P
PipsGrowth
الأتمتة

كيف تبني أول Expert Advisor على MT5

دليل خطوة بخطوة للمبتدئين للانتقال من التداول اليدوي إلى الأنظمة الآلية باستخدام MQL5.

PG
فريق Pips Growth
2026-01-24
8 دقيقة

كيف تبني أول Expert Advisor على MT5

التداول الآلي لم يعد حكراً على المؤسسات المالية الكبرى. اليوم، يستطيع أي متداول في المنطقة العربية بناء نظامه الآلي الخاص باستخدام MetaTrader 5 ولغة البرمجة MQL5، دون الحاجة إلى خلفية برمجية عميقة. بنهاية هذا الدليل، سيكون لديك Expert Advisor (EA) يعمل فعلياً وينفذ صفقات بناءً على إشارات تقاطع المتوسطات المتحركة البسيطة.

ما هو Expert Advisor؟

Expert Advisor هو برنامج يعمل داخل منصة MetaTrader ويقوم بتنفيذ قرارات التداول تلقائياً وفق قواعد مبرمجة مسبقاً. يمكنه:

  • مراقبة السوق على مدار الساعة دون تدخل بشري
  • تنفيذ الصفقات بسرعة أعلى بكثير من الإنسان
  • تطبيق إدارة المخاطر بصرامة لا تتأثر بالعواطف
  • اختبار الاستراتيجيات على بيانات تاريخية (Backtesting)

الفرق الجوهري بين EA على MT5 مقارنة بـ MT4 هو أن MQL5 أكثر قوة، يدعم البرمجة الكائنية (OOP)، وأسرع في المعالجة، مع مكتبة دوال أغنى.

المتطلبات المسبقة

قبل البدء، تأكد من توافر:

  • MetaTrader 5 مثبت على جهازك (يمكن تحميله مجاناً من موقع MetaQuotes)
  • حساب تجريبي (Demo) لدى أي وسيط موثوق مثل IC Markets أو Exness
  • فهم أساسي لمفهوم المتوسطات المتحركة ومنطق التداول
  • محرر MetaEditor المدمج مع MT5 (لا يحتاج تثبيتاً منفصلاً)

إعداد MetaEditor

MetaEditor هو بيئة التطوير المتكاملة (IDE) الخاصة بـ MQL5. للوصول إليه:

  1. افتح MetaTrader 5
  2. اضغط على أدواتمحرر MetaQuotes أو استخدم الاختصار F4
  3. ستنفتح نافذة MetaEditor

إنشاء ملف EA جديد

  1. في MetaEditor، اضغط ملفجديد
  2. اختر Expert Advisor (template)
  3. أدخل اسم الـ EA: SMA_Crossover_EA
  4. اضغط إنهاء

سيُنشئ MetaEditor هيكلاً أساسياً لملف .mq5.

هيكل ملف MQL5

كل Expert Advisor يتكون من ثلاثة أقسام رئيسية:

//+------------------------------------------------------------------+
//| SMA_Crossover_EA.mq5                                             |
//| حقوق النشر: فريق PipsGrowth                                       |
//| استراتيجية: تقاطع المتوسطات المتحركة البسيطة SMA-50/SMA-200       |
//+------------------------------------------------------------------+

// القسم الأول: خصائص EA
#property copyright "PipsGrowth"
#property version   "1.00"
#property strict

// القسم الثاني: المتغيرات العامة والمعاملات القابلة للتعديل
input int    FastMAPeriod  = 50;    // فترة المتوسط السريع
input int    SlowMAPeriod  = 200;   // فترة المتوسط البطيء
input double LotSize       = 0.1;   // حجم الصفقة
input int    StopLoss      = 100;   // وقف الخسارة بالنقاط
input int    TakeProfit    = 200;   // جني الأرباح بالنقاط
input int    MagicNumber   = 12345; // رقم تعريفي للـ EA

// معرّفات المؤشرات
int FastMAHandle;
int SlowMAHandle;

الاستراتيجية: تقاطع SMA-50 / SMA-200

هذه الاستراتيجية الكلاسيكية تعتمد على:

  • إشارة شراء: عندما يتقاطع SMA-50 فوق SMA-200 ("الصليب الذهبي")
  • إشارة بيع: عندما يتقاطع SMA-50 تحت SMA-200 ("الصليب الميت")

الكود الكامل مع التعليقات العربية

//+------------------------------------------------------------------+
//| دالة التهيئة - تُنفذ مرة واحدة عند بدء تشغيل الـ EA              |
//+------------------------------------------------------------------+
int OnInit()
{
   // إنشاء مقابض المتوسطات المتحركة
   FastMAHandle = iMA(_Symbol, _Period, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   SlowMAHandle = iMA(_Symbol, _Period, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
   
   // التحقق من صحة إنشاء المؤشرات
   if(FastMAHandle == INVALID_HANDLE || SlowMAHandle == INVALID_HANDLE)
   {
      Print("خطأ في إنشاء المؤشرات! الكود: ", GetLastError());
      return(INIT_FAILED);
   }
   
   Print("تم تهيئة الـ EA بنجاح على الزوج: ", _Symbol);
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| دالة التنظيف - تُنفذ عند إيقاف الـ EA                             |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // تحرير مقابض المؤشرات لتوفير الذاكرة
   IndicatorRelease(FastMAHandle);
   IndicatorRelease(SlowMAHandle);
   Print("تم إيقاف الـ EA");
}

//+------------------------------------------------------------------+
//| دالة التيك - تُنفذ عند كل تغيير في السعر                          |
//+------------------------------------------------------------------+
void OnTick()
{
   // التحقق من أنه شريط جديد فقط (لتجنب التنفيذ المتكرر)
   static datetime LastBarTime = 0;
   datetime CurrentBarTime = iTime(_Symbol, _Period, 0);
   
   if(CurrentBarTime == LastBarTime)
      return; // لا يوجد شريط جديد، تجاهل
   
   LastBarTime = CurrentBarTime;
   
   // استرجاع قيم المتوسطات المتحركة
   double FastMA_Current[], SlowMA_Current[];
   double FastMA_Previous[], SlowMA_Previous[];
   
   // تحديد اتجاه البيانات (الأحدث أولاً)
   ArraySetAsSeries(FastMA_Current, true);
   ArraySetAsSeries(SlowMA_Current, true);
   ArraySetAsSeries(FastMA_Previous, true);
   ArraySetAsSeries(SlowMA_Previous, true);
   
   // نسخ قيم المؤشرات
   if(CopyBuffer(FastMAHandle, 0, 0, 3, FastMA_Current) < 3) return;
   if(CopyBuffer(SlowMAHandle, 0, 0, 3, SlowMA_Current) < 3) return;
   
   // قيم الشريط الحالي والسابق
   double fastCurrent  = FastMA_Current[1];  // الشريط المغلق الأخير
   double slowCurrent  = SlowMA_Current[1];
   double fastPrevious = FastMA_Current[2];  // الشريط قبل الأخير
   double slowPrevious = SlowMA_Current[2];
   
   // التحقق من عدم وجود صفقات مفتوحة مسبقاً
   if(PositionsTotal() > 0)
   {
      // فحص الصفقات المفتوحة للخروج
      CheckExitConditions(fastCurrent, slowCurrent);
      return;
   }
   
   // الكشف عن إشارة الشراء: تقاطع SMA سريع فوق SMA بطيء
   if(fastPrevious < slowPrevious && fastCurrent > slowCurrent)
   {
      Print("إشارة شراء! SMA-50 تجاوز SMA-200 للأعلى");
      ExecuteTrade(ORDER_TYPE_BUY);
   }
   
   // الكشف عن إشارة البيع: تقاطع SMA سريع تحت SMA بطيء
   if(fastPrevious > slowPrevious && fastCurrent < slowCurrent)
   {
      Print("إشارة بيع! SMA-50 تجاوز SMA-200 للأسفل");
      ExecuteTrade(ORDER_TYPE_SELL);
   }
}

//+------------------------------------------------------------------+
//| دالة تنفيذ الصفقة                                                  |
//+------------------------------------------------------------------+
void ExecuteTrade(ENUM_ORDER_TYPE OrderType)
{
   MqlTradeRequest request = {};
   MqlTradeResult  result  = {};
   
   double price  = (OrderType == ORDER_TYPE_BUY) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
                                                  : SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double point  = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   
   // حساب مستويات وقف الخسارة وجني الأرباح
   double sl, tp;
   if(OrderType == ORDER_TYPE_BUY)
   {
      sl = price - StopLoss * point;
      tp = price + TakeProfit * point;
   }
   else
   {
      sl = price + StopLoss * point;
      tp = price - TakeProfit * point;
   }
   
   // تعبئة بيانات الطلب
   request.action   = TRADE_ACTION_DEAL;
   request.symbol   = _Symbol;
   request.volume   = LotSize;
   request.type     = OrderType;
   request.price    = price;
   request.sl       = sl;
   request.tp       = tp;
   request.magic    = MagicNumber;
   request.comment  = "SMA Crossover EA";
   
   // إرسال الأمر
   if(!OrderSend(request, result))
   {
      Print("فشل تنفيذ الصفقة! كود الخطأ: ", result.retcode);
   }
   else
   {
      Print("تم فتح الصفقة بنجاح - رقم التذكرة: ", result.order);
   }
}

//+------------------------------------------------------------------+
//| دالة التحقق من شروط الخروج                                         |
//+------------------------------------------------------------------+
void CheckExitConditions(double fastMA, double slowMA)
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket))
      {
         if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
         if(PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;
         
         ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         
         // إغلاق صفقة الشراء إذا تقاطع للأسفل
         if(posType == POSITION_TYPE_BUY && fastMA < slowMA)
         {
            ClosePosition(ticket);
         }
         // إغلاق صفقة البيع إذا تقاطع للأعلى
         else if(posType == POSITION_TYPE_SELL && fastMA > slowMA)
         {
            ClosePosition(ticket);
         }
      }
   }
}

//+------------------------------------------------------------------+
//| دالة إغلاق الصفقة                                                  |
//+------------------------------------------------------------------+
void ClosePosition(ulong ticket)
{
   MqlTradeRequest request = {};
   MqlTradeResult  result  = {};
   
   request.action = TRADE_ACTION_DEAL;
   request.position = ticket;
   request.symbol = _Symbol;
   request.volume = PositionGetDouble(POSITION_VOLUME);
   
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      request.type  = ORDER_TYPE_SELL;
      request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   }
   else
   {
      request.type  = ORDER_TYPE_BUY;
      request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   }
   
   if(!OrderSend(request, result))
      Print("فشل إغلاق الصفقة! كود الخطأ: ", result.retcode);
   else
      Print("تم إغلاق الصفقة بنجاح");
}

تجميع الكود وتشغيل الـ EA

بعد كتابة الكود:

  1. تجميع الكود: اضغط F7 أو انقر تجميع في شريط الأدوات
  2. التحقق من الأخطاء: انظر نافذة Log في الأسفل — يجب أن تظهر رسالة 0 error(s), 0 warning(s)
  3. الرجوع إلى MT5: اضغط Ctrl+T لفتح نافذة الـ Expert Advisors في Navigator
  4. سحب الـ EA على الرسم البياني: اسحب اسم الـ EA إلى أي رسم بياني

الاختبار الخلفي (Backtesting)

قبل تشغيل الـ EA على حساب حقيقي أو حتى تجريبي، اختبره على بيانات تاريخية:

خطوات الاختبار في Strategy Tester

  1. في MT5، افتح عرضاختبار الاستراتيجية (أو اضغط Ctrl+R)
  2. اختر الـ EA من القائمة المنسدلة
  3. حدد الرمز: مثلاً EURUSD
  4. اختر الإطار الزمني: H1 للبداية
  5. حدد الفترة الزمنية: سنة إلى سنتين من البيانات
  6. نوع الاختبار: اختر "Open prices only" للسرعة، أو "Every tick" للدقة الكاملة
  7. اضغط Start

قراءة النتائج

بعد انتهاء الاختبار، انظر إلى:

المؤشر ما يعنيه
صافي الربح إجمالي الأرباح بعد الخسائر
Profit Factor نسبة إجمالي الأرباح ÷ إجمالي الخسائر (أفضل من 1.3)
أقصى انسحاب أكبر خسارة متتالية — يجب أن تكون محتملة
نسبة الفوز نسبة الصفقات الرابحة (ليست وحدها المقياس)

تحسين المعاملات (Optimization)

Strategy Tester يتيح اختبار قيم متعددة تلقائياً:

  1. في Strategy Tester، انتقل إلى تبويب Inputs
  2. حدد Optimize بجانب المعاملات التي تريد اختبارها
  3. أدخل النطاق: مثلاً FastMA من 30 إلى 70 بخطوة 5
  4. شغّل Optimization

تحذير مهم: تحسين المعاملات قد يؤدي إلى "إفراط في الملاءمة" (Overfitting) — أي أن الـ EA يعمل بشكل ممتاز على البيانات الماضية لكنه يفشل في المستقبل. دائماً اختبر النتائج على بيانات لم تُستخدم في التحسين.

أخطاء شائعة وحلولها

الخطأ السبب المحتمل الحل
Invalid handle فشل إنشاء المؤشر تحقق من اسم الرمز والإطار الزمني
Not enough money رصيد غير كافٍ قلل حجم الصفقة
Trade context is busy أمر سابق لم يكتمل أضف تأخيراً بين الأوامر
Off quotes لا يوجد سعر تحقق من اتصال الإنترنت والوسيط
EA لا ينفذ صفقات Auto-trading معطل فعّل زر Auto-Trading في شريط MT5

نصائح للمتداولين العرب

اختبر دائماً قبل التداول الحقيقي: الحسابات التجريبية لدى وسطاء مثل IC Markets وExness مجانية وتُتيح اختبار الـ EA في ظروف السوق الحقيقية.

الحسابات الإسلامية (Swap-Free): إذا كنت تستخدم حساباً إسلامياً خالياً من الفائدة، تحقق من أن الـ EA لا يحتفظ بصفقات لأيام طويلة لتجنب مشكلات السواب. يمكنك إضافة منطق لإغلاق الصفقات قبل نهاية اليوم.

الرافعة المالية: حتى مع EA آلي، لا تستخدم رافعة عالية (أكثر من 1:50 فعلياً). الـ EA لا يحمي من التحركات العنيفة في الأسواق.

الخطوات التالية

الـ EA الذي بنيناه هو نقطة بداية. يمكنك تحسينه بإضافة:

  • فلاتر إضافية: مثل RSI أو ADX لتأكيد الإشارات
  • إدارة مخاطر ديناميكية: تعديل حجم الصفقة حسب التقلب (ATR)
  • تداول متعدد الأزواج: تشغيل الـ EA على عدة أزواج في آنٍ واحد
  • منطق تراجع الوقف (Trailing Stop): لحماية الأرباح

للمزيد حول أتمتة التداول، اقرأ دليلنا حول استراتيجيات حماية رأس المال.


أسئلة شائعة

هل أحتاج خبرة برمجية لبناء EA على MT5؟

لا تحتاج إلى خبرة برمجية متقدمة. MQL5 متشابه جداً مع لغة C++ ويمكن تعلم الأساسيات في أسابيع قليلة. البداية بأمثلة بسيطة مثل هذا الـ EA هي أفضل طريقة. كما أن MetaEditor يحتوي على مساعد تلقائي (Wizard) يُنشئ هياكل الكود الأساسية تلقائياً.

هل يمكن استخدام EA على الحسابات الإسلامية (Swap-Free)؟

نعم، EA يعمل بشكل طبيعي على الحسابات الإسلامية. لكن انتبه إلى أن بعض الوسطاء يُطبقون رسوماً إدارية بديلاً عن السواب في هذه الحسابات عند الاحتفاظ بالصفقات لفترة طويلة. يُنصح ببرمجة الـ EA ليغلق الصفقات يومياً أو استخدام استراتيجيات قصيرة المدى.

ما الفرق بين Backtesting وForward Testing؟

Backtesting هو اختبار الـ EA على بيانات تاريخية — سريع ومفيد للتحقق المبدئي. Forward Testing هو تشغيل الـ EA على حساب تجريبي في السوق الحقيقي لفترة من 3 إلى 6 أشهر — أدق وأكثر موثوقية. لا تتخطى Forward Testing أبداً قبل التداول الحقيقي.

لماذا يكون الـ EA مربحاً في الاختبار لكنه يخسر حقيقياً؟

هذا يحدث لعدة أسباب: الإفراط في التحسين (Overfitting)، عدم مراعاة السبريد والعمولات في الاختبار، وبالأهم — الفرق بين بيانات الاختبار وظروف السوق الحالية. الحل: اختبر على بيانات خارج الفترة المُحسَّن عليها واستخدم Forward Testing دائماً.

هل يمكن تشغيل EA على VPS للتداول 24 ساعة؟

نعم، هذا الخيار الأفضل للـ EAs. VPS (Virtual Private Server) يُبقي MT5 يعمل باستمرار حتى عندما يكون جهازك مغلقاً. كثير من الوسطاء مثل IC Markets وExness يُقدمون VPS مجانياً للعملاء ذوي الحجم التداولي الكافي.


هذا الدليل لأغراض تعليمية فقط. التداول الآلي ينطوي على مخاطر مرتفعة. اختبر دائماً على حساب تجريبي قبل استخدام أي EA بأموال حقيقية.

إفصاح التسويق بالعمولة: تحتوي هذه الصفحة على روابط تسويق بالعمولة. قد نحصل على عمولة عند النقر على روابط معينة أو التسجيل لدى الوسطاء المميزين على هذا الموقع، دون أي تكلفة إضافية عليك. مراجعاتنا وتوصياتنا مبنية على بحث شامل وتبقى محايدة.اعرف المزيد

تحذير بشأن المخاطر: تداول الفوركس وعقود الفروقات ينطوي على مخاطر كبيرة للخسارة. الأداء السابق لا يدل على النتائج المستقبلية. عقود الفروقات هي أدوات معقدة وتنطوي على مخاطر عالية لخسارة الأموال بسرعة بسبب الرافعة المالية. تأكد من فهمك للمخاطر قبل التداول. هذا المحتوى لأغراض تعليمية فقط ولا يشكل نصيحة مالية.

كتب بواسطة

فريق Pips Growth

فريق التعليم والأبحاث في التداول

فريق Pips Growth هو مجموعة من المتداولين ذوي الخبرة والمحللين الماليين ومعلمي التداول المكرسين لتقديم تعليم فوركس دقيق وعملي. يجمع فريقنا بين عقود من الخبرة العملية في الأسواق والمعرفة التقنية العميقة لإنشاء أدلة شاملة ومراجعات صادقة للوسطاء واستراتيجيات تداول مجربة. يتم البحث في كل مقال بدقة والتحقق من صحته ومراجعته من قبل عدة أعضاء في الفريق لضمان أعلى جودة ودقة.

15+ سنة خبرة43+ مقال منشور
تداول الفوركس والعقود مقابل الفروقاتالتحليل الفنيإدارة المخاطرمراجعات وتقييم الوسطاء
عرض الملف الشخصي الكامل
مشاركة

اشترك في النشرة

How to Build Your First MT5 Expert Advisor | PipsGrowth