ارورهای رایج هنگام استفاده از اکسپرتها در فارکس

مقدمه
فارکس و معاملهگری خودکار (Expert Advisors یا اکسپرتها) ترکیبی است که هم فرصتهای بزرگی میتواند به همراه آورد، هم دردسرها و خطاهای متعددی. اگر یک اکسپرت را بدون آگاهی درست به کار ببری، ممکن است سرمایهات را با شکست فنی از دست بدهی. در ادامه به صورت تخضضی ارورهای رایج هنگام استفاده از اکسپرتها در فارکس را بررسی خواهیم کرد.
اهمیت شناخت ارورهای رایج هنگام استفاده از اکسپرتها در فارکس
وقتی یک اکسپرت (EA) مینویسی یا خریداری میکنی و روی حساب واقعی یا دمو اجرا میکنی، ممکن است در هر مرحلهای با ارور مواجه شوی: از زمان راهاندازی تا هنگام معامله یا هنگام بستن معامله.
اگر شناخت درستی از ارورهای رایج هنگام استفاده از اکسپرتها در فارکس نداشته باشی:
ممکن است دلیل خطا را ندانسته و وقت زیادی صرف آزمون و خطا کنی.
ممکن است در شرایط بحرانی، معاملهها از کنترل خارج شوند و ضررها بزرگتر شوند.
ممکن است به دلیل خطاهای ساده یا تنظیمات غلط، کل سیستم اتوماتیک متوقف شود.
در بازار زنده (live) این خطاها میتواند به زیان واقعی منجر شود.
در مقابل، اگر آشنا باشی با این ارورها:
میتوانی سریع تشخیص دهی مشکل از کجاست.
راهحل مناسب را اعمال کنی و ربات را زود فعال کنی.
اعتماد بیشتری به اکسپرتها داشته باشی و از آنها بهره بیشتر ببری.
در زمان و هزینهات صرفهجویی کنی.
جملهای هست از یکی از بزرگان دنیای برنامهنویسی مالی:
“Errors in trading systems are inevitable — آنچه مهم است سرعت تشخیص و اصلاحشان است.”
— ناشناس
یادم باشه که اگر بخوای، در انتها کدهایی هم مثال میزنم تا وقتی در محیط MQL4/MQL5 هستی، دقیقا بفهمی ارور از کجاست.
دستهبندی کلی ارورها و جدول مقایسه
قبل از ورود به جزئیات، این جدول بهت کمک میکند دید کلی داشته باشی:
دسته ارور | زمان بروز | علت رایج | نتیجه | روش تشخیص اولیه |
---|---|---|---|---|
خطاهای پلتفرم / سرور | هنگام ارسال سفارش، اتصال، زمان تعطیلی بازار | کمبود نقدینگی، بازار بسته، سرور مشغول | معامله باز نمیشود یا خطا نمایش داده میشود | بررسی لاگها، خط ارور، GetLastError |
ارورهای پارامتری | تنظیمات TP/SL بسیار نزدیک، lot نامعتبر | پارامترهای اکسپرت یا شرایط بروکر | دستور رد میشود | بررسی محدودیتهای بروکر (MinStopLevel و غیره) |
ارورهای تخصیص منابع | تقسیم بر صفر، کلیهها (DLL)، متغیرهای نامعتبر | منطق غلط در کد | کرش EA یا توقف کار | چک کردن کد، استفاده از Try / Catch یا شرطها |
ارورهای همزمانی | ارسال چند دستور همزمان | عدم انتظار برای پاسخ سرور | “Trade Context is Busy” | بررسی زمانبندی دستورات و مدیریت صف |
ارورهای حساب / مارجین | ضریب کم، لات بزرگ | موجودی کم، لوریج نامناسب | “Not Enough Money” | بررسی free margin و فاکتورهای حساب |
ارورهای مربوط به بازار | بازار بسته، نماد غیر فعال | تعطیلی بازار، تغییر نماد | “Market Closed” یا “Trading is prohibited” | بررسی زمان بازار یا وضعیت نماد |
با این جدول به عنوان نقشه، بیایم قدم به قدم به ارورهای مهم بپردازیم.
ارورهای پلتفرم و سرور
وقتی اکسپرت دستور معامله میفرستد، دستور به سرور بروکر ارسال میشود و آنجا بررسی میشود. اگر مشکلی در این مسیر باشد، با ارورها مواجه میشوی.
مثال: Trade Context is Busy
این یکی از ارورهای رایج هنگام استفاده از اکسپرتها در فارکس است، مخصوصاً در MT5. وقتی EA تلاش کند دستور جدیدی ارسال کند در حالی که دستور قبلی هنوز کامل نشده، این خطا ظاهر میشود.
روش رفع مرحله به مرحله:
➊ مطمئن شو که بین ارسال دستورات، مدتی (حق تأخیر) وجود دارد.
➋ از تابعی مثل IsTradeAllowed()
یا بررسی وضعیت سرور استفاده کن.
➌ اگر دستور قبلی هنوز باز است، از ارسال مجدد جلوگیری کن، یا در صف بگذار.
➍ در لاگ (journal و log files) بررسی کن دقیقاً در چه زمان و چه دستوری خطا داده شده.
مثال: Market Closed یا Trading is prohibited
گاهی دستور ارسال میکنی ولی بازار بسته است یا نماد فعّال نیست، در نتیجه با ارور مواجه میشوی.
رفع:
ابتدا چک کن آیا زمان کاری بازار است یا نه
اگر نماد مورد نظر در Market Watch فعال نیست، آن را اضافه کن
اگر بروکر معاملات روی آن نماد را محدود کرده به تنظیمات اکسپرت بررسی کن
ارور Requote / Price Changed
وقتی قیمت بین ارسال فرمان و اجرای آن تغییر کند، سرور ممکن است سفارش را قبول نکند و ارور “Price Changed” یا “Requote” بدهد.
چکار کنی:
اسلیپیج (slippage) مناسب تعریف کن
در رباتت به خطاها اجازه retry بده (مثلاً ۲ یا ۳ بار تلاش مجدد)
در زمان نوسانی بازار کمتر معامله کن
ارور Too Frequent Requests
اگر EA خیلی سریع و بدون مکث دستور بدهد، سرور ممکن است آن را به عنوان حمله شناسایی کرده و درخواست را رد کند.
رفع:
بین فرمانها تأخیر بگذار
صفبندی دستورات
بررسی توکنهای دستوری و محدود کردن تعداد درخواستها در ثانیه
ارورهای پارامتر و محدودیتهای بروکر
حتی اگر ارسال دستور و سرور ایرادی نداشته باشند، اگر پارامترهایی که دادهای با قوانین بروکر مطابقت نداشته باشند، دستور رد میشود.
مثال: ارور 130 / Incorrect Stop Levels
یکی از پرتکرارترین خطاها این است که سطح StopLoss یا TakeProfit خیلی نزدیک به قیمت فعلی باشد. بروکر معمولاً حداقل فاصلهای را بین قیمت و استاپ تعیین کرده است.
رفع:
مقدار MinStopLevel بروکر را از مستندات یا با تماس پشتیبانی بگیر
در کد EA منطقی تعریف کن که فاصله استاپها حداقل به آن مقدار باشند
اگر پارامتر ورودی استاپ خیلی کم باشد، به صورت خودکار آن را اصلاح کن
مثال: Invalid Volume / Invalid Lots
اگر حجم (lot) درخواست شده نامعتبر باشد (مثلاً خیلی بزرگ یا اعشاری با عدد نامناسب) یا کمتر از حد مجاز، دستور رد میشود.
رفع:
بررسی حداکثر و حداقل lot مجاز توسط بروکر
اگر EA ورودی لات دارد، یک محدودیت منطقی روی آن بگذار
در هنگام محاسبه لات پویا (dynamic lot)، مطمئن باش عددی تولید شود که در رنج مجاز باشد
مثال: ارور Invalid Expiration / Order Expiration Denied
اگر برای سفارش شرط زمانی (Expiration) گذاشته باشی ولی بروکر آن را نپذیرد، ارور میدهد.
رفع:
اگر بروکر از expiration پشتیبانی نمیکند، گزینه را غیرفعال کن
اگر expiration تنظیم شده، از نوعی که بروکر قبول کند استفاده کن
مقدار expiration را صفر یا None بگذار تا بروکر خودش زمان را تعیین کند
ارورهای منطقی و برنامهنویسی در کد اکسپرت
بخش مهمی از ارورهای رایج هنگام استفاده از اکسپرتها در فارکس ناشی از کد ضعیف یا منطق نامناسب است.
مثال: Division by Zero
اگر در کد قسمتی باشی که تقسیم بر متغیری بشود و آن متغیر صفر شود، خطا میدهی.
رفع:
قبل از تقسیم، چک کن متغیر صفر نباشد
اگر متغیر امکان صفر شدن دارد، شرطی بگذار که آن مسیر اجرا نشود
از توابع ایمنتر استفاده کن یا کد را طوری بنویس که حالت صفر مدیریت شود
مثال: DLL Call Not Allowed
اگر در EA تماس با DLL انجام دهی ولی تنظیمات ترمینال یا امنیتی اجازه ندهد، ارور میگیری.
رفع:
بررسی کن EA اجازهی Calling DLL داشته باشد
اگر permission در ترمینال فعال نیست، آن را فعال کن (در تنظیمات)
اطمینان حاصل کن DLL ای که استفاده میکنی مجاز و ایمن باشد
مثال: Invalid Symbol / Symbol Not Found
اگر نمادی که در EA استفاده شده نیست یا در Market Watch فعال نیست، خطا میگیری.
رفع:
مطمئن شو نماد در پلتفرم معرفی شده باشد
اگر نماد با پسوند (Suffix) استفاده میشود، نام صحیح را استفاده کن
در کد، شرط اضافه کن که اگر символ موجود نبود، EA غیرفعال شود یا نام صحیح را جایگزین کند
ارورهای حساب و مارجین
حتی اگر همه چیز فنی درست باشد، وضعیت حساب و مارجین میتواند مانع اجرای دستور شود.
مثال: Not Enough Money / No Money
وقتی در حساب سرمایه کافی برای انجام معامله یا پوشش مارجین وجود نداشته باشد، با این خطا مواجه میشوی.
رفع:
قبل از ارسال دستور، free margin را بررسی کن
اگر موجودی کافی نیست، دستور نده یا حجمی کوچکتر انتخاب کن
از مدیریت سرمایه (risk management) استفاده کن تا همیشه درصدی از سرمایه آزاد داشته باشی
مثال: Maximum Open or Pending Orders Reached
اگر تعداد معاملات یا سفارشات باز یا معلق به حد مجاز برسد، دستور جدید رد میشود.
رفع:
در کد EA محدودیت تعداد بازها را رعایت کن
اگر EA چند استراتژی دارد، آنها را طوری همزمان اجرا کن که روی هم نپوشند
بررسی کن ضوابط بروکر در مورد تعداد سفارشات همزمان
تشخیص سریع ارورها + گام به گام عیبیابی
در این بخش، روش آزمون و خطا برای پیدا کردن مشکل را مرحله به مرحله مینویسم:
فعالسازی حالت نمایش ارور و لاگ در EA (logging)
چک کردن خروجی GetLastError بعد از هر دستور معاملاتی
بررسی فایل لاگ ترمینال (Experts و Journal)
مقایسه ارور با جدول ارورها در مستندات MQL و MetaTrader
درونگذاری (print یا Debug) متغیرهای حساس (لات، فاصله، قیمت، نماد)
در محیط دمو یا Strategy Tester آزمایش کن — اگر ارور نیاید، مشکل از محیط live است
مرحلهای پارامترها را جابجا کن یکی یکی تغییر بده تا ببینی کدام قسمت قضیه را خراب میکند
در نهایت اگر راهحل پیدا نکردی، از توسعهدهنده EA یا انجمنهای تخصصی کمک بگیر
نکات پیشگیرانه برای کاهش ارورها
پیشگیری همیشه بهتر از درمان است. این توصیهها کمک میکند بسیاری از ارورهای رایج هنگام استفاده از اکسپرتها در فارکس هرگز رخ ندهند:
همیشه اکسپرت را ابتدا روی حساب دمو تست کن
در کد EA، چکهای ابتدایی (Validations) بگذار برای ورودیها
لاگبرداری دقیق داشته باش تاریخ، زمان، دستورات، ارورها
اگر میخواهی EA را بهبود دهی، ابتدا نسخه پشتیبان بگیر
از تابع
Sleep()
یا تأخیر منطقی بین دستورات استفاده کنEA و پلتفرم را بهروز نگه دار
محدودیتهای بروکر را در مستنداتش بخوان و در کد رعایت کن
اگر بازار نوسانی است، معاملات را کم کن
امکان غیرفعالکردن (Stop) در صورت خطا در EA بگذار
مطمئن شو اتصال اینترنت و سرور پایدار است
مثال عملی — یک سناریو واقعی (با کد ساده)
فرض کن EA ای نوشتهای که در هر بشکند (Breakout) ورود میکند و استاپلاس دارد. در یک آزمایش live با ارور “130 Incorrect Stop Levels” مواجه میشوی.
حل مرحله به مرحله:
میروی به بروکر و میخوانی MinStopLevel = 10 (مثلاً به معنی 10 پیپ).
در EA بررسی میکنی: اگر فاصله استاپ از قیمت کمتر از 10 باشد، استاپ را به 10 پیپ افزایش بده.
تابعی اضافه میکنی:
double adjustStop(double price, double stop) {
double min = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
if (MathAbs(price - stop) < min) {
if (stop > price) stop = price + min;
else stop = price - min;
}
return stop;
}
قبل از اجرای دستور، استاپ و تیکپرافیت را از این تابع بگذران
دوباره تست کن — مشکل رفع شده است
در این مسیر دقیقاً فهمیدی علت خطا چیست، چطور آن را اصلاح کردی، و اکنون اکسپرت بدون مشکل اجرا خواهد شد.
ارورهای ناشی از بهروزرسانیها و ناسازگاری نسخهها
یکی از دلایل کمتر دیدهشده ولی بسیار مهم برای بروز ارور در اکسپرتها، تفاوت نسخه نرمافزار است هم در سطح پلتفرم متاتریدر و هم در سطح کدنویسی.
گاهی اوقات نسخه جدید متاتریدر۵ یا ۴ برخی از توابع، کلاسها یا متغیرهای سیستمی را تغییر میدهد. در نتیجه اکسپرتهایی که با نسخه قدیمیتر نوشته شدهاند، دیگر بهدرستی کار نمیکنند یا با ارورهای عجیب مواجه میشوند. ⚡
ارورهای شایع در این زمینه
➊ Function Not Defined — به معنی اینکه تابعی که در اکسپرت صدا زده شده در نسخه فعلی MQL وجود ندارد یا تغییر کرده است.
➋ ‘SymbolInfoDouble’ undeclared identifier — در نسخههای قدیمیتر این تابع وجود ندارد.
➌ OrderSend Error 4756 – invalid parameter — معمولاً بعد از آپدیتهای متاتریدر یا تغییر در ساختار order-handling رخ میدهد.
➍ Critical runtime errors — خطاهایی که فقط هنگام اجرای زنده ظاهر میشوند، نه در تستر.
راهحل پیشنهادی برای هر مرحله 🛠️
① قبل از هر بهروزرسانی، از پوشهی Experts و Indicators بکاپ بگیر.
② اکسپرتها را در محیط جدید (Strategy Tester) تست کن تا ببینی تابعی منسوخ یا ناسازگار شده یا نه.
③ از تغییرات نسخه (Release Notes) در وبسایت رسمی MetaQuotes اطلاع پیدا کن.
④ همیشه از دستورهای جایگزین استفاده کن. مثلاً به جای OrderSelect()
قدیمی از PositionSelect()
در MT5 استفاده کن.
⑤ در صورت نیاز، با دستور #property strict
در ابتدای کد سازگاری اجباری را فعال کن.
به قول معروف:
«هر بار که متاتریدر بهروزرسانی میشود، یک تستر باید از نو ساخته شود.»
— Steve Hopwood، توسعهدهنده معروف اکسپرت در انجمن MQL5
ارورهای مربوط به اتصال شبکه و VPS
بسیاری از کاربران تصور میکنند اگر اکسپرت درست نصب شود، دیگر کار تمام است. اما تجربه نشان داده که قطع موقت اینترنت یا تأخیر شبکه (Latency) میتواند یکی از خطرناکترین منابع ارور در فارکس باشد. 🕰️🚦
بهخصوص وقتی از VPS (سرور مجازی) استفاده میکنی، باید بدانی اکسپرتت مستقیماً با سرور بروکر در ارتباط است و هر ثانیه تأخیر میتواند باعث خطاهایی مثل Requote یا OrderSend Failed شود.
خطاهای رایج شبکه
نوع خطا | شرح کوتاه | نتیجه در اجرای EA | روش رفع |
---|---|---|---|
4060 – No Connection | متاتریدر به سرور وصل نیست | توقف کامل اکسپرت | بررسی اینترنت، سرور و لاگین |
4109 – Trade not allowed | اجازه معامله قطع شده (مثلاً حساب Read-Only یا زمان Maintenance) | دستور رد میشود | بررسی اجازه ترید در Options |
4754 – Trade Timeout | پاسخ از سرور بروکر دیر رسیده | دستور نیمهکاره اجرا میشود | استفاده از Retry در کد و پینگ پایین |
Ping > 300ms | تأخیر زیاد بین VPS و سرور | کندی و Requote زیاد | انتخاب VPS نزدیک به دیتاسنتر بروکر |
💡 نکته:
اگر از VPS استفاده میکنی، همیشه لوکیشن سرور را نزدیک به دیتاسنتر بروکر انتخاب کن. مثلاً اگر بروکر سرورش در لندن است، VPS اروپا را انتخاب کن نه آسیا.
همچنین، در کد EA از تابع IsConnected()
استفاده کن تا قبل از هر ارسال دستور، اتصال بررسی شود. این کار از بروز بسیاری از خطاهای تصادفی جلوگیری میکند.
ارورهای زمانی و تنظیم تایمفریمها
یکی از اشتباهات رایج بین تریدرها این است که اکسپرت را روی تایمفریمی غیر از تایم پیشفرض یا مورد انتظارش اجرا میکنند. نتیجه؟ سیگنالها اشتباه محاسبه میشوند، اندیکاتورها داده اشتباه میفرستند و نهایتاً اکسپرت با ارور مواجه میشود. 📊
مثال واقعی
فرض کن اکسپرتی طراحی شده تا روی تایم فریم H1 (یک ساعته) کار کند، اما تو آن را روی M15 اجرا میکنی.
در این حالت اندیکاتورهای داخلی (مثل Moving Average یا ATR) دادههای متفاوتی میفرستند و در شرایط خاص ممکن است تابعی مثل iCustom
مقدار NULL برگرداند که باعث ارور شود.
راهکارهای جلوگیری ✅
در ابتدای کد اکسپرت تایمفریم ثابت تعریف کن:
if(Period() != PERIOD_H1) {
Alert("لطفاً اکسپرت را فقط روی تایمفریم 1 ساعته اجرا کنید.");
return;
}
همیشه دادههای اندیکاتور را با
CopyBuffer
چک کن که مقدارEMPTY_VALUE
برنگردانده باشد.قبل از اجرای استراتژی، تست کن اکسپرت در تمام تایمفریمها یکسان رفتار میکند یا خیر.
به قول معروف، «اکسپرت بدون تایمفریم مشخص مثل قطبنما بدون جهت است.» 💭
ارورهای ناشی از داده تاریخی (History Data)
گاهی ارورهایی میبینی که ظاهراً ربطی به معامله ندارند ولی دلیلشان کمبود یا خرابی داده تاریخی است.
در تستر متاتریدر یا حتی هنگام اجرای زنده، ممکن است با خطاهایی مثل “Array out of range” یا “No data for this symbol” مواجه شوی. علت ساده است: دادههای قیمتی کامل نیستند. 🕰️
رفع مرحلهبهمرحله
① از منوی Tools → History Center برو و دادههای نماد مربوطه را دانلود یا بهروز کن.
② بررسی کن که تایمفریم انتخابی داده کافی داشته باشد (مثلاً حداقل ۱۰۰۰ کندل برای اندیکاتورها).
③ اگر از دادههای خارجی استفاده میکنی، مطمئن شو قالب آن با متاتریدر سازگار است (CSV یا HST).
④ در تستر استراتژی، گزینه Use Date را غیرفعال کن تا داده کاملتر استفاده شود.
🔥 نکته حرفهای:
وقتی اکسپرت از اندیکاتورهای چندتایمفریمی (MTF Indicators) استفاده میکند، نبود داده در تایمفریم بالاتر یکی از دلایل اصلی خطاست.
ارورهای دسترسی فایل و پوشهها
اکسپرتهایی که از فایلهای خارجی استفاده میکنند (مثل CSV، JSON، یا فایلهای تنظیمات)، ممکن است در محیط ویندوز یا VPS با محدودیت دسترسی مواجه شوند.
خطاهایی مثل 5003 – File Access Denied
یا 5004 – Cannot Open File
معمولاً زمانی ظاهر میشوند که مسیر فایل اشتباه است یا پوشه Write Permission ندارد.
روش صحیح رفع ارور
پوشههای مجاز برای ذخیرهسازی را فقط در مسیر زیر قرار بده:
MQL4/Files
یاMQL5/Files
اگر از فایل خارجی میخوانی، همیشه مسیر نسبی بده نه مطلق. مثلاً:
int handle = FileOpen("settings.csv", FILE_READ|FILE_CSV);
مطمئن شو اکسپرتت در تنظیمات متاتریدر اجازه دسترسی به فایلها را دارد (در بخش Options → Expert Advisors).
اگر از نسخه پرتابل متاتریدر استفاده میکنی، مسیر دادهها را دقیق بررسی کن.
اشتباهات انسانی که باعث بروز ارور در اکسپرت میشود 🎯
در کنار خطاهای سیستمی، بسیاری از ارورهای رایج هنگام استفاده از اکسپرتها در فارکس حاصل خطاهای انسانی هستند، نه فنی.
چند مثال واقعی از تجربه تریدرها
⭐ یکی از تریدرها اکسپرت را روی حساب دمو نصب کرده بود، اما فایل DLL مربوطه را به پوشهی Experts نریخته بود نتیجه؟ هیچ معاملهای باز نشد.
⭐ تریدری دیگر اکسپرت را روی چارت طلا اجرا کرد در حالی که تنظیماتش برای EURUSD نوشته شده بود. الگوریتم اشتباه محاسبه کرد و در عرض چند دقیقه ۵ معامله ضررده باز شد.
⭐ مورد دیگری اکسپرت را روی حساب واقعی اجرا کرد اما تیک “Allow live trading” را فعال نکرده بود. تمام سیگنالها فقط در لاگ نوشته میشدند ولی هیچ دستوری اجرا نشد!
💡 راهحل: همیشه قبل از اجرای نهایی، چکلیست کوتاه زیر را انجام بده:
فعال بودن گزینه “Allow live trading”
اتصال پایدار به سرور بروکر
اطمینان از نصب کامل فایلهای اندیکاتور و DLL
مطابقت تایمفریم و نماد با تنظیمات EA
تست اولیه در دمو
سخن پایانی 🏁
شناخت و مدیریت ارورهای رایج هنگام استفاده از اکسپرتها در فارکس همان اندازه اهمیت دارد که شناخت خود استراتژی معاملاتی. بسیاری از معاملهگران تازهکار تصور میکنند اکسپرتها بدون خطا و خودکار عمل میکنند، اما در واقع دنیای الگوتریدینگ پر از چالشهای فنی، منطقی و انسانی است.
اکنون که با جزئیات ارورهای سرور، پارامتری، منطقی، شبکهای و زمانی آشنا شدی، میتوانی در زمان مواجهه با خطا، با ذهنی روشن تصمیم بگیری و سریعترین مسیر رفع را انتخاب کنی. 💼📈
همیشه به یاد داشته باش — همانطور که “جسی لیورمور” گفته:
“در بازار، کسانی موفقاند که اشتباهاتشان را زود تشخیص میدهند، نه آنهایی که هرگز اشتباه نمیکنند.”
منابع: