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

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • الحلقة السادسة والأربعين من سلسلة تعلم البرمجة باسهل طريقة

    تنفيذ عند افتتاح الشمعة
    Execute On Bar Open



    بشكل افتراضي، تعمل الخبراء الاستشاريون في الوقت الحقيقي، على كل نقطة (Tick). ولكن في بعض الحالات، قد يكون من الأفضل التحقق من شروط التداول مرة واحدة فقط في كل شريط (Bar). عن طريق انتظار إغلاق الشريط الحالي، يمكننا التأكد من حدوث الشرط وصحة الإشارة. وبالمقارنة، من خلال تنفيذ الصفقات في الوقت الحقيقي، قد نكون أكثر عرضة للإشارات الزائفة.

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

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

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

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

    يجب أيضًا ضبط معامل الانتقال (shift parameter) في وظائف المؤشرات ووظائف الأسعار والمصفوفات ليعيد قيمة الشريط السابق. إذا تم تعيين وظيفة المؤشر أو مصفوفة الأسعار لفحص الشريط الحالي، فسنقوم بتحويل مؤشر الشريط بزيادة 1 لفحص الشريط السابق بدلاً من ذلك. يجب زيادة معامل الانتقال بمقدار 1 لجميع المؤشرات ومصفوفات الأسعار.

    من الناحية التقنية، نحن نقوم بفحص شروط التداول على النقطة الأولى من شمعة جديدة، بينما نفحص قيمة الإغلاق للشمعة السابقة. لا نقوم بفحص الشمعة المفتوحة حاليًا عند التنفيذ مرة واحدة في كل شريط.
    فيما يلي الشفرة للتحقق من فتح شريط جديد. أولاً، نعلن عن متغير خارجي بالاسم CheckOncePerBar لتشغيل وإيقاف هذه الميزة. ثم نعلن عن متغير عالمي من نوع datetime لتخزين الطابع الزمني للشريط الحالي - وسيتم تسميته CurrentTimeStamp.

    في وظيفة init()، سنعين الطابع الزمني للشريط الحالي لـ CurrentTimeStamp. وهذا سيؤخر فحص شرط التداول حتى فتح الشريط التالي:


    كود PHP:
    // External variables
    extern bool CheckOncePerBar = true;
    // Global variables
    datetime CurrentTimeStamp;
    // Init function
    int init()
    {
    CurrentTimeStamp = Time[0];
    } 
    
    فيما يلي الشفرة التي تأتي في بداية وظيفة start()، مباشرة بعد المؤقت. المتغير الصحيح (integer) BarShift سيحدد ما إذا كان سيتم تعيين قيمة التحول (Shift value) لوظائف المؤشر والأسعار للشريط الحالي أم الشريط السابق. المتغير البولياني (boolean) NewBar سيحدد ما إذا كنا سنتحقق من شروط التداول:


    كود PHP:
    if(CheckOncePerBar == true)
    {
    int BarShift = 1;
    if(CurrentTimeStamp != Time[0])
    {
    CurrentTimeStamp = Time[0];
    bool NewBar = true;
    }
    else NewBar = false;
    }
    else
    {
    NewBar = true;
    BarShift = 0;
    } 
    


    إذا تم تعيين CheckOncePerBar على القيمة الصحيحة (true)، سنقوم أولاً بتعيين قيمة BarShift إلى 1. وهذا سيعين قيمة التحول (Shift parameter) لجميع وظائف المؤشر والأسعار/المصفوفات للشريط السابق.

    بعد ذلك، سنقارن قيمة المتغير CurrentTimeStamp بقيمة Time[0]، والتي هي الطابع الزمني للشريط الحالي. إذا لم تتطابق القيمتين، سنقوم بتعيين قيمة Time[0] لـ CurrentTimeStamp وتعيين NewBar إلى القيمة الصحيحة (true). ستتم التحقق من شروط التداول بعد وقت قصير من ذلك.

    في التشغيلات التالية، ستتطابق قيمة CurrentTimeStamp و Time[0]، وهذا يعني أن NewBar سيتم تعيينه إلى القيمة الخاطئة (false). لن يتم التحقق من شروط التداول حتى يتم فتح شريط جديد. بمجرد فتح شريط جديد، ستكون قيمة Time[0] مختلفة عن قيمة CurrentTimeStamp، وسيتم تعيين NewBar إلى القيمة الصحيحة (true) مرة أخرى.

    إذا تم تعيين CheckOncePerBar على القيمة الخاطئة (false)، سيتم تعيين NewBar تلقائيًا إلى القيمة الصحيحة (true)، وسيتم تعيين BarShift إلى 0. وهذا سيتحقق من شروط التداول في كل نقطة (tick)، كما كان سابقًا.

    سيحتاج متغير BarShift إلى أن يتم تعيينه إلى معامل التحول (Shift parameter) في أي وظائف المؤشرات، وظائف الأسعار أو المصفوفات التي تشير إلى الشريط الأخير. فيما يلي بعض الأمثلة على كيفية تطبيق ذلك:


    كود PHP:
    double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,BarShift);
    if(Close[BarShift] > Open[BarShift])
    double UseLow = iLow(NULL,0,BarShift); 
    
    يجب أن تتعرف على هذه الأمثلة من قبل. بدلاً من التحقق من الشريط الحالي، سنتحقق من الشريط الذي تم إغلاقه للتو، أي الشريط السابق. إذا كنت بحاجة إلى الإشارة إلى شريط قبل الشريط السابق المغلق، ما عليك سوى إضافة معامل التحول الحالي إلى BarShift.


    كود PHP:
    double LastFastMA = iMA(NULL,0,FastMAPeriod,0,0,0,BarShift+1); 
    


    إذا كنت لا تتوقع الحاجة إلى تشغيل خبيرك المستشار مرة واحدة في كل شريط، فلن تحتاج إلى إضافة هذه الشفرة. ولكن بالنسبة للعديد من أنظمة التداول المستندة إلى المؤشرات، يمكن أن يجعل ذلك نتائج التداول واختبار الرجوع أكثر موثوقية.
    للتحكم في تنفيذ الصفقات، نحتاج إلى التحقق من قيمة NewBar قبل روتينات وضع الأوامر. يمكننا القيام بذلك باستخدام كتلة if التي وضعناها سابقًا للمؤقت:


    كود PHP:
    // Begin trade block
    if(TradeAllowed == true && NewBar == true)
    {
    // Buy Order
    if(FastMA > SlowMA && BuyTicket == 0 && BuyOrderCount(Symbol(),MagicNumber) == 0)
    {
    // Buy order code omitted for brevity
    }
    // Sell Order
    if(FastMA < SlowMA && SellTicket == 0 && SellOrderCount(Symbol(),MagicNumber) == 0)
    {
    // Sell order code omitted for brevity
    }
    } // End trade block 
    
يعمل...
X