الحلقة الرابعة عشرة من سلسلة تعلم البرمجة باسهل طريقة mt5

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

  • الحلقة الرابعة عشرة من سلسلة تعلم البرمجة باسهل طريقة mt5


    الفصول المشتقة
    Derived Classes


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

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

    فيما يلي مثال على فصل مشتق لمؤشر متوسط متحرك. يحتوي هذا الفصل على دالة واحدة، Init()، والتي تُهيئ مؤشر المتوسط المتحرك:


    كود PHP:
    class CiMA : public CIndicator
    {
    public:
    int Init(string pSymbol,ENUM_TIMEFRAMES pTimeframe, int pMAPeriod,
    int pMAShift,ENUM_MA_METHOD pMAMethod, ENUM_APPLIED_PRICE pMAPrice);
    }; 
    

    اسم الفصل المشتق الخاص بنا هو CiMA. لاحظ الفاصلة (:)، متبوعة بـ public CIndicator في إعلان الفصل. هذا يحدد أن فصل CiMA مشتق من فصل CIndicator. جميع الأعضاء العامة والمحمية من فصل CIndicator هي الآن جزء من فصل CiMA.

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

    فيما يلي إعلان الدالة لدالة Init() الخاصة بنا. تمرر هذه الدالة إعدادات مؤشر المتوسط المتحرك إلى الدالة iMA()، والتي تعيد مقبض المؤشر. لاحظ استخدام متغير المقبض من فصل CIndicator:


    كود PHP:
    int CiMA::Init(string pSymbol, ENUM_TIMEFRAMES pTimeframe, int pMAPeriod,
    int pMAShift, ENUM_MA_METHOD pMAMethod, ENUM_APPLIED_PRICE pMAPrice)
    {
    handle = iMA(pSymbol, pTimeframe, pMAPeriod, pMAShift, pMAMethod, pMAPrice);
    return(handle);
    } 
    




    الدوال الافتراضية
    Virtual Functions


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

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

    فيما يلي شكل فصل السيارة في الكود:


    كود PHP:
    class Car
    {
    public:
    virtual int ShiftGears(int gear) { return(gear); }
    }; 
    

    اسم فصلنا هو Car. لقد أعلنا دالة واحدة - دالة افتراضية تسمى ShiftGears(). لقد أضفنا جسمًا فارغًا للدالة ShiftGears() في الإعلان، يحتوي فقط على عامل إرجاع واحد. تم إعلان الدالة ShiftGears() مع كلمة المفتاح virtual. هذا يعني أن الدالة سيتم تعريفها في الفصول المشتقة.

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


    كود PHP:
    class ManualCar : public Car
    {
    public:
    int ShiftGears(int gear);
    }; 
    


    هذا الفصل يسمى ManualCar، وهو لسيارة ذات ناقل حركة يدوي. هنا حيث نقوم بتعريف الدالة ShiftGears(). يتم إعلان الدالة بنفس النوع والمعلمات كالدالة في فصل Car. لاحظ أننا لا نستخدم كلمة المفتاح virtual هنا. يتم تعريف جسم الدالة في مكان آخر، ويحتوي على المنطق لتغيير التروس باستخدام ناقل حركة يدوي. ستقوم الفصول الأخرى المشتقة من فصل Car بتعريف ShiftGears() بطريقة مماثلة.

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

    يمكن إعلان دالة Init() في فصل CiMA الخاص بنا كدالة افتراضية في فصل CIndicator الخاص بنا. هذا يضمن أن أي فصل مشتق من CIndicator يجب أن ينفذ فصل Init():


    كود PHP:
    class CIndicator
    {
    protected:
    int handle;
    public:
    virtual int Init() { return(handle); }
    }; 
    

    يتم إعلان الدالة Init() كعضو عام للفصل. تحدد كلمة المفتاح virtual أن تنفيذ الدالة سيتم في أي فصول مشتقة. يتم إعلان جسم الدالة على نفس السطر. في هذا المثال، تعيد الدالة ببساطة قيمة متغير المقبض. عند إنشاء فصل مشتق بناءً على CIndicator، يجب تنفيذ دالة Init() في الفصل الجديد.




    الكائنات
    Objects



    الآن بعد أن أنشأنا فصلًا لمؤشر المتوسط المتحرك، لنقم بإنشاء كائن. تقوم بإنشاء كائن بنفس الطريقة التي تنشئ بها متغيرًا أو تعدادًا أو بنية: يتم استخدام اسم الفصل كنوع، ويُعطى الكائن معرفًا فريدًا:


    كود PHP:
    CiMA objMa; 
    

    هذا ينشئ كائنًا باسم objMa، بناءً على الفصل CiMA. عند إنشاء كائن، يتم تنفيذ المنشئ لذلك الكائن تلقائيًا. بما أن فصل CiMA مشتق من فصل CIndicator، فإن المنشئ من فصل CIndicator يصبح متاحًا لفصل CiMA، وسيتم تنفيذه تلقائيًا عند إنشاء كائن بناءً على فصل CiMA. وبالتالي، يتم استدعاء منشئ CIndicator()، ويتم تعيين صفيف main[] كصفيف سلسلة عند إنشاء الكائن:


    كود PHP:
    CIndicator::CIndicator(void)
    {
    ArraySetAsSeries(main, true);
    } 
    

    بمجرد إعلان الكائن، يمكننا الوصول إلى أي أعضاء عامة باستخدام عامل النقطة (.). أول شيء سنحتاج إلى القيام به هو تهيئة مؤشرنا باستخدام دالة Init():


    كود PHP:
    objMa.Init(_Symbol, 0, MAPeriod, 0, MAMethod, MAPrice); 
    

    تذكر أن الدالة Init() تم إعلانها كدالة افتراضية في فصل CIndicator، وتم تعريفها في فصل CiMA. تقوم دالة Init() بإنشاء مقبض مؤشر لمؤشر المتوسط المتحرك باستخدام الإعدادات المحددة. يتم تخزين مقبض المؤشر في متغير handle المحمي، والذي يتم تعريفه في فصل CIndicator.

    بعد ذلك، سنستخدم الدالة Main() لملء صفيف main[] بقيم المؤشر، واسترداد قيمة المؤشر لشريط محدد. بما أن صفيف main[] هو عضو فصل محمي، فلا يمكننا الوصول إليه إلا من خلال دالة عامة مثل دالة Main(). هذا السطر من التعليمات البرمجية يقوم بطباعة قيمة المتوسط المتحرك للشريط الحالي في السجل:


    كود PHP:
    Print(objMa.Main()); 
    

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

    يتم إعلان الدالة Init() كعضو عام للفصل. تحدد كلمة المفتاح virtual أن تنفيذ الدالة سيتم في أي فصول مشتقة. يتم إعلان جسم الدالة على نفس السطر. في هذا المثال، تعيد الدالة ببساطة قيمة متغير المقبض. عند إنشاء فصل مشتق بناءً على CIndicator، يجب تنفيذ دالة Init() في الفصل الجديد.










يعمل...
X