سیگنال درست میتواند در محیطی غیرمجاز تولید شود
در یک اکسپرت معاملاتی، تولید Signal (سیگنال) و داشتن Permission (مجوز) برای اجرای معامله دو مسئله جدا هستند. ممکن است منطق استراتژی شرط ورود را درست تشخیص دهد، اما AutoTrading (معامله خودکار) در ترمینال خاموش باشد، اجازه معامله برای همان برنامه غیرفعال شده باشد، سرور معامله اکسپرت را برای حساب ممنوع کرده باشد یا حساب فقط در حالت مشاهده باشد. راهنمای رسمی MQL5 این لایهها را جداگانه معرفی میکند و برای آنها از TERMINAL_TRADE_ALLOWED، MQL_TRADE_ALLOWED، ACCOUNT_TRADE_EXPERT و ACCOUNT_TRADE_ALLOWED استفاده میکند [۱].
اگر کد فقط در لحظه OrderSend (ارسال سفارش) با خطا روبهرو شود، علت «چرا معامله نشد» دیر و مبهم کشف میشود. طراحی قابلتست بهتر است پیش از ساخت درخواست نهایی یک Trade Permission Gate (گیت مجوز معامله) داشته باشد. این گیت باید نتیجه هر کنترل را جدا ثبت کند و در صورت بستهبودن هر لایه، خروجی روشن «اجازه ارسال سفارش نداریم» بدهد؛ نه اینکه با Retry (تلاش مجدد) پیدرپی سرور را بمباران کند.
چهار سطح مجوز را از هم جدا لاگ کن
سطح اول ترمینال است: TERMINAL_TRADE_ALLOWED نشان میدهد معامله خودکار در تنظیمات عمومی ترمینال مجاز است یا نه. سطح دوم خود برنامه است: MQL_TRADE_ALLOWED بررسی میکند آیا برای همین EA یا Script (اسکریپت) اجازه استفاده از توابع معاملاتی فعال شده است. سطح سوم سرور و حساب است: ACCOUNT_TRADE_EXPERT مشخص میکند معامله توسط Expert Advisor (اکسپرت معاملاتی) برای حساب مجاز است و ACCOUNT_TRADE_ALLOWED مجوز کلی معامله حساب را نشان میدهد [۱، ۲].
این چهار مقدار را در یک Boolean (بولی) نهایی گم نکن. در لاگ بنویس کدام لایه بسته است. اگر حساب با Investor Password (رمز سرمایهگذار/فقطخواندنی) متصل شده باشد یا اتصال سرور مشکل داشته باشد، ACCOUNT_TRADE_ALLOWED میتواند false شود [۱]. بنابراین پیام «TRADE_BLOCKED» بدون علت کافی نیست؛ یک گزارش خوب مثلاً میگوید terminal=true، program=true، expert_account=false تا عیبیابی مستقیم شود.
بعد از حساب، خود نماد و سشن معاملاتی را بررسی کن
حتی وقتی حساب و اکسپرت اجازه معامله دارند، خود Symbol (نماد) میتواند محدودیت مستقل داشته باشد. ویژگی SYMBOL_TRADE_MODE میتواند حالتهایی مانند DISABLED (معامله ممنوع)، LONGONLY (فقط خرید)، SHORTONLY (فقط فروش)، CLOSEONLY (فقط بستن پوزیشن) یا FULL (بدون محدودیت عمومی) را گزارش کند [۳]. پس برای یک سیگنال BUY، صرف «فعالبودن حساب» کافی نیست؛ جهت درخواست نیز باید با حالت معامله همان نماد سازگار باشد.
زمان نیز یک ورودی مستقل است. SymbolInfoSessionTrade ساعت شروع و پایان سشنهای معاملاتی نماد را برای روز هفته برمیگرداند و مستندات تأکید میکند تاریخ بخش datetime را باید نادیده گرفت و مقدار برگشتی را بهعنوان زمان روز تفسیر کرد [۴]. یک نماد میتواند در روز چند سشن و بین آنها Break (وقفه) داشته باشد. بنابراین بهتر است برنامه همه session_indexهای موجود آن روز را بررسی کند و ساعت فعلی سرور را با بازه معتبر همان نماد مقایسه کند، نه اینکه یک جدول ساعت ثابت را برای همه بروکرها در کد Hard-code (ثابتنویسی) کند.
مثال آموزشی: سیگنال BUY هست، اما گیت باید NO SEND بدهد
فرض کن در یک حساب آزمایشی، استراتژی در ساعت فرضی ۱۲:۱۰ یک سیگنال BUY تولید میکند. TERMINAL_TRADE_ALLOWED و MQL_TRADE_ALLOWED هر دو true هستند و حساب نیز معامله اکسپرت را مجاز میداند. اما فرض کنیم SYMBOL_TRADE_MODE برای همان نماد در آن لحظه CLOSEONLY گزارش شده است. این سناریو کاملاً فرضی است و وضعیت واقعی هیچ بروکر یا حساب BamaUp را توصیف نمیکند.
خروجی درست گیت در این مثال «سیگنال نامعتبر است» نیست؛ سیگنال میتواند از دید استراتژی معتبر باشد. خروجی مهندسی باید چیزی مانند SIGNAL_VALID / TRADE_BLOCKED_SYMBOL_MODE باشد. با این تفکیک، وقتی بعداً عملکرد الگوریتم را ارزیابی میکنی میفهمی معامله بهخاطر منطق ورود حذف نشده، بلکه محیط اجرا اجازه سفارش جدید نداده است. همین الگو برای خارجبودن از سشن یا ممنوعبودن معامله در سطح حساب نیز قابل استفاده است.
اقدام عملی: یک ماتریس پذیرش پنجحالته بساز
برای تست بعدی در حساب دمو، پنج حالت بساز و بدون تغییر منطق سیگنال نتیجه را ثبت کن: AutoTrading ترمینالال خاموش؛ اجازه معامله همان EA خاموش؛ ACCOUNT_TRADE_EXPERT غیرمجاز یا یک حالت قابلشبیهسازی مشابه؛ نماد با محدودیت جهت یا CLOSEONLY؛ و زمانی خارج از Trading Session (سشن معاملاتی). انتظار هر تست را قبل از اجرا بنویس: سفارش نباید ارسال شود، دلیل باید در لاگ مشخص باشد و با بازگشت مجوز، سیستم نباید سفارشهای انباشته یا تکراری قبلی را ناگهان ارسال کند.
منابع فنی این مقاله در ۴ اکتبر ۲۰۲۶ دوباره بررسی شدند. مجوزهای واقعی، سشنها و حالت معامله نماد توسط محیط ترمینال، سرور و کارگزار تعیین میشوند و میتوانند بین حسابها یا در طول زمان تغییر کنند. این کنترل فقط یک لایه پیشبررسی نرمافزاری است و موفقیت OrderSend یا اجرای بازار را تضمین نمیکند. برای ادامه، مسیر رایگان اتوترید و چکلیست ارزیابی اکسپرت BamaUp را ببین؛ مطلب حاضر توصیه معامله یا وعده سود نیست.