دورة البرمجة في الفوركس للمبتدئين – الدرس السادس

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

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

لعمل باك تيست لمؤشر نقوم بفتح نافذة الباك تيست من قائمة View > Strategy Tester
او بالضغط مفتاح Ctrl + R
وستظهر لنا هذه الشاشة

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

بعد ان اخترت المؤشر وحددت التايم فريم ونوعية الباك تيست (Control Points) اعتقد انه لامشكلة في هذا الإعداد بالنسبة للمؤشرات لانك تريد اختبار المؤشر ومعرفة مصداقيته في حال كان لديك استراتيجية معينة اما لوكان الاختبار لاكسبيرت فانصح بالالتزام بنوعية (Every Tick) للحصول على افضل النتائج

انا قمت باختيار مؤشر الزجزاج ويمكنك انت ان تختار ماتشاء
ثم نضغط مفتاح ( Start) لبدء الباك تيست:

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

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

وشكل التنفيذ على المنصة بهذا الشكل:

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

وهذا هو شكل التنفيذ:

لاحظ التقاطعات بين المتوسطين الآن لو اردنا ان نعرف متى تحدث هذه التقاطعات عن طريق الكودو لاحظ اولا هذه الصورة وفيها وضعت ترقيمات الشموع
فالشمعة برقم 0 هي دائما الشمعة الحالية والتي لم تغلق حتى الآن ثم تليها الشمعة رقم 1 ثم 2 ثم 3 وهكذا….

من الصورة السابقة نلاحظ ان الشمعة رقم 0 لايمكن البناء عليها
لذلك ننظر للشمعة رقم 1 ونلاحظ ان المتوسط الابيض وهو المتوسط السريع في مثالنا فوق المتوسط البنفسجي وهو المتوسط البطيئ ثم في الشمعة رقم 2 حدث التقاطع وهو مايظهر لنا كان القيمتين قد تساوتا عند هذا التقاطع ( ولكن هذا فقط مايبدو لنا والحقيقة غير ذلك)
اما في الشمعة رقم 3 كان المتوسط الابيض تحت المتوسط البنفسجي

كل هذا السرد السابق حتى تفهم فكرة اساسية عندما تريد ان تتحقق هل حدث تقاطع في متوسطات او اي مؤشر يخطر على بالك فقط قم بفحص شمعتين (وليس ثلاث كما في الصورة) من بعد الشمعة ذات الرقم 0 وبتطبيق المنطق الآتي:
1 – هل المتوسط الاول للشمعة رقم 1 أكبر من المتوسط الثاني للشمعة رقم 1
2 – هل المتوسط الاول للشمعة رقم 2 أصغر من المتوسط الثاني للشمعة رقم 2

اذا تحقق الشرطين السابقين اذا لدينا تقاطع, والآن تعالوا نطبق ذلك على الكود:

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

أفتح نافذة الجورنال:

وبعد بدء الباك تيست وعند حدوث التقاطع نلاحظ الكثير من رسائل التنبيه وهذا هو ما نريد ( طبعا يوجد خطأ هنا في الحلقة القادمة ان شاء الله سنحله)
لاحظ الصورة:

أهلا وسهلا بكم أيها الاخوة الاكارم

في هذا الدرس سنناقش موضوع اعادة رسم المؤشرات لنفسها
في الواقع هذه المشكلة تكمن في ان المؤشر يقوم بتطبيق حساباته او المعادلات التي بني عليها مثل المتوسط الحسابي فهذا المؤشر يقوم بهذه الحسابات على جميع الشموع السابقة ومن ضمنها الشمعة الحالية التي لم تغلق حتى الآن وهنا تكمن المشلكة, فاذا استطعنا اقتصار حسابات المؤشر على جميع الشموع ماعجا الشمعة الحالية فنكون قد حللنا المشكلة, للنظر الآن لكود المؤشر الذي صنعناه سابقا.

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

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

التعليقات(Comments):

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

وهناك ايضا التعليق متعدد الأسطر:
يبدأ التعليق متعدد الأسطر بـ / * وينتهي بـ * /. يمكن للتعليق متعدد الأسطر أن يمتد إلى أي رقم من السطور ، ويتم التعليق على كل شيء بين / * و * /

المعرفات(Identifiers):

المعرفات هي أسماء تُعطى للمتغيرات والوظائف المخصصة. يمكن أن يكون المعرف أي مجموعة من الأرقام والأحرف وعلامة الشرطة السفلية ( _ ). يمكن أن يصل طول المعرفات إلى 31 حرفًا بتنسيق الطول.

المعرفات في MQL حساسة لحالة الأحرف. هذا يعني أن StopLoss و stoploss متغيران مختلفان! وهذا خطأ شائع يقع به المبتدئين ، لذا تحقق من أسماء المعرفات هذه!

المتغيرات(Variables):

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

يحدد نوع البيانات نوع المعلومات التي يحتفظ بها المتغير ، سواء كانت رقمًا أو نصًا سلسلة أو تاريخ أو لون. فيما يلي أنواع البيانات الاساسية في MQL:

int – عدد صحيح (رقم صحيح) مثل 0 أو 3 أو -5. أي رقم مخصص لعدد صحيح يتم تقريب المتغير إلى العدد الصحيح التالي.

double – رقم كسري مثل 1.5765 أو 0.03 أو -2.376. نستخدم هذا النوع للحصول على بيانات الأسعار ، أو في التعبيرات الرياضية التي تنطوي على القسمة.

string – سلسلة نصية مثل “منتدى المضارب العربي يرحب بكم”.
يجب أن تكون السلاسل محاطة بعلامات اقتباس مزدوجة.

bool – قيمة صواب / خطأ. يمكن أيضًا تمثيلها على أنها 1 (صواب) أو 0 (خطأ). نستخدم هذه في أي وقت نحتاج إلى تقييم ثنائي ، أو حالة تشغيل / إيقاف.

datetime – قيمة الوقت والتاريخ مثل 2022.01.01 00:00. تاريخ / وقت يتم تمثيل المتغير على أنه عدد الثواني التي مرت منذ 1 يناير 1970.

color – ثابت يمثل لونًا ، مثل الأحمر أو الأزرق الداكن. هذه بشكل عام تستخدم لتغيير ألوان المؤشر أو الكائنات على الشارت.

فيما يلي مثال على إعلان متغير. هذا متغير عدد صحيح ، مع المعرف
متغير My وقيمة افتراضية 1.

كود HTML:

int MyVariable = 1;

بمجرد التصريح عن المتغير ، يمكنك تغيير قيمته من خلال تخصيص قيمة جديدة له. هذا مثال حيث قمنا بتعيين الرقم 5 إلى MyVariable:

كود HTML:

MyVariable = 5;

يمكنك أيضًا إسناد قيمة متغير إلى متغير آخر:

كود HTML:

int YourVariable = 2;
MyVariable = YourVariable;
// MyVariable is 2

يجب أن يكون المتغير المخصص من نفس نوع البيانات. إذا تم تعيين double لمتغير عدد صحيح int ،على سبيل المثال ، سيتم تقريب double إلى أقرب عدد صحيح. هذا قد يؤدي إلى نتائج غير مرغوب فيها.

الثوابت (Constants):

تمامًا مثلما يوحي الاسم ، الثابت هو قيمة بيانات لا تتغير أبدًا. على سبيل المثال ، الرقم 5 هو عدد صحيح ثابت ، والحرف “A” هو حرف ثابت ، و2009.01.01 هو ثابت التاريخ والوقت في 1 يناير 2009.

تحتوي MQL على مجموعة متنوعة من الثوابت القياسية لأشياء مثل بيانات الأسعار وفترات الرسم البياني والألوان وعمليات التجارة. على سبيل المثال ، PERIOD_H1 ثابت للإطار الزمني لمخطط H1 ، يشير إلى OP_BUY
أمر شراء في السوق ، و Red هو ثابت اللون للون الأحمر.
حتى انه يمكنك إنشاء الثوابت الخاصة بك باستخدام التوجيه #define preprocessor. سنصل إلى ذلك قريبا ان شاء الله.

بعض الأمثلة:

ثوابت أوامر البيع والشراء:

ثوابت لأنماط الرسم على الشارت (خط متصل, اسهم, هيستوغرام):

ثوابت لنمط رسم الخط (خط متصل, منقط, مقطع):

أكتفي بهذا القدر لأننا في الحلقة القادمة إن شاء الله سنبدء بمفهوم مهم جدا وهو الاوامر او الإجراءات (Functions)

الإجراءات او الوظائف او الطرق او الدوال كلها تتحدث عن نفس الموضوع (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. تذكر ذلك عندما تتعامل مع عدد من المتغيرات التي تحتوي على قيم افتراضية ، يمكنك فقط حذف الوسائط إذا كنت تريد استخدام القيمة الافتراضية لجميع المتغيرات المتبقية.

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

نطاق أو مجال المتغيرات (Variable Scope):

يحدد نطاق المتغير الوظائف التي يكون متاحًا لها ومدة بقائها في الذاكرة.
في MQL يمكن أن يكون النطاق محلي (local) أو عام (global).

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

يتم استثناء المتغيرات المحلية الثابتة (static local) من هذه القاعدة. حيث تظل المتغيرات الثابتة في الذاكرة حتى بعد انتهاء الوظيفة. وعند تشغيل الوظيفة مرة أخرى ، لا تتم إعادة تهيئة المتغير ، ولكنه يحتفظ به بدلاً من ذلك القيمة السابقة.

يتم التصريح عن المتغيرات الثابتة عن طريق كتابة static أمام إعلان المتغير. مثال عن إعلان متغير ثابت:

كود:

static int MyStaticVar;

إذا كان المتغير الثابت يجب توفيره لأكثر من دالة ، فاستخدم متغيرًا عامًا
و في هذه الحالة لا تحتاج إلى التصريح عن المتغير على أنه ثابت(static).

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

لاحظ الصورة:






مخطط ملف MQ4:
إنشاء إكسبيرت جديد:

إن معالج إنشاء الإكسبيرت في MetaEditor هو أسرع طريقة للبدء في إنشاء
إكسبيرت. يمكنك بدء المعالج بتحديد “New” من قائمة “File” ، أو عن طريق الضغط على الزر “New” من شريط الأدوات ، أو بالضغط على Ctrl + N في لوحة المفاتيح.







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

لاحظ الصور:







ستتم مطالبتك بالاسم والمؤلف والرابط ، بالإضافة إلى بعض الخصائص الاختيارية. الاسم سيكون هو اسم ملف إكسبيرتك. سيتم حفظ EA في مجلد \ Experts أسفل ذلك اسم الملف.

ستظهر محتويات حقل المؤلف بجوار اسم EA في Strategy Tester ، وكتلميح عند تحريك الماوس فوق اسم الإكسبيرت في نافذة المستكشف. حقل الارتباط هو عنوان URL لملف موقع الويب ، لكنه لن يظهر في أي مكان خارج ملف التعليمات البرمجية المصدر mq4.

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









يعتبر قالب الإكسبيرت الافتراضي ضئيلاً نوعًا ما ، ولكنه يحتوي على الهيكل الأساسي للإكسبيرت. دعنا نحدد مخطط ملف MQL باستخدام قالب الإكسبيرت كدليل لنا.


توجيهات المعالج ( Preprocessor Directives ):

أول شيء يظهر في أي ملف MQL هو توجيهات المعالج. يسبقها #.
يحتوي قالب الإكسبيرت الافتراضي على اربع:
# copyright (ملكية حقوق النشر) وهو اسم المؤلف ( أي أنت ) والذي تم إدخاله في معالج Expert Advisor
# link وهو الرابط الذي أدخلته في ملف المعالج
# version وهو رقم نسخة هذا الملف
# strict لتوجيه المترجم (Compiler) لوضع الترجمة الصارم وذلك من أجل تنبيهك عند ارتكاب أي خطأ.


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

النوع الثاني من توجيهات المعالج والذي من المحتمل أن تستخدمه هو التوجيه # include. يتكون ملف التضمين من وظائف ورموز المصدر والذي سيتم تضمينها في مشروعك عندما يتم تجميعها. كيفية بناء الجملة لتوجيه التضمين هو:

كود:

#include <name.mqh>

حيث ان name هو اسم الملف الذي تريد تضمينه.

يتم استخدام التوجيه #define للتصريح عن الثوابت لاستخدامها في برنامجنا. على سبيل المثال ، بدلاً من كتابة سلسلة نصية طويلة في كل مرة تريد استخدامها يمكنك تحديد ثابت وكتابة ذلك مثال:

كود:

#define MYCONSTANT “This is a constant”

الآن في كل مرة سنقوم بكتابة MYCONSTANT فورا سيعرف المترجم (Compiler) أننا نقصد ( This is a constant ), وقد اصطلح على ان التصريح عن المعرفات الثابتة هو باستخدام الأحرف الكبيرة. على الرغم من أنه ليس ضروري على الإطلاق ، ولكن من أجل التناسق ، يجب عليك تحديد جميع معرفات الثوابت باستخدام الأحرف الاستهلالية ( الكبيرة ).

في بعض الأحيان ستحتاج إلى وظيفة قد تم كتابتها استخدامها في ملف آخر ، مثل
ملف مكتبة ( library file ) أو ملف ( Windows DLL ( dll. حيث يمكنك استيراد هذه الوظائف مباشرة إلى مشروعك ( إكسبيرت أو مؤشر ) باستخدام توجيهات #import.

تتشابه المكتبات (Libraries) مع تضمين الملفات (include files) ، ولكن بدلاً من تضمين شفرة المصدر في مشروعنا ، سيقوم المترجم بتنفيذ الملف الآخر واستدعاء الوظيفة منه. سنتحدث عن استخدام المكتبات لاحقًا إن شاء الله.

مثال على توجيه #import:

كود:

#import "library.ex4"
double MyImportedFunction();
#import

في هذا المثال ، ملف المكتبة الذي نستورد الوظيفة (الوظائف) منه هو library.ex4. وهنا قمنا باستيراد دالة واحدة من النوع double ، تسمى MyImportedFunction (). لاحظ أن معرف الوظيفة يجب أن يتطابق مع اسم الوظيفة في ملف المكتبة المصدر. لاحظ الفاصلة المنقوطة في نهاية الدالة.


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

دورة البرمجة في الفوركس للمبتدئين – الدرس الخامس

دورة البرمجة في الفوركس للمبتدئين – الدرس السابع