
چرا ربات در MT4 اجرا نمیشود: راهنمای جامع عیبیابی تخصصی برای برنامهنویسان MQL4
فعالسازی و اجرای صحیح یک ربات معاملهگر (Expert Advisor – EA) در محیط پلتفرم متاتریدر 4 (MetaTrader 4 – MT4) یکی از اساسیترین دغدغههای هر برنامهنویس MQL4 و تریدر خودکار است. این فرایند که ظاهراً ساده به نظر میرسد، مملو از پیچیدگیهایی است که میتواند از تنظیمات سطح پلتفرم آغاز شده و تا عمق منطق برنامهنویسی و تعامل با سرور بروکر (Broker) امتداد یابد. زمانی که یک EA که به درستی کدنویسی شده است، با وجود انتظار ما، در نمودار مورد نظر فعال نمیشود، یا پس از فعالسازی شروع به انجام وظایفش نمیکند، مجموعهای از مراحل تشخیصی دقیق مورد نیاز است تا ریشه مشکل شناسایی و برطرف گردد. این مقاله به بررسی عمیق و تخصصی تمام جنبههای فنی و پیکربندی که ممکن است مانع اجرای صحیح یک ربات در MT4 شوند، میپردازد، و راهنمایی جامع برای برنامهنویسان و تریدرهای سطح بالا فراهم میآورد.
مفهوم ربات معاملهگر (Expert Advisor) در متاتریدر 4
ربات معاملهگر یا اکسپرت ادوایزر (EA) در واقع یک برنامه کامپیوتری است که با استفاده از زبان برنامهنویسی MQL4 نوشته شده و به صورت خودکار وظایف تحلیلی و معاملاتی را بر اساس مجموعهای از قوانین از پیش تعیین شده در پلتفرم MT4 اجرا میکند. هسته اصلی عملکرد یک EA در توابع تعریف شدهای مانند OnInit(), OnDeinit(), و مهمتر از همه OnTick() نهفته است. تابع OnInit() تنها یک بار هنگام پیوست شدن EA به نمودار فراخوانی میشود و برای مقداردهی اولیه متغیرها، بررسی اتصالات اولیه، یا انجام محاسبات اولیه ضروری است. تابع OnDeinit() هنگام حذف شدن EA یا بسته شدن پلتفرم اجرا میشود. اما قلب تپنده هر EA، تابع OnTick() است که با دریافت هر تیک جدید قیمت (New Price Tick) از سرور بروکر، اجرا میشود و منطق اصلی استراتژی، شامل تحلیل بازار، تصمیمگیری برای ورود یا خروج، و مدیریت پوزیشنهای باز را به عهده دارد. عدم اجرای صحیح این توابع، یا عدم فراخوانی مکرر OnTick()، مستقیماً به عدم عملکرد ربات منجر میشود. برنامهنویس باید اطمینان حاصل کند که هیچ خطایی در حین مقداردهی اولیه رخ نداده باشد، زیرا در صورت بروز خطا در OnInit()، معمولاً EA به طور کامل از اجرا باز میماند و پیامی مبنی بر عدم موفقیت در مقداردهی اولیه در لاگها (Logs) ثبت میشود. همچنین، اگرچه تئوری میگوید EA با دریافت هر تیک اجرا میشود، اما عواملی مانند تنظیمات سرور بروکر یا حتی فعال نبودن ویژگی دریافت تیکها میتواند بر این فرایند تأثیر بگذارد.
تفاوت اجرا نشدن ربات با اجرا شدن بدون معامله
یکی از سردرگمکنندهترین سناریوها برای کاربران، تشخیص تفاوت میان حالتی است که ربات اصلاً اجرا نمیشود (به معنای عدم فعالسازی اولیه یا توقف ناگهانی)، و حالتی که ربات اجرا میشود اما هیچ معاملهای (Trade) انجام نمیدهد. در حالت اول، معمولاً آیکون صورتک خندان (یا همان ایموجی) در گوشه نمودار نمایش داده نمیشود یا وضعیت آن در پنجره Experts (کارشناسان) با خطا مشخص میشود. این حالت نشاندهنده یک مشکل ساختاری در بارگذاری، کامپایل، یا پیکربندی است که مانع از رسیدن کد به مرحله اجرای منطق اصلی میشود. دلایل آن میتواند از فعال نبودن AutoTrading گرفته تا مشکلات مربوط به مجوزهای دسترسی (مانند اجازه DLL (DLL Imports)) باشد. اما در حالت دوم، یعنی اجرای ربات بدون معامله، آیکون صورتک خندان فعال است و در پنجره Experts پیامهایی مبنی بر اجرای موفقیتآمیز OnTick را مشاهده میکنیم، اما پوزیشن جدیدی باز نمیشود. این وضعیت تقریباً همیشه به دلیل منطق داخلی کد یا عدم برآورده شدن شرایط معاملاتی استراتژی نهفته در تابع OnTick() رخ میدهد. برای مثال، ممکن است شمع جاری (Current Bar) هنوز بسته نشده باشد و EA منتظر تکمیل شمع جدید (New Bar) باشد، یا ممکن است شرایط ورود (مانند تقاطع دو میانگین متحرک) فعلاً محقق نشده باشد. همچنین، بررسی دقیق متغیرهای ورودی (Inputs) که ممکن است شرطی برای عدم معامله را فعال کرده باشند، حیاتی است. اگر پارامتری مانند MaxTrades روی صفر تنظیم شده باشد، ربات هرگز اجازه معامله جدید نخواهد داد، حتی اگر سیگنال قوی وجود داشته باشد. تشخیص این تمایز، مسیر عیبیابی را به کلی تغییر میدهد؛ اولی فنی و پیکربندی است، دومی اغلب الگوریتمی و منطقی.
بررسی فعال بودن AutoTrading (AutoTrading Button)
شاید سادهترین و در عین حال شایعترین دلیلی که یک ربات معاملهگر فعال نمیشود، نادیده گرفتن دکمه AutoTrading (که اغلب به نام “ترید خودکار” یا “معاملات خودکار” نیز شناخته میشود) در نوار ابزار اصلی MT4 باشد. این دکمه، که در بالای نمودارها قرار دارد و وضعیت آن باید سبز (فعال) باشد، یک سوییچ حیاتی در سطح پلتفرم است. این دکمه نه تنها اجرای کد EA را کنترل میکند، بلکه به سرور بروکر نیز سیگنال میدهد که اجازه دارد دستورات معاملاتی (مانند اجرای OrderSend()) از طریق این نرمافزار صادر شود. اگر این دکمه قرمز (غیرفعال) باشد، فارغ از اینکه کد چقدر دقیق نوشته شده باشد و تمام تنظیمات داخلی درست باشد، هیچ دستوری مبنی بر انجام عملیات خرید یا فروش به سرور ارسال نخواهد شد و ربات در حالت “فقط نظارت” باقی میماند. نکته بسیار مهم برای برنامهنویسان این است که حتی اگر کد MQL4 به درستی نوشته شده باشد و از توابع سیستم مانند TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) برای بررسی وضعیت استفاده کند، اگر این دکمه در سطح رابط کاربری غیرفعال باشد، تمام تلاشها برای ارسال دستورات شکست خواهد خورد. حتی در صورتی که یک EA خطایی در OnInit() داشته باشد و نتواند به درستی اجرا شود، این دکمه همچنان باید فعال باشد تا بتوانیم پیامهای مربوط به شکست در مقداردهی اولیه را در لاگها مشاهده کنیم. همیشه در اولین مرحله عیبیابی، وضعیت این دکمه باید تأیید شود؛ سبز بودن آن برای اجرای موفقیتآمیز الزامی است.
خطاهای مربوط به تنظیمات ورودی ربات (Input Parameters)
متغیرهای تنظیمات ورودی ربات (که با کلمه کلیدی extern یا در نسخههای جدیدتر input تعریف میشوند) نقش حیاتی در نحوه رفتار EA در محیطهای مختلف دارند. اشتباه در مقداردهی این پارامترها میتواند از اجرای کامل EA جلوگیری کند یا آن را به سمتی هدایت کند که هرگز شرایط معاملاتی را برآورده نسازد. خطاهای رایج در اینجا شامل موارد زیر است: مقادیر غیرمنطقی، مقادیر صفر یا منفی برای پارامترهایی که باید مثبت باشند (مانند اندازه لات یا حد ضرر)، و ناسازگاری بین پارامترهای عددی و مقادیر پیشفرض. برای مثال، اگر یک EA طراحی شده باشد تا فقط روی جفت ارزهایی با چهار رقم اعشار (مانند EURUSD=1.1234) کار کند و شما آن را بر روی نمادی با پنج رقم اعشار (مانند EURUSD=1.12345) متصل کنید، اگر کد شما برای مدیریت این تفاوتها (به وسیله توابعی مانند _Digits و _Point) نوشته نشده باشد، محاسبات فاصله حد سود و ضرر ممکن است کاملاً نادرست انجام شود و در نتیجه EA هیچ سیگنالی تولید نکند. همچنین، خطاهایی که در تابع OnInit() در حین اعتبارسنجی ورودیها رخ میدهند، میتوانند اجرای EA را متوقف کنند. برنامهنویسان باید اطمینان حاصل کنند که در OnInit، تمامی پارامترهای ورودی مهم از نظر منطقی و محدودیتهای سیستم (مانند محدودیتهای حجم معامله (Lot Size) توسط بروکر) بررسی شوند و در صورت تخطی، پیامی واضح در Experts ثبت گردد. اگر مقداردهی یک متغیر ورودی در زمان پیوستن به نمودار منجر به تقسیم بر صفر یا تخصیص غیرمجاز شود، EA بلافاصله متوقف خواهد شد.
مشکلات مربوط به اجازه DLL (DLL Imports)
یکی از پیچیدهترین موانع در اجرای برخی رباتهای معاملهگر پیشرفته، مربوط به استفاده از توابع خارجی (External Functions) از طریق اجازه DLL (DLL Imports) است. اگر یک EA برای تعامل با کتابخانههای خارجی (معمولاً فایلهای .dll ویندوز) برای انجام محاسبات سنگین یا دسترسی به منابع سیستمی خاص نوشته شده باشد، MT4 به طور پیشفرض این دسترسی را مسدود میکند. برای فعالسازی این قابلیت، کاربر باید به بخش تنظیمات MT4 رفته، تب Expert Advisors را انتخاب کرده و تیک گزینه “Allow DLL imports” را فعال نماید. اگر این تیک برداشته شده باشد، هر تلاشی از سوی EA برای فراخوانی تابعی مانند SomeExternalFunction() از داخل DLL با شکست مواجه شده و معمولاً با خطای “Cannot call external function” در پنجره Experts گزارش میشود. این خطا اغلب باعث میشود که تابع اصلی که از آن DLL فراخوانی شده، به طور کامل اجرا نشود و در نتیجه، منطق معاملاتی اصلی ربات تحت تأثیر قرار گیرد، یا اگر این فراخوانی در OnInit باشد، کل EA از بارگذاری باز بماند. نکته امنیتی این است که فعال کردن این گزینه، امنیت سیستم را کمی به خطر میاندازد، زیرا یک کد مخرب میتواند از طریق DLL به منابع سیستمی دسترسی پیدا کند؛ بنابراین، این کار تنها برای EAهایی که به آنها اعتماد کامل دارید توصیه میشود.
بررسی تبهای Experts و Journal در متاتریدر 4
دو پنجره کلیدی در پایین رابط کاربری MT4، یعنی تبهای Experts (کارشناسان) و Journal (مجله)، منابع اصلی اطلاعاتی برای تشخیص چرایی عدم اجرای صحیح ربات هستند. پنجره Experts به طور خاص برای ثبت رویدادها، خطاها، اخطارها و پیامهای سطح EA طراحی شده است. زمانی که یک EA بارگذاری میشود، موفقیت یا شکست در OnInit() باید در اینجا گزارش شود. هرگونه خطای زمان اجرا (Runtime Error) در طول اجرای OnTick() نیز در این پنجره با برچسب زمانی و نام EA ثبت میشود. برای مثال، اگر خطایی مانند “OrderSend error 130: Invalid stops” (خطای 130: توقفهای نامعتبر) رخ دهد، این نشان میدهد که EA اجرا شده اما دستور معاملاتی به دلیل مشکلات در پارامترهای حد سود/ضرر یا استاپ لاس ارسال شده، توسط سرور بروکر رد شده است. در مقابل، تب Journal اطلاعات سطح کلیتری از پلتفرم ارائه میدهد، از جمله زمان اتصال به سرور، خطاهای اتصال، تغییرات در وضعیت حساب (مثل واریز یا برداشت)، و همچنین ثبت تمامی دستورات معاملاتی ارسال شده و پاسخهای دریافتی از سرور. اگر یک دستور معاملاتی توسط EA صادر شده باشد و در Experts خطایی مبنی بر عدم ارسال آن مشاهده نشود، اما در Journal هیچ ردی از آن دستور نباشد، این احتمال قوی وجود دارد که مشکل در سطح فعالسازی AutoTrading یا اجازه ارسال دستورات توسط بروکر باشد. تحلیل دقیق تاریخچه پیامها در این دو تب، ۹۰ درصد از مشکلات عدم اجرا را آشکار میسازد.
خطاهای رایج برنامهنویسی در MQL4 (MQL4 Programming Errors)
بسیاری از مواقع، مشکل عدم اجرای ربات ناشی از نقصهای منطقی یا سینتکسی در کد MQL4 است که در زمان کامپایل به طور کامل شناسایی نشدهاند یا در زمان اجرا بروز میکنند. رایجترین این خطاها عبارتند از:
۱. استفاده از متغیرهای تعریف نشده: اگر یک متغیر در جایی استفاده شود بدون اینکه قبلاً تعریف شده باشد، یا اگر در یک تابع سطح پایین (Local Function) متغیری با همان نام تعریف شود و از نسخه سراسری (Global) استفاده شود، میتواند منجر به رفتارهای غیرمنتظره یا توقف برنامه شود.
۲. مشکلات مربوط به مدیریت زمان و شمعها: یکی از اشتباهات رایج، تلاش برای باز کردن معامله بر اساس یک شمع فعال (Incomplete Bar) یا استفاده نادرست از iBarShift یا Bars() است. اگر EA به جای انتظار برای بسته شدن شمع برای محاسبه اندیکاتورها، با هر تیک بر اساس دادههای شمع فعلی تصمیم بگیرد، ممکن است سیگنالهای کاذب زیادی تولید کند یا اگر شرطی برای اجرای فقط روی شمع بسته شده وجود داشته باشد، EA هرگز معاملهای انجام نخواهد داد. برای اطمینان از اجرای صحیح، برنامهنویسان باید همواره اطمینان حاصل کنند که محاسبات اندیکاتورها بر اساس شمعهای بسته شده (با استفاده از شیفتهای مثبت) انجام شود مگر آنکه استراتژی به صراحت بر روی شمع جاری تمرکز داشته باشد.
۳. خطاهای تخصیص حافظه و مدیریت منابع: در برنامهنویسی پیشرفتهتر، استفاده نادرست از اشارهگرها (Pointers) یا فراموش کردن آزادسازی منابعی مانند آبجکتهای گرافیکی (مانند خطوط یا مستطیلها) میتواند باعث کاهش کارایی و در نهایت توقف EA شود، به خصوص اگر تعداد زیادی از این منابع ایجاد شوند.
۴. توابع غیرمجاز یا قدیمی: استفاده از توابعی که در نسخه فعلی MT4 یا در بیلد کامپایلر شما منسوخ شدهاند، یا فراخوانی توابعی که نیاز به سطح دسترسی خاصی دارند (مانند توابع مربوط به تاریخچه حساب در حالی که فقط دسترسی به موقعیتهای باز مجاز است)، میتواند اجرای EA را با مشکل مواجه کند.
برنامهنویس باید از Debug Mode در MetaEditor استفاده کند و به دقت بررسی نماید که آیا حلقههای بیپایان (Infinite Loops) یا توابعی وجود دارند که بیش از حد طول میکشند و باعث میشوند زمان اجرای OnTick() از محدودیتهای MT4 (معمولاً چند ثانیه) فراتر رود، که در این صورت پلتفرم ممکن است به طور خودکار اجرای آن EA را متوقف کند.
ناسازگاری ربات با بروکر (Broker Compatibility)
تعامل بین ربات معاملهگر و بروکر یکی از مهمترین گلوگاهها در اجرای موفق است. هر بروکر تنظیمات و محدودیتهای خاص خود را دارد که ممکن است با فرضهای برنامهنویس در کد MQL4 تفاوت داشته باشد.
۱. حداقل و حداکثر حجم معامله (Lot Size Limits): بر اساس نوع حساب (استاندارد، مینی، میکرو)، بروکرها حداقل و حداکثر حجم مجاز برای هر معامله را تعیین میکنند. اگر EA تلاش کند حجمی خارج از این محدوده (مثلاً ۰.۰۱ لات در حالی که حداقل ۰.۱ لات مجاز است) ارسال کند، سرور بروکر دستور را با خطایی مانند “Invalid Lots” رد میکند. این خطاها باید توسط برنامهنویس با دقت در Journal بررسی شوند.
۲. نقطه اعشار (Digits) و قیمتگذاری: همانطور که پیشتر ذکر شد، تفاوت بین حسابهای استاندارد (۴ رقم اعشار) و حسابهای ECN یا پرايم (۵ رقم اعشار) میتواند محاسبات حد سود و ضرر را مختل کند. اگر EA فاصله TP/SL را بر اساس واحد Point محاسبه کند و در سیستم ۵ رقمی، هر Point معادل ۰.۱ پیپ باشد، محاسبات باید به درستی مقیاسبندی شوند.
۳. محدودیتهای Slippage و Requote: در حسابهایی که معاملات با Requote (درخواست مجدد قیمت) انجام میشوند، اگر EA برای مدت طولانی منتظر تأیید قیمت بماند، یا اگر سطح Slippage (انحراف قیمت) مجاز در تنظیمات EA بیش از حد کوچک باشد، دستورات معاملاتی ممکن است به سادگی رد شوند. در مدلهای STP/ECN که اجرای مستقیم دارند، خطاهای مربوط به قیمتهای منقضی شده (Stale Price) شایعتر است.
۴. ساعات کاری بازار و روزهای تعطیل: برخی بروکرها معاملات را در طول تعطیلات آخر هفته یا روزهای خاص (مانند قبل از انتشار اخبار مهم) مسدود میکنند. اگر EA در این زمانها اقدام به معامله کند، دستور رد خواهد شد.
۵. نوع حساب و اهرم (Leverage): اگر اهرم حساب بسیار کم باشد، ممکن است موجودی برای باز کردن حتی کوچکترین حجم معاملاتی کافی نباشد (Not Enough Money)، که این نیز در Journal ثبت میشود.
مشکلات تایمفریم و نماد معاملاتی
زمانی که یک ربات معاملهگر به نموداری با تایمفریم یا نماد معاملاتی اشتباهی متصل شود، نتایج میتواند بسیار گمراهکننده باشد. هر EA به طور پیشفرض روی تایمفریم (Timeframe) نموداری که به آن متصل است، عملیات خود را انجام میدهد، مگر اینکه به صراحت در کد، تایمفریم دیگری فراخوانی شود (مثلاً با استفاده از iMA(Symbol(), PERIOD_H4, ...)). اگر یک EA برای تایمفریم H1 طراحی شده باشد و شما آن را روی M15 اجرا کنید، منطق سیگنالدهی آن به کلی مختل خواهد شد، زیرا محاسبات اندیکاتورها و تشخیص الگوها بر اساس شمعهای کوتاهتر انجام میشود و سیگنالها بسیار پرنوسان خواهند بود.
مسئله دیگر، ناسازگاری نماد معاملاتی است. برخی از EAها به طور خاص برای نمادهای اصلی مانند EURUSD یا USDJPY نوشته شدهاند و ممکن است برای نمادهای عجیب (Exotic Pairs) یا کریپتوکارنسیها که اسپرد (Spread) بسیار بالایی دارند، به درستی عمل نکنند. اسپرد بالا میتواند حد سود تنظیم شده توسط EA را از بین ببرد یا باعث شود که شرط ورود به معامله (که اغلب شامل مقایسه قیمت خرید و فروش است) همیشه نادرست ارزیابی شود. نکته حیاتی دیگر این است که EAهایی که از توابع متصل به یک نماد خاص استفاده میکنند (مثلاً اگر EA در نمودار EURUSD اجرا شود اما سعی کند اطلاعات را از نماد GBPUSD بگیرد)، باید از پارامتر Symbol() برای ارجاع به نماد فعلی یا پارامتر صریح نماد معاملاتی مورد نظر استفاده کنند تا دچار ابهام نشوند. اگر EA به طور صریح به نمادی غیرقابل دسترس یا ناموجود در Market Watch متصل شود، در OnInit با خطا مواجه شده و اجرا نخواهد شد.
خطاهای مربوط به تست استراتژی (Strategy Tester)
اگر ربات در محیط تست استراتژی (Strategy Tester) اجرا نمیشود یا نتایج غیرقابل اعتمادی تولید میکند، مشکلات معمولاً در پیکربندی تست یا ویژگیهای خاص MQL4 نهفته است.
۱. حالت مدلسازی (Modeling Mode): رایجترین مشکل، انتخاب نادرست مدل شبیهسازی است. مدل “Every Tick” (هر تیک) دقیقترین است اما کندترین و نیازمند دادههای تیک کامل است. اگر از مدل “Control Points” یا “Open Prices Only” استفاده شود، نتایج شبیهسازی به شدت از واقعیت دور خواهند بود و ممکن است EA نتواند سیگنالهای دقیقی تولید کند که در محیط ریل کار کنند. بسیاری از EAها به دلیل عدم وجود دادههای کافی تیک، در این حالتها شکست میخورند.
۲. دادههای تاریخی (Historical Data): برای تست دقیق، باید دادههای تاریخی کافی (ترجیحاً با کیفیت بالا و پوشش چند ساله) برای نماد مورد نظر دانلود و نصب شده باشد. اگر دادههای موجود ناقص باشند (مثلاً فقط دادههای روزانه موجود باشد و EA برای تایمفریم H1 تست شود)، EA در شروع تست با خطای کمبود داده (Not Enough Data) مواجه شده و اجرا نمیشود.
۳. معاملات بهینهسازی (Optimization): هنگام اجرای بهینهسازی، EA باید به طور مداوم مجدداً مقداردهی اولیه شود. اگر تابع OnInit() در کد EA شامل عملیات سنگینی باشد که نباید با هر تکرار بهینهسازی اجرا شود، یا اگر عملیات مقداردهی اولیه به متغیرهای بهینهسازی شده وابسته باشد، فرآیند بهینهسازی با شکست مواجه خواهد شد یا نتایج بیمعنی خواهند داد.
۴. مشکلات مدیریت پوزیشن در تست: در محیط تست، باید مدیریت پوزیشنها به درستی انجام شود. اگر EA از توابعی برای بستن پوزیشنهای قدیمی استفاده نکند و صرفاً تلاش کند پوزیشنهای جدیدی باز کند، با توجه به محدودیتهای تستر (که هرگز اجازه نمیدهد بیش از یک پوزیشن همزمان روی یک نماد در تکرار تستی داشته باشید مگر با کدنویسی خاص)، خطا خواهد داد.
تفاوت حساب دمو و ریل در اجرای ربات
اگرچه کد MQL4 یکسان است، تفاوتهای بنیادین بین اجرای ربات در حساب دمو (Demo Account) و حساب ریل (Real Account) وجود دارد که میتواند منجر به عدم اجرای صحیح شود.
۱. سرعت و تأخیر (Latency): سرورهای حساب دمو معمولاً برای مدیریت حجم بالای کاربران و تستکنندگان طراحی شدهاند و ممکن است از لحاظ سرعت پردازش دستورات (Execution Speed) یا کیفیت دادههای دریافتی کندتر از سرورهای ریل باشند. این تأخیر ممکن است باعث شود شرایط معاملاتی که در دمو برآورده میشوند، در ریل به دلیل تغییر سریع قیمت از دست بروند.
۲. محدودیتهای بروکر برای دمو: برخی بروکرها برای جلوگیری از سوءاستفاده، محدودیتهایی را صرفاً برای حسابهای دمو اعمال میکنند، مانند محدود کردن تعداد دستورات باز در لحظه یا اعمال اسپرد ثابت بسیار گسترده که در محیط ریل متفاوت است.
۳. اجازه معامله: در برخی موارد نادر، حسابهای دمو ممکن است به دلیل تنظیمات خاص توسط بروکر، اجازه انجام معاملات اتوماتیک را ندهند یا نیازمند تأیید مجدد باشند که این موضوع باید در تنظیمات MT4 مربوط به آن حساب بررسی شود.
۴. مسائل مربوط به تاریخچه: دادههای تاریخی مورد استفاده برای تست دمو اغلب با دادههای ریل متفاوت است. در محیط ریل، شما با جریان زنده دادهها سر و کار دارید، در حالی که دمو ممکن است از مجموعهای از دادههای گذشته برای شبیهسازی استفاده کند.
تاثیر بهروزرسانی متاتریدر بر اجرای ربات
پلتفرم متاتریدر 4 به طور مرتب توسط شرکت MetaQuotes بهروزرسانی میشود. این بهروزرسانیها، چه در سطح پلتفرم و چه در سطح MetaEditor، گاهی اوقات منجر به ناسازگاری با رباتهای معاملهگر قدیمی میشوند. اصلیترین دلیل این ناسازگاری، تغییر در ساختار داخلی کامپایلر MQL4 یا تغییر در توابع سیستمی داخلی است. اگر یک EA با بیلد قدیمی کامپایل شده باشد و شما پلتفرم را به بیلد جدیدتری بهروز کنید، ممکن است پلتفرم هنگام تلاش برای بارگذاری EA، پیامی مبنی بر نیاز به کامپایل مجدد (Recompile) با بیلد جدید نمایش دهد. اگر برنامهنویس این کار را انجام ندهد، EA ممکن است اجرا نشود یا به طور مکرر در زمان OnTick با خطاهای عجیب مواجه شود. همچنین، تغییر در نحوه مدیریت توکنهای امنیتی یا نحوه تعامل با سرور بروکر پس از آپدیتهای بزرگ، میتواند عملکرد EAهایی که به شدت به عملکرد سیستمی وابسته بودند را مختل کند. همیشه پس از بهروزرسانی پلتفرم، باید EA را در MetaEditor باز کرده و با بیلد جدید کامپایل کرد.
مشکلات مربوط به فایلهای ناقص یا قدیمی ربات
اجرای موفق یک EA مستلزم این است که تمامی فایلهای مرتبط با آن به درستی در پوشههای صحیح MT4 قرار گرفته باشند. یک EA ممکن است به چندین فایل دیگر وابستگی داشته باشد:
۱. فایلهای DLL: اگر EA از DLL استفاده میکند، فایل DLL باید در پوشه /MQL4/Libraries قرار گیرد، نه صرفاً در پوشه /MQL4/Experts.
۲. فایلهای Include (کتابخانهها): اگر کد EA از فایلهای .mqh (فایلهای Include) برای ساختارهای داده یا توابع کمکی استفاده کند، این فایلها باید در پوشه /MQL4/Include باشند. اگر این فایلها مفقود باشند یا در مسیر اشتباهی قرار گرفته باشند، کامپایل ممکن است با موفقیت انجام شود (زیرا کامپایلر در زمان اجرا، آنها را پیدا نمیکند) اما در زمان اجرا در OnInit با خطای “Cannot open include file” مواجه شده و EA از کار میافتد.
۳. فایلهای تنظیمات (Settings Files): برخی EAها برای ذخیره وضعیت خود بین جلسات، از فایلهای سفارشی (معمولاً با پسوند .dat یا .ini) استفاده میکنند. اگر EA نتواند در پوشه مشخص شده (معمولاً MQL4/Files) به این فایلها دسترسی پیدا کند (مشکلات سطح دسترسی ویندوز)، ممکن است نتواند وضعیت قبلی خود را بازیابی کند و به دلیل عدم تعریف متغیرهای حالت، از معامله باز بماند.
نقش لاگها (Logs) در عیبیابی
همانطور که بارها اشاره شد، لاگها (Logs) یا گزارشهای ثبت شده در تبهای Experts و Journal نقشی حیاتی در تشخیص عدم اجرای ربات دارند. برای برنامهنویسان، فراتر از خواندن صرف پیامها، باید نحوه تولید پیامهای سفارشی توسط خود برنامهنویس نیز مورد توجه قرار گیرد. استفاده صحیح از تابع Print() و Comment() برای تزریق اطلاعات به لاگها و روی نمودار، به ردیابی لحظهای اجرای منطق کمک میکند.
یک استراتژی عیبیابی پیشرفته شامل تزریق خطوط Print در نقاط کلیدی کد است:
- در ابتدای
OnInit(): برای تأیید بارگذاری. - پس از اعتبارسنجی ورودیها: برای تأیید صحت پارامترها.
- در ابتدای
OnTick(): برای تأیید فراخوانی شدن تابع. - قبل از هر شرط معاملاتی: برای مشاهده مقادیر اندیکاتورها و متغیرهای محاسبه شده.
- قبل و بعد از هر فراخوانی
OrderSend(): برای ثبت پارامترهایی که قرار است ارسال شوند و کد بازگشتی از سرور.
اگر EA اجرا شود اما معاملهای نکند، باید خطوط Print را طوری تنظیم کرد که مقادیر بولین (Boolean) شرایط ورود را نشان دهند. به عنوان مثال، اگر شرط ورود ConditionA AND ConditionB است، باید خروجیهای جداگانهای برای ConditionA و ConditionB ثبت شود تا دقیقاً مشخص شود کدام بخش از منطق معاملاتی در حال شکست است. عدم وجود هرگونه خروجی در Experts پس از فعالسازی، معمولاً به معنای شکست در OnInit یا عدم فعال بودن AutoTrading است.
چکلیست کامل عیبیابی اجرا نشدن ربات در MT4
برای ساختاردهی فرآیند عیبیابی، یک چکلیست مرحلهای و سلسله مراتبی میتواند به تسریع روند تشخیص کمک کند:
مرحله ۱: بررسی سطح پلتفرم و پیکربندی عمومی
۱. دکمه AutoTrading: آیا دکمه AutoTrading در نوار ابزار MT4 به رنگ سبز است؟ (الزامی برای اجرای معاملاتی).
۲. نماد و تایمفریم: آیا EA به نماد و تایمفریم صحیح متصل است؟ آیا نماد در پنجره Market Watch باز است؟ ۳. تنظیمات EA در نمودار: پس از اتصال EA، آیا پنجره تنظیمات (Properties) باز شده است؟ آیا در تب “Common” تیک “Allow live trading” خورده است؟ ۴. تنظیمات عمومی پلتفرم: آیا در Options -> Expert Advisors، گزینه “Allow DLL imports” فعال است (در صورت نیاز به DLL)؟ آیا “Allow Automatic Trading” فعال است؟
مرحله ۲: بررسی وضعیت کامپایل و بارگذاری
۵. کامپایل موفق: آیا EA در MetaEditor بدون هیچ خطای کامپایل جدی (Error) کامپایل شده است؟ (هشدارها (Warnings) ممکن است نادیده گرفته شوند، اما خطاها باید رفع شوند).
۶. تاریخچه Experts: آیا در تب Experts پیامی مبنی بر لود شدن موفقیتآمیز EA مشاهده میشود؟ آیا پیام OnInit successful ثبت شده است؟ ۷. خطاهای OnInit: اگر پیامی مبنی بر شکست در OnInit وجود دارد، کدام خط از کد یا کدام پارامتر ورودی باعث آن شده است؟ (مثلاً خطا در محاسبات اولیه یا عدم دسترسی به فایل).
مرحله ۳: بررسی منطق و ورودیها
۸. پارامترهای ورودی (Input Parameters): آیا تمام مقادیر ورودی (Inputs) در محدوده منطقی تعریف شده توسط برنامهنویس هستند؟ آیا حجم لات (Lot Size) با حداقل/حداکثر مجاز بروکر سازگار است؟
۹. مدیریت خطا در MQL4: آیا برنامهنویس از توابع GetLastError() پس از هر فراخوانی مهم سیستمی (مثل OrderSend) استفاده کرده و آنها را در لاگها ثبت کرده است؟ ۱۰. شرایط معاملاتی: اگر EA اجرا میشود اما معاملهای نمیکند، آیا لاگها نشان میدهند که شرایط ورود به طور مداوم در تابع OnTick رد میشوند؟
مرحله ۴: بررسی محیط بروکر و شبکه
۱۱. وضعیت اتصال: آیا اتصال MT4 به سرور بروکر پایدار است؟ (بررسی آیکون وضعیت اتصال در پایین پنجره).
۱۲. Journal: آیا در تب Journal خطاهای مربوط به OrderSend (مانند خطای ۱۲۰: Requote یا خطای ۱۳۰: Invalid Stops) ثبت شده است؟ ۱۳. حساب دمو در مقابل ریل: آیا ربات در محیط دمو کار میکند اما در ریل خیر؟ (این نشاندهنده تفاوت در محدودیتهای بروکر است).
مرحله ۵: بررسی تعاملات خارجی
۱۴. DLL و Include Files: آیا فایلهای مورد نیاز (DLL/MQH) در مسیرهای صحیح قرار دارند و اجازه دسترسی در تنظیمات EA فعال است؟
۱۵. دادههای تاریخی: آیا دادههای تاریخی کافی برای نماد و تایمفریم مورد نظر در MT4 موجود است؟
پیمودن این مراحل به صورت سیستماتیک، از بررسی سطح پلتفرم تا تحلیل عمیق کد و تعامل با سرور، تضمین میکند که هیچ عامل بالقوهای در عدم اجرای ربات معاملهگر در MT4 نادیده گرفته نشود و برنامهنویس بتواند با دقت بالا ریشه مشکل را بیابد.
دیدگاهها (0)