برنامه‌نویسی ربات معامله‌گر

ساخت اکسپرت با هوش مصنوعی: کجا کمک می‌کند و کجا خطرناک است

پاسخ کوتاه: مدل‌های زبانی مثل ChatGPT، Claude، Gemini و Copilot در چند دقیقه اسکلت یک اکسپرت MQL5 را می‌نویسند، خطای کامپایل را توضیح می‌دهند و قاعده‌های نوشتاری یک استراتژی را به کد نزدیک می‌کنند. همین ابزارها گاهی تابع ناموجود می‌سازند، MQL4 و MQL5 را قاطی می‌کنند و جزئیات اجرای سفارش و مدیریت ریسک را جا می‌اندازند. اکسپرتی که هوش مصنوعی نوشته، فقط بعد از کامپایل بدون هشدار، بازبینی خط‌به‌خط کد سفارش و ریسک، تست با تیک واقعی در Strategy Tester و چند هفته اجرا روی حساب دمو به حساب واقعی نزدیک می‌شود.

هوش مصنوعی در اکسپرت‌نویسی دقیقاً چه می‌کند؟

مدل زبانی کد را از روی الگوهایی که پیش‌تر دیده پیش‌بینی می‌کند. متاتریدر را اجرا نمی‌کند، به سرور بروکر وصل نیست و نمی‌تواند بک‌تست بگیرد. خروجی‌اش متنی است که شبیه کد درست است و بیشتر وقت‌ها هم درست است، ولی «شبیه درست» با «امتحان‌شده» فرق دارد. هرچه درخواست دقیق‌تر و کوتاه‌تر باشد، خطا کمتر است؛ هرچه کد طولانی‌تر و منطق معاملاتی پیچیده‌تر باشد، خطاها پنهان‌تر می‌شوند.

این مقاله دربارهٔ نوشتن کد اکسپرت با کمک هوش مصنوعی است. اگر منظورتان رباتی است که خودش برای تصمیم معاملاتی از یادگیری ماشین استفاده می‌کند، ربات هوش مصنوعی در ترید را بخوانید. اگر هم می‌خواهید اصلاً کد ننویسید، طراحی ربات بدون نیاز به برنامه‌نویسی ابزارهای ساخت بدون کد را توضیح داده است.

کجا واقعاً کمک می‌کند

  • اسکلت اکسپرت: توابع OnInit، OnTick و OnDeinit، پارامترهای ورودی، تشخیص کندل جدید و نوشتن لاگ را سریع و مرتب می‌سازد.
  • توضیح خطای کامپایل: پیام‌های MetaEditor را ساده توضیح می‌دهد و راه رفعشان را پیشنهاد می‌کند.
  • شفاف کردن استراتژی: اگر قاعده‌های ورود و خروج را بنویسید، پیش از کدنویسی جاهای مبهم و متناقض را نشان می‌دهد.
  • پیش‌نویس تبدیل MQL4 به MQL5: ساختار کلی را جابه‌جا می‌کند، ولی بخش سفارش‌ها و اندیکاتورها را باید دستی بازنویسی و بررسی کرد.
  • مستندسازی: کامنت، توضیح پارامترها و راهنمای تنظیم را خوب می‌نویسد.
  • ابزارهای کمکی: اسکریپت‌های کوچک برای خروجی گرفتن از تاریخچه معاملات یا آمار بک‌تست، که اشتباهشان پولی را به خطر نمی‌اندازد.

کجا خطرناک است

تابع و ثابتی که وجود ندارد

مدل زبانی گاهی نامی می‌سازد که به نظرش «باید» وجود داشته باشد. نمونه‌ای که در بازبینی متن‌های آموزشی دیده‌ایم، تابعی به نام OnInitIndicator بود که نه در MQL4 هست و نه در MQL5 (توابع رویداد واقعی را در تابع OnInit در MQL4 و MQL5 ببینید). اگر کد کامپایل نشود، خطا را فوری می‌بینید. خطرناک‌تر وقتی است که ثابتی اشتباه ولی موجود به کار رفته و کد بدون هشدار کامپایل می‌شود.

قاطی کردن MQL4 و MQL5

این یکی از رایج‌ترین خطاهای کد ماشینی است. در MQL4 تابع OrderSend شماره تیکت برمی‌گرداند و اندیکاتوری مثل iMA مستقیم مقدار می‌دهد. در MQL5 سفارش با ساختار MqlTradeRequest یا کلاس CTrade فرستاده می‌شود و نتیجه‌اش در retcode می‌آید. iMA هم فقط یک handle برمی‌گرداند که مقدارش را باید با CopyBuffer خواند. کدی که این دو را با هم ترکیب کند، یا کامپایل نمی‌شود یا اندیکاتور را در هر تیک از نو می‌سازد. تفاوت‌ها را در تفاوت MQL4 و MQL5 در ساخت Expert Advisor و روش درست خواندن اندیکاتور را در فراخوانی اندیکاتور سفارشی با iCustom نوشته‌ایم.

جزئیات اجرای سفارش

«سفارش خرید بفرست» ساده به نظر می‌رسد، ولی روی حساب واقعی این موارد تعیین می‌کند سفارش اجرا شود یا رد:

  • حداقل فاصله حد ضرر و حد سود از قیمت (SYMBOL_TRADE_STOPS_LEVEL) و سطح فریز (SYMBOL_TRADE_FREEZE_LEVEL)؛
  • گام، حداقل و حداکثر حجم نماد (SYMBOL_VOLUME_STEP، SYMBOL_VOLUME_MIN و SYMBOL_VOLUME_MAX)؛
  • حالت پر شدن سفارش (FOK، IOC یا Return) که هر بروکر فقط بعضی از آن‌ها را می‌پذیرد؛
  • نوع حساب: در حساب Netting هر نماد فقط یک پوزیشن دارد و کدی که چند پوزیشن هم‌زمان فرض کرده، روی آن رفتار دیگری پیدا می‌کند؛
  • بررسی نتیجه: بعد از هر سفارش باید retcode خوانده و رد شدن ثبت شود. خطاهای رایج و معنی آن‌ها را در مدیریت خطاهای OrderSend در ربات آورده‌ایم.

این تکه کد الگوی درست ارسال سفارش در MQL5 است: حجم با مشخصات نماد گرد می‌شود، فاصله حد ضرر سنجیده می‌شود و نتیجه سفارش در لاگ می‌ماند.

#include <Trade\Trade.mqh>
CTrade trade;

// Round a lot size to what the symbol accepts; 0 means "too small, do not trade".
double NormalizeVolume(const double lots)
  {
   double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
   double vmin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double vmax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   double v    = MathFloor(lots / step) * step;
   if(v < vmin)
      return 0.0;
   return MathMin(v, vmax);
  }

// The broker's minimum distance between the price and the stop loss.
bool StopAllowed(const double price, const double sl)
  {
   long level = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   return sl == 0.0 || MathAbs(price - sl) >= level * _Point;
  }

void OpenBuy(const double lots, const double sl, const double tp)
  {
   double vol = NormalizeVolume(lots);
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   if(vol <= 0.0 || !StopAllowed(ask, sl))
      return;
   trade.SetExpertMagicNumber(20261023);
   trade.SetDeviationInPoints(20);
   if(!trade.Buy(vol, _Symbol, 0.0, sl, tp, "checked order"))
      PrintFormat("Buy failed: retcode=%u (%s)", trade.ResultRetcode(), trade.ResultRetcodeDescription());
  }

مدیریت ریسک ناقص

اگر در درخواست ننویسید ریسک هر معامله چقدر است، مدل معمولاً حجم ثابت می‌گذارد یا فرمولی می‌نویسد که ارزش تیک نماد را نادیده می‌گیرد. حجم درست از روی درصد ریسک، فاصله حد ضرر و ارزش تیک (SYMBOL_TRADE_TICK_VALUE و SYMBOL_TRADE_TICK_SIZE) حساب می‌شود؛ روشش در محاسبه Lot Size در ربات معامله‌گر آمده است. گاهی هم بدون اینکه بخواهید، دو برابر کردن حجم بعد از ضرر را پیشنهاد می‌کند؛ خطر این کار را در ریسک استفاده از ربات‌های مارتینگل توضیح داده‌ایم.

بک‌تست فریبنده

هوش مصنوعی Strategy Tester را اجرا نمی‌کند؛ هر عددی که دربارهٔ سود یا Win Rate یک استراتژی بگوید، حدس است. اگر نتیجه بک‌تست را به او بدهید و بپرسید چطور بهترش کند، معمولاً پارامترها را به گذشته فیت می‌کند (Overfitting). تست را با حالت Every tick based on real ticks، اسپرد و کمیسیون واقعی و چند دوره زمانی جدا بگیرید و بعد روی حساب دمو جلو بروید. چرا تست کوتاه کافی نیست را در چرا تست کوتاه‌مدت ربات گمراه‌کننده است و تفاوت دو نوع تست را در تفاوت Forward Test و Backtest ببینید.

محرمانگی و امنیت

  • رمز حساب معاملاتی، کلید API صرافی یا هر اطلاعات ورودی را هیچ‌وقت در چت‌بات ننویسید.
  • اگر استراتژی‌تان ارزش تجاری دارد، پیش از وارد کردن جزئیات، شرایط استفاده آن سرویس از داده‌ها را بخوانید.
  • کدی که با #import فایل DLL بار می‌کند یا با WebRequest به نشانی ناشناسی داده می‌فرستد، باید دلیل روشن داشته باشد. متاتریدر هر دو را فقط با اجازه صریح شما در تنظیمات ترمینال اجرا می‌کند.

روند امن ساخت اکسپرت با کمک هوش مصنوعی

  1. استراتژی را بدون ابهام بنویسید: نماد، تایم‌فریم، شرط ورود و خروج روی کندل بسته‌شده، حد ضرر و حد سود، ریسک هر معامله، ساعت‌های معامله و حداکثر پوزیشن هم‌زمان.
  2. درخواست را محدود کنید: زبان را مشخص کنید (MQL5 یا MQL4)، فقط کلاس‌های استاندارد را مجاز کنید و بخواهید هر تابعی را که از وجودش مطمئن نیست، صریح بگوید.
  3. در MetaEditor کامپایل کنید و هیچ هشداری را نادیده نگیرید تا معنی‌اش را بفهمید.
  4. بخش سفارش و ریسک را خط‌به‌خط بخوانید (چک‌لیست پایین همین صفحه).
  5. در Strategy Tester تست کنید: با تیک واقعی، چند دوره جدا و اسپرد بالاتر از معمول (آموزش استفاده از Strategy Tester در متاتریدر).
  6. دو تا چهار هفته روی حساب دمو اجرا کنید و لاگ اکسپرت را با معاملات مقایسه کنید.
  7. با حجم کوچک و سقف ضرر روزانه وارد حساب واقعی شوید.

نمونه یک درخواست دقیق:

یک اکسپرت MQL5 بنویس، نه MQL4، که فقط از کلاس CTrade استفاده کند. ورود: تقاطع میانگین متحرک ۲۰ و ۵۰ روی کندل بسته‌شده تایم‌فریم H1. ریسک هر معامله ۱٪ موجودی، حد ضرر ۱٫۵ برابر ATR(14) و حد سود دو برابر حد ضرر. حجم را با SYMBOL_VOLUME_STEP گرد کن، فاصله حد ضرر را با SYMBOL_TRADE_STOPS_LEVEL بسنج و بعد از هر سفارش retcode را در لاگ بنویس. اگر از وجود تابعی در MQL5 مطمئن نیستی، بگو.

چک‌لیست بازبینی اکسپرتی که هوش مصنوعی نوشته

بخش چه چیزی را بررسی کنید
زبان و توابع همه کد MQL5 است (یا همه MQL4) و هیچ تابع ناآشنایی بدون جست‌وجو در مستندات رسمی نمانده است.
اندیکاتورها در MQL5 هر handle یک بار در OnInit ساخته و مقدارش با CopyBuffer خوانده می‌شود؛ شماره کندل (۰ یا ۱) با «کندل بسته‌شده» در استراتژی جور است.
کندل جدید منطق ورود در هر کندل فقط یک بار اجرا می‌شود، نه در هر تیک.
حجم از روی ریسک حساب و با گام، حداقل و حداکثر حجم نماد گرد می‌شود؛ حجم صفر یعنی معامله نشود.
حد ضرر و حد سود همراه سفارش فرستاده می‌شوند و از حداقل فاصله مجاز بروکر کمتر نیستند.
نتیجه سفارش retcode خوانده و ثبت می‌شود و تلاش دوباره محدود است، نه یک حلقه بی‌پایان.
Magic Number اکسپرت فقط پوزیشن‌های خودش را مدیریت می‌کند، نه معامله دستی یا ربات دیگر.
ساعت و اسپرد ساعت سرور بروکر و فیلتر اسپرد بالا در نظر گرفته شده است.
محافظ‌ها سقف تعداد پوزیشن، سقف ضرر روزانه و توقف بعد از خطای پیاپی وجود دارد.
مجوزها DLL و WebRequest فقط وقتی هست که لازم و شفاف باشد.

کی اکسپرت‌نویس حرفه‌ای لازم است؟

اگر قرار است اکسپرت با پول واقعی کار کند، روی چند نماد یا چند تایم‌فریم تصمیم بگیرد، با قوانین حساب‌های پراپ سازگار باشد یا سال‌ها نگهداری شود، هزینه یک اشتباه از هزینه نوشتن حرفه‌ای بیشتر است. هوش مصنوعی برای یادگیری، نمونه‌سازی سریع و ابزارهای کمکی عالی است. برای کدی که مستقیم سفارش می‌فرستد، بازبینی کسی لازم است که MQL و رفتار بروکرها را می‌شناسد.

پرسش‌های متداول

آیا هوش مصنوعی می‌تواند اکسپرت سودده بنویسد؟

هوش مصنوعی استراتژی‌ای را که شما توصیف می‌کنید به کد تبدیل می‌کند. سودده بودن به خود استراتژی، شرایط بازار و تست درست بستگی دارد، نه به ابزاری که کد را نوشته. هیچ ابزار و هیچ برنامه‌نویسی نمی‌تواند سود را تضمین کند.

کدام هوش مصنوعی برای MQL5 بهتر است؟

مدل‌های رایج همین دسته خطاها را دارند و کیفیتشان با هر نسخه تغییر می‌کند. فرق اصلی را روند کار شما می‌سازد: درخواست دقیق، کامپایل، بازبینی و تست. مدلی را ترجیح دهید که وقتی مطمئن نیست، صریح می‌گوید.

می‌شود استراتژی TradingView را با هوش مصنوعی به MQL5 تبدیل کرد؟

پیش‌نویسش بله. ولی شماره‌گذاری کندل‌ها، محاسبه روی کندل بسته یا باز و رفتار repaint در Pine Script و MQL5 فرق دارد و خطای پنهان می‌سازد. جزئیات را در تبدیل استراتژی TradingView (Pine Script) به اکسپرت متاتریدر ببینید.

اگر مدلم پایتونی باشد چه؟

کتابخانه رسمی MetaTrader5 راه اتصال پایتون به ترمینال است (اتصال پایتون به متاتریدر ۵). همان قاعده‌های بازبینی و تست آنجا هم صدق می‌کند.

اگر می‌خواهید استراتژی‌تان از ابتدا به اکسپرت نوشته‌شده و تست‌شده تبدیل شود، صفحه اکسپرت نویسی MQL5 و سفارش ربات متاتریدر روند کار را توضیح می‌دهند. استراتژی‌تان را برای ارزیابی اولیه بفرستید.

منابع

هشدار ریسک: معامله با اهرم ممکن است به از دست رفتن تمام سرمایه منجر شود. کدهای این مقاله نمونه‌اند؛ پیش از هر استفاده روی حساب واقعی، آن‌ها را روی حساب دمو امتحان کنید.

هشدار ریسک: این مطلب جنبه آموزشی دارد و توصیه سرمایه‌گذاری نیست. معامله در بازارهای مالی با ریسک از دست دادن سرمایه همراه است و نتایج گذشته یا بک‌تست تضمینی برای آینده نیست.

نویسنده

تیم متااکسپرت در طراحی و برنامه‌نویسی ربات‌های معامله‌گر و اکسپرت‌های متاتریدر با MQL4 و MQL5 تخصص دارد و تجربه‌های عملی خود را در قالب این مقالات منتشر می‌کند.

دیدگاه‌ها

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *