الحلقة التاسعة من سلسلة تعلم البرمجة باسهل طريقة
الإجراءات او الوظائف او الطرق او الدوال كلها تتحدث عن نفس الموضوع (Functions):
الوظائف هي اللبنات الأساسية للغات البرمجة الحديثة. الوظيفة عبارة عن كتلة من التعليمات البرمجية التي تم تصميمها لتنفيذ مهمة معينة ، مثل وضع أمر أو حساب وقف الخسارة. لغة MQL لديها العشرات من الوظائف المضمنة لكل شيء من المؤشرات الفنية إلى وضع الطلبات.
تم تصميم الوظائف ليتم إعادة استخدامها مرارًا وتكرارًا.إن تعلم كيفية إنشاء وظائف لمهام التداول الشائعة ضروري جدا للبرمجة بشكل إحترافي. سنتعلم كيفية إنشاء وظائف قابلة لإعادة الاستخدام للعديد من المهام التي سنتعلمها في هذا الدروس.
لنبدأ بدالة (اي وظيفة) بسيطة تسمى PipPoint () ، والتي تحسب عدد النقاط العشرية للزوج الحالي ، ويتم ضبطه تلقائيًا للإكسبيرتات والمكونين من 3 و 5 أرقام بحيث تكون النتيجة متساوية دائمًا بنقطة واحدة.
لأزواج الين (2 أو 3 أرقام) ، فترجع الدالة 0.01. أما لجميع الأزواج الأخرى (4 و 5 أرقام) فترجع الدالة 0.0001. إليك كيفية استدعاء الوظيفة من التعليمات البرمجية:

قمنا بالإعلان عن متغير من النوع double اسمه UsePoint. ثم اسمينا الدالة PipPoint () وقمنا بتعيين النتيجة إلى UsePoint. الآن يمكننا استخدام القيمة المخزنة في المتغير UsePoint لحساب وقف الخسارة، مثلا.
هذا هو الكود في وظيفة PipPoint ():

السطر الأول هو الإعلان عن الدالة. مثل المتغيرات ، فإن تعريفات الوظائف لها نوع بيانات واسم المعرف. تستخدم الدوال نفس أنواع البيانات التي تستخدمها المتغيرات. نوع البيانات يعتمد على نوع البيانات التي ترجعها الدالة. نظرًا لأن هذه الدالة تُرجع عددًا كسريًا ، فإننا نستخدم البيانات من نوع double.
جسم الوظيفة يوجد داخل الأقواس { }. لدينا الشرط if-else لتقييم عدد الأرقام بعد المكان العشري ، وتخصيص القيمة المناسبة للمتغير UsePoint. بعد ذلك ، لدينا عامل الإرجاع (return) ، الذي يُرجع قيمة المتغير (UsePoint) إلى الوظيفة التي قامت بالاستدعاء.
يوجد نوع بيانات خاص للوظائف التي لا تُرجع قيمة. يتم استخدام نوع البيانات void للوظائف التي تقوم بمهمة محددة ، ولكن لا تحتاج إلى إرجاع اي قيمة إلى وظيفة الاستدعاء. الوظائف من النوع void لا تتطلب عامل إرجاع في جسم الوظيفة.
لنفكر في وظيفة بسيطة لوضع أمر شراء. هذه الوظيفة لها arguments والتي يجب أن تكون مررت (اي مجموعة من المتغيرات ) يتم تسليمها إلى الوظيفة. ستضع هذه الوظيفة طلب شراء في السوق على العملة الحالية بحجم عقد محدد ووقف للخسارة وجني الأرباح.

تحتوي هذه الوظيفة على ثلاث arguments
، LotSize ، و StopLoss ، و TakeProfit.
ان الـ arguments عبارة عن متغيرات يتم استخدامها فقط داخل الوظيفة. ويتم تعيين قيمتها من خلال وظيفة الاستدعاء. إليك كيف نقوم بذلك
سوف تستدعي هذه الوظيفة في الكود باستخدام أرقام ثابتة:

سيؤدي هذا إلى وضع أمر شراء 2 لوت ، مع وقف خسارة 1.5550 وجني ربح 1.6050. هنا مثال آخر باستخدام المتغيرات. سنفترض أن المتغيرات UseLotSize و BuyStopLoss وBuyTakeProfit قد تم تعيين القيم المناسبة لها مسبقا اي اننا لن نستخدم الارقام الثابتة كما في المثال السابق:

في هذا المثال ، نقوم بتعيين قيمة إرجاع OpenBuyOrder () إلى المتغير GetTicket ، وهو رقم تذكرة الطلب الذي وضعناه للتو. إن عملية إسناد ناتج هذ الدالة إلى متغيرهو اختياري, في هذه الحالة . ولكن يكون ذلك ضروريًا فقط إذا كنت تخطط لإجراء مزيد من المعالجة باستخدام التذكرة (Ticket) رقم الطلب المقدم.
يمكن أن تحتوي الـ argumentsعلى قيم افتراضية ، مما يعني أنه إذا لم يتم تمرير المتغير صراحةً إلى الدالة ، سيأخذ المتغير القيمة الافتراضية. المتغيرات ذات القيمة الافتراضية تكون في النهاية دائمًا من قائمة الـ arguments. فيما يلي مثال لدالة لها عدة قيم افتراضية:

تحتوي هذه الوظيفة على متغيرين من القيم الافتراضية ، رقم وتعليق ، بقيم افتراضية 0 و NULL على التوالي. إذا أردنا استخدام القيم الافتراضية لكل من Number و Comment ، فنحن ببساطة سنحذف تلك المتغيرات عند استدعاء الوظيفة:

لاحظ أننا حددنا المتغيرين الأوليين فقط. حيث يستخدم الرقم والتعليق القيم الافتراضية لـ 0 و NULL. فإذا أردنا تحديد قيمة لـ Number ، ولكن ليس للتعليق ، فإننا ببساطة نحذف الأخير بهذا الشكل:

مرة أخرى ، يستخدم Comment القيمة الافتراضية لـ NULL. ولكن ، إذا أردنا تحديد قيمة للتعليق، بغض النظر عما إذا كنا نريد استخدام القيمة الافتراضية لـ Number أم لا ، يجب علينا تحديد قيمة لـ Number أيضًا هكذا:

في هذا المثال ، استخدمنا 0 كقيمة لـ Number ، وهي نفس القيمة الافتراضية
و سلسلة نصية ثابتة كقيمة للمتغير Comment. تذكر ذلك عندما تتعامل مع عدد من المتغيرات التي تحتوي على قيم افتراضية ، يمكنك فقط حذف الوسائط إذا كنت تريد استخدام القيمة الافتراضية لجميع المتغيرات المتبقية.
أختم هنا وفي الدرس القادم ان شاء الله سنتحدث عن مجال أو نطاق المتغيرات
أترككم في رعاية الله.
الإجراءات او الوظائف او الطرق او الدوال كلها تتحدث عن نفس الموضوع (Functions):
الوظائف هي اللبنات الأساسية للغات البرمجة الحديثة. الوظيفة عبارة عن كتلة من التعليمات البرمجية التي تم تصميمها لتنفيذ مهمة معينة ، مثل وضع أمر أو حساب وقف الخسارة. لغة MQL لديها العشرات من الوظائف المضمنة لكل شيء من المؤشرات الفنية إلى وضع الطلبات.
تم تصميم الوظائف ليتم إعادة استخدامها مرارًا وتكرارًا.إن تعلم كيفية إنشاء وظائف لمهام التداول الشائعة ضروري جدا للبرمجة بشكل إحترافي. سنتعلم كيفية إنشاء وظائف قابلة لإعادة الاستخدام للعديد من المهام التي سنتعلمها في هذا الدروس.
لنبدأ بدالة (اي وظيفة) بسيطة تسمى PipPoint () ، والتي تحسب عدد النقاط العشرية للزوج الحالي ، ويتم ضبطه تلقائيًا للإكسبيرتات والمكونين من 3 و 5 أرقام بحيث تكون النتيجة متساوية دائمًا بنقطة واحدة.
لأزواج الين (2 أو 3 أرقام) ، فترجع الدالة 0.01. أما لجميع الأزواج الأخرى (4 و 5 أرقام) فترجع الدالة 0.0001. إليك كيفية استدعاء الوظيفة من التعليمات البرمجية:

قمنا بالإعلان عن متغير من النوع double اسمه UsePoint. ثم اسمينا الدالة PipPoint () وقمنا بتعيين النتيجة إلى UsePoint. الآن يمكننا استخدام القيمة المخزنة في المتغير UsePoint لحساب وقف الخسارة، مثلا.
هذا هو الكود في وظيفة PipPoint ():

السطر الأول هو الإعلان عن الدالة. مثل المتغيرات ، فإن تعريفات الوظائف لها نوع بيانات واسم المعرف. تستخدم الدوال نفس أنواع البيانات التي تستخدمها المتغيرات. نوع البيانات يعتمد على نوع البيانات التي ترجعها الدالة. نظرًا لأن هذه الدالة تُرجع عددًا كسريًا ، فإننا نستخدم البيانات من نوع double.
جسم الوظيفة يوجد داخل الأقواس { }. لدينا الشرط if-else لتقييم عدد الأرقام بعد المكان العشري ، وتخصيص القيمة المناسبة للمتغير UsePoint. بعد ذلك ، لدينا عامل الإرجاع (return) ، الذي يُرجع قيمة المتغير (UsePoint) إلى الوظيفة التي قامت بالاستدعاء.
يوجد نوع بيانات خاص للوظائف التي لا تُرجع قيمة. يتم استخدام نوع البيانات void للوظائف التي تقوم بمهمة محددة ، ولكن لا تحتاج إلى إرجاع اي قيمة إلى وظيفة الاستدعاء. الوظائف من النوع void لا تتطلب عامل إرجاع في جسم الوظيفة.
لنفكر في وظيفة بسيطة لوضع أمر شراء. هذه الوظيفة لها arguments والتي يجب أن تكون مررت (اي مجموعة من المتغيرات ) يتم تسليمها إلى الوظيفة. ستضع هذه الوظيفة طلب شراء في السوق على العملة الحالية بحجم عقد محدد ووقف للخسارة وجني الأرباح.

تحتوي هذه الوظيفة على ثلاث arguments
، LotSize ، و StopLoss ، و TakeProfit.
ان الـ arguments عبارة عن متغيرات يتم استخدامها فقط داخل الوظيفة. ويتم تعيين قيمتها من خلال وظيفة الاستدعاء. إليك كيف نقوم بذلك
سوف تستدعي هذه الوظيفة في الكود باستخدام أرقام ثابتة:

سيؤدي هذا إلى وضع أمر شراء 2 لوت ، مع وقف خسارة 1.5550 وجني ربح 1.6050. هنا مثال آخر باستخدام المتغيرات. سنفترض أن المتغيرات UseLotSize و BuyStopLoss وBuyTakeProfit قد تم تعيين القيم المناسبة لها مسبقا اي اننا لن نستخدم الارقام الثابتة كما في المثال السابق:

في هذا المثال ، نقوم بتعيين قيمة إرجاع OpenBuyOrder () إلى المتغير GetTicket ، وهو رقم تذكرة الطلب الذي وضعناه للتو. إن عملية إسناد ناتج هذ الدالة إلى متغيرهو اختياري, في هذه الحالة . ولكن يكون ذلك ضروريًا فقط إذا كنت تخطط لإجراء مزيد من المعالجة باستخدام التذكرة (Ticket) رقم الطلب المقدم.
يمكن أن تحتوي الـ argumentsعلى قيم افتراضية ، مما يعني أنه إذا لم يتم تمرير المتغير صراحةً إلى الدالة ، سيأخذ المتغير القيمة الافتراضية. المتغيرات ذات القيمة الافتراضية تكون في النهاية دائمًا من قائمة الـ arguments. فيما يلي مثال لدالة لها عدة قيم افتراضية:

تحتوي هذه الوظيفة على متغيرين من القيم الافتراضية ، رقم وتعليق ، بقيم افتراضية 0 و NULL على التوالي. إذا أردنا استخدام القيم الافتراضية لكل من Number و Comment ، فنحن ببساطة سنحذف تلك المتغيرات عند استدعاء الوظيفة:

لاحظ أننا حددنا المتغيرين الأوليين فقط. حيث يستخدم الرقم والتعليق القيم الافتراضية لـ 0 و NULL. فإذا أردنا تحديد قيمة لـ Number ، ولكن ليس للتعليق ، فإننا ببساطة نحذف الأخير بهذا الشكل:

مرة أخرى ، يستخدم Comment القيمة الافتراضية لـ NULL. ولكن ، إذا أردنا تحديد قيمة للتعليق، بغض النظر عما إذا كنا نريد استخدام القيمة الافتراضية لـ Number أم لا ، يجب علينا تحديد قيمة لـ Number أيضًا هكذا:

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