اول مشخص کن چه چیزی واقعاً رد شده است
گاهی در متاتریدر ۵ یا MT5، ربات معاملهگر یا اکسپرت (Expert Advisor) خطای Invalid Stops، یعنی «سطوح توقف نامعتبر» را نشان میدهد. دیدن این پیام بهتنهایی ثابت نمیکند مشکل از استراتژی، سرعت VPS یا قیمت بروکر است. باید تشخیص بدهی درخواست مربوط به گذاشتن حد ضرر (Stop Loss)، حد سود (Take Profit)، سفارش معلق یا تغییر یک سفارش قبلی بوده است. سپس قیمت مرجع و محدودیتهای همان نماد و همان لحظه را ثبت کنی.
طبق فهرست رسمی کدهای سرور MQL5، مقدار 10016 مربوط به TRADE_RETCODE_INVALID_STOPS است [۴]. مقدار 10029 یا TRADE_RETCODE_FROZEN یک وضعیت متفاوت است و به سفارش یا موقعیت «فریز شده» اشاره میکند [۴]. این دو خطا را در دفتر آزمایش یکی نکن. اگر کد دیگری دیدهای، ابتدا همان کد دقیق را بخوان؛ حدس زدن از روی یک عبارت کوتاه، عیبیابی نیست.
Stops Level و Freeze Level یک مفهوم نیستند
ویژگی SYMBOL_TRADE_STOPS_LEVEL حداقل فاصله تعیینشده برای سطوح توقف را به واحد Point یا «پوینت نماد» معرفی میکند. ویژگی SYMBOL_TRADE_FREEZE_LEVEL محدودهای را به واحد پوینت مشخص میکند که برخی عملیات معاملاتی در نزدیکی قیمت، محدود یا فریز میشوند. هر دو در مشخصات نماد بروکر تعریف میشوند و با SymbolInfoInteger قابل خواندناند [۱، ۲]. عدد این تنظیمات را از یک اسکرینشات قدیمی برای همه بروکرها و حسابها تعمیم نده.
Point را با Pip یا «پیپ» قاطی نکن. مقدار یک پوینت به دقت نمایش قیمت آن نماد وابسته است؛ ویژگی SYMBOL_POINT آن را نشان میدهد [۱]. همچنین قیمت مناسب برای سنجش فاصله به نوع درخواست و سمت خرید یا فروش بستگی دارد. برای محاسبه دقیق باید مشخصات نماد، مظنه تازه Bid/Ask و دستور همان بروکر را در لحظه بررسی کنی. این مقاله یک فرمول همگانی برای تمام سفارشهای بازار ارائه نمیکند.
مثال عددی کاملاً فرضی، نه قیمت زنده
فرض کن نمادی ساختگی با پوینت 0.0001 داریم؛ Bid فرضی 1.0000 و Ask فرضی 1.0002 است. برای آموزش فرض میکنیم حداقل فاصله توقف برابر ۲۰ پوینت باشد. در یک آزمایش روی حد ضرر خرید، سطح 0.9985 تا Bid فرضی فقط ۱۵ پوینت فاصله دارد. پس نسبت به حداقل ۲۰ پوینتی فرضشده کافی نیست. اگر سطح به 0.9975 منتقل شود، فاصله عددی ۲۵ پوینت میشود؛ اما این فقط حسابکردن فاصله است، نه ضمانت پذیرش سفارش یا تصمیم مناسب درباره ریسک.
در همین سناریوی کاملاً ساختگی اگر محدوده Freeze Level را ۱۰ پوینت فرض کنیم، ممکن است تلاش برای تغییر سطح یک سفارش نزدیک قیمت با قاعده فریز برخورد کند. قواعد دقیق به نوع سفارش و شرایط کارگزار وابستهاند؛ کد بازگشتی واقعی را ثبت کن. صرفاً برای دورزدن خطا، حد ضرر را عقب نبر. دورتر بردن استاپ میتواند زیان احتمالی را بالا ببرد و اندازه موقعیت قبلی را نامتناسب کند.
یک تست دمو بدون ارسال سفارش طراحی کن
ابتدا در حساب دمو، معامله واقعی و حتی ارسال سفارش آزمایشی را غیرفعال کن. نام بروکر و نماد، ساعت ثبت، Bid/Ask، مقدار Point، Stops Level، Freeze Level، نوع درخواست و مقدار سطح پیشنهادی را در یک جدول بنویس. سه حالت فرضی بساز: سطح زیر فاصله مجاز، سطح بالاتر از حداقل فاصله، و تغییر نزدیک محدوده فریز. سپس فقط خروجی محاسبه داخلی فیلتر اکسپرت را با انتظار از پیش نوشتهشده مقایسه کن.
یک ردیف مستقل هم برای «اطلاعات موجود نیست» بگذار: نماد در Market Watch یا «دیدهبان بازار» انتخاب نشده، مظنه تازه نرسیده یا یکی از ویژگیها خوانده نشده است. مستند SymbolInfoInteger خطاهای مربوط به نماد ناشناخته و انتخابنشدن نماد را جدا میکند [۲]. در این حالت بهتر است فیلتر با علت روشن ارزیابی را متوقف کند، نه اینکه عدد صفر یا حدس را بهعنوان داده معتبر جا بزند.
OrderCheck کمک میکند، ولی تعهد اجرا نیست
تابع OrderCheck درخواست و نتیجه بررسی را در ساختارهای MqlTradeRequest و MqlTradeCheckResult بررسی میکند. مرجع رسمی توضیح میدهد که موفقیت بررسی پایه به معنی تضمین اجرای درخواست نیست [۳]. بنابراین اگر در محیط مجازِ بررسی بدون معامله از نتیجه این تابع استفاده میکنی، کد و توضیح بررسی را جدا از نتیجه واقعی OrderSend نگهدار. در این تمرین نیازی به اجرای OrderSend یا فعالکردن AutoTrading نیست.
فرقی ندارد ربات خرید باشد یا فروش؛ یک داده خوب شامل زمان، نماد، سمت معامله، نوع سفارش، مقدارهای محدودیت و تصمیم فیلتر است. در آزمون بعدی یک متغیر را عوض کن تا معلوم شود چرا تصمیم تغییر کرده است. اگر نتیجه با انتظار نمیخواند، اول تفاوت Bid و Ask، ارزش Point، تازگی داده و مجاز بودن نوع سفارش را بررسی کن؛ بعد سراغ فرضیههای پیچیدهتر برو.
چه وقت ارزیابی تخصصی اکسپرت ارزش دارد؟
اگر فروشنده ربات فقط اسکرینشات سود نشان میدهد ولی لاگ رد سفارشها، حد ضررها و فرضهای هزینه اجرا را ارائه نمیکند، هنوز اطلاعات لازم برای اعتماد به عملکرد در اختیار نداری. با فایل EX5 میتوان رفتار قابل مشاهده را آزمود؛ ارزیابی منطق درون کد نیازمند منبع MQ5 و وابستگیهای مربوط است. بررسی حرفهای هم نتیجه سود آینده را تضمین نمیکند و نباید جای تمرین و مدیریت ریسک را بگیرد.
برای قدم بعد، چکلیست همین تمرین را روی دمو اجرا کن و اگر اکسپرتی داری که مدام سطح توقف را رد میکند، بخش ارزیابی اکسپرت باماآپ را ببین. محدوده بررسی و هزینه خدمت باید پیش از هر خرید مشخص باشد. این متن آموزش فنی است، نه سیگنال معاملاتی، سفارش خرید، تضمین سود یا گزارش نتایج آزمایش واقعی.