- المتاجرة
- تداول مبرمج
- اكسبرت لـ NetTradeX
- تحويل السكريبتات من MetaTrader 4 الى NetTradeX Advisors
تحويل السكريبتات من MetaTrader 4 الى NetTradeX Advisors
مدخل
هناك الكثير من الاكسبرتات و السكريبات التي تمّ انشائها لمنصة الميتاتريدر 4 حتى يومنا هذا. سابقاً ، كان يتوجب على المتداولين الراغبين في استخدام هذه السكريبتات على منصة النت تريديكس ، أن يقوموا بتحويل الشيفرة ( الكود ) الأصلي ، الأمر الذي تطلب الكثير من الوقت لديهم . و لتسهيل هذا الامر ، تم انشاء مكتبة لتوافق لغة MQL4 مع لغة NTL+ . تسمح هذه المكتبة بتبسيط عملية تحويل السكريبتات الى لغة NTL+ بشكل كبير ، و ذلك لتشغيلهم في منصة NetTradeX Advisors . بسبب الفروقات بين منصتي التداول الميتاتريدير4 و النت تريديكس ( و لغتي MQL4 و NTL+ ) ، فإنه من الطبيعي ، سيترتب عليك القيام ببعض التغييرات في السكريبتات التي تريد تحويلها . تأخذ مكتبة MQL4.ntl و المُدرجة في منصة NetTradeX Advisors ، على عاتقها الجزء الأكبر من هذا العمل في عملية التكييف و التحويل هذه . بيد أنه و في كافة الاحوال ، سيتوجب على المبرمج تعديل سكريبته لتشغيله. سنقوم في هذه المقالة ، على توضيح كيفية استخدام الوظائف الموجودة في هذه المكتبة و ما هي التغييرات و التعديلات الاضافية التي يجب القيام بها .
المبادئ الأساسية للعمل مع مكتبة MQL4.ntl .
إذاً ... قبل البدء بعملنا ، يجب أن يكون لديك أولاً سكريبت مُنقّح بشكّل كامل بلغة MQL4. ما هي الخطوات التي يجب اتباعها حتى نقوم بتحويل هذا الكود ليصبح السكريبت قابلاً للعمل في NTL+ .؟
الخطوة الأولى – أولاً ، يجب أن تقوم بإنشاء ملف جديد للسكريبت في شجرة Scripts في نافذة Navigator لمنصة NetTradeX Advisors . يجب أن يتوضع الملف في مجلد Advisors أو في Utilities و ذلك بحسب الغرض منه . من ثم ، نقوم بنسخ نص السكريبت بأكمله على لغة MQL4 .
الخطوة الثانية – تشغيل مكتبة MQL4.ntl . للقيام بذلك ، أضف في بداية الملف ، سطر "include "Libraries\MQL4.ntl# . تجدر الاشارة مباشرةً إلى عدم الحاجة في تجميع مكتبة MQL4.ntl بحدّ ذاتها و لا توجد هناك حاجة لملف تنفيذي كي تعمل الوظائف من المكتبة . إنّ هذه المكتبة مخصصة للتشغيل التلقائي و تقوم بمهمة داعمة .
الخطوة الثالثة – محاولة تجميع السكريبت المُنشأ. للقيام بذلك ، انقر على زر Compile في مُحرر الكود أو اضغط على كبسة F7 . على الأغلب ، سيقوم المُصرّف (Compiler ) بإظهار قائمة الأخطاء و التحذيرات ، التي سنقوم بإزالتها خطوةً خطوة. إن ما يهمّنا الآن هو أمرين اثنين : الأمر الأول هو هل عثر المُصرّف على المكتبة أم لم يعثر عليها و الأمر الثاني هو هل تتوفر جميع الوظائف الخاصة في هذا السكريبت أم لا تتوفر .
إذا لم يكن بإمكان المُصرّف العثور على ملف المكتبة ، فإنه ستظهر رسالة "Failed to open script file" . في هذه الحالة ، يتوجب التأكد من أن ملف MQL4.ntl موجود بالفعل في نفس المكان ، المُشار اليه في موجّه (Directive ) #include , و أن اسمه مكتوب بشكل صحيح .
هناك 3 وظائف خاصة في لغة MQL4 لها اسماء مُعرّفة مسبقاً و هي ()init(), start(), deinit . حتى تعمل في منصة NetTradeX Advisors ، يجب أن تكون جميع هذه الخصائص ، محدّدة . بيد أنه و في بعض السكريبتات قد لا تتوفر هناك وظيفة ()init أو حتى الوظيفتين ()init و ()deinit . في هذه الحالة ، يقوم المُصّرف بإبلاغك "()'No matching signatures to 'init" أو "()'No matching signatures to 'deinit" . في هذه الحالة ، سيتوجب عليك اضافة وظيفة ()init و ()deinit مع مشغل واحد ;return 0
int init() { return 0; } int deinit() { return 0; }
يمكننا اعتبار أن المرحلة الأولى قد انتهت بنجاح ، إذا ما لم تظهر لديك رسالة "Failed to open script file"
و
"()'No matching signatures to 'init()'" / "No matching signatures to 'deinit" .
الآن يمكننا الانتقال للتخلص من المشاكل المحلية .
رسائل المُصرّف الاكثر شيوعاً و أسباب و طرق التخلص منها
في هذا القسم ، سيجري الحديث عن أكثر الرسائل شيوعاً التي يُظهرها المٌصرّف و التي كذلك تظهر اثناء عملية تكييف السكريبت و سنقدم الحلول العملية لإزالة حالات عدم التطابق في الكود .
No matching signatures to Printإن هذا النوع من الأخطاء سببه يكمن في عدم امكانية استخدام وظيفة العدد المتغير للبارمترات في لغة الـ NTL+ . في هذه الحالة ، ستكون بحاجة الى تغيير الوظيفة بشكل يتطابق فيه عدد البارمترات اثناء استدعائها مع كمية البارمترات في تحديدها . يجب أن يكون لوظيفة Print() بارامتر دخول واحد فقط (one input property ) . و بذلك إذاً ، مكان Print(البارامتر1, البارامتر2, البارامتر3) يجب ان تُجري التسلسل التالي - Print(البارامتر 1+البارامتر2+البارامتر3).
Unexpected token 'unrecognized token'إن أحدّ اسباب ظهور هذه الرسالة هو محاولة ربط ملفات مكتبات لغة MQL4 ، من خلال المسار #include . إن لغة NTL+ لا تعمل مع مثل هذه المكتبات ، و لذلك استخدام مثل هذه الملفات يُعد أمر غير ممكن و يجب حذف هذه السطور من البرنامج .
True'/'False' is not declared'إن اسماء المتغيرات المنطقية في لغة NTL+ تبدأ بحرف صغير ، و لذلك يمكن فقط تغيير True لتصبح true و False لتصبح false .
No conversion from '_bars&' to 'int' availableإن الـ Bars المتغيرة في لغة MQL4 مُخصصة لتحديد كمية البارات للشارت الحالي . يوجد في لغة NTL+ مشروع Bars يحمل نفس الاسم ، و لذلك ، فإنه في مكتبة MQL4.ntl تمت إضافة bars متغيرة ( بحرف صغير b ) ، تُعيد كمية البارات للشارت هذا ، و يجب استخدامها هي تحديداً في سكريبتك و ذلك مكان Bars .
Must return a valueتظهر هذه الرسالة اثناء استدعاء مشغل «return» بدون القيمة المسترجعة. في هذه الحالة تكون الخاصية التي يُستخدم فيها هذا المشغل ، مُعلنة بإمتياز من void بالقيمة المُستعادة. في حال وجود مثل هذه الرسالة ، ستيطلب الامر إما تصحيح الوظيفة ذاتها أو تبيان قيمة return.
استخدام الرقم السحري (Magic number)إن استخدام الارقام السحرية غير مُعتمد في الاصدار الحالي للغة NTL+. تعود قيمة الصفر للعدد السحري بالنسبة لجميع الصفقات المفتوحة . في السكريب بلغة MQL4 يُنصح الانتباه بشكل خاص الى استخدام الأعداد السحرية في مُشغلات شرطية. عادةً ، يكفي فقط حذف او قفل OrderMagicNumber() ، إذا ما لم تكن بحاجة لتحديد الصفقات، التي انشأتها بواسطة هذا المستشار.
استخدام المتغيرات الثابتةلا يُستخدم في لغة NTL+ الكلمة الرئيسية «static». في حال الحاجة لحفظ قيم المتغيرات بين تشغيل الوظائف، سيتوجب جعل مثل المتغيرات على أنها جذرية ( بدون الكلمة الرئيسية static ) ، بوضعهم خارج الوظائف. بحسب الرغبة ، يمكن اضافة modifier ( مُعدّل ) extern، فيما لو تكهن لتغير هذه البارمترات من قِبل المستخدم أثناء تشغيل او عمل الخبير .
تحديد حجم اللوتفي الاصدار الحالي ، إن حجم اي لوت لاي أداة يساوي 10000 وحدة من العملة الاساسية، لذلك ، إذا كنت تريد استخدام حجم لوت آخر ، حدّد متغير مناسب على حدى و ضع القيمة المطلوبة لحجم اللوت ، فيما لو اختلف عن 10000 .
العمل المختلف مع ملفات الربط المكتبي DLLالعمل مع ملفات الربط المكتبي DLL في منصات NetTradeX Advisors و MetaTrader4 يتم بشكل مختلف. في لغة MQL4 يتوجب الوصف الكامل للوظيفة من نموذج DLL، أما في لغة NTL+ ، فإن مثل هكذا وصف ليس مطلوباً. مكان الاشارة.
#import " اسم_الملف_أو_الوحدة النمطية " وصف الوظيفة ;function1 وصف الوظيفة ;function2 وصف الوظيفة ;functionN #import
يتوجب فقط إنشاء عنصر dll اي اسم لا على التعيين للمُعرّف ( "اسم_الملف_أو_الوحدة النمطية"); و طلب الوظيفة التي تريدها من خلال
المُعرّف.Call("اسم_الوظيفة",بارامترات_الوظيفة_من خلال_فاصلة);
أو
المُعرّف.CallProc("اسم_الوظيفة",بارامترات_الوظيفة_من خلال_فاصلة);
في لغات الـ MQL4 و الـ NTL+ توجد فروقات في الكلمات الرئيسية للغة. المستشارين في لغة MQL4 يمكنهم استخدام اسماء المُعادة تسميتها أو الوظائف ، الغير مُتاحة في لغة NTL+ و العكس بالعكس. يمكن للمحول البرمجي (compiler ) على سبيل المثال إخراج رسالة Expected '(' للسطر الذي لا يُعرض فيه استخدام الاقواس . إحدى الاسباب المحتملة – تماثل اسم المتغير مع إحدى الكلمات الرئيسية للغة. في مثل حالة التماثل هذه ، يجب استبدال اسم المتغير الى اسم آخر في جميع الاماكن في كود البرنامج. للاستدعاء السريع لنافذة Replace في المحرر ، يمكن استخدام تركيبة المفاتيح Ctrl+H .
Float value truncated in implicit convertion to integerيظهر هذا التحذير أثناء محاولة وضع قيمة من نوع float أو double للمتغير من نوع int. إن تصحيح مثل هذا التناقض لا يعتبر أمراً إلزامياً لتشغيل السكريبت ، لكن من الافضل القيام به. إن إعادة التشكيل من double الى int و من float الى int ضروري تنفيذه . على سبيل المثال، للمتغير d من نوع double سيكون له الشكل التالي : int(d) .
انعدام التحويل التلقائي من bool لـ int و بالعكسإن التحول التلقائي لشكل int i; bool b = true; i=b; أمر غير ممكن في لغة NTL+. في هذه الحالة تظهر رسالة Can't implicitly convert from 'bool' to 'int' و لذلك فإنه عندما ستكون بحاجة لمثل هذا التحول ، يمكن استخدام التركيب التالي :
int Run() { // convertion from bool to int; bool a=false; int b = a?1:0; // convertion from int to bool int c=1; bool d = c==0?false:true; }Can't implicitly convert from 'datetime' to 'int'
من الواضح أنه و في لغة NTL+ يتطلب القيام بإعادة تحويل ( تشكيل ) النوع لاجسام datetime للمتغير int. يمكن القيام بذلك على الشكل التالي int i; datetime d; i=int(d);
الثوابت اللونيةفي MQL4 يمكن استخدام العديد من الثوابت للعمل مع الوان المجسمات البيانية الاولية. إن مثل هذه الثوابت في الكود يمكن تغييرها الى اي لون من الالوان الـ 15 الرئيسية ، على سبيل المثال ، بالاشارة الى White أو Black . الحالة الاستثنائية – استخدام اللون في المؤشرات البيانية. إذا كان يستخدم اللون الذي لا تتعرف عليه لغة NTL+ ، فإن سيتوجب التعرف على اللون من خلال وضع الوان RGB. على سبيل المثال للون Tomato سيكون له التحديد التالي : color Tomato = 0xFF6347
العمل مع مجموعات البيانات إن العمل مع البيانات الضخمة يختلف بين لغتي MQL4 و NTL+. في لغة NTL+ يُستخدم الاعلان النمط الاسم[] فقط لصفائف المؤشرات. إن جميع الصفائق لحفظ بقية البيانات ، يُعلن عنها على شكل array <النمط> الاسم; أو array <النمط> الاسم (الحجم) . بهذا الشكل ، يجب استخدام arrayهناك بعض الوظائف الغير معتمدة في لغة NTL+. إن هذه الوظائف من الواجب حذفها أو استبدال منطقية عمل السكريبت بشكل ، يصبح فيه بالامكان استخدام تركيبة لغة الـ NTL+. أثناء استخدام مثل هذه الوظائف ، ستظهر في السجل رسالة 'The function is not supported' أو 'No matching signatures to function_name' .
قائمة بأسماء بعض الوظائف الغير مُعتمدة :
- SendMail()
- مجموعة وظائف onArray
- وظائف FileOpenHistory, FileIsLineEnding
- مجموعة وظائف objects وخصائص المجسمات
- تُعيد وظيفة MarketInfo للأنظمة التالية ، قيمتها الصفرية:
- MODE_SWAPLONG
- MODE_SWAPSHORT
- MODE_STARTING
- MODE_EXPIRATION
- MODE_MINLOT
- MODE_LOTSTEP
- MODE_SWAPTYPE
- MODE_PROFITCALCMODE
- MODE_MARGINCALCMODE
- MODE_MARGININIT
- MODE_MARGINHEDGED
- MODE_FREEZELEVEL
- مُشغل goto
- وظيفة لحساب مؤشر المستخدم iCustom
- مجموعة الوظائف للعمل مع نوافذ Window functions) (, MessageBox
- TerminalCompany(), TerminalName(), TerminalPath()
- بارامترات #property
خلاصة
تحدثنا في هذه المقالة عن المصاعب النمطية التي تنشأ أثناء تحويل السكريبتات من منصة الميتاتريدير الى منصة النت تريديكس . إن هذه العملية تُسهل بشكل كبير مكتبة MQL4.ntl التي تأتي مع المنصة. إن ميزات هذه المكتبة – تكمن في انها شيفرة مفتوحة بشكل كامل ، و التي يمكن فيها للمبرمج استبدالها أو ان يُضيف عليها و ذلك كما يرتأي . نحن بدورنا ، لن نتوقف عند ما حققناه و سنضيف وظائف جديدة الى المكتبة و سنقوم بالتنقيح الدائم و ذلك من اجل تسهيل عمل المبرمج في تحويل السكريبتات .