عرض مشاركة واحدة
قديم 12-10-2007, 23:59   رقم المشاركة : [7 (permalink)]
شبكه جديد
الصورة الرمزية aqlan
 

aqlan is on a distinguished road
Icon3 الدرس الثاني

Bookmark and Share



الدرس الثاني
الهدف:
سوف نخرج من هذا الدرس بتصور عام عن تركيبة الدالة الرئيسية 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.
نلاحظ العلامة && بين الشرطين وهي تعني ضرورة تحقق الشرطين لنخرج بقيمة "ترو" لهذا المتغير.



رمز:
//=======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 );
الجزء الثالث: فتح الاوامر بالسوق:
هنا نصبح جاهزين تماما لفتح الاوامر بدون الخوض في اي شروط او استراتيجيات فهو جزء يقوم بفتح الاوامر بناء على المتغيرين Long, Short التي جهزناها بالجزء السابق
التعديل على هذا الجزء قليل ايضا من برنامج لاخر مثل الجزء الاول في هذه النقطة.


رمز:
//===== 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; }
التطوير المتوقع في هذا الجزء مستقبلا:
في الدروس المتقدة سنرى كيف نضع اوامر سوق معلقة 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 غير قابلة للتعديل في اي تطوير لارتباطها باكثر من جزء بالبرنامج
· البرنامج الذي بين يدينا يعتبر برنامج كامل وقابل للتجربة باك تست
نهاية الدرس الثاني،،،

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




التوقيع:

[عزيزي الزائر يتوجب عليك التسجيل للمشاهدة الرابطللتسجيل اضغط هنا]


aqlan غير متواجد حالياً   رد باقتباس
 
1 2 3 4 5 6 7 9 10 11 12 18 19 20 21 22 25 26 27 28 32 39 43 44 47 48 49 50 53 54 55 56 57 58 59