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

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

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

    استخدام ملفات الإدراج
    Using Include Files


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

    لا يتطلب ملفات الإدراج أي صياغة خاصة. يتم إعلان الوظائف والمتغيرات في ملف الإدراج تمامًا كما تفعل في أي ملف شفرة مصدري. لا يجب أن يحتوي ملف الإدراج على وظائف init() أو start() أو deinit(). يجب أن يكون للملف امتداد .mqh ويتم وضعه في المجلد \experts\include.





    استخدام المكتبات
    Using Libraries

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

    تُخزَّن المكتبات في مجلد \experts\libraries. تحمل ملفات شفرة المصدر امتداد .mq4، ويحمل الملف التنفيذي امتداد .ex4. لا تحتوي المكتبات على وظائف start() أو init() أو deinit(). لتعلن عن ملف كمكتبة، يجب وضع توجيه معالج مسبق #property library في بداية الملف.

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

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

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

    يمكنك أيضًا استيراد الوظائف من مكتبات DLL لنظام Windows باستخدام توجيهات #import. يحتوي ملف الإدراج WinUser32.mqh الموجود في المسار \experts\includes على العديد من الأمثلة التي تستخدم لوظيفة MessageBox(). (سنناقش وظيفة MessageBox()). استخدام وظائف DLL هو استخدام متقدم لن نغطيه هنا. هناك مقالات على موقع MQL4 حول استخدام مكتبات DLL للمهتمين.





    مصدر خبير المستشار البسيط
    A Simple Expert Advisor (with Functions)


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


    كود PHP:
    // Preprocessor
    #include <IncludeExample.mqh>
    // External Variables
    extern bool DynamicLotSize = true;
    extern double EquityPercent = 2;
    extern double FixedLotSize = 0.1;
    extern double StopLoss = 50;
    extern double TakeProfit = 100;
    extern int Slippage = 5;
    extern int MagicNumber = 123;
    extern int FastMAPeriod = 10;
    extern int SlowMAPeriod = 20;
    // Global Variables
    int BuyTicket;
    int SellTicket;
    double UsePoint;
    int UseSlippage;
    // Init function
    int init()
    {
    UsePoint = PipPoint(Symbol());
    UseSlippage = GetSlippage(Symbol(),Slippage);
    }
    // Start Function
    int start()
    {
    // Moving Average
    double FastMA = iMA(NULL,0,FastMAPeriod,0,0,0,0);
    double SlowMA = iMA(NULL,0,SlowMAPeriod,0,0,0,0);
    // Calculate Lot Size
    double LotSize = CalcLotSize(DynamicLotSize,EquityPercent,StopLoss, FixedLotSize);
    LotSize = VerifyLotSize(LotSize);
    // Buy Order
    if(FastMA > SlowMA && BuyTicket == 0)
    {
    if(SellTicket > 0) int Closed = CloseSellOrder(Symbol(),SellTicket,UseSlippage);
    SellTicket = 0;
    BuyTicket = OpenBuyOrder(Symbol(),LotSize,UseSlippage,MagicNum ber);
    if(BuyTicket > 0 && (StopLoss > 0 || TakeProfit > 0))
    {
    OrderSelect(BuyTicket,SELECT_BY_TICKET);
    double OpenPrice = OrderOpenPrice();
    double BuyStopLoss = CalcBuyStopLoss(Symbol(),StopLoss,OpenPrice);
    if(BuyStopLoss > 0)
    {
    BuyStopLoss = AdjustBelowStopLevel(Symbol(),BuyStopLoss,5);
    }
    double BuyTakeProfit = CalcBuyTakeProfit(Symbol(),TakeProfit,OpenPrice);
    if(BuyTakeProfit > 0)
    {
    BuyTakeProfit = AdjustAboveStopLevel(Symbol(),BuyTakeProfit,5);
    }
    AddStopProfit(BuyTicket,BuyStopLoss,BuyTakeProfit) ;
    }
    }
    // Sell Order
    if(FastMA < SlowMA && SellTicket == 0)
    {
    if(BuyTicket > 0) Closed = CloseBuyOrder(Symbol(),BuyTicket,Slippage);
    BuyTicket = 0;
    SellTicket = OpenSellOrder(Symbol(),LotSize,UseSlippage,MagicNu mber);
    if(SellTicket > 0 && (StopLoss > 0 || TakeProfit > 0))
    {
    OrderSelect(SellTicket,SELECT_BY_TICKET);
    OpenPrice = OrderOpenPrice();
    double SellStopLoss = CalcSellStopLoss(Symbol(),StopLoss,OpenPrice);
    if(SellStopLoss > 0)
    {
    SellStopLoss = AdjustAboveStopLevel(Symbol(),SellStopLoss,5);
    }
    double SellTakeProfit = CalcSellTakeProfit(Symbol(),TakeProfit,OpenPrice);
    if(SellTakeProfit > 0)
    {
    SellTakeProfit = AdjustBelowStopLevel(Symbol(),SellTakeProfit,5);
    }
    AddStopProfit(SellTicket,SellStopLoss,SellTakeProf it);
    }
    }
    return(0);
    } 
    

    نبدأ بتضمين الملف الذي يحتوي على وظائفنا فيه، في هذه الحالة IncludeExample.mqh. تعريفات المتغيرات ومحتويات وظيفة init() هي نفسها كما كانت من قبل. في بداية وظيفة start()، نستخدم CalcLotSize() وVerifyLotSize() لحساب والتحقق من حجم اللوت.

    في كتل أمر الشراء والبيع، نستخدم CloseBuyOrder() وCloseSellOrder() لإغلاق الأمر العكسي. تتم فتح الأوامر الجديدة باستخدام OpenBuyOrder() أو OpenSellOrder(). قبل حساب وقف الخسارة وجني الربح، نتحقق من أن الأمر تم فتحه وتم تحديد مستوى وقف الخسارة أو جني الربح.

    نقوم بجلب سعر الافتتاح للأمر باستخدام OrderSelect() و OrderOpenPrice(). ثم نحسب قيمة وقف الخسارة باستخدام CalcBuyStopLoss() أو CalcSellStopLoss() والهدف باستخدام CalcBuyTakeProfit() أو CalcSellTakeProfit().

    نتحقق من أن قيمة وقف الخسارة أو الهدف أكبر من 0، ونستخدم AdjustAboveStopLevel() و AdjustBelowStopLevel() للتحقق من صحة أسعار وقف الخسارة والهدف. في النهاية، نمرر تلك الأسعار إلى دالة AddOrderProfit() التي تضيف وقف الخسارة والهدف إلى الأمر.

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

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