google
twitter
facebook
twitter
google
forex

صفحة 2 من 10 الأولىالأولى 1 2 3 4 ... الأخيرةالأخيرة
النتائج 11 إلى 20 من 94

الموضوع: المؤشرات و الاكسبيرتات والبرمجة

  1. #11
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

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

    الفكرة هي ببساطة في أن يكتشف المؤشر بداية حدوث انفجار في السعر مع إعطائنا الاتجاه المتوقع.

    وكما هو معلوم فإن الانفجار السعري يحدث في وقت قصير مقارنة بحركة اليوم الكلية.

    من خلال خبرتي طبعا وجدت أن مؤشر البولنغر حساس للانفجارات السعرية بسبب أنه ينتفخ مع الانفجار ويضيق عند الهدوء.

    وبما أني أريد أن يظهر المؤشر على نافذة منفصلة قررت أن أستفيد من مؤشر البولنغر بطريقة أخرى.

    وهي أن أرسم الانتفاخ والتضيق على شكل خط واحد ( هو الخط الأصفر طبعا ).

    هذا الخط هو بكل بساطة عبارة عن الفرق بين الخط العلوي للبولنغر وبين الخط السفلي له.

    بمعنى أني حسبت الخط الأصفر بطرح القيمة الدنيا للباند من القيمة العليا.

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

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

    فكرت في إضافة مؤشر آخر وكان اختياري هو الماكد لمعرفة الاتجاه الحالي.

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

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

    بقي أمر آخر وهو أن قيم الفرق بين الماكدين صغيرة جدا مقارنة بقيم الفرق بين خطي البولنغر ولذلك اخترعت خاصية جديدة للمؤشر هي الحساسية.

    وظيفة هذه الحساسية أن تكبر اشارات الفرق بين الماكدين لتجعله متوافقا مع قيم البولنغر مع إمكانية التحكم بهذه الحساسية.

    فكلما زادت الحساسية زادت المخاطرة والعكس صحيح.

    بعد تنفيذ المؤشر وإجراء اختبارات كثيرة عليه وجدت أن قيمة الحساسية 100 - 150 مناسبة للعمل على النصف ساعة بحيث يبدأ الانفجار مع بدء ارتفاع أعمدة الفرق بين ماكدين فوق مؤشر الفرق بين خطي البولنغر.

    طبعا في البداية هي فكرة تم تطويرها على مراحل.

    والقيم التي حددتها هي نتيجة إختبارات لهذا المؤشر على أزواج كثيرة.

    لا يمكن أن تنجز مؤشر جديد من المرة الأولى بل تأتي التطويرات متلاحقة ومتتابعة.

    وأحيانا قد تبدأ بفكرة وعند التنفيذ الفعلي لها تجد نفسك قد عدلت على هذه الفكرة كثيرا لدرجة أن النتيجة النهائية قد لا تكون على علاقة بالفكرة الأولية.

    المهم جعلت المؤشر يرسم الخطوط المناسبة لكشف بداية الانفجار وكشف نهايته أيضا.

    لأن صعود خطوط الماكد فوق خط الانفجار البولنغري هو بداية الانفجار

    و هبوط هذه الخطوط مرة أخرى تحته هي نهاية الانفجار.


    وضعت خاصية جديدة هي المجال الميت والتي تعني أننا لا نريد الدخول في الانفجارات الصغيرة التي لا طائل منها.

    وهي عبارة عن خط أفقي منقط يحدد لنا منطقة العمل التي ينبغي لنا العمل وفقها.


    والآن نأتي للكود مع الشرح.

    القسم الأول:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                       Waddah_Attar_Explosion.mq4 |
    //|                              Copyright © 2006, Eng. Waddah Attar |
    //|                                          waddahattar@hotmail.com |
    //+------------------------------------------------------------------+
    #property  copyright "Copyright © 2006, Eng. Waddah Attar"
    #property  link      "waddahattar@hotmail.com"
    //----
    #property  indicator_separate_window
    #property  indicator_buffers 4
    #property  indicator_color1  Green
    #property  indicator_color2  Red
    #property  indicator_color3  Sienna
    #property  indicator_color4  Blue
    #property  indicator_minimum 0.0 
    وهو واضح جدا جدا حيث أننا نحتاج لأربعة خطوط وحددنا ألوان كل خط.

    وبما أن عملنا هو في القسم الموجب فقط فقد حددنا المجال الأدنى للمؤشر بصفر.


    القسم الثاني:
    كود PHP:
    extern int  Sensetive 150;
    extern int  DeadZonePip 30;
    extern int  ExplosionPower 15;
    extern int  TrendPower 15;
    extern bool AlertWindow true;
    extern int  AlertCount 500;
    extern bool AlertLong true;
    extern bool AlertShort true;
    extern bool AlertExitLong true;
    extern bool AlertExitShort true
    هذه هي خصائص المؤشر العامة الحساسية ومقدار المجال الميت.

    بالنسبة لقوة الانفجار وقوة الترند فقد وجدت أنه يمكن إعطاء المستخدم معلومات إضافية أخرى تخبره عن قوة الانفجار وقوة ميل الترند.

    قوة الانفجار هي بكل بساطة نسبة الزيادة في ميل الخط الأصفر وهو خط البولنغر.

    وقوة الميل هي نسبة الزيادة لعمود الماكد الأخير عن الخط الذي يسبقه.

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

    لأنه أحيانا تتحقق شروط الانفجار ولكن بقوة ضعيفة ولذلك وضعنا ما يشبه الفلتر على القوة.

    ويستطيع المستخدم تغيير هذه القيم حسب درجة مخاطرته التي يريدها.

    الخصائص المتبقية هي خصائص التنبيه بحيث يقوم المؤشر آليا بتنبيه المستخدم لبدء حدوث الانفجار في كلا الاتجاهين.

    كما أنه يقوم بتنبيهه أيضا للخروج من صفقته في حال دخل بها أصلا.

    القسم الثالث:
    كود PHP:
    double   ind_buffer1[];
    double   ind_buffer2[];
    double   ind_buffer3[];
    double   ind_buffer4[];
    //----
    int LastTime1 1;
    int LastTime2 1;
    int LastTime3 1;
    int LastTime4 1;
    int Status 0PrevStatus = -1;
    double baskbbid
    تعريف المصفوفات وبعض المتحولات التي ستلزمنا في عمل نظام التنبيهات.


    القسم الرابع:
    كود PHP:
    int init()
      {
       
    SetIndexStyle(0DRAW_HISTOGRAMSTYLE_SOLID2);
       
    SetIndexStyle(1DRAW_HISTOGRAMSTYLE_SOLID2);
       
    SetIndexStyle(2DRAW_LINESTYLE_SOLID2);
       
    SetIndexStyle(3DRAW_LINESTYLE_DOT1);
    //----   
       
    SetIndexBuffer(0ind_buffer1);
       
    SetIndexBuffer(1ind_buffer2);
       
    SetIndexBuffer(2ind_buffer3);
       
    SetIndexBuffer(3ind_buffer4);
    //----   
       
    IndicatorShortName("Waddah Attar Explosion: [S(" Sensetive 
                          
    ") - DZ(" DeadZonePip ") - EP(" ExplosionPower 
                          
    ") - TP(" TrendPower ")]");
       
    Comment("copyright waddahwttar@hotmail.com");
       return(
    0);
      } 
    وضعنا في الوظيفة init تعريف الخصائص الرسومية لخطوط المؤشر وربطنا المصفوفات بذاكرتها الرسومية.

    كذلك جعلنا المؤشر يظهر اسم المؤشر والخصائص التي اختارها المستخدم.


    القسم الخامس:
    كود PHP:
    int start()
      {
    // تعريف متحولات لوضع قيم مؤشرات الماكد والبولنغر وقوة كل منهما
       
    double Trend1Trend2Explo1Explo2Dead;
       
    double pwrtpwre;
    // حساب عدد الشمعات الجديدة فقط
       
    int    limiticounted_bars IndicatorCounted();
    //----
       
    if(counted_bars 0
           return(-
    1);
    //----
       
    if(counted_bars 0
           
    counted_bars--;
       
    limit Bars counted_bars;
    //  بدء الحلقة الرئيسية لحساب قيم خطوط المؤشر
       
    for(limit 1>= 0i--)
         {
    //  حساب قيمة الفرق بين الماكد للشمعة الحالية والشمعة التي تسبقها مباشرة وضرب الناتج في الحساسية لتكبير الإشارة
           
    Trend1 = (iMACD(NULL020409PRICE_CLOSEMODE_MAINi) - 
                     
    iMACD(NULL020409PRICE_CLOSEMODE_MAIN1))*Sensetive;

    // نفس الحساب السابق ولكن للشمعة التي تسبقها
           
    Trend2 = (iMACD(NULL020409PRICE_CLOSEMODE_MAIN2) - 
                     
    iMACD(NULL020409PRICE_CLOSEMODE_MAIN3))*Sensetive;
     
    // حساب الفرق بين خطي البولنغر للشمعة الحالية
           
    Explo1 = (iBands(NULL02020PRICE_CLOSEMODE_UPPERi) - 
                     
    iBands(NULL02020PRICE_CLOSEMODE_LOWERi));
    // حساب نفس الفرق السابق ولكن للشمعة السابقة
           
    Explo2 = (iBands(NULL02020PRICE_CLOSEMODE_UPPER1) - 
                     
    iBands(NULL02020PRICE_CLOSEMODE_LOWER1));
     
    // حساب قيمة المنطقة الميتة
           
    Dead Point DeadZonePip;
    // تصفير قيم المصفوفات
           
    ind_buffer1[i] = 0;
           
    ind_buffer2[i] = 0;
           
    ind_buffer3[i] = 0;
           
    ind_buffer4[i] = 0;

    // رسم خطوط خضراء في حال كان اتجاه الماكد لأعلى
           
    if(Trend1 >= 0)
               
    ind_buffer1[i] = Trend1;
    // رسم خطوط خضراء في حال كان الاتجاه لأسفل
           
    if(Trend1 0)
               
    ind_buffer2[i] = (-1*Trend1);
    // رسم خط البولنغر
           
    ind_buffer3[i] = Explo1;
    // رسم الخط المنقط الأبيض للمنطقة الميتة
           
    ind_buffer4[i] = Dead
    والشرح في نفس الكود.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  2. #12
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    القسم السادس:

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

    والشرح في الكود
    كود PHP:
    // التأكد أننا في الشمعة رقم صفر والأخيرة حتى يعمل نظام التنبيهات
           
    if(== 0)
             {
    // في حال تحققت الشروط التالية يجب التنبيه:
    // قيمة الترند الحالي أكبر من الصفر
    // قيمة الترند الحالي أكبر من قيمة الانفجار
    // قيمة الترند الحالي أكبر من المنطقة الميتة
    // قيمة الانفجار أكبر من المنطقة الميتة
    // الانفجار الحالي أكبر من الانفجار السابق
    // الترند الحالي أكبر من السابق
    // لم يتجاوز عدد مرات التنبيه
    // المستخدم يريد تنبيه انفجارات الشراء
    // السعر تغير حتى لا ينبهه بدون تغير في السعر
               
    if(Trend1 && Trend1 Explo1 && Trend1 Dead && 
                  
    Explo1 Dead && Explo1 Explo2 && Trend1 Trend2 && 
                  
    LastTime1 AlertCount && AlertLong == true && Ask != bask)
                 {
    // حساب قوة الترند وقوة الانفجار
                   
    pwrt 100*(Trend1 Trend2) / Trend1;
                   
    pwre 100*(Explo1 Explo2) / Explo1;
                   
    bask Ask;
    // قوة الانفجار أكبر من القوة المحددة وكذلك قوة الترند
                   
    if(pwre >= ExplosionPower && pwrt >= TrendPower)
                     {
    // تفعيل التنبيه في حال كان المستخدم يريد تفعيل التنبيه بشكل عام
                       
    if(AlertWindow == true)
                         {
    // إعطاء المستخدم معلومات عن الوضع الحالي للانفجار السعري
                           
    Alert(LastTime1"- "Symbol(), " - BUY "" ("
                                 
    DoubleToStr(baskDigits) , ") Trend PWR " 
                                 
    DoubleToStr(pwrt,0), " - Exp PWR "DoubleToStr(pwre0));
                         }
    // حتى في حال لم يكن المستخدم يفعل نظام التنبيه أظهر له المعلومات عن طريق الطباعة
                       
    else
                         {
                           Print(
    LastTime1"- "Symbol(), " - BUY "" ("
                                 
    DoubleToStr(baskDigits), ") Trend PWR "
                                 
    DoubleToStr(pwrt0), " - Exp PWR "DoubleToStr(pwre0));
                         }
                       
    LastTime1++;
                     }
                   
    Status 1;
                 }
    // نفس الشرح السابق لتنبيه المستخدم عن صفقات البيع
               
    if(Trend1 && MathAbs(Trend1) > Explo1 && MathAbs(Trend1) > Dead && 
                  
    Explo1 Dead && Explo1 Explo2 && MathAbs(Trend1) > MathAbs(Trend2) && 
                  
    LastTime2 AlertCount && AlertShort == true && Bid != bbid)
                 {
                   
    pwrt 100*(MathAbs(Trend1) - MathAbs(Trend2)) / MathAbs(Trend1);
                   
    pwre 100*(Explo1 Explo2) / Explo1;
                   
    bbid Bid;
                   if(
    pwre >= ExplosionPower && pwrt >= TrendPower)
                     {
                       if(
    AlertWindow == true)
                         {
                           
    Alert(LastTime2"- "Symbol(), " - SELL "" ("
                                 
    DoubleToStr(bbidDigits), ") Trend PWR "
                                 
    DoubleToStr(pwrt,0), " - Exp PWR "DoubleToStr(pwre0));
                         }
                       else
                         {
                           Print(
    LastTime2"- "Symbol(), " - SELL "" ("
                                 
    DoubleToStr(bbidDigits), ") Trend PWR " 
                                 
    DoubleToStr(pwrt0), " - Exp PWR "DoubleToStr(pwre0));
                         }
                       
    LastTime2++;
                     }
                   
    Status 2;
                 }
    // تنبيه المستخدم للخروج من الشراء
               
    if(Trend1 && Trend1 Explo1 && Trend1 Trend2 && Trend2 Explo2 && 
                  
    Trend1 Dead && Explo1 Dead && LastTime3 <= AlertCount && 
                  
    AlertExitLong == true && Bid != bbid)
                 {
                   
    bbid Bid;
                   if(
    AlertWindow == true)
                     {
                       
    Alert(LastTime3"- "Symbol(), " - Exit BUY "" "
                             
    DoubleToStr(bbidDigits));
                     }
                   else
                     {
                       Print(
    LastTime3"- "Symbol(), " - Exit BUY "" "
                             
    DoubleToStr(bbidDigits));
                     }
                   
    Status 3;
                   
    LastTime3++;
                 }
    // تنبيه المستخدم للخروج من البيع
               
    if(Trend1 && MathAbs(Trend1) < Explo1 && 
                  
    MathAbs(Trend1) < MathAbs(Trend2) && MathAbs(Trend2) > Explo2 && 
                  
    Trend1 Dead && Explo1 Dead && LastTime4 <= AlertCount && 
                  
    AlertExitShort == true && Ask != bask)
                 {
                   
    bask Ask;
                   if(
    AlertWindow == true)
                     {
                       
    Alert(LastTime4"- "Symbol(), " - Exit SELL "" "
                             
    DoubleToStr(baskDigits));
                     }
                   else
                     {
                       Print(
    LastTime4"- "Symbol(), " - Exit SELL "" "
                             
    DoubleToStr(baskDigits));
                     }
                   
    Status 4;
                   
    LastTime4++;
                 }
               
    PrevStatus Status;
             }
    // تصفير العدادت في حال تغيرت حالة الصفقات
           
    if(Status != PrevStatus)
             {
               
    LastTime1 1;
               
    LastTime2 1;
               
    LastTime3 1;
               
    LastTime4 1;
             }
         }
       return(
    0);
      }
    //+------------------------------------------------------------------+ 
    أرجو أن تمخمخوا كثيرا في هذا الكود

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

    فأي مؤشر يبدأ صغيرا وبسيطا ثم يزداد تعقيدا وصعوبة مع مرور الوقت وعمل التطويرات عليه.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  3. #13
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    سنتكلم في هذا الدرس عن بعض الوظائف الهامة مع الشرح


    - الوظيفة NormalizeDouble :

    استخدام الوظيفة يكون على الشكل التالي:
    كود PHP:
    NormalizeDouble(double valueint digits); 
    تقوم هذه الوظيفة بتحويل الرقم العشري إلى رقم عشري بعدد خانات محدد.

    مثلا الرقم 1.298765 يمكن تحويله إلى 1.2987 أو إلى الرقم 1.29 وهكذا.

    يستفاد من هذه الوظيفة لجعل قيم الأسعار متوافقة مع وظائف الشراء والبيع.

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

    بل يجب أولا أن نجعله متوافقا مع الأسعار القياسية ولذلك فإننا يجب ان نحسنه باستخدام هذه الوظيفة على الشكل التالي:
    كود PHP:
    double A=(معادلة حسابية);
    double myAsk NormalizeDouble(A,Digits); 
    وكما تعلمنا سابقا فإن Digits تعطينا عدد الخانات العشرية المتبعة مع الزوج الحالي.

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

    كما انه من المستحسن أن تظهر الأرقام على المؤشر أيضا بعد تحسينها حتى لا تظهر بخانات عشرية أكبر أو أصغر.



    - الوظيفة DoubleToStr :

    تستخدم هذه الوظيفة على الشكل التالي:
    كود PHP:
    string DoubleToStr(double valueint digits); 
    تقوم بتحويل الرقم العشري أو الصحيح إلى نص. ويمكن أيضا التحكم بعدد الخانات العشرية التي نريدها.


    - الوظيفة StrToDouble :

    تستخدم على الشكل التالي
    كود PHP:
    double StrToDouble(string value); 
    وهي عكس الوظيفة السابقة حيث تحول النص المكون من أرقام إلى رقم يمكن التعامل معه رياضيا.

    لأن الرقم النصي مثل "4.3445" لا يمكن التعامل معه رياضيا.

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


    - الوظيفة StrToInteger :

    تستخدم على الشكل التالي:
    كود PHP:
    int StrToInteger(string value); 
    وهي نفس عمل الوظيفة السابقة ولكنها تحول النص الرقمي إلى رقم صحيح وأنتم تعلمون الفرق بين الأرقام الصحيحة والأرقام العشرية.


    - الوظيفة StrToTime :

    لها الاستخدام التالي:
    كود PHP:
    datetime StrToTime(string value); 
    وهي تحول النص الذي يتضمن تاريخا مثل "2007.05.06 05:30" إلى قيمة في متحول زمني datetime.


    الوظيفة TimeToStr :

    لها الاستخدام التالي:
    كود PHP:
    string TimeToStr(datetime valueint mode=TIME_DATE|TIME_MINUTES
    وهي تحول القيمة الزمنية إلى نص ولها بارامتر إضافي خياري نحدد من خلاله المعطيات التي نريد تحويلها إلى نص.

    القيمة الافتراضية هي TIME_DATE|TIME_MINUTES أي أننا نريد تحويل النص الزمني إلى تاريخ وإلى دقائق بدون ثواني.

    أما إذا وضعنا الثابت TIME_DATE|TIME_SECOND فهذا سيجعل القيمة النهائية تحتوي على ثواني أيضا.

    مثال:
    كود PHP:
    string var1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS); 
    سينتج لنا نص يحتوي على التاريخ الحالي متضمنا الثواني أيضا.


    - الوظيفة CharToStr :

    لها الاستخدام التالي:
    كود PHP:
    string CharToStr(int char_code); 
    مهمة هذه الوظيفة هي تحويل رقم صحيح من 0 - 255 إلى حرف وحيد.

    من المعلوم أن لكل حرف أبجدي للانجليزي والعربي وبعض الرموز الأخرى رقما يحدده .

    وهذه الأرقام تعرف بجدول الآسكي ASCII .

    فمثلا رمز المسافة هو 32 ورمز الحرف a هو 65 وهكذا.

    أحيانا نضطر لكتابة بعض الرموز الخاصة عن طريق رقمها وسنجد استخدامات مفيدة لهذه الوظيفة لاحقا.


    كل الوظائف السابقة تسمى وظائف التحويلات ومهمتها التحويل بين أنواع المتحولات المختلفة وهي ضرورية جدا لعمل برامجنا في المستقبل.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  4. #14
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    نكمل شرح بعض الوظائف الهامة الأخرى:

    الوظائف الزمنية:

    - الوظيفة Day :

    هذه الوظيفة تعيد لنا قيمة اليوم كرقم فمثلا نحن الآن في التاريخ 16/7/2007 فإن قيمة ()Day ستكون 16.

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

    - الوظيفة DayOfWeek :

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

    يمكن مثلا وضع الشرط الحالي في اكسبيرت ما لكي لا يعمل في أيام العطل السبت والأحد.
    كود PHP:
    // يجب عدم العمل في أيام العطل
      
    if(DayOfWeek()==|| DayOfWeek()==6) return(0); 
    - الوظيفة DayOfYear :

    تعود لنا برقم اليوم بالنسبة للسنة الحالية بدءا من الرقم واحد لأول يوم في السنة انتهاء بالرقم 365 لآخر يوم في السنة.


    - الوظيفة Hour :

    تعيد لنا هذه الوظيفة رقم الساعة بالنسبة لليوم ابتداء من الرقم صفر للساعة 12 عند منتصف الليل وانتهاء بالرقم 23 للساعة 11 مساء.

    يستفاد من هذه الوظيفة مثلا لتحديد ساعات عمل اكسبيرت ما في أوقات محددة ويكون الشرط على الشكل التالي:
    كود PHP:
    int start()
    {
      if(
    Hour()<12 || Hour()>17)  return(0);
      ......

    - الوظيفة Minute :

    تعيد لنا هذه الوظيفة رقم الدقيقة بالنسبة للساعة الحالية بدءا من الصفر للدقيقة الأولى وانتهاء بالرقم 59 لآخر دقيقة في الساعة.

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


    - الوظيفة Month :

    تعيد لنا هذه الوظيفة رقم الشهر بالنسبة للسنة الحالية بدءا من الرقم 1 للشهر الأول من السنة وحتى الرقم 12 للشهر الأخير من السنة.


    - الوظيفة Seconds:

    تعيد لنا رقم الثانية بالنسبة للدقيقة الحالية بدءا من الرقم صفر لأول ثانية بالنسبة للدقية وانتهاء بالرقم 59 لآخر ثانية.


    - الوظيفة Year :

    تعيد لنا رقما عبارة عن السنة الحالية فمثلا:
    كود PHP:
    Print(Year());
    // الناتج سيكون 2008 
    - الوظيفة TimeCurrent :

    تعيد لنا آخر تاريخ ووقت حصل فيه تغير للسعر للزوج المستخدم على الشارت.


    - الوظيفة TimeDay :

    تعيد لنا رقم اليوم بالنسبة لتاريخ مدخل مثلا:
    كود PHP:
    int day=TimeDay(D'2003.12.31');
      
    // النتيجة ستكون 31 
    هذه الوظيفة مشابهة للوظيفة Day ولكنها تحتاج لتاريخ محدد.


    - الوظائف TimeDayOfWeek TimeDayOfYear TimeHour TimeMinute TimeMonth TimeSeconds TimeYear :

    نفس عمل الوظائف المشروحة سابقا والتي لها نفس الاسم بدون Time.

    وجميعها لها نفس المعنى ولكن على تاريخ محدد وليس على التاريخ الحالي.



    - الوظيفة TimeLocal :

    تعيد لنا تاريخ ووقت الجهاز الحالي المحلي. وقد يكون مختلفا عن تاريخ ووقت السيرفر لذلك يجب الانتباه.


    والآن أصبح لديك كل الوظائف اللازمة للتعامل مع التاريخ والوقت وسنرى في الدروس القادمة أنها وظائف هامة فعلا وخصوصا عند تعاملنا مع الاكسبيرتات.
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  5. #15
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    هذا الدرس سيخصص بالكامل لشرح الوظائف الرسومية والتي مهمتها التعامل مع الكائنات Objects الرسومية التي يمكن لنا وضعها أو رسمها على الشارت مباشرة وتعديل موقعها والبيانات التي تظهرها.

    الكائنات الرسومية هي ( مع أسمائها البرمجية ) :

    - الخط العمودي OBJ_VLINE:
    وهو عبارة عن خط عمودي على كامل الشارت له خصائص مثل اللون والسماكة وطريقة رسم الخط هل هو منقط أو متصل وهكذا.

    وهو يحتاج فقط إلى معرفة الزمن الذي سيرسم عليه الخط العمودي.

    - الخط الأفقي OBJ_HLINE:
    وهو عبارة عن خط أفقي يرسم على كامل الشارت وله مثل خصائص الخط العمودي أعلاه.

    وهو يحتاج فقط إلى السعر الذي سيرسم عليه الخط الأفقي.

    - الخط المائل OBJ_TREND:
    وهو خط الترند المعروف ويتم تحديده بنقطتين فقط. بحيث يكون لكل نقطة زمن وسعر.

    وله أيضا نفس الخصائص الرسومية السابقة.

    كما أن له أيضا خاصية جديدة هي Ray والتي تأخذ قيمتين هما true أو false.

    في حال كانت true فإن خط الترند يرسم حتى يخرج من حدود الشارت.

    في حال كانت false فإن خط الترند يرسم فقط بين النقطتين المحددتين.

    - الخط المائل بزاوية OBJ_TRENDBYANGLE:
    وهو مشابه للترند السابق ولكنه يرسم من نقطة واحدة فقط مع إعطائه زاوية معينة.

    - نسب فيبوناتشي OBJ_FIBO:
    وهي كائن فيبوناتشي المعروفة وترسم بتحديد نقطين فقط. وسيظهر الكائن على الشارت وفق الإعدادات الإفتراضية لمستوياته.

    مع إمكانية التحكم بهذه المستويات برمجيا كما سنرى بعد قليل.

    - المستطيل OBJ_RECTANGLE:
    يتم رسم مستطيل على الشارت بتحديد نقطتين فقط بحيث تكون كل نقطة زمن وسعر.

    - المثلث OBJ_TRIANGLE:
    يتم رسم مثلث على الشارت بتحديد ثلاث نقط.

    - القطع الناقص OBJ_ELLIPSE:
    يتم رسمه بتحديد نقطتين فقط.

    - الدائرة OBJ_CYCLES:
    يتم رسمها أيضا بتحديد نقطتين فقط.

    - أسهم أو أشكال أخرى OBJ_ARROW:
    يمكن بواسطة هذا الشكل رسم أسهم لفوق أو لتحت أو إشارات مثل يد لتحت أو يد لفوق أو إشارة صح أو اشارة خطأ أو مستطيل صغير يظهر السعر الحالي.

    يتم تحديد نوع السهم بواسطة رقم خاص بكل نوع.

    هذه الأسهم والأشكال مختلفة عن أسهم المؤشرات المتعارف عليها في رسم أسهم المؤشرات.

    لأن هذه الأسهم والإشارات هي كائنات رسومية ترسم بشكل خاص ولها اسم وموقع وصفات أخرى.

    يعني هذه الأسهم والإشارات هي كائنات رسومية مثلها مثل الترند والمستطيل فانتبه لهذا الفرق.


    - مربع نص OBJ_TEXT:
    لرسمه نحتاج فقط إلى نقطة واحدة مكونة من زمن وسعر. حيث دائما الزمن يكون محور X والسعر هو محور Y.



    كل الكائنات الرسومية السابقة تعتمد على نقاط تموضع على الشارت مكونة من زمن X وسعر Y.

    وهذه الكائنات تتحرك مع الشارت يمينا ويسارا كما أنها تكبر بتصغير الفريم وتصغر بتكبير الفريم.

    هناك نوع أخير لا يتحرك مع الشارت ويبقى ثابتا عليه مهما حركنا الشارت يمينا أو يسارا أو مهما غيرنا نوع الفريم المستخدم وهو:

    - بطاقة نص OBJ_LABEL:
    لرسم هذه البطاقة التي تظهر لنا نصا داخلها بلون وخط محددين فإننا نحتاج إلى تحديد X و Y لها بالبيكسل.

    والبيكسل هو أصغر نقطة ضوئية على الشاشة بالدقة المحددة مثلا 1024 × 768 بيكسل.

    والنقطة صفر × صفر هي النقطة اليسارية العلوية من نافذة الشارت.

    أي أن مبدأ الاحدائيات هو من الزاوية اليسارية العلوية لنافذة الشارت.

    وكلما زدنا القيمة بالموجب فإن النقطة تنزل إلى الأسفل وتقترب من اليمين أكثر.

    نستفيد من هذا الكائن لعرض معلومات نصية ثابتة على الشارت
    وهذه المعلومات ستظل ثابتة على الشارت مهما غيرنا الفريم المستخدم أو أزحنا السعر إلى اليمين أو اليسار.

    وهو حل جيد لمشكلة Comment التي واجهناها في السابق.

    يوجد كائنات رسومية أخرى مثل مراوح فيبوناتشي وقنوات فيبوناتشي والقناة السعرية وغيرها من الكائنات الأخرى الموجودة في برنامج التداول.

    يمكن التمرن الآن على الكائنات الرسومية من خلال برنامج التداول ومعرفة خصائص كل كائن رسومي من خلال برنامج التداول نفسه.

    وسنرى بعد قليل كيف نستطيع جعل مؤشرنا يقوم برسم هذه الكائنات على الشارت آليا وفق آلية معينة

    أو جعل مؤشرنا أكثر فائدة وحيوية باستخدام هذه الكائنات الرسومية الضرورية.

    شرح الوظائف المستخدمة مع الكائنات الرسومية:

    إن أهم وظيفة سوف نستخدمها هي الوظيفة ObjectCreate والتي من خلالها نستطيع رسم أي كائن رسومي من الأنواع التي شرحناها سابقا على الشارت.

    إن أي كائن رسومي نريد رسمه على الشارت يجب أن يكون له اسم فريد غير مكرر على الشارت وكذلك أن يكون له نقاط تموضع مرتبطة بالسعر والزمن.

    تستخدم الوظيفة ObjectCreate كالتالي:
    كود PHP:
    bool ObjectCreate(string nameint typeint windowdatetime time1double price1datetime time2=0double price2=0datetime time3=0double price3=0
    البارامتر الأول هو اسم الكائن الرسومي البرمجي والذي من خلاله نستطيع تعديل صفاته الرسومية أو تغيير مكانه أو حتى حذفه.

    وهو كما قلنا يجب ان يكون فريدا أي غير مكرر.

    البارامتر الثاني هو نوع الكائن الرسومي الذي نريد رسمه على الشارت وهو أحد الأنواع المشروحة سابقا.

    البارامتر الثالث هو رقم النافذة التي نريد وضع الكائن الرسومي عليها وهي عادة تكون النافذة رقم صفر وهي الأساسية ثم الرقم واحد لأول نافذة فرعية وهكذا.

    البارامترات الستة الباقية هو نقاط تمركز وتموضع هذا الكائن على الشارت.

    يجب إدخال نقطة تموضع واحدة على الأقل لأي كائن رسومي.

    وكما وجدنا سابقا فإن أي كائن رسومي قد يحتاج لنقطة واحدة أو اثنتين أو ثلاثة معا حسب نوعه.

    في حال نجحت الوظيفة في رسم الكائن المطلوب فإنها تعود بقيمة true أما إذا فشلت فإنها تعود بقيمة false.

    والفشل قد يعود لعدة أسباب منها تكرار اسم موجود على الشارت أو إنقاص في معلومات نقاط التموضع.

    مثال لرسم خط عمودي:
    كود PHP:
    if (ObjectCreate("VerLine1",OBJ_VLINE,0D'2007.07.25 12:30',0))
    {
       ..... 
    نجاح الوظيفة في رسم الخط العمودي
    }
    else
    {
      Print(
    "Cant Draw VLINE");

    الكود السابق يعني ارسم خط عمودي باسم VerLine1 على النافذة الأساسية في التاريخ 2007.07.25 12:30

    واستخدمنا الشرط لمعرفة هل نجحت الوظيفة في عملها أم لا.


    مثال آخر لرسم الترند المرتكز على نقطتين:
    كود PHP:
    ObjectCreate("Trend1",OBJ_TREND,0,Time[0],Low[0],Time[10],High[9]); 
    الكود السابق يرسم ترند باسم Trend1 على النافذة الأساسية من لو الشمعة الأخيرة إلى هاي الشمعة العاشرة.



    الوظيفة ObjectDelete:

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

    وليس لهذه الوظيفة إلا بارامتر واحد هو اسم الكائن الذي نريد حذفه.

    فمثلا الكود التالي يحذف الكائن الرسومي الذي اسمه Trend1.
    كود PHP:
    ObjectDelete("Trend1"); 
    وهي تعود بقيمة true في حال نجحت في حذف الكائن أو false في حال فشلت.

    والفشل يكون هنا في حال لم تعثر الوظيفة على كائن بهذا الاسم.


    الوظيفة ObjectsDeleteAll:

    هذه الوظيفة لها ثلاثة استخدامات:

    1- تقوم هذه الوظيفة بحذف كل الكائنات الرسومية الموجودة على الشارت وذلك باستدعائها دون بارامترات مثل:
    كود PHP:
    ObjectsDeleteAll(); 
    - أو حذف كل الكائنات الرسومية من نافذة محددة ( صفر للرئيسية ثم واحد للفرعية وهكذا )

    فمثلا المثال التالي يحذف كل الكائنات الرسومية الموجودة على النافذة الفرعية الأولى:
    كود PHP:
    ObjectsDeleteAll(1); 
    - أو حذف كل الكائنات الرسومية التي لها نوع محدد من النافذة المحددة.

    فمثلا الكود التالي يحذف كل الترندات المرسومة على النافذة الرئيسية للشارت:
    كود PHP:
    ObjectsDeleteAll(0,OBJ_TREND); 
    الوظيفة ObjectFind:

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

    فإذا كان موجودا على النافذة الرئيسية للشارت فهي تعيد لنا الرقم صفر وإذا كان موجودا في النافذة الفرعية الأولى فإنها تعيد لنا الرقم واحد وهكذا.

    في حال لم تجد الوظيفة الكائن الذي نبحث عنه فإنها تعيد لنا القيمة -1 والتي من خلالها نعرف أنه لا يوجد كائن رسومي بهذا الاسم.

    فمثلا هذا الكود يبحث لنا عن الترند Trend1 ويخبرنا هل وجده أم لا.
    كود PHP:
    int wi=ObjectFind("Trend1");
    if (
    wi==-1)
    {
      Print (
    "الترند غير موجود");
    }
    else
    {
      Print(
    "الترند موجود على النافذة رقم  " ,wi);

    الوظيفة ObjectTotal:

    أي كائن رسومي يتم رسمه على الشارت يأخذ رقم يبدأ من الصفر.

    بمعنى إن أول كائن رسومي مهما كان نوعه يتم رسمه على الشارت يأخذ الرقم صفر. وثاني كائن يأخذ رقم واحد وهكذا.

    الوظيفة ObjectTotal تعطينا عدد الكائنات الرسومية الموجودة على الشارت.

    إذا أردنا معرفة فقط عدد الترندات مثلا فإننا نحدد لهذه الوظيفة نوع الكائن الذي نريد عدده مثل الكود التالي:
    كود PHP:
    Print("عدد كل الكائنات " ObjectTotal());
    Print(
    "عدد الترندات فقط " ObjectTotal(OBJ_TREND)); 
    الوظيفة ObjectType:

    تعطينا هذه الوظيفة نوع الكائن الرسومي هل هو ترند أو خط أفقي مثلا من خلال اسمه.

    فمثلا الكود التالي يعطينا نوع الكائن الرسومي الذي اسمه Line.
    كود PHP:
    Print(ObjectType("Line")); 
    بقي شرح بسيط وننتهي من درس الكائنات الرسومية

    الوظيفة ObjectSet :

    هذه الوظيفة تقوم بتغيير مواصفات الكائن الرسومي على الشارت وتستخدم على الشكل التالي:
    كود PHP:
    bool ObjectSetstring nameint indexdouble value
    البارامتر الأول هو اسم الكائن الرسومي الذي نريد تغيير إحدى خصائصه.

    البارامتر الثاني هو رقم الخاصية التي نريد تغيير قيمتها.

    البارامتر الثالث هي القيمة الجديدة للخاصية.

    وهذا جدول يبين فيه الخصائص التي يمكن تغييرها لأي كائن مع ملاحظة أن هذه الخصائص ليست مشتركة لكل أنواع الكائنات الرسومية.

    بل لكل نوع كائن هناك خصائص خاصة به فقط وقد لا تكون مشتركة مع الكائنات الأخرى.
    كود PHP:
    OBJPROP_PRICE1            1
    لتغيير موقع الكائن السعري الأول
    .
    OBJPROP_TIME2              2
    لتغيير موقع الكائن الزمني الثاني
    .
    OBJPROP_PRICE2            3
    لتغيير موقع الكائن السعري الثاني
    .
    OBJPROP_TIME3              4
    لتغيير موقع الكائن الزمني الثالث
    .
    OBJPROP_PRICE3            5
    لتغيير موقع الكائن السعري الثالث
    .
    OBJPROP_COLOR            6
    لتغيير لون الكائن الرسومي
    .
    OBJPROP_STYLE             7
    لتغيير طريقة رسم الكائن الرسومي وهي تأخذ إحدى الحالات التالية
    STYLE_SOLIDSTYLE_DASHSTYLE_DOT
    STYLE_DASHDOTSTYLE_DASHDOTDOT 
    OBJPROP_WIDTH             8
    لتغيير عرض وسماكة الخط وتأخذ قيم من 1 إلى 5 
    .
    OBJPROP_BACK              9
    لجعل الخلفية مصبوغة بالكامل أو مجرد حدود فقط
    .
    OBJPROP_RAY               10
    لتغيير خاصية RAY والتي تجعل الترند ممتدا إلى خارج الشارت أو فقط خط بين نقطيتن
    .
    OBJPROP_ANGLE           13 
    لتغيير زاوية رسم الكائن الرسومي أو زاوية الاستدارة
    .
    OBJPROP_ARROWCODE 14
    لتغيير رمز السهم للكائن الرسومي الذي يظهر أشكال محددة أو أسهم
    .
    OBJPROP_TIME*****S 15
    لتغيير خاصية ظهور الكائن على بعض الفريمات فقط وليس كلها
    .OBJPROP_FONTSIZE     100
    لتغيير حجم الفونت للكائنات التي تظهر نصا داخلها
    .
    OBJPROP_CORNER       101
    لتغيير زاوية تموضع كائن البطاقة النصية وهي تأخذ قيم من 0 إلى ثلاثة حيث الصفر هي الزاوية العلوية اليسارية للشارت وهكذا

    OBJPROP_XDISTANCE   102
    لتغيير قيمة المحور X للكائن البطاقة النصية وهذه القيمة بالبيكسل
    .
    OBJPROP_YDISTANCE   103
    لتغيير قيمة المحور Y للكائن البطاقة النصية وهذه القيمة بالبيكسل
    .
    OBJPROP_LEVELCOLOR  201
    لتغيير ألوان مستويات الكائن الرسومي
    .
    OBJPROP_LEVELSTYLE   202
    لتغيير طريقة رسم خطوط المستويات
    .OBJPROP_LEVELWIDTH   203
    لتغيير عرض خطوط المستويات

    أمثلة:
    كود PHP:
    // لتغيير تموضع الكائن الزمني الأول
    ObjectSet("MyTrend"OBJPROP_TIME1Time[0]);
    // لتغيير عرض خط الترند إلى 3
    ObjectSet("MyTrend"OBJPROP_WIDTH3);
    // لجعل الكائن يظهر فقط على الفريم ربع الساعة والساعة
    ObjectSet("MyObject"OBJPROP_TIME*****SOBJ_PERIOD_M15 OBJ_PERIOD_H1); 
    الوظيفة ObjectGet
    وهي تقوم بإعادة قيمة أية خاصية لأي كائن رسومي موجود على الشارت. وهي معاكسة لمهمة الوظيفة السابقة ObjectSet.

    في المصطلحات البرمجية فإن Set دائما تعني تغيير قيمة. و Get تعني الحصول على قيمة.

    فمثلا لو أردنا معرفة عرض خط الترند الذي اسمه MyTrend فإننا نستخدم الكود التالي:
    كود PHP:
    Print(ObjectGet("MyTrend"OBJPROP_WIDTH));
    // النتيجة ستكون 3 
    وهي تستخدم نفس الجدول السابق تماما.

    الوظيفة ObjectSetText:

    وهي تستخدم فقط مع كائن مربع النص المرتبط مع احدائيات الشارت الزمنية. وكائن البطاقة النصية المرتبط بإحداثيات البيكسل للشارت.

    وهي تقوم بتغيير النص الظاهر عليهما مع تحديد لحجم واسم ولون الخط المستخدم.

    وهي تستخدم على الشكل التالي:
    كود PHP:
    bool ObjectSetTextstring namestring textint font_sizestring font=NULLcolor text_color=CLR_NONE
    وطريقة استخدامها واضحة جدا والمثال التالي يشرح بشكل أفضل:
    كود PHP:
    ObjectSetText("text_object""Hello world!"10"Times New Roman"Green); 
    مؤشر Waddah Attar Strong Level بنسخته القديمة مثال جيد عن التعامل مع الكائنات الرسومية .

    والشرح الخاص بها موجود في نص الكود التالي:
    كود PHP:
    #property copyright "Copyright © 2007, Waddah Attar"
    #property link      waddahattar@hotmail.com
    //---- 
    #property indicator_chart_window
    #property indicator_buffers 8
    #property indicator_color1 Red
    #property indicator_color2 Green
    #property indicator_color3 Blue
    #property indicator_color4 Red
    #property indicator_color5 Green
    #property indicator_color6 Blue
    #property indicator_color7 Orange
    #property indicator_color8 Orange
    extern bool BackTest=false;
    extern bool DrawMonth=true;
    extern bool DrawWeek=true;
    extern bool DrawDay=true;
    extern bool DrawH4=false;
    //---- buffers
    double P1Buffer[];
    double P2Buffer[];
    double P3Buffer[];
    double P4Buffer[];
    double P5Buffer[];
    double P6Buffer[];
    double P7Buffer[];
    double P8Buffer[];
    //---- 
    int levelPeriod1 PERIOD_D1;
    int levelPeriod2 PERIOD_H4;
    int levelPeriod3 PERIOD_W1;
    int levelPeriod4 PERIOD_MN1;
    bool FixSunday;
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int init()
      {
       
    SetIndexBuffer(0P1Buffer);
       
    SetIndexBuffer(1P2Buffer);
       
    SetIndexBuffer(2P3Buffer);
       
    SetIndexBuffer(3P4Buffer);
       
    SetIndexBuffer(4P5Buffer);
       
    SetIndexBuffer(5P6Buffer);
       
    SetIndexBuffer(6P7Buffer);
       
    SetIndexBuffer(7P8Buffer);
    //---- 
       
    SetIndexStyle(0DRAW_LINESTYLE_SOLID2);
       
    SetIndexStyle(1DRAW_LINESTYLE_SOLID1);
       
    SetIndexStyle(2DRAW_LINESTYLE_SOLID3);
       
    SetIndexStyle(3DRAW_LINESTYLE_SOLID2);
       
    SetIndexStyle(4DRAW_LINESTYLE_SOLID1);
       
    SetIndexStyle(5DRAW_LINESTYLE_SOLID3);
       
    SetIndexStyle(6DRAW_LINESTYLE_SOLID4);
       
    SetIndexStyle(7DRAW_LINESTYLE_SOLID4);
    //---- 
       
    Comment("Strong Level By eng.Waddah Attar ");
       
    FixSunday=false;
       for(
    int i 0<7i++)
         {
           if (
    TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,i))==0)
           {
             
    FixSunday=true;
           }
         }
       return(
    0);
      }
    //+------------------------------------------------------------------+
    //| Custor indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    int deinit()
      {
     
    // تنظيف الشارت من الكائنات الرسومية التي ولدها هذا المؤشر وهي عملية ضرورية لمؤشر احترافي
    // والحذف يكون طبعا فقط للكائنات الخاصة به وليس حذف عام
       
    ObjectDelete("level1");
       
    ObjectDelete("txtlevel1");
       
    ObjectDelete("level2");
       
    ObjectDelete("txtlevel2");
       
    ObjectDelete("level3");
       
    ObjectDelete("txtlevel3");
       
    ObjectDelete("level4");
       
    ObjectDelete("txtlevel4");
       
    ObjectDelete("level5");
       
    ObjectDelete("txtlevel5");
       
    ObjectDelete("level6");
       
    ObjectDelete("txtlevel6");
       
    ObjectDelete("level7");
       
    ObjectDelete("txtlevel7");
       
    ObjectDelete("level8");
       
    ObjectDelete("txtlevel8");
    //---- 
       
    Comment("");
       return(
    0);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator iteration function                              |
    //+------------------------------------------------------------------+
    int start()
      {
       if(
    DrawDayDrawPeriod1();
       if(
    DrawH4DrawPeriod2();
       if(
    DrawWeekDrawPeriod3();
       if(
    DrawMonthDrawPeriod4();
       if (
    BackTest==false)
       {
         for(
    int i=1Barsi++)
         {
           
    P1Buffer[i]=P1Buffer[0];
           
    P2Buffer[i]=P2Buffer[0];
           
    P3Buffer[i]=P3Buffer[0];
           
    P4Buffer[i]=P4Buffer[0];
           
    P5Buffer[i]=P5Buffer[0];
           
    P6Buffer[i]=P6Buffer[0];
           
    P7Buffer[i]=P7Buffer[0];
           
    P8Buffer[i]=P8Buffer[0];
         }
       }
       return(
    0);
      }
     
    int DrawPeriod1()
    {
       
    int iiicounted_bars IndicatorCounted();
       
    double c1c2dc;
       
    string TrendType;
    //---- check for possible errors
       
    if(counted_bars 0
           return(-
    1);
    //---- last counted bar will be recounted
       
    if(counted_bars 0
           
    counted_bars--;  
       
    int limit Bars counted_bars;
    //---- 
       
    for(limit 1>= 0i--)
         {
           
    ii iBarShift(Symbol(), levelPeriod1Time[i],true);
           if (
    TimeDayOfWeek(Time[i])==&& FixSunday==true)
           {
             
    ii=ii+1;
           }
           if(
    ii != -1)
             {
               
    c1 iClose(Symbol(), levelPeriod1ii 1);
               
    c2 iClose(Symbol(), levelPeriod1ii 2);
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    c2 iClose(Symbol(), levelPeriod1ii 3);
                 }
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    dc c1;
                 }
               
    //----
               
    P1Buffer[i] = c1-dc;
               
    P4Buffer[i] = c1+dc;
               if (
    P1Buffer[i]<P4Buffer[i])
               {
                 
    TrendType="Day Up                           ";
               }
               else
               {
                 
    TrendType="Day Down                         ";
               }
     
    // عملت وظيفتين تختصر الكثير من كتابة الكود لوضع كائن سعري وكائن نصي
               
    SetPrice("level1"Time[i],P1Buffer[i], Red);
               
    SetText("txtlevel1"TrendTypeTime[i], P1Buffer[i], Red);
     
               
    SetPrice("level4"Time[i],P4Buffer[i], Red);
               
    SetText("txtlevel4"TrendTypeTime[i], P4Buffer[i], Red);
               
    //----
            
    }
         }
    //----
       
    return(0);
    }
    int DrawPeriod2()
    {
       
    int iiicounted_bars IndicatorCounted();
       
    double c1c2dc;
       
    string TrendType;
    //---- check for possible errors
       
    if(counted_bars 0
           return(-
    1);
    //---- last counted bar will be recounted
       
    if(counted_bars 0
           
    counted_bars--;  
       
    int limit Bars counted_bars;
    //---- 
       
    for(limit 1>= 0i--)
         {
           
    ii iBarShift(Symbol(), levelPeriod2Time[i],true);
           if(
    ii != -1)
             {
               
    c1 iClose(Symbol(), levelPeriod2ii 1);
               
    c2 iClose(Symbol(), levelPeriod2ii 2);
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    c2 iClose(Symbol(), levelPeriod2ii 3);
                 }
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    dc c1;
                 }
               
    //----
               
    P2Buffer[i] = c1-dc;
               
    P5Buffer[i] = c1+dc;
               if (
    P2Buffer[i]<P5Buffer[i])
               {
                 
    TrendType="H4 Up                       ";
               }
               else
               {
                 
    TrendType="H4 Down                     ";
               }
               
    SetPrice("level2"Time[i],P2Buffer[i], Green);
               
    SetText("txtlevel2"TrendTypeTime[i], P2Buffer[i], Green);
               
    SetPrice("level5"Time[i],P5Buffer[i], Green);
               
    SetText("txtlevel5"TrendTypeTime[i], P5Buffer[i], Green);
               
    //----
            
    }
         }
    //----
       
    return(0);
    }
    int DrawPeriod3()
    {
       
    int iiicounted_bars IndicatorCounted();
       
    double c1c2dc;
       
    string TrendType;
    //---- check for possible errors
       
    if(counted_bars 0
           return(-
    1);
    //---- last counted bar will be recounted
       
    if(counted_bars 0
           
    counted_bars--;  
       
    int limit Bars counted_bars;
    //---- 
       
    for(limit 1>= 0i--)
         {
           
    ii iBarShift(Symbol(), levelPeriod3Time[i],true);
           if(
    ii != -1)
             {
               
    c1 iClose(Symbol(), levelPeriod3ii 1);
               
    c2 iClose(Symbol(), levelPeriod3ii 2);
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    c2 iClose(Symbol(), levelPeriod3ii 3);
                 }
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    dc c1;
                 }
               
    //----
               
    P3Buffer[i] = c1-dc;
               
    P6Buffer[i] = c1+dc;
               if (
    P3Buffer[i]<P6Buffer[i])
               {
                 
    TrendType="Week Up                           ";
               }
               else
               {
                 
    TrendType="Week Down                         ";
               }
               
    SetPrice("level3"Time[i],P3Buffer[i], Blue);
               
    SetText("txtlevel3"TrendTypeTime[i], P3Buffer[i], Blue);
               
    SetPrice("level6"Time[i],P6Buffer[i], Blue);
               
    SetText("txtlevel6"TrendTypeTime[i], P6Buffer[i], Blue);
               
    //----
            
    }
         }
    //----
       
    return(0);
    }
    int DrawPeriod4()
    {
       
    int iiicounted_bars IndicatorCounted();
       
    double c1c2dc;
       
    string TrendType;
    //---- check for possible errors
       
    if(counted_bars 0
           return(-
    1);
    //---- last counted bar will be recounted
       
    if(counted_bars 0
           
    counted_bars--;  
       
    int limit Bars counted_bars;
    //---- 
       
    for(limit 1>= 0i--)
         {
           
    ii iBarShift(Symbol(), levelPeriod4Time[i],true);
           if(
    ii != -1)
             {
               
    c1 iClose(Symbol(), levelPeriod4ii 1);
               
    c2 iClose(Symbol(), levelPeriod4ii 2);
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    c2 iClose(Symbol(), levelPeriod4ii 3);
                 }
               
    //----
               
    dc c1 c2;
               
    //----
               
    if(dc == 0)
                 {
                   
    dc c1;
                 }
               
    //----
               
    P7Buffer[i] = c1-dc;
               
    P8Buffer[i] = c1+dc;
               if (
    P7Buffer[i]<P8Buffer[i])
               {
                 
    TrendType="Month Up                           ";
               }
               else
               {
                 
    TrendType="Month Down                         ";
               }
               
    SetPrice("level7"Time[i],P7Buffer[i], Orange);
               
    SetText("txtlevel7"TrendTypeTime[i], P7Buffer[i], Orange);
               
    SetPrice("level8"Time[i],P8Buffer[i], Orange);
               
    SetText("txtlevel8"TrendTypeTime[i], P8Buffer[i], Orange);
               
    //----
            
    }
         }
    //----
       
    return(0);
    }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+ 
     
    //  هذه الوظيفة لوضع كائن سعري
    //  نعطيها اسم الكائن والزمن والسعر واللون
    void SetPrice(string namedatetime Tmdouble Prccolor clr)
      {
    //  في حال عدم وجود الكائن فيجب إنشائه للمرة الأولى
       
    if(ObjectFind(name) == -1)
         {
           
    ObjectCreate(nameOBJ_ARROW0TmPrc);
           
    ObjectSet(nameOBJPROP_COLORclr);
           
    ObjectSet(nameOBJPROP_WIDTH1);
           
    ObjectSet(nameOBJPROP_ARROWCODESYMBOL_RIGHTPRICE);
         }
       else
         {
    //  أما في حال وجوده سابقا فيجب تعديل مواصفاته فقط
           
    ObjectSet(nameOBJPROP_TIME1Tm);
           
    ObjectSet(nameOBJPROP_PRICE1Prc);
           
    ObjectSet(nameOBJPROP_COLORclr);
           
    ObjectSet(nameOBJPROP_WIDTH1);
           
    ObjectSet(nameOBJPROP_ARROWCODESYMBOL_RIGHTPRICE);
         } 
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+ 
     
    //  هذه الوظيفة تنشيء كائن نصي باسم محدد ونص محدد وموقع هذا الكائن ولونه
    void SetText(string name,string txt,datetime Tm,double Prc,color clr)
      {
    //  في حال عدم وجوده قم بإنشائه بالمواصفات المحدد
       
    if(ObjectFind(name) == -1)
         {
           
    ObjectCreate(nameOBJ_TEXT0TmPrc);
           
    ObjectSetText(nametxt10"Times New Roman"clr);
           
    ObjectSet(nameOBJPROP_CORNER2);
         }
       else
         {
    //  في حال وجوده غير خصائصه فقط
           
    ObjectSet(nameOBJPROP_TIME1Tm);
           
    ObjectSet(nameOBJPROP_PRICE1Prc);
           
    ObjectSetText(nametxt10"Times New Roman"clr);
           
    ObjectSet(nameOBJPROP_CORNER2);
         } 
      }
    //+------------------------------------------------------------------+ 
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  6. #16
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    دورة صناعة الاكسبيرتات

    مقدمة عن الاكسبيرتات:

    يجب التفكير في الاكسبيرتات على أنها استراتيجية مؤتمتة آليا. أي لا بد للاكسبيرت أن يعتمد على استراتيجية معينة تكون في الأساس ناجحة.

    ونحن نلجأ عادة للاكسبيرتات في حالات معينة مثل:

    - عدم القدرة على المتابعة اللصيقة للشاشة.

    - عدم القدرة على مجاراة السرعة التي تتطلبها الاستراتيجية.

    - تطبيق الاستراتيجية سيكون على أكثر من زوج واحد بحيث يكون من المستحيل أن يقوم بها المتاجر نفسه.

    - قد تكون شروط الاستراتيجية صعبة جدا بحيث لا يتمكن المتاجر من اتخاذ القرار السريع.

    - قد تكون الاستراتيجية مستحيلة التطبيق يدويا لأنها تتضمن حسابات كثيرة ومعقدة جدا.

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

    هناك الكثير من الأمور الأخرى التي تجعلنا نلجأ إلى الاكسبيرتات وطبعا هناك سبب مادي بحت.

    فالوصول إلى اكسبيرت ناجح يعني كنز بالنسبة لصاحبه أو لمن يستخدمه.



    الشروط الواجب توفرها في الاكسبيرت:

    وهذه الشروط مهمة جدا ويجب أخذها بعين الاعتبار عند تصميم أي اكسبيرت احترافي.

    - أن لا يتعامل الاكسبيرت إلا مع صفقاته التي فتحها بنفسه دون أن يتدخل في الصفقات الأخرى سواء كانت موجودة أو لا.

    - يجب على الاكسبيرت أن يتعامل مع الأخطاء التي قد تحصل أثناء فتح الصفقات بحذر شديد.

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

    - أن يكون الاكسبيرت مرنا جدا من حيث الاستخدام والخصائص المتوفرة تكون واضحة.

    - أن يعالج جميع حالات الاستراتيجية التي يتبعها وأن يكون عنده الحلول المناسبة لأي احتمال.

    - أن يكون متضمنا فيه معالجة للمخاطرة المطلوبة وأن لا يتجاوزها بأي حال من الأحوال.


    الفرق بين المؤشر والاكسبيرت:

    - المؤشر له القدرة على إظهار رسوم على الشارت بينما الاكسبيرت لا يستطيع ذلك.

    - المؤشر لا يستطيع فتح أو إغلاق الصفقات ولكن الاكسبيرت يستطيع ذلك.

    - المؤشر يعمل دائما حتى في حال كان البرنامج غير متصل بالانترنت بينما الاكسبيرت لا يعمل إلا إذا كان البرنامج متصلا بالانترنت.

    - المؤشر يعمل على بيانات الأسعار الحديثة والقديمة بينما الاكسبيرت لا يعمل إلا على آخر سعر فقط.

    - باقي الأوامر البرمجية هي نفسها تماما وما تعلمناه في المؤشرات سنستخدمه وبنفس الطريقة تماما مع الاكسبيرتات.



    بما أنه أصبح لدينا خبرة بالأوامر البرمجية سنبدأ مباشرة في صناعة اكسبيرت وبنفس مباديء برمجة المؤشر والتي عرضناها في الدروس الأولى.

    أولا يجب أن تكون فكرة الاكسبيرت وشروطه واحتمالاته كلها معروفة لنا ومدروسة بشكل محكم وكامل لأن أي خطأ يعني خسارات لا سمح الله.

    ثانيا يجب فحص الاكسبيرت على أربع مراحل:

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

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

    -- الثالثة: فحص الاكسبيرت لمدة لا تقل عن الشهر على حساب ديمو.

    -- الرابعة: فحص الاكسبيرت على حساب حقيقي مع مراقبة لصيقة له في البداية.




    حسب خبرتي المتواضعة فإن الاكسبيرت الناجح هو الاكسبيرت المصمم لزوج محدد فقط.

    لأن لكل زوج طريقة حركة معينة وأهداف وستوبات مختلفة عن أي زوج آخر.



    لنبدأ على بركة الله


    فكرة الاكسبيرت التي سننفذها هي:

    مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:

    - صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

    - صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

    - في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا.

    - في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا.

    - في حال انتهى اليوم ولم تتفعل أي صفقة فإنه يحذف الصفقتين ويبدأ من جديد.


    سوف نكتب فكرة الاكسبيرت الذي نريد صناعته مرة أخرى لنتذكرها ونمشي عليها:

    مع بداية كل يوم جديد في الساعة 12 ليلا يقوم الاكسبيرت بفتح صفقتين معلقتين بالشروط التالية:

    - صفقة شراء فوق سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

    - صفقة بيع تحت سعر الإغلاق لليوم المنتهي بعدد محدد من النقاط وبهدف محدد ووقف محدد.

    - في حال تفعلت صفقة الشراء فإنه يقوم بحذف صفقة البيع المعلقة آليا.

    - في حال تفعلت صفقة البيع فإنه يقوم بحذف صفقة الشراء المعلقة آليا.

    - في حال انتهى اليوم ولم تتفعل أي صفقة فإنه يحذف الصفقتين ويبدأ من جديد.


    خصائص الاكسبيرت الجديد:

    - اسمه هو Buy_Sell_Day

    - له خاصية Step وهي عدد النقاط التي تعلو أو تدنو من سعر الإغلاق لليوم السابق.

    - له خاصية Takeprofit وهي عدد نقاط الربح.

    - له خاصية Stoploss وهي نقاط الوقف.

    - له خاصية Lots وهي حجم اللوتات لكل صفقة.



    والآن لنحلل طريقة عمل الاكسبيرت بطريقة برمجية تحليلية:

    - يفحص الاكسبيرت هل دخل يوم جديد.

    - يفحص الاكسبيرت هل قام بإضافة الصفقات المعلقة أم لا. فإذا كان قد أضافها فليخرج. وإلا فليقم بإضافتها الآن.

    - يضيف الاكسبيرت الصفقات المعلقة بالشروط المحددة.

    - يفحص الآن في كل مرة هل تفعلت إحدى الصفقتين أم لا.

    - في حال تفعلت صفقة فيجب حذف الصفقة المعلقة الأخرى.

    - في حال إغلاق الصفقة بربح أو خسارة فإنه ينتظر بدء يوم جديد ليعيد العملية مرة أخرى.


    والآن إلى الكود.


    نبدأ بالويزارد الخاص بعمل اكسبيرت من برنامج الميتاإيديتور.

    وعندما ننتهي سيكون قالب كود الاكسبيرت الأولي على الشكل التالي:
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                 Byu_Sell_Day.mq4 |
    //|                              Copyright © 2007, www.****forex.net |
    //|                                         http://www.****forex.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2007, www.****forex.net"
    #property link      "http://www.****forex.net"
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+ 
    نكتب الخصائص التالية للاكسبيرت مع القيم الافتراضية:
    كود PHP:
    extern int Step=20;
    extern int Takeprofit=50;
    extern int Stoploss=50;
    extern double Lots=1
    سوف نضيف متحولا داخليا باسم Magicnumber ونعطيه قيمة عشوائية ثابتة وذلك لكي يستطيع الاكسبيرت التعامل فقط مع صفقاته.
    كود PHP:
    int Magicnumber=234561
    لا يوجد شيء نعمله في الوظيفية init والوظيفة deinit

    عملنا كله سيكون في الوظيفة start وسوف نضيف نحن وظائف خاصة مساعدة.

    إن فتح الصفقات يكون دائما في الساعة 0 أي الساعة 12 صباحا ولذلك لن يفتح الاكسبيرت أي صفقة بعد الساعة 12 صباحا.

    لذلك فإن كود فتح الصفقات المعلقة سيكون على الشكل التالي:
    كود PHP:
    int start()
    {
      if(
    Hour()==&& Minute()>&& MyOrdersTotal(Magicnumber)==0)
      {
        
    double DayClose=iClose(Symbol(),PERIOD_D1,1);
        
    double BuyPrice=DayClose+Step*Point;
        
    double BuyTP=BuyPrice+Takeprofit*Point;
        
    double BuySL=BuyPrice-Stoploss*Point;
        
        
    double SellPrice=DayClose-Step*Point;
        
    double SellTP=SellPrice-Takeprofit*Point;
        
    double SellSL=SellPrice+Stoploss*Point;
        
        
    OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuySL,BuyTP,"",Magicnumber,0,Green);
        
    OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,SellTP,"",Magicnumber,0,Green);
      }
      return(
    0);

    في شرط فتح الصفقات المعلقة وضعنا ثلاثة شروط:

    الأول أن الساعة 0 وتعني أن 12 ليلا قد دخلت وأن يوما جديدا قد بدأ.

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

    الثالث أن عدد الصفقات الحالية الخاصة باكسبيرتنا هو الصفر أي أنه لا توجد صفقات مفتوحة حاليا.

    واستخدمنا لذلك وظيفة خاصة من صنعنا هي MyOrdersTotal وأدخلنا فيها الرقم السحري الذي يميز صفقات الاكسبيرت عن غيره.

    هذه الوظيفة لها الكود التالي:
    كود PHP:
    int MyOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();
      
      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          
    c++;
        }
      }
      return(
    c);

    وهي تقوم بعد الصفقات المفتوحة المنفذة أو المعلقة وتعود لنا بقيمة تمثل عدد الصفقات الخاصة بالاكسبيرت فقط.


    إذا تحققت الشروط السابقة فإنه يقوم بتجهيز معلومات صفقة البيع وصفقة الشراء ثم يرسل أمر تنفيذها فعليا على الحساب بواسطة الوظيفة OrderSend

    صفقة الشراء المعلقة ستكون أعلى من السعر الحالي ولذلك فإن نوعها سيكون OP_BUYSTOP

    أما صفقة البيع المعلقة ستكون أسفل السعر الحالي ونوعها سيكون OP_SELLSTOP

    استطعنا الحصول على سعر الإغلاق لليوم المنتهي السابق عن طريق الوظيفة iClose والتي تعطينا معلومات الإغلاق لأي زوج ولأي فريم ولأي شمعة نريد.

    نحن مثلا استعلمنا عن سعر الإغلاق لنفس الزوج الذي يعمل عليه الاكسبيرت ولفترة اليوم والشمعة رقم واحد والتي تمثل الشمعة قبل الأخيرة وهي المطلوبة.

    لأن الشمعة رقم صفر هي الشمعة اليومية الجديدة التي تكونت من عشر دقائق فقط.

    ونحن نريد الشمعة التي قبلها ورقمها واحد وهي تمثل الشمعة اليومية لليوم المنتهي.

    بعد ذلك حسبنا سعر الدخول وسعر الهدف وسعر الوقف لعملية البيع وعملية الشراء

    ثم أرسلنا هذه المعلومات للوظيفة OrderSend.
    بسم الله الرحمن الرحيم

    نكمل ما بدأنا به مع الاكسبيرت السابق

    ولكن قبل ذلك سأشرح بالتفصيل الوظيفة OrderSend أهم وظيفة على الإطلاق بالنسبة لبرمجة الاكسبيرتات.

    كما أنها تعتبر من الوظائف الخاصة بالاكسبيرتات فقط والتي لا يستطيع المؤشر بأي شكل من الأشكال أن ينفذها.

    مهمتها ببساطة إجراء عملية بيع أو شراء فوري بسعر السوق أو عمليات بيع أو شراء معلقة بسعر أعلى أو أدنى من سعر السوق الحالي .

    البيع والشراء الفوري يعني من السعر الحالي ( آخر سعر للزوج )

    ويكون الشراء من سعر الطلب Ask والبيع من سعر العرض Bid

    الشراء المعلق له نوعان :

    الأول شراء محدود Buy Limit ويكون من سعر أدنى من السعر الحالي.

    وهو النوع من الصفقات الذي تضعه على دعم تتوقع أن يرتد منه السعر.

    الثاني شراء وقف Buy Stop ويكون من سعر أعلى من السعر الحالي.

    وهو النوع من الصفقات الذي تضعه على مقاومة تتوقع أن يكسرها السعر.

    البيع المعلق له نوعان أيضا:

    الأول بيع محدود Sell Limit ويكون من سعر أعلى من السعر الحالي.

    وهو النوع من الصفقات الذي تضعه على مقاومة تتوقع أن يرتد عنها السعر.

    الثاني بيع وقف Sell Stop ويكون من سعر أدنى من السعر الحالي.

    وهو النوع من الصفقات الذي تضعه على دعم تتوقع أن يخترقها السعر.

    وهذه الوظيفة لها البارامترات التالية :
    كود PHP:
    int OrderSendstring symbolint cmddouble volumedouble priceint slippagedouble stoplossdouble 
    takeprofit
    string comment=NULLint magic=0datetime expiration=0color arrow_color=CLR_NONE
    في حال نجحت الوظيفة في مهمتها فإنها ستعود بقيمة تعبر عن رقم الصفقة وهو أكبر من الصفر حتما.

    أما في حال فشلت لأي سبب من الأسباب فإنها ستعود بقيمة -1
    يجب دائما بعد كل تنفيذ لهذه الوظيفة أن نفحص القيمة العائدة منها.

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

    أو يمكن أن السوق مقفل أو السيرفر مشغول وهكذا.

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

    أول بارامتر لهذه الوظيفة هي اسم الزوج أو السلعة التي نريد إجراء الصفقة عليها .

    وهي متحول نصي نكتب فيه "GBPUSD" مثلا أو نقوم بدلا من ذلك بوضع المتحول Symbol

    والذي يحتوي اسم الزوج الذي يعمل عليه الاكسبيرت حاليا وهي الطريقة المتبعة غالبا .

    ولكن أحيانا فإننا قد نحتاج أن نجري صفقة على زوج آخر ولذلك فقد نضطر لكتابة اسم الزوج يدويا .

    البارامتر الثاني هو نوع الصفقة التي نريد اجرائها على الزوج المحدد وهو له هذه القيم :
    كود PHP:
    OP_BUY == ==Buying position.  == شراء فوري
    OP_SELL 
    == ==Selling position. == بيع فوري
    OP_BUYLIMIT 
    == ==Buy limit pending position. == شراء معلق من سعر أدنى من السعر الحالي
    OP_SELLLIMIT 
    == ==Sell limit pending position. == بيع معلق من سعر أعلى من السعر الحالي
    OP_BUYSTOP 
    == ==Buy stop pending position. == شراء معلق من سعر أعلى من السعر الحالي
    OP_SELLSTOP 
    == ==Sell stop pending position. == بيع معلق من سعر أدنى من السعر الحالي 
    يمكن وضع اسم المتحول OP_BUY أو وضع القيمة المناسبة له وهي صفر والأولى طبعا هو كتابة اسم المتحول لسهولة قراء الكود.

    البارامتر الثالث هو حجم العقد أو اللوت لهذه الصفقة ويمثل الرقم 1 لوت واحد أما الرقم 0.1 فيمثل ميني لوت
    فلو أردنا شراء ثلاثة عقود كبيرة و ثلاثة عقود ميني فإن الرقم سيكون 3.3 وهكذا

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

    لأن البروكر لن يقبل أسعارا غير متوافقة مع سعر السوق الحالي وسوف تفشل الصفقة الفورية .

    أما بالنسبة للعمليات المعلقة الأخرى فالسعر يجب أن يكون أعلى أو أدنى من السعر الحالي وفق نوع الصفقة كما هو محدد في الأعلى وبفارق يقبله البروكر نفسه

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

    فلو فرضنا أننا أردنا الشراء عند السعر 1.9654 بتسامح قدره 3 نقاط فإن مجال الشراء المسموح هو من 1.9654 إلى 1.9657

    طبعا هذا الرقم يكون لصالح البروكر نفسه ولن يكون غالبا لمصلحة المتاجر لذلك يفضل جعله 3 نقاط أو أقل حتما .

    البارامتر السادس هو وقف الخسارة وهو السعر الذي ستتوقف خسارة صفقتك عنده ويتم احتسابه بناء على سعر الدخول زائد أو ناقص عدد معين من النقاط بناء على نوع الصفقة

    فلو فرضنا أن العملية شراء بوقف 50 نقطة فيجب أن يكون سعر الوقف مساويا لسعر الشراء ناقص 50 نقطة والمعادلة ستكون على الشكل التالي:
    كود PHP:
    Ask-Stoploss*Point 
    حيث المتحول Stoploss يساوي الخمسين وقد تم ضربه بالقيمة Point لتحويله إلى رقم عشري مناسب لسعر الزوج .

    مثلا المتحول Ask يساوي 1.9525 فإن وقف الخسارة سيكون 1.9525 - 50 * 0.0001 = 1.9475

    البارامتر السابع هو الهدف أو سعر أخذ الربح وهو مشابه لسعر وقف الخسارة ولكن بالاتجاه الصحيح لصفقتك

    فمثلا في صفقة الشراء فإن سعر الهدف يجب أن يكون أعلى من سعر الدخول بعدد معين من النقاط ويحتسب على الشكل التالي :
    كود PHP:
    Ask+Takeprofit*Point 
    وله نفس شرح الوقف سابقا

    البارامتر الثامن هو عبارة عن نص يمكنك وضع ملاحظة معينة تخزن مع معلومات صفقتك نفسها يمكنك قرائتها فيما بعد .

    البارامتر التاسع هو عبارة عن الرقم السحري والذي تحدده أنت في الاكسبيرت نفسه ووظيفته فصل الصفقات وتصنيفها بحيث يستطيع كل اكسبيرت

    معرفة صفقاته من صفقات غيره . فيقوم بمعالجة صفقاته فقط دون أن يمس الصفقات الأخرى .

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

    البارامتر الأخير هو اللون المميز لهذه الصفقة على الشارت
    البارامترات الأربعة الأخيرة هي بارامترات اختيارية أي يمكنك عدم وضع قيمة فيها لتأخذ حينها القيم الافتراضية المعرفة مسبقا

    وهذا مثال عن تنفيذ صفقة شراء
    كود PHP:
    int ticket;
      if(
    iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
        {
         
    ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,Green);
         if(
    ticket<0)
           {
            Print(
    "OrderSend failed with error #",GetLastError());
            return(
    0);
           }
        } 
    الاكسبيرت الجديد حاليا يقوم بفتح الصفقات المعلقة يوميا.

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

    الكود الحالي للوظيفة start هي على الشكل التالي:
    كود PHP:
    int start()
    {
      if(
    Hour()==&& Minute()>&& MyOrdersTotal(Magicnumber)==0)
      {
        
    double DayClose=iClose(Symbol(),PERIOD_D1,1);
        
    double BuyPrice=DayClose+Step*Point;
        
    double BuyTP=BuyPrice+Takeprofit*Point;
        
    double BuySL=BuyPrice-Stoploss*Point;
     
        
    double SellPrice=DayClose-Step*Point;
        
    double SellTP=SellPrice-Takeprofit*Point;
        
    double SellSL=SellPrice+Stoploss*Point;
     
        
    OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuySL,BuyTP,"",Magicnumber,0,Green);
        
    OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,SellTP,"",Magicnumber,0,Green);
      }
      return(
    0);

    سنضع الآن شرطا في حال وجد صفقات معلقة من اليوم السابق أن يقوم بحذفها

    وسيكون الحذف بعد دخول الساعة 12 ليلا وخلال الخمس دقائق الأولى من الساعة 12

    سنستخدم وظيفتين إحداهما لحذف الصفقات المعلقة التي لم تنفذ والوظيفة الثانية هي إغلاق الصفقات المنفذة مهما كانت النتيجة.

    هاتين الوظيفتين هما من مكتبة أكوادي الخاصة وسنشرح كيف تعمل كل وظيفة.

    يصبح الشرط على الشكل التالي :
    كود PHP:
    if(Hour()==&& Minute()<&& MyOrdersTotal(Magicnumber)>0)
    {
    DeletePendingOrders(Magicnumber);
    CloseOrders(Magicnumber);

    وهذا الشرط يتحقق عندما تصبح الساعة 12 ليلا والدقيقة أقل من خمسة وهناك صفقات معلقة أو مفتوحة.

    في حال تحققت الشروط السابقة يقوم الاكسبيرت بحذف الصفقات المعلقة وإغلاق الصفقات المفتوحة.


    الوظيفة المسؤولة عن حذف الأوامر المعلقة هي :
    كود PHP:
    int DeletePendingOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
     
      for (
    int cnt total  cnt cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
        {
          
    OrderDelete(OrderTicket());
        }
      }
      return(
    0);

    هذه الوظيفة تقوم بحذف كل الصفقات المعلقة والتي ليست من النوع OP_BUY أو OP_SELL

    لأنه لا يمكن حذف الصفقات من هذا النوع.

    في حال تم حذف صفقة معلقة فإنه يقوم بإعادة العداد cnt إلى الصفر مرة أخرى ويقوم بعد الصفقات كلها من جديد في التحول total .

    هذه الخطوة ضرورية جدا لأنه بعد حذف أي صفقة تختلف قيم total و cnt ولا بد من تحديث القيم هذه من جديد.

    تقنية الحذف هي عن طريق اختيار وتحديد الصفقة بواسطة الوظيفة OrderSelect والتي لها ثلاثة بارامترات.

    الأول هو رقم الصفقة التي نريد تحديدها.

    الثاني هو نوع رقم الصفقة هل هو رقم تسلسلي أو رقم التيكيت.

    الثالث هو لتحديد خزان الصفقات التي نريد الاختيار منها هل هو الصفقات الحالية أو الصفقات الهيستوري.

    وكما تلاحظون بأننا استخدمنا تحديد الصفقات عن طريق رقمها التسلسلي والموجودة في خزان الصفقات الحالية.

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

    هذه الوظيفة تحذف لنا أي صفقة يمكن حذفها من خلال رقمها التيكيت.

    وهذا الرقم حصلنا عليه من خلال الوظيفة OrderTicket.

    وطبعا لا يمكن استخدام OrderTicket إلا بعد أن نستخدم الوظيفة OrderSelect

    وهذا ما فعلناه بالضبط.
    أما الوظيفة المسؤولة عن إغلاق الصفقات المنفذة فهي :
    كود PHP:
    int CloseOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
      
      for (
    int cnt total cnt cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          if (
    OrderType()==OP_BUY)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Bid,3);
          }
          
          if (
    OrderType()==OP_SELL)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Ask,3);
          }
        }
      }
      return(
    0);

    هذه الوظيفة بنفس تقنية الوظيفة السابقة ولكنها تبحث فقط عن الوظائف المنفذة وليس المعلقة

    في حال وجدت وظيفة شراء فإنها تغلقها على السعر Bid عن طريق الوظيفة OrderClose

    وهي تحتاج لرقم التيكيت للوظيفة التي نريد إغلاقها

    وهو ما حصلنا عليه بعد أن حددنا الصفقة المطلوبة.

    وتحتاج أيضا إلى عدد اللوتات التي نريد إغلاقها حيث أنه يمكننا إغلاق لوتات أقل من اللوتات الكاملة للصفقة.

    لنفرض أن لدينا صفقة فيها 10 لوت فنحن نستطيع عن طريق هذه الوظيفة إغلاق 5 لوتات فقط وترك الباقي.

    وهي أيضا تحتاج للسعر الذي نريد إغلاق الصفقة عليه وهو Bid بالنسبة للشراء. وAsk بالنسبة للبيع.

    بعد إغلاق كل صفقة نحتاج لتحديث العدادات كما شرحنا سابقا.


    هاتين الوظيفتين هامتين جدا لنا في المستقبل لحذف الصفقات أو أغلاقها.


    الآن يصبح الكود النهائي على الشكل التالي وهو جاهز للعمل وبدون مشاكل.
    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                 Byu_Sell_Day.mq4 |
    //|                              Copyright © 2007, www.****forex.net |
    //|                                         http://www.****forex.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2007, www.****forex.net"
    #property link      "http://www.****forex.net"

    extern int Step=20;
    extern int Takeprofit=50;
    extern int Stoploss=50;
    extern double Lots=1;
    int Magicnumber=234561;
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //----
       
    //----
       
    return(0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
    {
      if(
    Hour()==&& Minute()<&& MyOrdersTotal(Magicnumber)>0)
      {
        
    DeletePendingOrders(Magicnumber);
        
    CloseOrders(Magicnumber);
      }
      if(
    Hour()==&& Minute()>&& MyOrdersTotal(Magicnumber)==0)
      {
        
    double DayClose=iClose(Symbol(),PERIOD_D1,1);
        
    double BuyPrice=DayClose+Step*Point;
        
    double BuyTP=BuyPrice+Takeprofit*Point;
        
    double BuySL=BuyPrice-Stoploss*Point;
        
        
    double SellPrice=DayClose-Step*Point;
        
    double SellTP=SellPrice-Takeprofit*Point;
        
    double SellSL=SellPrice+Stoploss*Point;
        
        
    OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuySL,BuyTP,"",Magicnumber,0,Green);
        
    OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,SellTP,"",Magicnumber,0,Green);
      }
      return(
    0);
    }
    int MyOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();
      
      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          
    c++;
        }
      }
      return(
    c);
    }
    int DeletePendingOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
      
      for (
    int cnt total cnt cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
        {
          
    OrderDelete(OrderTicket());
        }
      }
      return(
    0);
    }
    int CloseOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
      
      for (
    int cnt total cnt cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          if (
    OrderType()==OP_BUY)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Bid,3);
          }
          
          if (
    OrderType()==OP_SELL)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Ask,3);
          }
        }
      }
      return(
    0);

    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  7. #17
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم


    السلام عليكم ورحمة الله وبركاته

    في هذا الدرس سنشرح المزيد من الأوامر المتعلقة بالاكسبيرتات والصفقات التجارية وكيفية التعامل معها.

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

    كل صفقة نقوم بها سواء كانت فورية أو معلقة فإن لها رقم فريد غير متكرر على مستوى الصفقات التي تفتح من البروكر نفسه .


    وهو عبارة عن رقم تسلسلي لجميع الصفقات الحقيقية أو الديمو لكل الحسابات الموجودة في السيرفر الخاص بكل بروكر .


    مثلا أنا فتحت صفقة شراء من حسابي وأخذت الرقم 20034 وأنت أيضا لك حساب في نفس الشركة وفتحت بعدي مباشرة صفقة بيع من حسابك فهي ستأخذ الرقم 20035 .

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

    فمثلا فتحت أنا صفقة أخذت الرقم 10000 وبعد ساعة فتحت صفقة أخرى فكان رقمها 100300 فهذا يعني أنه خلال هذه الساعة تم فتح 300 صفقة.

    ولكننا لن نعرف طبعا عدد الصفقات الحقيقية من الديمو . ولكنه رقم يعبر عن حركة الشركة بشكل عام .


    المهم من كل الكلام السابق فإن أهم شيء لنا علينا معرفته أن لكل صفقة رقم Ticket وهو رقم فريد لهذه الصفقة فقط .
    حتى الصفقة المعلقة التي نحذفها لها رقم فريد يبقى معلقا بها حتى النهاية .

    وجدنا في الدرس السابق كيف قمنا بعمل حلقة على كل الصفقات الحالية ومعرفة عدد الصفقات المتعلقة بالاكسبيرت فقط عن طريق ميزة الرقم السري الذي يميز الصفقات عن بعضها البعض.

    وكيف استطعنا أيضا إغلاق الصفقات المفتوحة أو حذف الصفقات المعلقة .

    واستخدمنا في ذلك تقنية بسيطة وهي عبارة عن حلقة تمر على كل الصفقات من أول صفقة حتى آخر صفقة .

    وفي حال وجدنا صفقة تحقق الشروط المطلوبة قمنا بعدها أو حذفها أو إغلاقها حسب نوع العمل المطلوب .

    لا يمكن بأي حال من الأحوال التعامل مع صفقة قبل اختيارها أولا ويتم اختيارها عن طريق الوظيفة OrderSelect .


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

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

    مثلا نستطيع معرفة أي معلومة عن الصفقة المختارة مثل سعر الدخول لهذه الصفقة أو نوع الصفقة هل هي بيع أو شراء أو غيره .

    أو تاريخ فتح الصفقة أو ربح الصفقة الحالي وغيره من المعلومات الأخرى الهامة .


    بما أننا لا بد من أن نختار الصفقة من خلال OrderSelect قبل أن نقوم بأي عملية على الصفقة المختارة لذلك سنتكلم قليلا عن تقنية الاختيار هذه.

    لكل حساب قسمين من الصفقات .

    القسم الأول : هو القسم الذي يحوي على الصفقات المنفذة وغير المغلقة أو الصفقات المعلقة وغير المنفذة .

    وهي الصفقات التي نراها في صفحة Trade أسفل برنامج التداول .

    القسم الثاني : وهو القسم الذي يحوي على الصفقات المغلقة أو الصفقات المعلقة المحذوفة .

    وهي الصفقات التي نراها في صفحة History .


    في الحقيقة فإن لكل صفقة رقمين :

    الأول : رقم التيكيت الذي تحدثنا قبل قليل .

    الثاني : رقم تسلسلي في القسم الذي يتبع له وهو يبدأ من الصفر - واحد - اثنان وهكذا حتى آخر صفقة .

    ولكل قسم أرقام تسلسلية خاصة به .


    ادخل على صفقاتك الحالية فإن أول صفقة لها الرقم صفر والصفقة التي بعدها رقمها واحد وهكذا .

    هذا الرقم لن تراه في جدول الصفقات . بل سترى رقم التيكيت فقط .

    الآن حان وقت شرح الوظيفة OrderSelect

    لهذه الوظيفة ثلاث بارامترات :

    الأول : رقم الصفقة التسلسلي أو التيكيت والذي يتحدد نوعه حسب قيمة البارامتر الثاني .


    البارامتر الثاني : نوع الرقم هل هو تسلسلي أو تيكيت . ويأخذ قيمتين إما SELECT_BY_POS وهذا يعني أن الرقم نوعه تسلسلي.

    أو القيمة SELECT_BY_TICKET وهذا يعني أن الرقم نوعه تيكيت .


    البارامتر الثالث : نوع القسم الذي سنختار منه الصفقة هل هو الصفقات الحالية أو الهيستوري . وله قيمتان إما MODE_TRADES وهذا يعني أننا سنعمل على الصفقات الحالية. وهي القيمة الافتراضية .

    أو القيمة MODE_HISTORY وهذا يعني أننا سنعمل على الصفقات الهيستوري فقط .


    فمثلا الكود التالي يعني أنني أختار الصفقة ذات الرقم التسلسي 3 في الصفقات الحالية:
    كود PHP:
    OrderSelect(3SELECT_BY_POS,MODE_TRADE); 
    كما يمكن كتابة نفس السطر بالطريقة المختصرة مع أني لا أحبذها على الشكل التالي :
    كود PHP:
    OrderSelect(3SELECT_BY_POS); 
    حيث أن البارامتر الثالث له قيمة افتراضية هي MODE_TRADE ونستطيع عدم كتابته .

    والكود التالي يعني أنني أختار الصفقة ذات رقم التيكيت 25689 في الصفقات الحالية:
    كود PHP:
    OrderSelect(25689SELECT_BY_TICKET,MODE_TRADE); 
    والكود التالي يعني أنني أختار الصفقة ذات رقم التيكيت 4567 في صفقات الهيستوري:
    كود PHP:
    OrderSelect(4567SELECT_BY_TICKET,MODE_HISTORY); 
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  8. #18
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    بسم الله الرحمن الرحيم

    السلام عليكم ورحمة الله وبركاته

    في هذا الدرس سوف نشرح فكرة وطريقة عمل الاكسبيرت TrenMeLeaveMe والذي لاقى رواجا كبيرا في المنتديات الأجنبية.

    وهناك الكثير الذين أضافوه لاستراتيجياتهم ومؤشرات أخرى يقوم الاكسبيرت بالمتاجرة على أساسها.

    فكرة الاكسبيرت بسيطة جدا لكنها قوية أيضا في نفس الوقت.

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

    وبما أن نقطة الكسر لا يمكن التكهن بها إلا أن حد الكسر هو خط الترند نفسه.

    بمعنى أن الكسر سيكون لهذا الترند عاجلا أم آجلا ولكن السعر الذي سينكسر عند الترند غير معروف.

    لذلك كان هذا الاكسبيرت هو الحل لهذه المشكلة بحيث أن الاكسبيرت يتابع السعر على الترند المطلوب ويقوم بوضع أوردر معلق على حدود الترند.

    ويقوم أيضا بتعديل سعر الدخول للأوردر المعلق كلما مشى السعر مع الترند دون أن يكسره.

    بمجرد كسر السعر للترند فإن الأوردر يكون له بالمرصاد في أفضل نقطة دخول.

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

    المهم نعود للاكسبيرت وطريقة عمله.

    يتطلب الاكسبيرت أن يقوم المتاجر يدويا برسم الترند الذي ينتظر كسره والذي يجب أن يسميه باسم خاص لكي يتعرف عليه الاكسبيرت.

    الآن سيقوم الاكسبيرت بفحص الترندات المرسومة على الشارت وفي حال وجد الاكسبيرت ترندا خاصا به فإنه يقوم بوضع أوردر معلق مناسب له.

    حسب الإعدادات التي حددها المستخدم نفسه من هدف وستوب لوز وعدد نقاط الكسر وهكذا.

    في الحقيقة هناك نسختان من الاكسبيرت . النسخة الأولى تتعامل فقط مع كسر الترندات.

    النسخة الثانية تتعامل مع كسر واختراق الترندات.

    ونحن هنا سنشرح النسخة الأولى لأنها أقل تعقيدا وأسهل على الشرح.

    أولا سنشرح الخصائص الخاصة بالاكسبيرت وهي:
    كود PHP:
    extern string BuyStop_Trend_Info "_______________________";
    extern string BuyStop_TrendName "buystop";
    extern int    BuyStop_TakeProfit 50;
    extern int    BuyStop_StopLoss 30;
    extern double BuyStop_Lot 0.1;
    extern int    BuyStop_StepUpper 10;
    extern int    BuyStop_StepLower 50;
    extern string SellStop_Trend_Info "_______________________";
    extern string SellStop_TrendName "sellstop";
    extern int    SellStop_TakeProfit 50;
    extern int    SellStop_StopLoss 30;
    extern double SellStop_Lot 0.1;
    extern int    SellStop_StepUpper 50;
    extern int    SellStop_StepLower 10
    الخاصية BuyStop_Trend_Info هي عبارة عن خط أفقي لفصل الخصائص عن بعضها وليس له أهمية.

    الخاصية BuyStop_TrendName وهي اسم الترند الذي رسمه المستخدم على الشارت لكي يتعامل معه الاكسبيرت على أنه ترند هابط وعند كسره يشتري.

    الخاصية BuyStop_TakeProfit وهي عدد النقاط المطلوبة كهدف من أوردر الشراء.

    الخاصية BuyStop_StopLoss وهي عدد نقاط الوقف لعملية الشراء.

    الخاصية BuyStop_Lot وهي عدد اللوتات لصفقة الشراء.

    الخاصية BuyStop_StepUpper وهي عدد النقاط الفاصلة بين الترند وبين نقطة الدخول.

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

    الخصائص الباقية نفس الشرح ولكنها لصفقة البيع.


    الكود التالي:
    كود PHP:
    int MagicBuyStop 1101;
    int MagicSellStop 1102;
    int glbOrderType;
    int glbOrderTicket;
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int init()
      {
       
    Comment("TrendMeLeaveMe by Waddah Attar");
       return(
    0);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int deinit()
      {
       
    Comment("");
       return(
    0);
      } 
    عرفنا أيضا متحولين يضمان رقمين سحريان لكي يستطيع الاكسبيرت الفصل بين صفقة البيع وصفقة الشراء.

    المتحولات الأخرى ستلزمنا في البرنامج بعد قليل.


    كما تلاحظون أنه لا يوجد كود في الوظيفتين init و deinit .


    المعالجة كلها ستكون في الوظيفة start كما سنرى الآن.
    كود PHP:
    int start()
      {
       
    double vHvLvMsltp;
       if(
    ObjectFind(BuyStop_TrendName) == 0)
         {
           
    SetObject("High" BuyStop_TrendName,
                     
    ObjectGet(BuyStop_TrendNameOBJPROP_TIME1),
                     
    ObjectGet(BuyStop_TrendNameOBJPROP_PRICE1) + BuyStop_StepUpper*Point,
                     
    ObjectGet(BuyStop_TrendNameOBJPROP_TIME2),
                     
    ObjectGet(BuyStop_TrendNameOBJPROP_PRICE2) + BuyStop_StepUpper*Point,
                     
    ObjectGet(BuyStop_TrendNameOBJPROP_COLOR)); 
    والآن نفس التقنية نقوم بها مع الترند الصاعد من أجل صفقة البيع وهي لها الكود التالي:
    كود PHP:
    if(ObjectFind(SellStop_TrendName) == 0)
         {
           
    SetObject("High" SellStop_TrendName,
                     
    ObjectGet(SellStop_TrendNameOBJPROP_TIME1),
                     
    ObjectGet(SellStop_TrendNameOBJPROP_PRICE1) + SellStop_StepUpper*Point,
                     
    ObjectGet(SellStop_TrendNameOBJPROP_TIME2),
                     
    ObjectGet(SellStop_TrendNameOBJPROP_PRICE2) + SellStop_StepUpper*Point,
                     
    ObjectGet(SellStop_TrendNameOBJPROP_COLOR));
           
    SetObject("Low" SellStop_TrendNameObjectGet(SellStop_TrendNameOBJPROP_TIME1),
                     
    ObjectGet(SellStop_TrendNameOBJPROP_PRICE1) - SellStop_StepLower*Point,
                     
    ObjectGet(SellStop_TrendNameOBJPROP_TIME2),
                     
    ObjectGet(SellStop_TrendNameOBJPROP_PRICE2) - SellStop_StepLower*Point,
                     
    ObjectGet(SellStop_TrendNameOBJPROP_COLOR));
           
    vH NormalizeDouble(ObjectGetValueByShift("High" SellStop_TrendName0), Digits);
           
    vM NormalizeDouble(ObjectGetValueByShift(SellStop_TrendName0), Digits);
           
    vL NormalizeDouble(ObjectGetValueByShift("Low" +SellStop_TrendName0), Digits);
           
    sl vL SellStop_StopLoss*Point;
           
    tp vL SellStop_TakeProfit*Point;
           if(
    Bid >= vM && Bid <= vH && OrderFind(MagicSellStop) == false)
               if(
    OrderSend(Symbol(), OP_SELLSTOPSellStop_LotvL3sltp""
                  
    MagicSellStop0Red) < 0)
                   Print(
    "Err ("GetLastError(), ") Open SellStop Price= "vL" SL= "sl
                         
    " TP= "tp);
           if(
    Bid >= vM && Bid <= vH && OrderFind(MagicSellStop) == true && 
              
    glbOrderType == OP_SELLSTOP)
             {
               
    OrderSelect(glbOrderTicketSELECT_BY_TICKETMODE_TRADES);
               if(
    vL != OrderOpenPrice())
                   if(
    OrderModify(glbOrderTicketvLsltp0Red) == false)
                       Print(
    "Err ("GetLastError(), ") Modify Sell Price= "vL" SL= "sl
                             
    " TP= "tp);
             }
         } 
    وهذه هي الوظائف الجديدة التي استخدمناها وهي مشروحة مسبقا.
    كود PHP:
    bool OrderFind(int Magic)
      {
       
    glbOrderType = -1;
       
    glbOrderTicket = -1;
       
    int total OrdersTotal();
       
    bool res false;
       for(
    int cnt cnt total cnt++)
         {
           
    OrderSelect(cntSELECT_BY_POSMODE_TRADES);
           if(
    OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
             {
               
    glbOrderType OrderType();
               
    glbOrderTicket OrderTicket();
               
    res true;
             }
         }
       return(
    res);
      }
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    void SetObject(string name,datetime T1,double P1,datetime T2,double P2,color clr)
      {
       if(
    ObjectFind(name) == -1)
         {
           
    ObjectCreate(nameOBJ_TREND0T1P1T2P2);
           
    ObjectSet(nameOBJPROP_COLORclr);
           
    ObjectSet(nameOBJPROP_STYLESTYLE_DOT);
         }
       else
         {
           
    ObjectSet(nameOBJPROP_TIME1T1);
           
    ObjectSet(nameOBJPROP_PRICE1P1);
           
    ObjectSet(nameOBJPROP_TIME2T2);
           
    ObjectSet(nameOBJPROP_PRICE2P2);
           
    ObjectSet(nameOBJPROP_COLORclr);
           
    ObjectSet(nameOBJPROP_STYLESTYLE_DOT);
         } 
      } 
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  9. #19
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    المتحولات العامة Global Variable

    تحتوي لغة الميتاتريدر على تقنية تسمى Global Variable

    يستطيع المبرمج من خلالها تخزين واسترجاع المعلومات ومشاركتها بين جميع المؤشرات أو الاكسبيرتات أو حتى
    المستخدم نفسه .

    يمكنك يدويا أو برمجيا إنشاء متحول عام وإسناد قيمة ما له .

    يمكنك تغيير هذه القيمة في أي وقت تريد يدويا أو برمجيا .

    هذه المتحولات يمكن قراءة قيمها من أي مؤشر أو اكسبيرت آخر .
    بهذه الطريقة يمكن تبادل المعلومات بين مجموعة من المؤشرات أو الاكسبيرتات .

    يمكن مثلا برمجة مؤشر يقوم بحسابات معقدة ثم يعطي اشارة بيع أو شراء ويخزنها داخل متحول عام .

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

    هذا مثال بسيط لما يمكن عمله بواسطة هذه التقنية الرائعة .

    العمل اليدوي على المتحولات العامة هو عن طريق برنامج الميتاتريدر نفسه .

    من القائمة Tools اختر Global Variable أو اضغط F3 مباشرة .

    ستظهر لك نافذة المتحولات العامة لتظهر لك المتحولات الحالية مع قيمها .

    يمكنك إضافة متحول جديد أو حذف متحول موجود أو تغيير قيمته كما تريد .

    العمل مع المتحولات العامة من خلال البرمجة :

    تحتوي لغة MQL4 على كافة الوظائف المناسبة للعمل مع هذه المتحولات .

    وهذه الوظائف هي :
    كود PHP:
    bool GlobalVariableCheckstring name

    تقوم بفحص هل يوجد متحول عام له الاسم المحدد ..

    تعيد هذه الوظيفة القيمة true في حال وجدت المتحول والقيمة false في حال لم يكن المتحول موجودا .
    كود PHP:
    bool GlobalVariableDelstring name
    تقوم بحذف المتحول ذو الاسم المحدد وتعيد القيمة true في حال نجحت في عملية الحذف والقيمة false في حال لم تنجح لأي سبب من الأسباب .
    كود PHP:
    double GlobalVariableGetstring name
    تقوم بقراءة قيمة المتحول ذو الاسم المحدد .
    كود PHP:
    datetime GlobalVariableSetstring namedouble value

    تقوم بوضع قيمة رقمية في المتحول ذو الاسم المحدد وتعيد زمن آخر قراءة تمت على هذا المتحول .

    أو تعيد القيمة صفر إذا كانت هذه أول مرة يتم تخزين قيمة في هذا المتحول .
    كود PHP:
    int GlobalVariablesDeleteAllstring prefix_name=NULL
    تقوم بحذف كافة المتحولات العامة أو يمكنك حذف فقط المتحولات التي يبدأ اسمها ببادئة محددة .

    تعيد هذه الوظيفة عدد المتحولات التي قامت بحذفها .
    كود PHP:
    int GlobalVariablesTotal( ) 
    تقوم بإعادة عدد المتحولات العامة المتوفرة حاليا .
    كود PHP:
    string GlobalVariableNameint index
    تقوم بإعادة اسم المتحول من خلال رقمه الذي يبدأ من الصفر حتى آخر متحول .

    أمثلة :
    كود PHP:
    // check variable before use
      
    if(!GlobalVariableCheck("g1"))
        
    GlobalVariableSet("g1",1); 

    يقوم هذا المثال بفحص هل يوجد متحول اسمه g1 .
    في حال لم يجد هذا المتحول فإنه ينشئه ويضع فيه القيمة 1 .
    كود PHP:
    GlobalVariableDel("gvar_1"); 

    يقوم هذا المثال بحذف المتحول ذو الاسم gvar_1 .
    كود PHP:
    double v1=GlobalVariableGet("g1"); 
    يقوم هذا المثال بقراءة قيمة المتحول g1 وتخزينه في المتحول v1 .
    كود PHP:
    int    var_total=GlobalVariablesTotal();
      
    string name;
      for(
    int i=0;i<var_total;i++)
        {
         
    name=GlobalVariableName(i);
         Print(
    i,": Global variable name - ",name);
        } 

    يقوم هذا المثال بقراءة وطباعة أسماء جميع المتحولات المتوفرة حاليا

    فقط أسمائها وليس قيمها .

    بعد التدقيق في الكود وجدت الخطأ

    هذا هو الكود الصحيح

    كود PHP:
    //+------------------------------------------------------------------+
    //|                                                Amro high low.mq4 |
    //|                      Copyright © 2008, MetaQuotes Software Corp. |
    //|                                        http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright © 2008, MetaQuotes Software Corp."
    #property link      "http://www.metaquotes.net"
    extern int Step=20;
    extern int Takeprofit=50;
    extern int Stoploss=50;
    extern double Lots=1;  
    int Magicnumber=234561;
    //+------------------------------------------------------------------+
    //| expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
      return(
    0);
      }
    //+------------------------------------------------------------------+
    //| expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
       return(
    0);
      }
    //+------------------------------------------------------------------+
    //| expert start function                                            |
    //+------------------------------------------------------------------+
    int start()
    {
      if(
    Hour()==&& Minute()<&& MyOrdersTotal(Magicnumber)>0)
      {
        
    DeletePendingOrders(Magicnumber);
        
    CloseOrders(Magicnumber);
      }
      if(
    Hour()==&& Minute()>&& MyOrdersTotal(Magicnumber)==0)
      {
        
    double Dayhigh=iHigh(Symbol(),PERIOD_D1,1);
        
    double Daylow=iLow(Symbol(),PERIOD_D1,1);
        
    double BuyPrice=Dayhigh+Step*Point;
        
    double BuyTP=BuyPrice+Takeprofit*Point;
        
    double BuySL=BuyPrice-Stoploss*Point;
        
        
    double SellPrice=Daylow-Step*Point;
        
    double SellTP=SellPrice-Takeprofit*Point;
        
    double SellSL=SellPrice+Stoploss*Point;
        
        
    OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,3,BuySL,BuyTP,"",Magicnumber,0,Green);
        
    OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice,3,SellSL,SellTP,"",Magicnumber,0,Red);
        
        
      }
      return(
    0);
    }
    int MyOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();
      
      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          
    c++;
        }
      }
      return(
    c);
    }

    int DeletePendingOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
     
      for (
    int cnt total cnt >= cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()!=OP_BUY || OrderType()!=OP_SELL))
        {
          
    OrderDelete(OrderTicket());
        }
      }
      return(
    0);
    }  

    int CloseOrders(int Magic)
    {
      
    int total  OrdersTotal()-1;
      
      for (
    int cnt total cnt >= cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          if (
    OrderType()==OP_BUY)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Bid,3);
          }
          
          if (
    OrderType()==OP_SELL)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Ask,3);
          }
        }
      }
      return(
    0);
    }  

    //+------------------------------------------------------------------+ 
    فيما يلي بعض الوظائف الهامة التي أستخدمها بكثرة في الاكسبيرتات التي أصنعها

    وأعتقد أنها سوف تنفعكم أيضا


    هذه الوظائف سهلة الاستخدام ومفهومة جدا وكلها تعتمد على مدخل واحد هو الرقم السحري المميز للصفقات ...


    الوظيفة الأولى :

    MyRealOrdersTotal

    تقوم بإعادة عدد الصفقات الحقيقية المفتوحة من قبل الاكسبيرت سواء كانت بيع أو شراء :

    كود PHP:
    int MyRealOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();

      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
        {
          
    c++;
        }
      }
      return(
    c);

    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

  10. #20
    تاريخ التسجيل
    Nov 2011
    المشاركات
    1,560

    افتراضي

    الوظيفة الثانية

    MyPendingOrdersTotal

    تقوم بإعادة عدد الصفقات المعلقة من قبل الاكسبيرت سواء كانت بيع أو شراء بنوعيهما الستوب والليميت .
    كود PHP:
    int MyPendingOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();
     
      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
        {
          
    c++;
        }
      }
      return(
    c);

    الوظيفة الثالثة :

    MyRealBuyOrdersTotal

    تقوم بإعادة عدد صفقات الشراء الحقيقية فقط المفتوحة من قبل الاكسبيرت .
    كود PHP:
    int MyRealBuyOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();

      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
        {
          
    c++;
        }
      }
      return(
    c);

    الوظيفة الرابعة :

    MyRealSellOrdersTotal

    تقوم بإعادة عدد صفقات البيع الحقيقية فقط المفتوحة من قبل الاكسبيرت .
    كود PHP:
    int MyRealSellOrdersTotal(int Magic)
    {
      
    int c=0;
      
    int total  OrdersTotal();

      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
        {
          
    c++;
        }
      }
      return(
    c);

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


    الوظيفة الخامسة :

    DeletePendingOrders

    تقوم بحذف الصفقات المعلقة والتي لم تتفعل والمفتوحة من قبل الاكسبيرت .
    كود PHP:
    int DeletePendingOrders(int Magic)
    {
      
    int total  OrdersTotal();
     
      for (
    int cnt total 1cnt >= 0cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP))
        {
          
    OrderDelete(OrderTicket());
        }
      }
      return(
    0);

    الوظيفة السادسة :

    MyOrdersProfit

    تقوم بحساب ربح الصفقات المفتوحة البيع والشراء وبالدولار وليس بالنقاط .
    كود PHP:
    double MyOrdersProfit(int Magic)
    {
      
    double c=0;
      
    int total  OrdersTotal();
      
      for (
    int cnt cnt total cnt++)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL))
        {
          
    c=c+OrderProfit();
        }
      }
      return(
    c);

    الوظيفة السابعة :

    CloseOrders

    تقوم بإقفال جميع الصفقات المفتوحة سواء كانت بيع أو شراء .
    كود PHP:
    int CloseOrders(int Magic)
    {
      
    int total  OrdersTotal();
      
      for (
    int cnt total-cnt >= cnt--)
      {
        
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
        if (
    OrderMagicNumber() == Magic && OrderSymbol()==Symbol())
        {
          if (
    OrderType()==OP_BUY)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Bid,3);
          }
          
          if (
    OrderType()==OP_SELL)
          {
            
    OrderClose(OrderTicket(),OrderLots(),Ask,3);
          }
        }
      }
      return(
    0);

    طريقة إجبار السيرفر على فتح الصفقة

    أحيانا لا يستجيب السيرفر لأمر فتح الصفقة نتيجة خلل أو ضغط أو أي سبب آخر

    مع ان معلومات الصفقة صحيحة تماما

    لذلك نضع حلقة while تجبر السيرفر على التنفيذ والكود كالتالي :
    كود PHP:
           gT=0;
           while(
    gT<=0)
           {
             
    Sleep(1000);
             
    gT=OrderSend(Symbol(),OP_SELLSTOP,Lots,sl,3,sl+StopLoss*Point,sl-TakeProfit Point ,"" Magic Green);
             
    Sleep(1000);
           } 
    طالما عادت الوظيفة OrderSend برقم يساوي أو أقل من الصفر فهذا يعني أن الوظيفة لم تنجح بفتح الصفقة .

    يتم تكرار هذا الأمر مرة أخرى حتى نضمن نجاح فتح الصفقة .

    وضعنا تأخير زمني قبل وبعد تنفيذ الصفقة مقداره ثانية واحدة لنعطي السيرفر مهلة تنفيذ الأمر .
    فَقُلْتُ اسْتَغْفِرُوا رَبَّكُمْ إِنَّهُ كَانَ غَفَّارًا (10) يُرْسِلِ السَّمَاءَ عَلَيْكُمْ مِدْرَارًا (11) وَيُمْدِدْكُمْ بِأَمْوَالٍ وَبَنِينَ وَيَجْعَلْ لَكُمْ جَنَّاتٍ وَيَجْعَلْ لَكُمْ أَنْهَارًا (12) مَا لَكُمْ لَا تَرْجُونَ لِلَّهِ وَقَارًا (13)

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •