تعلم لغة برمجة الميتا واعمل اكسبيرت لاستراتيجيتك الخاصة
السلام عليكم
هل تعمل على استراتيجية وناجحة معك وتريد ان تعملها برنامج الي يقوم بالتداول بدلا عنك؟
هل تعلم ان قرار فتح الاوامر بالسوق قد لاياخذ عشر الوقت الذي تقضيه في متابعة الاوامر المفتوحة وقرار اغلاقها او الانتظار لماذا لاتعمل برنامج يتابع اوامرك المفتوحة وتوفر على نفسك عناء المتابعة؟
هل تريد ان تعمل برنامج يعطيك تنبيه او رسالة على جوالك متى توفرت فرصة دخول بالسوق او فرصة مناسبة للخروج؟
هل متابعة السوق وتقلباته تقودك سلبيا احيانا في اتخاذ القرار المناسب؟ (الخوف - الطمع - الحذر)
هل تحب ان تكون ادارة المال بحسابك مدروسة بطريقة رياضية وغير خاضعة للتاثيرات النفسية؟
نعم بامكانك عمل كل هذا على الميتاترايدر وتوفر على نفسك الكثير من الوقت ليس هذا فقط لكن سوف تخرج من دائرة تاثير حركة السوق السلبية على نفسيتك ويكون قرارك علمي ومدروس اكثر
اخي بامكانك الان تعلم هذه اللغة وعمل كل ماسبق وزيادة وتحتاج لذلك المتطلبات الادنى وهي:
الحماس والاصرار
الصبر على التعلم
اعطاء الوقت الكافي
المشاركة بقراءة هذا الموضوع
سوف اقوم بعمل دروس تدريجية للبرمجة هنا وارحب باي مشاركة من المبرمجين لدعم الموضوع
لابدأ الموضوع عندي طلب صغير وهو الاجابة على الاستفتاء بالرغبة في المشاركة بالموضوع والتعلم وسوف يكون هناك اختبارات مرحلية بعد كل جزء حتى ننتقل للجزء الذي يليه
لا احبذ الرد بالمشاركات في غير صلب الموضوع حتى تسهل المتابعة وللراغبين في تسلسل الدروس ونكتفي بالاستفتاء لمعرفة اراءكم (فضلا لا امرا)
تمهيد قد يقول البعض ان البداية سريعة ومتقدمة وتحتاج الكثير من التمهيد والطرح النظري قبل ان نصل الى هذه المرحلة. وانا اقول ان هناك طريقتان في التعلم: الطريقة الاولى: تعلم الاجزاء لفهم الكل الطريقة الثانية: فهم الكل لتعلم الاجزاء من دون الغوص في فلسفات التعليم وطرقها لكن بحسب خبرتي ارى ان اسهل واسرع طريقة للتعلم هي الطريقة الثانية وهي لكي نتعلم اجزاء البرمجة وتفاصيلها واسرارها يجب اولا ان نفهم برنامج كامل ونراه كيف يعمل ثم نتجول في اجزاءه.
مقدمة اذا اتفقنا ان نبدأ بفهم البرنامج الكامل ثم ندخل في التفاصيل والخبايا لاحقا. سنرفق مع كل درس برنامج وسيبدأ هذا البرنامج صغير جدا لكنه برنامج كامل يقوم بالمتاجرة الالية وباقل شروط ممكنة لكنه سينتهي ببرنامج ضخم وفيه الكثير من التقنيات البرمجية والمعادلات الرياضية والكثير من خبايا واسرار البرمجة.
مرفق: برنامج Lesson1.mq4 برنامج يقوم بفتح اوامر بيع وشراء عند تقاطع خطين متوسطين 7و15 يشتري عند التقاطع للاعلى ويبيع عند التقاطع للاسفل
الهدف: نهاية الدرس الاول هي بفهم اجزاء وتفاصيل البرنامج الاساسي بشكل عام غير تفصيلي وغير دقيق (نفهم الكل لنتعلم الاجزاء) سنصل الى فهم عمل البرنامج الاول و اجزائه الرئيسية ودور كل جزء منها.
اجزاء البرنامج: سوف نشرح هنا اجزاء البرنامج، واعرف مسبقا انه سيكون في كثير من التساؤلات وعدم الوضوح لكن هذا شيء طبيعي ولاتستعجل اخي سوف تصل الى ادق التفاصيل باسرع مما تتصور لكن حاول ان تركز معي في هذا الدرس على عموم الشرح والتصور العام للبرنامج وليس فهم التفاصيل الدقيقة فهي لم ياتي وقتها بعد. الاكسبيرت يتكون من خمسة مكونات اساسية لايخلو منها برنامج
اولا: مدخلات الاكسبيرت:
رمز:
//+------------------------------------------------------------------+
//| Input Parameters مدخلات الاكسبيرت |
//+------------------------------------------------------------------+
extern double Lots = 1;
extern int StopLoss = 40 ;
extern int TakeProfit = 120 ;
extern int MAS = 15;
extern int MAF = 7;
وهي عبارة عن مدخلات المستخدم والمتغيرات التي سوف تسمح له ان يعدل عليها مثل حجم العقد مثلا وتستطيع تمييزها عن غيرها من المتغيرات بكلمة extern السابقة للتعريف وسوف نرى انواع اخرى من المتغيرات بالبرنامج.
ثانيا: متغيرات عامة: وهي متغيرات على لايراها المستخدم العادي للبرنامج وتستخدم داخليا بالبرنامج وفي مثالنا هذا استخدمنا الرقم السحري
رمز:
//+------------------------------------------------------------------+
//| Static Parameters متغيرات عامة |
//+------------------------------------------------------------------+
int Magic = 10;
ثالثا: دالة التهيئة: الدالة هي عبارة عن جزء من البرنامج او الكود وكل دالة لها عمل ولها وقت محدد تنفذ فيه الكود الذي بداخلها وهنا هذه الدالة تنفذ مرة واحدة فقط وهو عند تشغيل الاكسبيرت في كل مرة او عند اعادة تشغيل برنامج التداول. وفي مثالنا هذا لم نستخدم اي كود بهذه الدالة ولكن في الدروس المتقدمة سوف نستخدمها بالتاكيد
رمز:
//+------------------------------------------------------------------+
//| Initialization function دالة التهيئة وتنفذ عند الدخول للاكسبيرت |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
رابعا: دالة التصفية: هذه الدالة تعمل بشكل معاكس لسابقتها فهي تنفذ الكود الذي بداخلها عند ايقاف استخدام الاكسبيرت او عند الخروج من برنامج التداول بالكامل. وايضا لم نستخدمها بمثالنا هذا
رمز:
//+------------------------------------------------------------------+
//| Deinitialization function دالة التصفية وتنفذ عند الخروج فقط |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
خامسا: الدالة الرئيسية هنا يتركز الكود الذي معظم العمل عليه، وهنا سننفذ استراتيجياتنا وحساباتنا الرقمية والرياضية وكذلك تنفيذ الاوردرات واغلاق الصفقات وتعديل الاهداف والاستوبات. اذا نستطيع ان نقول ان 99% من الكود موجود بهذه الدالة وسنفرد لها درس خاص وهو القادم باذن الله. يقوم برنامج الميتا ترايدر بتنفيذ الكود المتضمن بهذه الدالة مع كل تغير بالسعر على الزوج الموضوع عليه الاكسبيرت وهذا فرق واضح واساسي بينها وبين الدالتين السابقتين
رمز:
//+------------------------------------------------------------------+
//| Start function الدالة الرئيسية وتنفذ عند كل تغير بالسعر |
//+------------------------------------------------------------------+
int start()
{
//===== Part 1: Check opened positions:
double curTotal=0, BuyRun=0, SellRun=0;
for (int cnt=0; cnt<OrdersTotal(); cnt++)
{
OrderSelect(cnt,SELECT_BY_POS) ;
if(OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!= Magic) continue;
if(OrderType()<=OP_SELL)
{
curTotal+=1 ;
if (OrderType()==OP_SELL) { SellRun=OrderOpenPrice(); }
if (OrderType()==OP_BUY) { BuyRun =OrderOpenPrice(); }
}
}
//=======Part 2: Initialize Parms:
double MA_f, MA_s, MA_f1, MA_s1;
MA_f = iMA(Symbol(), 0, MAF, 0, MODE_EMA, PRICE_CLOSE, 1);
MA_s = iMA(Symbol(), 0, MAS, 0, MODE_EMA, PRICE_CLOSE, 1);
MA_f1 = iMA(Symbol(), 0, MAF, 0, MODE_EMA, PRICE_CLOSE, 2);
MA_s1 = iMA(Symbol(), 0, MAS, 0, MODE_EMA, PRICE_CLOSE, 2);
bool CrossUp = (MA_f1<=MA_s1 && MA_f>MA_s);
bool CrossDn = (MA_f1>=MA_s1 && MA_f<MA_s);
bool Long = (BuyRun==0 && CrossUp );
bool Short= (SellRun==0 && CrossDn );
//===== Part 3: Do Buy Or Sell:
if(Long)
{
OrderSend(Symbol(),OP_BUY,Lots,Ask, 5, Ask-StopLoss*Point, Ask+TakeProfit*Point,"LetsFX Lesson1", Magic, 0, RoyalBlue);
return ;
}
if(Short)
{
OrderSend(Symbol(),OP_SELL,Lots,Bid, 0, Bid+StopLoss*Point, Bid-TakeProfit*Point,"LetsFX Lesson1", Magic, 0,LightPink);
return;
}
//======Part 4: Handle Running Orders:
double OpenP=0,StopL=0,TakeP=0,Lot=0 ;
int Ticket=0, Type=0 ;
for (int cnt1=0; cnt1<OrdersTotal(); cnt1++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!= Magic) continue;
if (OrderType()<=OP_SELL)
{
Ticket= OrderTicket();
Type = OrderType();
OpenP = OrderOpenPrice();
StopL = OrderStopLoss();
TakeP = OrderTakeProfit();
Lot = OrderLots();
if (Type==OP_BUY)
{
//Handle running Long pos:
}
else
{
//Handle running Short pos:
}
}
}
// the end.
//----
return(0);
}
الجزء التالي هو للدوال الخاصة بالمبرمج، نعم تستطيع ان تعمل دوال خاصة بك تستدعيها من الدوال الرئيسية السابقة ولنضرب مثال بسيط لدالة قد تحتاج اليها وهي انك قد تعمل دالة تحسب لك متوسط الحركة الييومية للسعر لفترات مختلفة، وكثيرة هي الامثلة للدوال الخاصة وسنتطرق لها لكن بدروس متقدمة
رمز:
//+------------------------------------------------------------------+
//| My Functions الدوال الخاصة |
//+------------------------------------------------------------------+
ملخص: يفترض ان تكون اجزاء البرنامج واضحة لدى المتدرب وهي 5 اجزاء رئيسية يحتوي عليها اي برنامج والهدف من كل جزء من هذه الاجزاء يجب ان يكون مستوعب بشكل عام، كذلك 3 دوال رئيسية واساسية كل منها له وقت محدد يقوم نظام التداول بتنفيذ الكود المتضمن بها كل بوقته المحدد.
الدرس التالي هو بتفنيد الدالة الرئيسية وفهم تركيبتها الداخلية وماهي افضل الطرق لهيكلتها وتنظيمها. سيكون الدرس القادم بعد ان نتأكد من ان الجزء الاول مستوعب ومن عنده تساؤل فاليوضحه مشكورين علما ان الدرس القادم قريب فلا تتاخرو باستفساراتكم.
الدرس الثاني الهدف: سوف نخرج من هذا الدرس بتصور عام عن تركيبة الدالة الرئيسية Start وكيفية تنظيمها وهيكلتها ويعتبد هذا الدرس تمهيدا لما ياتي بعده من ورش عملية وتجارب وامثلة.
مقدمة: هل سمعتم تعليق من احد المبرمجين عن برنامج شاهده وقال " البرنامج ركيك" او "صاحب البرنامج غير محترف" او "برنامج ملخبط" وغيرها من التعليقات؟ نعم كثير من هذه التعليقات ربما تقولونها على برامج تعرض عليكم مستقبلا، ولكن السؤال المهم انه كيف استطاع هذا المبرمج وصف البرنامج بانه ضعيف؟ هذه الدالة الرئيسية هي التي اخبرت المبرمج عن قوة الذي كتبها والفها، نعم سوف تستطيعون بنظرة –مستقبلا- على الدالة الرئيسية بالحكم على قوة البرنامج او كاتبه. الدالة الرئيسية هي مساحة المبرمج يكنب فيها الكود بالطريقة التي يفكر بها وبالاسلوب الذي تعلمه لذا تجد من الصعب على مبرمج ان يفهم برنامج كتبه غيره فهما كاملا الا بصعوبة شديدة. بل احيانا كاتب البرنامج نفسه اذا ترك البرنامج سنة مثلا ثم رجع يقراه فسيجد انه صعب عليه فهمه كما كان وقت كتابته. هذه المقدمة وان كانت طويلة لكن هي مهمة لنعرف اهمية تنظيم هذه الدالة وعدم رمي الكود فيها بدون تنظيم وترتيب لكي يسهل علينا مستقبلا التعديل عليها وتطويرها.
الدالة الرئيسية Start : كما ذكرنا سابقا ان هذه الدالة سوف يتركز عليها معظم العمل البرمجي وتكاد تكون هي لب الاكسبيرت. لذا سيكون عليها تركيز كبير وتفاصيل تحتاج الى التركيز. سنقوم بعمل قالب خاص بنا نحن داخل هذه الدالة، هذا القالب الهدف منه تنظيم هيكلة الدالة ووضعها بشكل مقروء ومنظم. هذا القالب عملته من خلال عملي ولم اجد في اي برنامج عملته اني احتجت ان اخرج عن حدود هذا القالب. فستختصرون الكثير من الوقت باتباع هذا القالب. في الدروس القادمة والامثلة سيكون عملنا مبني على هذا القالب ولن يخرج عنه لنستطيع ان نفهم بعضنا جيدا. فمثلا سيكون وضع السؤال منكم عند التجارب كالتالي "الجزء الثالث واجهت مشكلة في عمل مؤشرين متضادين" سيكون هذا السؤال المختصر مفهوم لكل الموجودين وسهل الاجابة عليه في حينها. هذا الدرس سنعتمد على البرنامج من الدرس الاول وفكرته الشراء والبيع عند تقاطع خطوط المتوسط للاعلى والاسفل.
اجزاء الدالة الرئيسية: 4 اجزاء
الجزء الاول: تحميل بيانات المراكز المفتوحة: عادة في العمل اليومي العادي قبل ان تقرر وضع اي اوامر بالسوق تفحص الاوامر المفتوحة اليس كذلك؟ لترى اذا كان هناك اوامر مفتوحة ويجب اتخاذ قرار بخصوصها قبل الخوض في تحليل السوق وفتح اوامر جديدة. وهذا مانعمله بالبرنامج تماما، نحمل جميع الاوامر المفتوحة ونأخذ مثل الاحصائية العامة وفي مثالنا هذا نحن نخرج من هذا الجزء بثلاثة متغيرات مهمة ستؤثر في قرارنا لدخول السوق من جديد وهي عدد الاوامر المفتوحة curTotal السعر المفتوح به صفقة الشراء BuyRun السعر المفتوح به صفقة البيع ٍSellRun ملاحظة: هذا الجزء قليل التعديل عليه بين البرامج المختلفة حتى في معظم البرامج سترى انك لن تحتاج ان تعدل عليه الا نادرا.
رمز:
//===== Part 1: Check opened positions:
double curTotal=0, BuyRun=0, SellRun=0;
for (int cnt=0; cnt<OrdersTotal(); cnt++)
{ OrderSelect(cnt,SELECT_BY_POS) ;
if(OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!= Magic) continue;
if(OrderType()<=OP_SELL)
{ curTotal+=1 ;
if (OrderType()==OP_SELL) { SellRun=OrderOpenPrice(); }
if (OrderType()==OP_BUY) { BuyRun =OrderOpenPrice(); }
}
}
التطوير المتوقع في هذا الجزء مستقبلا: فحص الاوامر المعلقة بالسوق BuyStop, BuyLimit, SellStop and SellLimit
الجزء الثاني: تجهيز المتغيرات الخاصة بالاستراتيجية: هذا الجزء يختلف عن سابقه بانه يختلف من برنامج لاخر اختلافا كبيرا. بهذا الجزء نقوم عادة بتجهيز متغيرات لنستخدمها في الجزء التالي للدخول بالسوق وهذه المتغيرات نجهزها حسب الاستراتيجية الخاصة بنا في مثالنا هذا وهو الدخول عند تقاطع الخطوط المتوسطة سنجهز قيمة الخط المتوسط الاول والثاني (السريع والبطيء) في متغيرين ma_f, ma_s للبار السابقة تماما ورقمها 1 في الكود. ولكن لنعرف اذا تقاطعوا ام لا سنحتاج ايضا ان نعرف قيمة المتوسطات للبار السابقة لهذه البار ورقمها البرمجي 2 وسنضع قيمة المتوسطين لها في ma_f1, ma_s1 الان لنعرف فعليا ان التقاطع حاصل سنعرف متغيرين جديدة CrossUp, CrossDn كما بالكود:
bool CrossUp = (MA_f1<=MA_s1 && MA_f>MA_s);
"كروس اب" ستكون قيمتها اما True, False ونستطيع فهمها كانها (نعم،لا) ففي مثالنا هنا ستكون "ترو" اي (نعم) في حالة ان الخطين المتوسطة كانت في البار رقم 2 السريع تحت البطيء، وفي البار رقم 1 السريع فوق البطيء. اي حصل تبادل للاماكن بين البارين السابقين. وهكذا الامر بالنسبة CrossDn التقاطع للاسفل ولكن بالعكس. بعد تجهيز المتغيرات ندخل فورا في شرط الدخول للسوق ونضعه في متغيرين Long, Short ولن نقوم بفتح الاوامر فعليا بهذا الجزء انما فقط تجهيز هذين المتغيرين للجزء التالي. Long ستكون فيها احدى قيمتين True, False فلو كانت بترو فهذا يعني اننا سوف ندخل شراء بالجزء التالي وكذلك الامر بالنسبة للبيع والمتغير Short
bool Long = (BuyRun==0 && CrossUp) سنجد ان قيمة Long ستكون "بترو" فقط في حالة انه لايوجد عقد شراء بالسوق BuyRun==0، وكذلك حصول تقاطع للاعلى CrossUp. نلاحظ العلامة && بين الشرطين وهي تعني ضرورة تحقق الشرطين لنخرج بقيمة "ترو" لهذا المتغير.
الجزء الثالث: فتح الاوامر بالسوق: هنا نصبح جاهزين تماما لفتح الاوامر بدون الخوض في اي شروط او استراتيجيات فهو جزء يقوم بفتح الاوامر بناء على المتغيرين Long, Short التي جهزناها بالجزء السابق التعديل على هذا الجزء قليل ايضا من برنامج لاخر مثل الجزء الاول في هذه النقطة.
التطوير المتوقع في هذا الجزء مستقبلا: في الدروس المتقدة سنرى كيف نضع اوامر سوق معلقة BuyStop, BuyLimit, SellStop and SellLimit
الجزء الرابع: ادارة الاوامر المفتوحة: بقي بالبرنامج الجزء الاخير وهو جزء حيوي جدا في ادارة الاوامر المفتوحة وهنا بمثالنا نحن لانقوم باي عمل تجاه الاوامر المفتوحة لكن اكتفيت بوضع القالب العام لهذا الجزء وهو الذي لايتغير ابدا مهما تغير البرنامج فهو يكاد يكون ثابت في جميع البرامج.
رمز:
//======Part 4: Handle Running Orders:
double OpenP=0,StopL=0,TakeP=0,Lot=0 ;
int Ticket=0, Type=0 ;
for (int cnt1=0; cnt1<OrdersTotal(); cnt1++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber()!= Magic) continue;
if (OrderType()<=OP_SELL)
{
Ticket= OrderTicket();
Type = OrderType();
OpenP = OrderOpenPrice();
StopL = OrderStopLoss();
TakeP = OrderTakeProfit();
Lot = OrderLots();
if (Type==OP_BUY)
{
//Handle running Long pos:
}
else
{
//Handle running Short pos:
}
}
}
التطوير المتوقع في هذا الجزء مستقبلا: كثيرة هي التطويرات والافكار في هذا الجزء وسنتطرق لكثير منها في الامثلة القادمة لكني ساذكر امثلة هنا: · تغيير الاستوب · وضع الاستوب على سعر الفتح · اغلاق العقد المفتوح لفترة زمنية معينة دون الوصول للهدف · الخروج من الصفقات عند شروط معينة مثل ضعف الحركة في السعر
ملخص: يجب ان نخرج من الدرس الثاني بعدد من المفاهيم: · هيكل الدالة الرئيسية مهم جدا ان يكون في قالب محدد لسهولة التطوير المستقبلي · القالب المستخدم به 4 اجزاء رئيسية · الجزء الاول والثالث قليل التعديل عليه من برنامج لاخر · الجزء الثاني وهو تجهيز الاستراتيجية وشروط الدخول هو لب البرنامج واكبر جزء يختلف من برنامج لاخر · طريقة كتابة المتغيرات Long, Short غير قابلة للتعديل في اي تطوير لارتباطها باكثر من جزء بالبرنامج · البرنامج الذي بين يدينا يعتبر برنامج كامل وقابل للتجربة باك تست نهاية الدرس الثاني،،،
لقائنا مع الدرس الثالث قريبا ان شاء الله وسيكون درس عملي اكثر مما سبق لكن محتويات الدرس الثالث ساشكلها بناء على ردة الفعل من هذا الدرس ومن خلال مشاركاتكم واستفساراتكم ساستطيع ان احدد عناصر الدرس الثالث في انتظار المشاركات والتجارب.
قبل اى شئ احب ان اشكرك اخي على تلك الشرح الجميل وجزاك الله عنا خير وجعله فى ميزان حسناتك والان نأتي للسؤال واعذرني فيه لاني مبتداء فى عالم الفوركس لم تقول لنا ما هو البرنامج الذى سوف نستخدمه فى برمجة الاكسبيرت ؟؟؟ هل هو الفجول بيزك ؟ وان كان البرمجة سوف تتم عن طريق احد برامج البرمجة فنرجو ان توضح لنا ذلك بالصور او طريقة وضع الاكواد والدوال ولك منى خالص التحيات واشكرك على مجهودك الكبير