اکسپرت نویسی چیست و چرا باید یاد بگیریم؟

تصور کنید یک معامله‌گر حرفه‌ای دارید که ۲۴ ساعت شبانه‌روز، هفت روز هفته، بدون خستگی، بدون احساسات و بدون اشتباهات انسانی، دقیقاً بر اساس استراتژی شما معامله می‌کند. این همان چیزی است که اکسپرت نویسی در اختیارتان می‌گذارد.

اکسپرت (Expert Advisor یا EA) در واقع یک برنامه کامپیوتری است که در پلتفرم متاتریدر (MetaTrader 4 یا 5) اجرا می‌شود و می‌تواند به صورت خودکار بازار فارکس را تحلیل کند، سیگنال بدهد یا حتی معامله باز و بسته کند. اکسپرت نویسی فرایند نوشتن این برنامه با زبان‌های برنامه‌نویسی MQL4 یا MQL5 است.

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

این مقاله برای چه کسانی مناسب است؟

اگر استراتژی معاملاتی دارید و می‌خواهید آن را به ربات تبدیل کنید، یا می‌خواهید از اکسپرت‌های آماده استفاده هوشمندانه‌تری داشته باشید، این مقاله دقیقاً برای شماست.

تفاوت اکسپرت، اندیکاتور و اسکریپت در متاتریدر

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

ابزار
کارکرد اصلی
آیا معامله می‌کند؟
نوع اجرا
Expert Advisor (EA)
تحلیل + معامله خودکار
بله (تمام یا نیمه اتوماتیک)
پیوسته روی چارت
Custom Indicator
نمایش اطلاعات روی چارت
خیر
پیوسته روی چارت
Script
انجام یک کار مشخص
بله (یک‌بار)
یک‌بار و تمام

انواع اکسپرت در فارکس

انواع اکسپرت ها

اکسپرت‌ها از نظر درجه اتوماسیون به دو دسته اصلی تقسیم می‌شوند. انتخاب درست نوع اکسپرت، یکی از مهم‌ترین تصمیماتی است که باید بگیرید:

۱. اکسپرت تمام اتوماتیک (Fully Automated EA)

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

۲. اکسپرت نیمه اتوماتیک (Semi-Automated EA)

این نوع اکسپرت تحلیل را انجام می‌دهد و به شما سیگنال می‌دهد، اما تصمیم نهایی برای ورود به معامله با شماست. برای معامله‌گرانی که می‌خواهند کنترل بیشتری داشته باشند، این گزینه بهتر است.

توصیه برای مبتدیان

اگر تازه با اکسپرت نویسی آشنا می‌شوید، ابتدا اکسپرت نیمه اتوماتیک بسازید. این کار ریسک را کاهش می‌دهد و به شما زمان می‌دهد تا رفتار اکسپرت را بشناسید.

چرا اکسپرت نویسی یاد بگیریم؟ (مزایا و معایب)

مزایای استفاده از اکسپرت

  • معاملات ۲۴ ساعته: در حالی که شما خواب هستید، اکسپرت بازار را رصد می‌کند.
  • حذف احساسات: ترس، طمع و هیجان وارد تصمیمات نمی‌شود.
  • اجرای دقیق استراتژی: اکسپرت هیچ‌وقت قوانین استراتژی شما را فراموش نمی‌کند.
  • بک‌تست روی داده‌های تاریخی: می‌توانید عملکرد استراتژی‌تان را روی سال‌ها داده تاریخی آزمایش کنید.
  • مدیریت چند حساب همزمان: یک اکسپرت می‌تواند چندین جفت ارز یا حساب را همزمان مدیریت کند.
  • سرعت اجرا: اکسپرت در کسری از ثانیه واکنش نشان می‌دهد؛ چیزی که برای انسان ممکن نیست.

معایب و ریسک‌های اکسپرت

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

هیچ اکسپرتی به صورت دائمی و بدون نظارت نمی‌تواند سودآور باشد. همیشه اکسپرت‌هایتان را زیر نظر داشته باشید و حتماً حد ضرر کلی (Drawdown Limit) تعریف کنید.

آموزش اکسپرت نویسی: آشنایی با MQL4 و MQL5

اکسپرت نویسی در متاتریدر

برای اکسپرت نویسی باید با زبان‌های MQL4 (برای متاتریدر ۴) یا MQL5 (برای متاتریدر ۵) آشنا باشید. این زبان‌ها شباهت زیادی به C++ دارند و نسبتاً یادگیری آن‌ها آسان است.

ویژگی
MQL4
MQL5
پلتفرم
MetaTrader 4
MetaTrader 5
سطح پیچیدگی
ساده‌تر (مناسب مبتدی)
پیشرفته‌تر
سرعت بک‌تست
کندتر
بسیار سریع‌تر
محبوبیت در ایران
بیشتر
در حال رشد
پشتیبانی بروکرها
تقریباً همه بروکرها
بروکرهای مدرن

ساختار پایه یک اکسپرت در MQL4

هر اکسپرت MQL4 از سه تابع اصلی تشکیل می‌شود. درک این سه تابع، پایه و اساس آموزش اکسپرت نویسی است:

۱. تابع OnInit()

این تابع فقط یک بار، هنگام بارگذاری اکسپرت روی چارت اجرا می‌شود. برای مقداردهی اولیه متغیرها، بررسی تنظیمات و آماده‌سازی اکسپرت از این تابع استفاده می‌شود.

int OnInit()
  {
   // کدهای مقداردهی اولیه
   Print("اکسپرت با موفقیت بارگذاری شد");
   return(INIT_SUCCEEDED);
  }

۲. تابع OnDeinit()

این تابع هنگام حذف اکسپرت از چارت یا بسته شدن متاتریدر اجرا می‌شود. برای آزادسازی منابع و پاکسازی استفاده می‌شود.

void OnDeinit(const int reason)
  {
   // پاکسازی و آزادسازی منابع
   Print("اکسپرت متوقف شد");
  }

۳. تابع OnTick()

این مهم‌ترین تابع است. با هر تیک قیمت (هر بار که قیمت تغییر می‌کند) اجرا می‌شود. تمام منطق اصلی اکسپرت، یعنی بررسی سیگنال‌ها و باز و بستن معاملات، در این تابع قرار می‌گیرد.

void OnTick()
  {
   // منطق اصلی اکسپرت اینجاست
   double currentPrice = Ask;
   double maValue = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
   
   if(currentPrice > maValue)
     {
      // شرایط ورود به معامله خرید
     }
  }

آموزش گام به گام: ساخت اولین اکسپرت در متاتریدر ۴

حالا وقت عمل است. یک اکسپرت ساده اما کاربردی می‌سازیم که بر اساس تقاطع دو میانگین متحرک (Moving Average Crossover) معامله می‌کند.

مرحله اول: باز کردن MetaEditor

در متاتریدر ۴، کلیدهای ترکیبی Alt + F4 یا گزینه منو Tools → MetaQuotes Language Editor را بزنید. همچنین می‌توانید از نوار ابزار، آیکون MetaEditor را کلیک کنید.

مرحله دوم: ایجاد فایل جدید

در MetaEditor از منوی File → New (یا کلید Ctrl+N) یک فایل جدید بسازید. پنجره‌ای باز می‌شود با گزینه‌های زیر:

  • Expert Advisor – برای ساخت ربات معامله‌گر
  • Custom Indicator – برای ساخت اندیکاتور
  • Script – برای ساخت اسکریپت

گزینه Expert Advisor را انتخاب کنید و Next را بزنید.

مرحله سوم: تنظیمات اولیه اکسپرت

در صفحه بعد، اطلاعات زیر را وارد کنید:

  • Name: نام اکسپرت‌تان (مثلاً MA_Crossover_EA)
  • Author: نام خودتان
  • Link: آدرس وب‌سایت (اختیاری)

بقیه صفحات را با Next رد کنید تا به Finish برسید.

مرحله چهارم: نوشتن کد اکسپرت

حالا یک فایل با ساختار پایه برای شما آماده شده. کد زیر را جایگزین کنید. این یک اکسپرت کامل و کارآمد بر اساس تقاطع دو MA است:

//+------------------------------------------------------------------+
//|  MA Crossover Expert Advisor                                      |
//|  آموزش اکسپرت نویسی - خانه سرمایه                              |
//+------------------------------------------------------------------+
#property copyright "Khane Sarmaye"
#property version   "1.00"
#property strict

// ===== پارامترهای ورودی (قابل تنظیم توسط کاربر) =====
input int    FastMA_Period = 10;    // دوره میانگین سریع
input int    SlowMA_Period = 20;    // دوره میانگین کند
input double LotSize       = 0.1;  // حجم معامله
input int    StopLoss      = 50;   // حد ضرر (پیپ)
input int    TakeProfit    = 100;  // حد سود (پیپ)
input int    MagicNumber   = 12345;// شناسه اکسپرت

// ===== تابع اجرا با هر تیک =====
void OnTick()
  {
   // محاسبه مقدار دو میانگین متحرک
   double fastMA_now  = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,0);
   double slowMA_now  = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,0);
   double fastMA_prev = iMA(NULL,0,FastMA_Period,0,MODE_SMA,PRICE_CLOSE,1);
   double slowMA_prev = iMA(NULL,0,SlowMA_Period,0,MODE_SMA,PRICE_CLOSE,1);

   // بررسی وجود معامله باز
   bool buyOpen  = false;
   bool sellOpen = false;
   for(int i = OrdersTotal()-1; i >= 0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)  buyOpen  = true;
            if(OrderType()==OP_SELL) sellOpen = true;
           }
        }
     }

   // سیگنال خرید: تقاطع صعودی
   if(fastMA_prev < slowMA_prev && fastMA_now > slowMA_now && !buyOpen)
     {
      if(sellOpen) CloseAllOrders(OP_SELL);
      OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,
                Ask - StopLoss*Point,
                Ask + TakeProfit*Point,
                "MA Cross Buy",MagicNumber,0,clrGreen);
     }

   // سیگنال فروش: تقاطع نزولی
   if(fastMA_prev > slowMA_prev && fastMA_now < slowMA_now && !sellOpen)
     {
      if(buyOpen) CloseAllOrders(OP_BUY);
      OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,
                Bid + StopLoss*Point,
                Bid - TakeProfit*Point,
                "MA Cross Sell",MagicNumber,0,clrRed);
     }
  }

// ===== تابع بستن همه معاملات =====
void CloseAllOrders(int type)
  {
   for(int i = OrdersTotal()-1; i >= 0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==type && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
           {
            double price = (type==OP_BUY) ? Bid : Ask;
            OrderClose(OrderTicket(),OrderLots(),price,3,clrYellow);
           }
        }
     }
  }
توضیح کد بالا

این اکسپرت وقتی میانگین سریع (MA10) میانگین کند (MA20) را به سمت بالا قطع کند، وارد معامله خرید می‌شود و بالعکس. این یک استراتژی کلاسیک است و هدف آموزش ساختار اکسپرت است، نه سودآوری تضمین‌شده.

مرحله پنجم: کامپایل و بررسی خطاها

بعد از نوشتن کد، دکمه Compile (یا کلید F7) را بزنید. در پایین صفحه پنجره‌ای باز می‌شود که تعداد خطاها و هشدارها را نشان می‌دهد.

  • Errors: 0 یعنی کد بدون خطا کامپایل شد.
  • اگر خطا وجود دارد، روی هر خطا دوبار کلیک کنید تا مستقیم به خط مشکل‌دار ببرد.

مرحله ششم: تست روی حساب دمو

قبل از هر چیز، اکسپرت را حتماً روی حساب دمو تست کنید. برای اجرا، به متاتریدر برگردید، اکسپرت‌تان را از پنجره Navigator روی چارت بکشید و در تنظیمات، گزینه Allow live trading را فعال کنید.

بک‌تست اکسپرت با Strategy Tester

یکی از قدرتمندترین ابزارهای متاتریدر، Strategy Tester است که به شما امکان می‌دهد عملکرد اکسپرت را روی داده‌های تاریخی بسنجید. برای باز کردن آن از منوی View → Strategy Tester استفاده کنید.

تنظیمات مهم در Strategy Tester

  • Expert Advisor: اکسپرت خودتان را انتخاب کنید.
  • Symbol: جفت ارز موردنظر (مثلاً EURUSD)
  • Model: Every tick (دقیق‌ترین حالت)
  • Date: بازه زمانی تست
  • Initial Deposit: سرمایه اولیه فرضی
نکته حرفه‌ای: بهینه‌سازی (Optimization)

Strategy Tester امکان بهینه‌سازی پارامترها را دارد. اما مراقب Over-Fitting باشید؛ اکسپرتی که فقط روی داده‌های گذشته عالی است، الزاماً در آینده هم خوب نخواهد بود.

مفاهیم پیشرفته اکسپرت نویسی که باید بدانید

مدیریت ریسک در کد اکسپرت

هیچ اکسپرتی بدون مدیریت ریسک مناسب نباید روی حساب واقعی استفاده شود. مهم‌ترین مفاهیم مدیریت ریسک در کدنویسی:

  • StopLoss اجباری: هر معامله باید حد ضرر داشته باشد.
  • حجم معامله متغیر: حجم را بر اساس درصد ریسک از حساب محاسبه کنید، نه عدد ثابت.
  • Maximum Drawdown: اگر اکسپرت بیش از درصد مشخصی ضرر داد، معامله را متوقف کند.
  • Trailing Stop: برای قفل کردن سود، از استاپ لاس متحرک استفاده کنید.

کار با اندیکاتورها در MQL4

یکی از پرکاربردترین مهارت‌ها در اکسپرت نویسی، فراخوانی اندیکاتورهای داخلی متاتریدر است. چند نمونه مهم:

// میانگین متحرک
double ma = iMA(NULL, 0, 14, 0, MODE_EMA, PRICE_CLOSE, 0);

// RSI
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);

// Bollinger Bands (باند بالا)
double bbUpper = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 0);

// MACD
double macdMain = iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0);

خطاهای رایج در اکسپرت نویسی و راه حل آن‌ها

خطا
دلیل
راه حل
Error 130 (Invalid Stops)
StopLoss/TakeProfit خیلی نزدیک
از MarketInfo(Symbol(),MODE_STOPLEVEL) استفاده کنید
Error 134 (No money)
موجودی کافی نیست
حجم معامله را کاهش دهید
Error 138 (Requote)
قیمت تغییر کرد
Slippage را افزایش دهید
Error 4 (Server busy)
سرور بروکر مشغول است
با تاخیر مجدد تلاش کنید (Sleep)

تفاوت اکسپرت نویسی برای فارکس و بورس ایران

یک سوال رایج این است که آیا اکسپرت نویسی برای بازار بورس ایران هم کاربرد دارد؟ پاسخ بله، اما با تفاوت‌هایی مهم:

  • فارکس: اکسپرت در متاتریدر (MT4/MT5) نوشته می‌شود و به صورت ۲۴ ساعته روی حساب بروکر اجرا می‌شود.
  • بورس ایران: نرم‌افزار معاملاتی متفاوت است (مثل TSETMC) و اکسپرت نویسی به شکل متاتریدر معنا ندارد، اما می‌توان با API کارگزاران و زبان‌هایی مثل Python ربات‌های مشابه نوشت.
جمع‌بندی کلیدی

آموزش اکسپرت نویسی یک سرمایه‌گذاری بلندمدت در مهارت‌های معاملاتی شماست. با تسلط بر MQL4 یا MQL5، می‌توانید استراتژی‌های خود را مکانیزه کنید، آن‌ها را بک‌تست بگیرید و بدون احساسات معامله کنید. کلید موفقیت: تست، تست و باز هم تست قبل از استفاده روی حساب واقعی.

نقشه راه یادگیری اکسپرت نویسی (از مبتدی تا پیشرفته)

برای اینکه بدانید از کجا شروع کنید و مسیر یادگیری‌تان چیست، این نقشه راه را دنبال کنید:

مرحله اول: پایه‌ها (۲ تا ۴ هفته)

  • یادگیری اصول اولیه برنامه‌نویسی (متغیرها، شرط‌ها، حلقه‌ها، توابع)
  • آشنایی با محیط MetaEditor
  • فهمیدن ساختار سه تابع OnInit، OnDeinit، OnTick

مرحله دوم: اکسپرت‌های ساده (۱ تا ۲ ماه)

  • نوشتن اکسپرت بر اساس اندیکاتورهای ساده (MA، RSI)
  • کار با OrderSend، OrderClose، OrderModify
  • یاد گرفتن مدیریت خطاها

مرحله سوم: بک‌تست و بهینه‌سازی (مستمر)

  • اجرای Strategy Tester روی داده‌های تاریخی
  • تفسیر گزارش بک‌تست (Profit Factor، Drawdown، Sharpe Ratio)
  • اجتناب از Over-Fitting

مرحله چهارم: مهارت‌های پیشرفته (۳ ماه به بالا)

  • مدیریت ریسک پیشرفته (محاسبه حجم پویا)
  • Trailing Stop و Breakeven
  • ارتباط با سرور خارجی (WebRequest)
  • چند ارزی (Multi-Symbol EA)