تعد لغة البرمجة MetaQuotes 4 و 5 أدوات لتطوير التطبيقات لمنصة التداول ميتاتريدر (MetaTrader) للجيلين الرابع والخامس من المنصة. توفر هذه اللغات للمستخدمين أدوات لتطوير استراتيجيات التداول الآلي التى يستخدمها العميل من جانبه.
يغطي المقال الموضوعات التالية:
- ما هي MQL4 و MQL5؟
- خصائص لغات البرمجة MQL4 و MQL5
- أنواع البيانات والصياغة اللغوية أو طريقة كتابة (Syntax) لغات البرمجة MQL4 و MQL5
- الفرق بين كود MQL4 و MQL5
- برمجة مؤشر بلغة MQL4: كيفية كتابة مستشار خبير (اكسبيرت) بلغة MQL4 أو MQL5
- إيجابيات وسلبيات لغات MQL4 و MQL5
- التحويل من MQL4 الى MQL5
- الأسئلة الشائعة (FAQ) حول MQL4 و MQL5
لقد أعدت لك برنامجاً تعليمياً مفصلاً حول لغات برمجة منصة ميتاتريدر MQL4 و MQL5. بعد قراءة هذه المقالة، سوف تعرف ما هى لغة MQL، والاختلافات بين أحدث نسختين من لغات برمجة المنصة، وكيفية استخدام هذه اللغات. وستجد هنا ايضاً إرشادات مفصلة حول كيفية كتابة كود برمجى لمستشار خبير (اكسبيرت). دعونا نبدأ!
ما هي MQL4 و MQL5؟
تتشابه لغتا MQL4 و MQL5 من نواحٍ عديدة. لذلك، سنتحدث بشكل منفصل عن الاختلافات، ولكننا الآن سنتفق على تسميتها MQL بدون تحديد الإصدار.
MQL هي لغة برمجة مدمجة في منصة ميتاتريدر. يتم استخدام بيئة تطوير محرر اللغة "MetaQuotes Language Editor" لكتابة روبوتات التداول الخاصة بك أو المؤشرات أو التطبيقات الأخرى بلغة MQL، وكذلك لتجميعها وتصحيحها. يتم توفير هذه البيئة مع منصة ميتاتريدر بالإضافة إلى جميع المعلومات المرجعية.
إذا كنت قد استثمرت في بعض الأصول ولو لمرة واحدة، ربما اشتريت دولارات لتحتفظ بها في البنك، فهذا يعني أنك تدرك أن الاستثمار يتطلب قدراً هائلاً من السيطرة. أراهن أنك سألت نفسك أسئلة مثل هذه أكثر من مرة:
- هل حان الوقت للخروج من الصفقة في حين أن السعر في ذروته؟
- كيف أحدد ما إذا كان سعر الأصل سوف يستمر في الارتفاع أم أن السوق سوف يعكس اتجاهه؟
- ربما هذه المرة تلقيت إشارة تداول كاذبة وليس هناك حاجة لتحمل المخاطر والاندفاع لفتح مركز، إليس كذلك؟
تحتاج إلى متابعة السوق واتخاذ قرارات التداول في الوقت المناسب. ومن المستحسن القيام بذلك ليلا ونهارا في الجلسات الأكثر نشاطا. وعندما يجري العمل بعدة أصول في نفس الوقت، فإن الوضع يزداد تفاقما.
تتيح لك MQL تنفيذ أي استراتيجية أو خوارزمية للتداول في شكل برنامج كمبيوتر. ثم يتم تشغيل هذا البرنامج باستمرار على منصة ميتاتريدر الخاصة بالعميل. بالإضافة إلى ذلك، تتضمن المجموعة المدمجة مع المنصة عددًا من روبوتات التداول والمؤشرات والنصوص البرمجية أو (السكريبت) من مطورى المنصة في شكل شفرات مصدرية (Source Code)، مما يسهل إلى حد كبير تطوير اللغة وتقنياتها. كما يتم توفير MQL مع معلومات مرجعية سواء عبر الإنترنت أو بدون الإنترنت (فى حالة عدم الاتصال). وأيضا يوجد مجتمع ضخم حول هذه اللغة.
لنفترض أنك قد توصلت إلى بعض المؤشرات الرائعة أو خوارزمية التداول الذكية التي تريد استخدامها في عملك أو ربما ترغب في تحليل السوق باستخدام الشبكات العصبية؟ لا توجد قيود. مع MQL، يمكنك تنفيذ أي فكرة في شكل مؤشر، اكسبيرت أو تطبيق آخر، تجميع، تصحيح، تحقق من البيانات التاريخية في اختبار الاستراتيجية (strategy tester) - كل ذلك دون أى مخاطر مالية.
دعونا نلخص ما سبق! تحل MQL مشكلة ايجاد الأدوات لمراقبة حالة حساب التداول، تعيين وحساب مستويات المؤشرات، تلقي إشارات التداول، وتحديد نقاط الدخول والخروج من السوق. تسمح هذه اللغة لروبوت التداول أو المؤشرات بتنظيم تبادل المعلومات مع خادم بعيد باستخدام بروتوكول التحكم بالنقل TCP، بما في ذلك تشفير TLS أو بروتوكول HTTP. من الممكن إرسال البيانات عبر بروتوكول نقل الملفات FTP بالإضافة إلى الإشعارات إلى عملاء MetaTrader للأجهزة المحمولة أو إلى البريد الإلكتروني للمستخدم. بمجرد أن يعمل برنامج مكتوب بشكل جيد، سوف يظل يعمل حتى تقرر إجراء تغييرات عليه أو استبداله بالكامل ببرنامج آخر. الشيئ المهم بالنسبة لك هو أن تظل متحكماً فى عملية التداول بشكل عام.
القصة وراء لغات MQL4 و MQL5
ظهرت MQL نتيجة للتطور المستمر لمنصة التداول. فهى أداة للإدارة التلقائية أو الآلية لحسابات التداول في منصة ميتاتريدر. ولن أتطرق إلى هذه النقطة بالتفصيل الآن.
- لقد أطلقت شركة MetaQuotes لغات برمجة المنصة المعروفة بأسم (MetaQuotes Language) جنبا إلى جنب مع منصة التداول ميتاتريدر، والتي كانت سابقا تعرف بأسم تطبيق FXCharts. تم تحديث لغة MQL إلى الإصدار الثاني جنبا إلى جنب مع تحديث منصة التداول إلى ميتاتريدر 3. وحينها قامت MetaQuotes بطرح واجهة برمجة التطبيقات API، والتي تم توفيرها للعملاء كطبقة إضافية بين عميل ميتاتريدر (MetaTrader Client) وخادم ميتاتريدر (MetaTrader Server).
- تم إطلاق الجيل الرابع من المنصة في 1 يوليو 2005. وجنبا إلى جنب مع ذلك، تم إصدار MQL4. لم تعد المنصة متوافقة مع الإصدار السابق من اللغة. كما توقفت MetaQuotes عن دعم واجهة برمجة تطبيقات العميل الطرفية (API)، ولكنها وسعت قدرات اللغة نفسها وقدمت طرقًا لدمج مكتبات DLL المخصصة في تطبيقات MQL. وظلت واجهة برمجة التطبيقات API متاحة فقط للوسطاء على مستويات الخادم والإدارة والتنظيم.
في يونيو 2010، بعد العديد من الإصدارات، تم إطلاق ميتاتريدر 5. قامت MetaQuotes بإعادة تصميم نظام التداول بشكل عام، فأزالت معظم القيود التي تفرضها البنية الداخلية للمنصة. ولكن حتى الآن لم تصل منصة MT5 لنفس شعبية الجيل الرابع MT4.
في فبراير 2014، تم تحديث MQL4 جنبا إلى جنب مع تحديث منصة التداول ميتاتريدر 4 إلى النسخة (MT4 build 600). حسنت MetaQuotes اللغة، وقدمت معظم الميزات من MQL5 وفي نفس الوقت تسريعها.
خصائص لغات البرمجة MQL4 و MQL5
تُُستخدم لغة MQL لإنشاء استراتيجيات التداول الآلي. يتم ترجمة كود لغة MQL بشكل مبدئي إلى كود لغة ++C، والذي يتم تجميعه بعد ذلك في شكل تعليمات برمجية قابلة للتنفيذ داخل المنصة كمكتبة ديناميكية مضمنة. إذا قمنا بعمل مقارنة بين هذه اللغة واللغة الأم، فسيكون ذلك مشابهًا لتضمين مكتبة DLL في التعليمات البرمجية القابلة للتنفيذ للبرنامج الرئيسي. ويساهم هذا النهج في سهولة التطوير ويعتبر بداية جيدة للدخول إلى مجال التداول الآلي. تحظى هذه اللغة بشعبية بين المتداولين، على الرغم من تخصصها الضيق واعتمادها على المنصة.
اهتمت MetaQuotes بمستخدميها وقدمت جميع تطبيقاتها مزودة بمعلومات مفصلة للمساعدة. وتم تضمين مراجع لبرمجة MQL4 و MQL5 داخل محرر الأكود MetaEditor بعدة لغات في شكل ملفات HTM. ولذلك، سيكون لديك دائما دليل مفصل مع أمثلة من التعليمات البرمجية حول كيفية تنفيذ المهمة المطلوبة.
تشكل مجتمع عريض من المتداولين والمبرمجين حول MQL. وتوجد أدوات لتسهيل التواصل بين المبرمجين والمتداولين. وقد تشكلت بالفعل مجموعة من التطبيقات الجاهزة لتسهيل عملية التداول. وهناك سوق لتبادل التطبيقات سواء المدفوعة أو المجانية ستجده على موقع mql5.com. كما تتضمن منصة التداول متجر التطبيقات، قاعدة البيانات، المقالات وإشارات التداول من المتداولين الآخرين. يعرض متجر التطبيقات المئات من الحلول المدفوعة والمجانية كالمؤشرات والمستشارين الخبراء والبرامج النصية وجميع الأدوات المساعدة للتداول. وبالتالى أصبح من السهل شراء برنامج جاهز بدلاً من «إعادة اختراع العجلة» من جديد وكتابة الأكواد من البداية.
إذا كنت قد قررت إتقان لغة MQL بنفسك والغوص في عالم إنشاء التطبيقات الخاصة بك، يمكنك استخدام هذه المقالة للتعرف على المشاكل التي يواجهها المبتدئ عند اتخاذ الخطوات الأولى في هذا المجال. أما إذا كنت محترف فى برمجة MQL، ففى الغالب لن تجد شيئًا جديدًا مما سنعرضه أدناه.
يقدم المطورون الدعم المعلوماتي لمجتمع MQL من خلال نشر البرامج التعليمية بانتظام في شكل مقالات حول مواضيع مختلفة من عالم التداول. يتناول مؤلفو المقالات التقنيات الحديثة للبرمجة، بما في ذلك إنشاء الشبكات العصبية، تحليل وحل مشاكل وقيود اللغة، تحليل واختبار استراتيجيات التداول، والبحث عن خوارزميات جديدة وتنفيذها.
يوفر معالج (MQL Wizard) ثمانية خيارات للغة البرمجة MQL4 وعشرة خيارات للغة MQL5. فيما يلي صورة من معالج كلا الإصدارين من اللغة.
دعونا نتناول أكثر هذه الخيارات شعبية:
- الاكسبيرت (Expert Advisor)/روبوت التداول؛
- المؤشر (Indicator)؛
- البرنامج النصي أو السكريبت (Script)؛
- تضمين الملفات (.mqh) والمكتبة (library).
بعد التجميع، يتم وضع هذه التطبيقات في شكل رمز أو كود قابل للتنفيذ في الدليل المناسب لمنصة العميل ميتاتريدر (File -> Open Data Folder): Experts, Indicators، Scripts، إلخ. بعد وضعها على المخطط، يتم تشغيل هذه التطبيقات استجابة للأحداث التي تم إنشاؤها أثناء تشغيل منصة الميتاتريدر. الأحداث أو Events هي المسؤولة عن تشغيل برامج مخصصة، وتسمح لك بتتبع أو إلغاء التهيئة، تلقي عرض أسعار جديد، عرض أحداث مخصصة على المخطط، والمزيد.
وبالإضافة إلى ذلك، أصبح من الممكن الآن إنشاء تطبيقات بلغة البرمجة بايثون (Python). وبناء على ذلك، أصبحت أدوات لغة البايثون متاحة في منصة التداول.
داخل المرجع الخاص بلغة MQL4 يتم شرح الدوال البرمجية أو معالجات الأحداث (event handlers) التالية:
وفى مرجع لغة MQL5، تم زيادة عدد الدوال مقارنة بالجيل السابق. والآن تبدو القائمة كما يلي:
في وقت لاحق تم توسيع قائمة الأحداث أو الدوال. لتبدو الآن على النحو التالي:
روبوت التداول أو Expert Advisor
في مجتمع المتداولين، يشار إليه أيضًا باسم المستشار الخبير أو الاكسبيرت. يتم إرفاق الاكسبيرت بالمخطط في منصة الميتاتريدر ويعمل باستمرار طالما أن منصة التداول قيد التشغيل والاتصال بخادم التداول متوفر. يتم استخدام المستشارين الخبراء أو الاكسبيرتات لتنفيذ أي استراتيجيات تداول، ومراقبة حالة الحساب، وإجراء عمليات التداول في ظل ظروف معينة، وإدارة الكائنات الرسومية. في كل مرة يتلقى روبوت التداول حركة جديدة من أداة التداول، فإنه يبدأ في فتح الصفقات؛ يمكن أيضًا تشغيل الاكسبيرت استجابة لعدد من الأحداث أو الدول الأخرى: كحدث OnTimer، OnChartEvent، OnTesterTimer، الخ.
يتم استخدام المستشارين الخبراء لإنشاء واجهات المستخدم. الروبوتات، فضلا عن المؤشرات، لديها إمكانية الوصول إلى الكائنات الرسومية على المخطط والتحكم بها.
وفيما يلي رمز لروبوت تداول بسيط. بعد كل حركة جديدة لرمز اداة التداول التى يعمل على مخططها الاكسبيرت (EA)، يتم التحقق من صفقات السوق. إذا كان هناك بالفعل صفقة تداول مفتوحة على بعض الرموز ، فإن EA ينتظر حتى يتم الإغلاق. وإذا لم يكن هناك صفقة، ثم يتم فتح واحدة في الاتجاه المعاكس للصفقة السابقة. معلمات EA: كحجم التداول، وقف الخسارة، وجني الأرباح يتم تعيينها من قبل المستخدم. عند تشغيل الاكسبيرت للمرة الأولى، سيتم فتح مركز شراء على بعض العملات. بعد إغلاقه، سيكون المركز التالي عبارة عن مركز بيع، ثم شراء مرة أخرى، وهكذا. وفي حالة وجود محاولة فاشلة لفتح صفقة، يكتب EA رسالة خطأ إلى السجل (log) ويستريح لمدة 60 ثانية، ثم يكرر المحاولة. لا يتحقق EA من المعلمات التي أدخلها المستخدم للتأكد من دقتها، وبالتالي يجب مراقبة هذا الجزء بعناية. فيما يلي بعض المشاكل المحتملة التي تظهر على الفور:
- لم يتم تفعيل القدرة على التداول بشكل عام. قد يكون المستخدم قام بتعطيل إمكانية التداول الآلى بشكل عام، أو قام بتعطيل التداول لهذا الاكسبيرت بالتحديد. وقد يكون لخادم التداول أيضاً قيود على التداول الآلي.
- قد يكون حجم التداول الذى تم إدخاله أقل من أصغر حجم ممكن أو أكبر من الحد الأقصى للحجم على حساب تداول العميل، وقد لا يكون مناسبًا إذا كان للخادم قيود على خطوة او حركة حجم التداول. على سبيل المثال، يدخل المستخدم حجم التداول 0.23 لوت، ولكن الحد الأدنى لحركة حجم التداول على الخادم 0.05 لوت (سوف يقبل فقط 0.05 ثم 0.10 ثم 0.15 ثم 0.20 ثم 0.25 لوت وهكذا) ونتيجة لذلك، لن يتم فتح الصفقة وستقوم دالة OrderSend بإظهار رسالة خطأ.
- لم يتم التحقق من مستويات وقف الخسارة للصفقة للتأكد من دقتها. وقد لا تتناسب قيم وقف الخسارة مع الحد الأدنى/الحد الأقصى للقيم المسموح بها أو قد لا تتوافق مع حدود مستويات التجميد (freeze levels)، وهو الحد الأدنى من النقاط التى يُسمح قبلها بالتعديل على أمر التداول أو إلغائه.
أبسط كود برمجى يمكن استخدامه كقالب لتنفيذ حلول على نطاق أوسع.
يتم تجميع هذا الكود وتشغيله في محرر اللغة (MetaQuotes Language Editor 5 ) النسخة 2375 والتى صدرت فى31 مارس 2020.
المؤشر (Indicator)
يستخدم المؤشر لعرض معلومات حول بيانات الأسعار والتى يتم تحويلها بطريقة ما. جميع أنواع مؤشرات التذبذب، خطوط الاتجاه، الفركتلات كلها مؤشرات. يمكن للمؤشرات الوصول إلى الأدوات الرسومية. يوجد 6 منهم في MQL4، بينما في MQL5 يصل عددها إلى 18. على سبيل المثال، يعرض المتوسط المتحرك بعض قيمة السعر المتوسط و/أو المحسن لفترة في الماضي ويشير بشكل غير مباشر إلى الاتجاه المستقبلي لسعر الأداة. وهي تعمل على المخطط طوال الوقت. يتم تحديث المؤشر وإعادة حسابه في كل مرة يتم فيها تلقي حركة جديدة للأداة المتواجد على مخططها المؤشر، أو عند استلام حدث جديد من المستخدم.
لكل مؤشر مكان تخزين أو "ذاكرة رسومية وسيطة" (Buffer) واحد أو أكثر للكائنات الخاصه به داخل منصة الميتاتريدر، والذى يتم وضع البيانات الرقمية داخله. توفر لغة MQL4 للمؤشر الواحد 32 مكان تخزين، بينما في MQL5 يسمح لك باستخدام 512 مكان تخزين.
وفيما يلي مثال على مصدر الكود البرمجى لمؤشر الدببة (Bears) المدمج من منصة MetaTrader4.
البرنامج النصي (Script)
يستخدم المطورون البرامج النصية لإنشاء خوارزميات لا تتطلب معالجة البيانات في الوقت الفعلي. على سبيل المثال، لتحميل البيانات الإحصائية أو معلومات تصحيح الأخطاء البرمجية. يتم تنفيذ البرامج النصية بمجرد إرفاقها بأي مخطط بواسطة دالة OnStart. فهى الدالة الوحيدة التى يمكن للبرنامج النصي معالجتها.
توضح الصورة أدناه النص البرمجي لإغلاق جميع أوامر السوق على الحساب. سيقوم البرنامج النصي أو الاسكربت بمعالجة جميع الأوامر، بغض النظر عن مخطط الرمز الذى تم تشغيله عليه. وفي هذه الحالة، سيتم تجاهل الأوامر المعلقة.
ستكون نتيجة تشغيل هذا البرنامج النصي هي كما يظهر بالصورة التالية فى سجل MetaTrader:
سوف يتطلب الأمر المزيد من الجهد لتعليم هذا البرنامج النصي معالجة الأوامر المعلقة بشكل منفصل بلغة MQL4. أولا، لنقم بإنشاء خاصية بحيث يمكن للبرنامج النصي إظهار نافذة تحتوي على بيانات الإدخال. بعد ذلك، أضف تعداد ثوابت (Enum) يحتوي على 3 خيارات لإغلاق الصفقات بواسطة البرنامج النصي: أوامر السوق فقط، الأوامر المعلقة فقط، أو جميع الصفقات الموجودة في الحساب في الوقت الحالي. ثم نقوم بإضافة مصفوفة (Array) لتخزين تحركات السعر للأمر المعلق وملئه وفقًا لذلك في حلقة تكرار (For loop) الأولى. والآن يبقى معالجة خيار إغلاق الصفقات التي حددها المستخدم.
ونتيجة لذلك، حصلنا على برنامج نصي مثل هذا، والذي لا يغلق فقط جميع الصفقات ولكن يأخذ بعين الاعتبار اختيار المستخدم.
تضمين الملفات (.mqh) والمكتبة (library)
يتم استخدامه، كما يوحي الاسم، لإدراج أنواع أخرى من البرامج إلى منصة العميل ميتاتريدر. فالمطورون من ذوي الخبرة لديهم مجموعة من الأدوات الخاصة التي يمكن إعادة استخدامها عدة مرات في مختلف التطبيقات.
في محرر اللغة (MetaQuotes Language Editor)، تحتاج فقط إلى تحديد المسار إلى الملف الرأسي (Header File) المتعلق بموقع الملف الذي يتم فيه التضمين. عند إجراء عملية التحويل البرمجي، سيجد MetaEditor هذا الملف ويقوم بإخراج الكود البرمجى منه عن طريق الأوامر توجيهية مثل #include. الآن يمكن استخدام كل أكواد المكتبة في التطبيق.
وبالمثل، يقوم المبرمجون فى لغات C و ++C بإعادة استخدام التعليمات البرمجية من خلال تضمين ملفات الرأس في مشاريعهم وربطها بالنظام الثنائى.
يعرض المثال أدناه تفسير بسيط لأحدى المصفوفات الديناميكية تعرف باسم std::vector من مكتبة C ++ المعيارية. يتوافق هذا الكود ويعمل مع إصدار MetaEditor: 5.00 نسخة 2375 إصدار 31 مارس 2020.
أنواع البيانات والصياغة اللغوية أو طريقة كتابة (Syntax) لغات البرمجة MQL4 و MQL5
تؤخذ تقريباً معظم أنواع البيانات والتراكيب اللغوية من لغة ++C، بمعنى أن لغة MQL بنوعيها مشتقة من اللغة الأدنى ++C. قبل عملية التجميع والتحويل، يتم تجهيز كود MQL مسبقًا وتفسيره إلى كود لغة ++C المقابل، لذلك، سيتم تجميع تركيبات اللغة الصالحة في اللغة الأصل على الأرجح، وسوف تعمل في MQL. ويمكن للمبرمج الذي يعرف لغة C أو ++C أو #C أن يكتشف بسهولة كيفية كتابة كود لغة MQL
أنواع البيانات
توجد أنواع البيانات الرئيسية التالية في MQL:
- القيم المنطقية (Boolean)؛
- تنسيق الفاصلة العائمة أحادية ومزدوجة الدقة؛
- الأعداد الصحيحة، أيضا أحادية ومزدوجة الدقة، بإشارة و بدون إشارة؛
- البيانات الحرفية أو النصية (Char) لتخزين الأحرف؛
- نوع البيانات التعدادي (Enum)، ولكن لا يتم دعم فئة الثوابت المتعدِّدة (enum class)؛
- الأصناف Classes والبنيات Structures والقوالب Templates.
وفي الوقت نفسه، هناك المزيد من الدعم فى هذه اللغة لـ الألون والمتغيرات النصية والبيانات الزمنية (datetime) كأنواع مدمجة، مما يسهل إلى حد ما عمل المطور. يتم تنظيم العمل مع هذه الأنواع في نمط C باستخدام الدوال العالمية. يختلف سلوك نصوص string الخاصة بلغة MQL اختلافًا جوهريًا عن عائلة std። string الخاصة بقوالب C++03 من لغة السى بلس بلس. لا تخلط بينهم.
الصياغة اللغوية (Syntax) أو طريقة كتابة كود لغة MetaQuotes
تحتوي MQL على تراكيب مشابهة للغة ++C. تم نقل معظم الدلالات (semantics) من مكتبة اللغة السلف أو الأم المعيارية C++03 إلى MQL مع تغييرات طفيفة. وحاليا، تتوافق MQL مع مكتبة لغة C++03 المعيارية من حيث القدرات.
والفرق الرئيسي بين MQL و ++C هو الدلالات المختلفة للمؤشرات (Pointers). إذا كان لدينا فى لغة ++C عنوان ظاهري (virtual address) توجد فيه البيانات، سيكون في لغة MQL عبارة عن واصف (descriptor)، جزءًا من واجهة برمجة التطبيقات POSIX، معرف رقمي، أو نوع من دوال الغلاف على مؤشر مصدرى، والتي من خلالها توجد الكائنات التي تم إنشاؤها في الذاكرة الديناميكية والمرتبطة بهذا المعرف. فمعامل السهم «->» غير معتمد لمؤشرات MQL، ويتم الحصول على القيمة التي يشير إليها المؤشر باستخدام معامل النقطة «.». يجب حذف الواصف والمؤشر تمامًا بعد انتهاء البرنامج. ومع ذلك، إذا نسيت تدمير الكائن الذي تشير إليه هذه الدالة، فستقوم مكتبة أخطاء وقت التّشغيل (Runtime) بذلك نيابة عنك عند إلغاء تهيئة البرنامج.
تفتقر لغة MQL إلى مفهوم المتغير المؤقت وحركة البيانات. كما أن تمرير المتغيرات حسب المرجع والقيمة فى لغة MQL يختلف عن ++C ويتم تنفيذه في MQL بطريقتها الخاصة. سيتم تمرير أي كائن معقد أو فئة مخصصة إلى الدالة بالرجوع إليها سواء كنت تستخدم عامل تشغيل الكود (Ampersand) أم لا.
وهناك عدد من القيود المفروضة على اللغة الأم. لا يمكنك كتابة الدالات والقوالب باستخدام عدد متغير من الوسيطات (arguments). ولكن الأمر الملحوظ هنا هو أن عدداً من الدوال المدمجة مثل iCustom (التي سنقوم بتحليلها لاحقًا في هذه المقالة)، printf، StringFormat، وPrintFormat قد تأخذ عدداً متغيرًا من الوسيطات. يا لها من مفارقة!
يختلف العمل مع مراجع البيانات والكائنات في بعض الجوانب مقارنة بـ C ++، ولكن هذا الاختلاف يمكن التعامل معه بسهولة باستخدام الرسائل من المحوّل البرمجي. هناك اختلافات في توقيعات مُنشئ النسخ وعامل تعيين النسخ بسبب اختلاف دلالات المتغيرات التي تمر عبر المرجع. أيضا، لا توجد دلالات نقل (move semantics) لنقل متغيرات وكائنات المرجع في لغة MQL.
الفرق بين كود MQL4 و MQL5
يرجع الاختلاف بين الجيل الرابع والخامس من لغات MQL إلى الاختلافات بين منصات MetaTrader4 و MetaTrader5 نفسها. ومن الجدير بالذكر أنه منذ إصدار النسخة 600 MT4، يتم استخدام النسخة الخامسة فقط من محرر اللغة (MetaQuotes Language Editor) لكتابة وترجمة البرامج في MQL4 و MQL5. وعلى وجه الخصوص، تعمل اللغات بطرق مختلفة مع عمليات التداول، حيث أن المنصة ذات الإصدار الخامس لديها المزيد من أنماط التداول ويتم فصل مفاهيم الأمر والمعاملة والمركز.
الآن لإرسال الطلبات يتم فقط استخدام دالة OrderSend، على عكس الإصدار الرابع، حيث يتم استخدام دوال منفصلة لوضع أو تعديل أو حذف طلبات أو أوامر التداول.
| MQL4 | MQL5 |
|---|---|---|
الأطر الزمنية | 9 (M1, M5, M15, M30, H1, H4, D, W, MN) | 21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1) |
أنماط الرسم | 6 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_ARROW DRAW_ZIGZAG بداية من الإصدار 600، أصبح عدد هذه الأنماط متوافقاً مع النسخة الخامسة | 18 DRAW_NONE DRAW_LINE DRAW_SECTION DRAW_HISTOGRAM DRAW_HISTOGRAM2 DRAW_ARROW DRAW_ZIGZAG DRAW_FILLING DRAW_BARS DRAW_CANDLES DRAW_COLOR_LINE DRAW_COLOR_SECTION DRAW_COLOR_HISTOGRAM DRAW_COLOR_HISTOGRAM2 DRAW_COLOR_ARROW DRAW_COLOR_ZIGZAG DRAW_COLOR_BARS DRAW_COLOR_CANDLES |
نماذج إطلاق موجهة بالأحداث | OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnChartEvent OnTester
| OnInit OnStart OnDeinit OnTick OnCalculate OnTimer OnTrade OnTradeTransaction OnBookEvent OnChartEvent OnTester OnTesterInit OnTesterDeinit OnTesterPass |
التداول | OrderSend OrderModify OrderDelete يتم تحديد السلوك المطلوب بواسطة مجموعة منفصلة من المعلمات لكل دالة. مما يعقد برامج الكتابة والتصحيح. | OrderSend دالة واحدة لجميع العمليات. يتم تحديد السلوك المطلوب في هيكل طلب المعاملة (MqlTradeRequest). يتم إرجاع الاستجابة إلى هيكل MQLTradeResulT. مما يسهل تشكيل السلوك واختبار النتيجة وتصحيح البرنامج. |
أماكن تخزين بيانات المؤشر | 32 | 512 |
المؤشرات المدمجة | الكمية: 30 | الكمية: 38 يتم إنشاء المؤشرات باستخدام دوال معينة. وقد تم تخفيض عدد النسخ واستهلاك الذاكرة. |
أوضاع التداول | التحوط (Hedging) | المعاوضة (Netting) التحوط (Hedging) الأسهم (Stock) |
أدوات الرسومات OpenCL و DirectX | لا | نعم |
إنشاء روبوتات التداول | لا | نعم. وفي الوقت نفسه، يمكنك تحديد وحدات إشارة مخصصة. |
وبالتالى هناك بعض الاختلافات الموجودة بالفعل. بعد التحديث إلى الإصدار 600، تختلف MQL4 عن MQL5 فقط فى الجزء الذي تختلف فيه إحدى المنصات عن الأخرى. تحتوي مدونة LiteFinance بالفعل على مقال مخصص لمقارنة منصة ميتاتريدر 4 مع ميتاتريدر 5، والتي أوصي بشدة بقراءتها إذا كنت ترغب في زيادة معرفتك وتعميق فهمك حول هذا الموضوع.
برمجة مؤشر بلغة MQL4: كيفية كتابة مستشار خبير (اكسبيرت) بلغة MQL4 أو MQL5
قبل البدء في كتابة اكسبيرت، عليك أن تفهم أنه يجب أن تكون لديك بالفعل استراتيجية تداول. عندها فقط يمكنك البدء في تحقيق الفكرة في شكل خوارزمية رسمية. فالكود نفسه يوفر فقط أدوات برمجية لتنفيذ فكرة معينة.
لذا، فإن أول شيء تحتاجه هو استراتيجية تداول فعالة. ومسألة تطوير استراتجية من البداية ليست موضوع هذه المقالة، لذلك دعونا نأخذ شيئا بسيطا كمثال. دعونا نفترض ما يلي. خلال فترات النشاط المنخفض للأداة التداول «فى حالة الاتجاه العرضى»، من الممكن فتح صفقات في اتجاهين متعاكسين مع أهداف بمستويات صغيرة. وسيسمح لك هذا بالاستفادة من حركات السوق العرضية الصغيرة وتحقيق ربح.
وسوف نكتب مستشار خبير من شأنه أتمتة عملية الفتح اليدوي للصفقات والسيطرة على الاهداف وايقاف الخسارة، وسنقوم بتشغيله على حساب التداول خلال فترات السوق المسطح أو الاتجاه العرضى.
في البداية، سوف نقوم بنفس الخطوات بغض النظر عن إصدار اللغة. لكتابة برامج بلغة MQL، تحتاج إلى تثبيت منصة العميل (MetaTrader Client Terminal)، والتي تتضمن حزمة محرر MetaEditor. والآن يمكننا بدء تشغيل MetaEditor مباشرة من الدليل الحالي، أو من خلال القائمة الرئيسية لمنصة التداول: بالضغط على أدوات (Tools) ثم محرر اللغة (MetaQuotes Language Editor) أو بالضغط مباشرة على زر (F4). في نافذة MetaEditor في القائمة الرئيسية، انقر فوق ملف (File) -> جديد (New). أو عن طريق النقر على جديد (New) في القائمة الرسومية.
كيفية إنشاء روبوت تداول بلغة MQL4
في معالج تطبيق كتابة الاكسبيرت (MQL4 Wizard) حدد الاختيار "Expert Advisor (template)" وانقر فوق التالي (Next).
بعد ذلك، أدخل المعلمات التي توفر للمستخدم واجهة للتفاعل مع البرنامج، وتأكيدها بالنقر فوق موافق (OK). وقد أضفنا هنا:
- أداة للتداول
- اختيار اتجاه الصفقة الأولى التي سيفتحها الروبوت. في الوقت الحالي، نوع البيانات لهذه الخانة هو العدد الصحيح، ولكن فيما بعد سنقوم بإصلاح الكود البرمجى بحيث يمكن فقط اختيار شراء (Buy) أو بيع (Sell) كاتجاه للصفقة.
سيقوم محرر MetaEditor تلقائيًا بتضمين دالة حدث OnTick في التعليمات البرمجية. أما البقية لابد أن تختارها بنفسك. كما ترى، لدينا أيضًا إمكانية الوصول إلى دالة OnTimer، والتى يتم استدعاؤها في كل مرة نقوم فيها بتعيين التردد للمؤقت أو الفاصل الزمنى، ودالة OnChartEvent، والتي سيتم استدعاؤها استجابة لإجراءات المستخدم التى تتعامل مع الكائنات على الشارت. سترى هنا المزيد من الدوال المتاحة فى حالة استخدام MQL5.
انتقل أبعد من ذلك وحدد دوال الأحداث في وضع الاختبار. في MQL5 يمكنك اختيار المزيد من الأحداث في وضع الاختبار، وبالتالي، تتوفر المزيد من الدوال لهم.
خلال الخطوتين السابقتين، تركت جميع الخيارات فارغة. سيتم تنفيذ كل الخطوات التى نريدها بواسطة دالة OnTick. حيث سيتم استدعاؤها مع كل حركة (tick) جديدة للرمز.
بعد النقر فوق الزر إنهاء (Finish)، سيقوم MetaEditor بإنشاء قالب للاكسبيرت المستقبلي بالاسم والمعلمات المحددة. كما سيتم تضمين دوال الأحداث المحددة في التعليمات البرمجية أو الكود الخاص بنا. لن أسهب في الحديث عن كل منهم بالتفصيل. جميع المعلومات الضرورية حول هذا الأمر موجودة في الدليل المرجعي (Reference).
يمكن بالفعل ترجمة وتحويل هذا الكود وتشغيله في منصة التداول. لكن لن يحدث شيء. لدينا فعلا متغيرات الإدخال، لكننا لم نستخدمها حتى الآن. فدالة OnInit تقوم دائمًا بإعلام المنصة عن التهيئة الناجحة، في حين أن OnTick و OnDeInit لا تحتوي على أي تعليمات.
دعونا نبدأ كتابة الكود.
دعونا ننظف أولا مكان كتابة الكود. احذف المسافات الإضافية واختصر التعليقات إلى سطر واحد. ثم نحدد enum TradeCmd (الأسطر 11-14) للإشارة إلى اتجاه أول صفقة تداول بطريقة بدلا من الرقم. ثم قم بتغيير نوع الإدخال للمتغير FirstTradeDirection من int إلى TradecMD (20). والخطوة التالية هي إنشاء اتجاه متغير عالمي ثابت مع نوع TradecMD لتأخذ في الاعتبار اتجاه الصفقة السابقة وتغييره إلى العكس بالنسبة للصفقة التالية.
في البداية، نسيت أن أضيف متغيرات لحجم الصفقات (volume)، ووقف الخسارة (stop-loss) ومستويات جني الأرباح (take-profit) في المعالج. نضيفها الآن مع الكلمة الرئيسية الإدخال ومعها بقية الإعدادات الخارجية.
دعونا ننتقل إلى دالة OnTick. نقوم بتحليل توافر الصفقات المفتوحة. للقيام بذلك، نكرر على جميع الصفقات المفتوحة باستخدام دورة بسيطة في النطاق [0، TotalTrades). نتحقق مرة تلو الآخرى من أن رمز الصفقة المحددة يطابق الرمز المحدد في InputSymbol. وبمجرد أن يكون هناك صفقة واحدة على الأقل، لن تكون هناك حاجة للقيام بأي شيء. نخرج من دالة OnTick مع وضع Return (الأسطر 29-35). وانتظر التشغيل التالي.
خلاف ذلك، ستحتاج إلى فتح صفقة. دعونا نشير إلى توثيق MQL4 لاستخدام دالة OrderSend بشكل صحيح، والتى بمساعدتها سوف نرسل طلبًا أو أمر تداول إلى خادم التداول. سيبدو الإعلان أو الايضاح كما يلي:
دعونا نتناول هذه المعلمات بالترتيب:
- Symbol. هذا المتغير موجود لدينا بالفعل، لكننا لا نتحقق من صحتة بأي شكل من الأشكال ونعتمد فقط على الإدخال الصحيح من المستخدم.
- CMD. لهذا، نستخدم المتغير العالمى الثابت (Direction).
- Volume. المحدّد من قبل المستخدم. ومرة أخرى، سيكون من الضروري التحقق من القيمة المدخلة للحدود: الحد الأدنى والحد الأقصى وأدنى حركة لتغيير الحجم.
- Price. سيكون Ask إذا كنا سنشترى، و Bid إذا كنا سنبيع.
- Slippage. في حالتنا، هذا المتغير لا يهم كثيراً. فقط اضبطه على 2 نقطة.
- Stoploss. مرة أخرى، يعتمد هذا المتغير على اتجاه الصفقة. يجب أن يكون أقل من سعر الفتح إذا كنا فى صفقة شراء، وأكبر من سعر الفتح إذا كنا فى صفقة بيع.
- Takeprofit. مثل وقف الخسارة (stop loss)، يعتمد على اتجاه الصفقة.
المعلمات الأربعة الأخرى ذات القيمة الافتراضية لا تهمنا بعد. ونتيجة لذلك، لفتح صفقة لدينا: InputVolume (ونقصد بها حجم)، Direction(أي اتجاه الصفقة)، InputSymbol (أي رمز الاداة)، ثم قم بتعيين الانزلاق (slippage) إلى 1 نقطة. ما نحتاج إلى حسابه اعتمادًا على الاتجاه (Direction): السعر (price)(أي سعر فتح الصفقة)، sl(أي وقف الخسارة) و tp(أي جني الأرباح). إذا كنا نشتري، سيكون السعر هو Ask، وقف الخسارة (Stop loss) أقل من السعر الحالي، جني الأرباح (Take profit) أعلى من السعر الحالى، وإذا كنا نبيع، سيكون السعر هو Bid، ووقف الخسارة أعلى من السعر الحالي، وجني الأرباح أقل. نحتاج أيضًا إلى متغيرين إضافيين. الأول لتحويل مستوى الحدود سواء الهدف أو الايقاف من النقاط إلى القيمة الاسمية point وهي القيمة الدنيا التي يمكن أن يتغير بها سعر الرمز. والثاني لتعديل قيم النقطة العائمة أو digit وهو عدد الأرقام الهامة في الجزء الكسري من السعر.
تحويل هذا إلى لغة MQL.
ننتقل مباشرة إلى فتح صفقة. نقوم بإعادة تعيين المتغير _LastError فى دالة ResetLastError المضمنة. نرسل طلبًا أو أمر تداول باستخدام OrderSend، ونكتب النتيجة فى متغير result. سيكون هناك خياران لهذا الحدث بعد تفعيله:
- الأول أنه تم فتح الصفقة بنجاح، إذا كانت خانة result تحتوي على قيمة أكبر من الصفر، حركة الصفقة. وفى هذه الحالة، سنكون فى حاجة إلى تغيير القيمة الخاصة بالاتجاه (Direction) لفتح صفقة في الاتجاه المعاكس المرة القادمة.
- إذا كانت خانة result تحتوي على قيمة سالبة، فهذا يعنى إنه لم يتم فتح الصفقة. سنحتاج إلى التحقق من الخطأ الأخير باستخدام GetLastError، وتحليله والقيام بشيء ما: حاول مرة أخرى، أغفو لفترة من الوقت، قم بإخراج معلومات تصحيح الإخطاء من السجل، إلخ. للتبسيط، قمت بإخراج معلومات تصحيح الإخطاء من السجل.
دعونا نلقي نظرة على ذلك.
ها قد كتبنا عشرات الأسطر من التعليمات البرمجية أو الأكود وأصبح روبوت التداول جاهزاً. بالتأكيد هذا الروبوت البدائى ليس له وظائف فعالة ، ولكن هذا مجرد مثال على حقيقة أن كتابة التعليمات البرمجية لا تتطلب الكثير من المعرفة والجهد الكبير.
وهنا قائمة كاملة بالأكواد التى قمنا بكتابتها، في حال كنت بحاجة إليها.
نقوم بترجمة وتحويل الكود ونشغل الاكسبيرت في منصة التداول.
كيفية إنشاء مستشار خبير بلغة MQL5
لدى لغة MQL5 الكثير من المميزات التى تتفوق بها على MQL4. ففي الواقع يمكنك إنشاء روبوت تداول من النسخة الخامسة بعدد قليل من النقرات دون كتابة سطر واحد من الأكواد البرمجية.
في محرر MetaEditor، انقر فوق جديد (New) وحدد Expert Advisor (generate) معالج تطبيق كتابة الاكسبيرت (MQL5 Wizard).
دعونا نسمى المستشار الخبير الخاص بنا MQL5_Generated_Robot. ونشير إلى المؤلف وموقعه الإلكتروني أو ملفه الشخصي ولكن هذا الأمر اختياريًا. أضف معلمات الاكسبيرت، إذا لزم الأمر: الرمز والإطار الزمني للتداول. يؤدي النقر المزدوج إلى تنشيط المعلمة، والنقر على اسم أو قيمة المتغير يسمح لك بتغيير الإعدادات الافتراضية المقترحة. يمكنك تعيين أي رمز تريد. لقد حددته بالحالي (current)، وأعنى به أى مخطط سيعمل عليه الاكسبيرت EA، سيقوم بتحديد رمزه مباشرة هنا. وقمت بتعيين الإطار الزمني بـ M15 أو خمسة عشرة دقيقة لزيادة احتمالية الحصول على إشارات تداول.
دعونا نمضي قدماً. الآن نحن بحاجة إلى تحديد إشارة ومن ثم نقوم بتعيين الإعدادات الخاصة بها. يمكنك هنا تجربة مجموعات مختلفة من الإشارات المقترحة من قبل المطورين. ستولد هذه الإشارات أحداثًا للإكسبيرت لفتح الصفقات.
يمكنك إضافة إشارات مخصصة لهذا الجزء، بما في ذلك إشارات المراقبة من موقع mql5.com. ويتم توفير الخيارات التالية مع المنصة افتراضيًا:
لقد اخترت التداول عند تقاطع اثنين من المتوسطات “Trading at the intersection of two averages” وقمت بتعيين الفترتين مع القيم 21 و 55. من غير المرغوب فيه اختيار فترات قصيرة جدًا إذا كنت بحاجة إلى تقليل عدد الإشارات الخاطئة. نترك خانة الرمز الحالي كما هى. على سبيل المثال، سوف نتداول على زوج EURJPY ونتلقى إشارات من المتوسطات المتحركة المطبقة على بيانات سعر زوج EURJPY. اختر رمزًا مختلفًا هنا إذا كانت استراتيجيتك تنطوي على تداول الأداة اعتمادًا على سلوك بعض الأزواج الأخرى. وأيضا قمت بتعيين الإطار الزمني بـ M15.
تأكيد. سنرى أنه تمت إضافة إشارة للرمز والإطار الزمني الحالي، والتي ستولد أحداثًا للإكسبيرت.
انتقل إلى وضع إيقاف الخسارة المتحرك (Trailing Stop). هنا اخترت ايقاف خسارة ثابت. وقمت أيضا بتعيين وقف الخسارة عند 150 نقطة وجني الأرباح عند 200 نقطة.
بعد ذلك، يمكننا اختيار واحد من أصل خمسة أنماط لإدارة الأموال لحساب التداول. فالتداول متاح بالأنماط التالية:
- حجم التداول الثابت (Fixed trade volume)؛
- الهامش الثابت (Fixed margin)؛
- المخاطر الثابتة (Fixed risk)؛
- الحد الأدنى المسموح به لحجم التداول (Minimal allowed trade volume)؛
- حجم التداول الأمثل (Optimized trade volume).
قمت باختيار التداول مع المخاطر الثابتة (trading with the fixed risk) بنسبة 1٪ من الأموال الموجودة فى الحساب.
انقر فوق تم (Done) واستقبل الربح! لقد أنشأنا مستشار خبير دون كتابة سطر واحد من التعليمات البرمجية.
دعونا نلقي نظرة أقرب ونجري تحليلًا صغيرًا للكود.
بالنسبة لمقدمة الجدول أو الرأس - كل شيء مألوف وواضح. بعد ذلك تأتى خانات ووحدات المكتبة. Expert هو الروبوت الخاص بنا. MACross هو مولد الإشارة عند حدوث تقاطع المتوسط المتحرك، TrailingFixedPips هو بمثابة وحدة التحكم في حدود مستويات التوقف والهدف، وأخيراً MoneyFixedRiskهي وحدة إدارة المخاطر. ثم الإعدادات التي تتضمن متغيرات الإدخال التي تحدد واجهة للتفاعل مع التطبيق. تبدو مألوفة، أليس كذلك؟ بالطبع! قمنا بإعدادها في معالج الاكسبيرت (Expert Advisor Generation Wizard). في المستقبل، قد يتم تغيير القيم الافتراضية هنا.
بعد ذلك، يتم الإعلان عن متغير عام تلقائي من نوع CExpert، والذي يتم تهيئته بقيمة افتراضية. بالنسبة للكائن، يعني هذا أنه تم استدعاء المُنشئ الافتراضي. داخل كود الدالة OnInit، يتم تهيئة EA، كما يتم إنشاء الإشارات والمرشحات وتهيئتها بالقيم المحددة في الإعدادات. فيما يلي الكود الذي أزلت منه جميع عمليات التحقق من نجاح نتائج التهيئة والتوصيفات، لتقليل حجم الكود.
أدناه يمكنك ان ترى دوال OnDeinit، OnTick، OnTimer، OnTrade. كل دالة منهم ببساطة تستدعى الطريقة المقابلة لفئة CExpert.
إذا نظرت عن كثب، في متصفح الملفات على اليسار، Include -> مجلد Experts، يمكنك ان ترى الإشارات والوحدات المتاحة في مولد الإشارات. وبالتالى يمكنك إضافة بعض الحلول المتخصصة لمولد الإشارات أو إنشاء بعض الحلول الجديدة عن طريق بضع نقرات.
دعونا نحاول ترجمة وتحويل الكود. بما أن الأخطاء 0 والتحذيرات 0 إذا تمت كتابة الكود بنجاح. ولتشغيل وضع اختبار الاستراتيجية اضغط على Ctrl و F5 في وقت واحد أو انقر فوق الزر الموجود في القائمة الرسومية في الأعلى.
سوف ننتقل إلى منصة المتداول MetaTrader، في إعدادات اختبار الاستراتيجية. ثم نختار الملف لاختباره، وتهيئة باقي المعلمات: الرمز (Symbol)، الإطار الزمني، الفترة أو التاريخ (Date)، الرصيد (Deposit) والرافعة المالية (Leverage) لحساب التداول، إلخ. هناك العديد من الإعدادات، ولكل منها وصف وشرح مفصل في الدليل المرجعي (Reference). للحصول على معلومات مفصلة عن الإعدادات ووضع الاختبار، اضغط F1.
للبدء، اضغط ابدأ (Start) في الزاوية اليمنى السفلى، وإذا تم اختبار الاستراتجية بدون تحسين، يمكنك تحديد الوضع المرئى لاستراتيجيتك.
لقدم المطورين شاكرين شرحاً لكل وحدة برمجية مدمجة وكل إشارة على https://www.mql5.com/en/docs/standardlibrary/expertclasses. لا تتردد في الرجوع إلى هذه الوثائق مرجعية لتوسيع معرفتك.
إيجابيات وسلبيات لغات MQL4 و MQL5
يكمن العيب الرئيسي في الغرض ذاته من هذه اللغات. فلغة (MetaQuotes Querying Language) هي لغة لبرمجة وكتابة الأكود البرمجية لتطبيقات منصة الميتاتريدر فقط. ويمكن فقط تجميع وتصحيح كود لغة MQL في بيئة محرر MetaEditor . وفقط منصة ميتاتريدر للمتداولين يمكنها تشغيل البرنامج الذى تم برمجته. كما تغيب عملية تنظيم الذاكرة اليدوية (Manual memory management)، والتى هى عبارة تعليمات يدوية لايجاد وتحرير الذاكرة من الأغراض غير المستخدمة. صحيح لا يزال بإمكانك اختيار إنشاء المتغيرات على النطاق الديناميكي (dynamic scope) أو النطاق الثابت (stack scope)، ولكن في كلتا الحالتين، ليس لديك حق الوصول إلى عنوانه الظاهري.
وفى المقابل لدى هذه اللغات الكثير من المزايا. وأهمها أن هذه اللغات لا تحتاج إلى مستوى عالى من الاحتراف، فباستخدام الحد الادنى من المعرفة البرمجية، خاصة إذا كان لديك بالفعل خبرة في تطوير لغات البرمجة ثابتة الأنواع (Statically Typed). أداء عالي على مستوى لغات C و ++C. دعم أسلوب البرمجة كائنية التوجُّه: كـ التغليف (Encapsulation) والتمدد (Extensibility)، الوراثة (Inheritance)، تعدد الأشكال (Polymorphism)، الإجراءات المجردة (Virtual Methods) للقوالب أو الأصناف (classes). من الممكن إنشاء قوالب أو نماذج للأصناف والدوال، أي إنها من لغات البرمجة تعددية الأشكال الحدودية"، باستخدام هذا النوع من لغات البرمجة يمكن كتابة وظيفة أو نوع بيانات بشكل عام حتى تتمكن من التعامل مع القيم بشكل مماثل دون الاعتماد على نوعها" كل هذا يسمح بإعادة استخدام الكود عدة مرات. وتشمل الهياكل الأساسية المجانية منصة التداول، بيئة التطوير، اختبار الاستراتيجية، والمكتبات المضمنة.
التحويل من MQL4 الى MQL5
دعونا نتناول عملية تحويل الكود من إصدار إلى إصدار آخر أحدث باستخدام مثال الروبوت، الذي سبق عرضة في هذه المقالة داخل جزئية قدرات اللغة. للقيام بذلك، قم بإنشاء مستشار خبير أو اكسبيرت فارغ في محرر MetaEditor 5 وقم بنسخ كود المصدر الخاص بإكسبيرت MQL4_Example_EA إليه. لن تتمكن من ترجمة وتحويل هذا الكود دون عمل بعض التغييرات، ستحدث الكثير من الأخطاء عند المحاولة.
فى الجزء العلوى من الكود، لا شيء تقريبا سيتغير، باستثناء بضع نقاط:
- قم بإزالة #property strict من (preprocessor directives) الموجودة فى بداية نص البرنامج، لتبدو منطقية عند تجميع كود MQL4.
- قم بنقل إنشاء المتغير الثابت (Direction) أعلى دالة تهيئة الإكسبيرت لتهيئته بطريقة خاصة في دالة OnInit، اعتمادًا على الصفقات المتاحة. وسيسمح ذلك فيما بعد بتغيير إعدادات الإكسبيرت (EA) خلال عملية التداول.
لاحظ أنه أصبح من الأسهل الآن تحديد صفقة لأي رمز في MQL5 باستخدام دالة PositionSelect المضمنة، دون الحاجة إلى البحث من خلال جميع الصفقات المفتوحة.
دعونا نتناول بشكل كامل دالة OnTick . نستخدم PositionSelect للتحقق من وجود صفقة مفتوحة للرمز. إذا لم يكن هناك صفقة مفتوحة، انتقل داخل نص if واستعد لإرسال أمر لفتح صفقة. ومن حسن الحظ توفر لنا MQL5 بنية MqlTradeRequest لإنشاء أمر تداول، على عكس معلمات MQL4. لن أتناول الآن كل جزء منه على حدة. فكما هو الحال في MQL4، لدينا 4 من أصل 7 معلمات مطلوبة: رمز التداول (trade symbol)، الحجم (volume)، اتجاه الصفقة (direction) والانحراف (deviation) عن السعر المطلوب. ونحدد الثلاثة معلمات المتبقية (سعر الافتتاح "opening price" ووقف الخسارة "stop loss"وجني الأرباح take profit) اعتمادًا على اتجاه الصفقة. سنملأ الهيكل بالترتيب. والآن ليست هناك حاجة لتنسيق أرقام الفاصلة العائمة، ولذلك لا حاجة لمتغير digit .
يبدو إرسال طلب أو أمر تداول بأحدث إصدار من اللغة أكثر إيجازًا. والآن ستعود إلينا جميع المعلومات حول نتيجة تنفيذ دالة OrderSend في MqlTradeResult.
حصلت فى النهاية على الكود التالى بعد تصحيح الاخطاء وسلسلة من الاختبارات. لم يتغير الحجم، على الرغم من أننا أجرينا تغييرًا في الشكل العام والذي يتطلب إجراءات إضافية في مرحلة التهيئة داخل دالة OnInit.
دعونا نلخص ما سبق. ترقية التطبيقات من لغة MQL4 إلى MQL5 أمر سهل. فإذا كان لديك معرفة أساسية بلغة MQL، ستتمكن من فعل ذلك بنفسك.
وعلاوة على ذلك، اخترت لك عددا من الأسئلة الأكثر شيوعا حول MQL وقمت بالإجابة عليها بشكل مختصر وشامل.
الأسئلة الشائعة (FAQ) حول MQL4 و MQL5
لغة MetaQuotes هي لغة برمجة عالية المستوى تُستخدم لكتابة التطبيقات في منصة التداول الميتاتريدر بواسطة كتابة ضعيفة (weak typing) ثابتة، والتي تشبه إلى حد كبير الكتابة الخاصة بلغة ++C السالفة لها. وتعتبر لغة MetaQuotes من لغات البرمجة متعددة النماذج (multi-paradigm). أثناء كتابة التعليمات البرمجية، يمكنك استخدام الدوال كائنية التوجُّه أو الوظيفية أو الإجرائية أو المختلطة. وتدعم البرمجة الكائنية (OOP) التغليف، والوراثة، وتعدد الأشكال. وتتوفر قوالب الدوال والأصناف داخل هذه اللغة. ولكن لسوء الحظ، لا يمكن استخدام البرمجة الوصفية (Metaprogramming) مع حساب وقت التجميع (التحويل) البرمجي.
لكتابة برامج في MQL ، تحتاج إلى تثبيت منصة عميل ميتاتريدر. تتضمن حزمة التسليم الخاصة به بيئة لتطوير التطبيقات في MQL تسمى محرر MetaEditor. نقوم بتشغيله باستخدام أدوات القائمة الرئيسية -> MetaQuotes Language Editor (F4). الآن نحن جاهزون لكتابة أول برنامج MQL خاص بنا.
وستكون نتيجة تشغيل مثل هذا البرنامج في منصة التداول كالتالى
هو ملف نصي بسيط. يسمح هذا الامتداد لنظام التشغيل بربط الملف تلقائيًا ببيئة تطوير MetaEditor. فى حين أن ملف ex4 هو ملف قابل للتنفيذ لا يمكن قراءته كنص، ويحتوي على بيانات فى شفرة مكتوبة بالنظام الثنائي.
أثناء التجميع البرمجي ، يتم تحويل كود برنامج mq4 إلى كود ex4 قابل للتنفيذ. هذا التحول بسيط، ويحدث غالبًا عند إنشاء البرامج. وهذا هو بالضبط ما يفعله المحول البرمجي.
والعملية العكسية هي عملية فك تجميع (تفكيك) كود ex4 القابل للتنفيذ إلى كود نصي mq4 نادرًا ما يكون لها أساس رسمي. تقدم المشاريع مفتوحة المصدر بشكل عام كود المصدر لأي شخص يوافق على قواعد توزيعها وتحويلها واستخدامها. تحمي بقية المشاريع جميع التطورات التى تتم عليها بموجب قانون حقوق النشر. ولا توجد أدوات قياسية لأداء فك التجميع البرمجي.
ولكن ماذا لو كنت تحتاج حقًا إلى تحويل الكود التنفيذي لملف ex4 إلى كود البرنامج؟ فيما يلي عدة إجابات على هذا السؤال مرتبة حسب تعقيد التنفيذ المتزايد:
- تواصل مع مؤلف البرنامج وتعرف على شروط الحصول على الكود.
- ابحث عن مبرمج يمكنه تنفيذ المطلوب ببرنامج ex4 الخاص بك وتفاوض معه.
- تعلم لغة MQL واكتب بنفسك برنامجًا مكافئًا للبرنامج الذي لديك على شكل ex4. هذا المسار ليس سهلاً ، لكنه فقط سيوسع إمكانياتك بشكل لا مثيل له.
- قم بإجراء فك التجميع البرمجي بنفسك أو بمساعدة شخص ما. يرجى الانتباه إلى المسؤولية المنصوص عليها في قانون حقوق الطبع والنشر.
ملفات Mq4 و mq5 هي ملفات نصية بسيطة تحتوي على كود MQL في شكل نصي. إذا كنت لا ترغب في مشاركة شفرة المصدر الخاصة بك ، فإن أسهل ما يمكنك فعله في هذه الحالة هو عدم كتابة الملفات بهذا التنسيق.
والطريقة البسيطة لحماية التعليمات البرمجية الخاصة بك هي توزيعها أو كتابتها بتنسيق ex4 أو (ex5). فالملفات بهذا التنسيق يتم إنشائها بواسطة محرر MetaEditor عند تجميع كود mq4 أو (mq5). وفقًا لقواعد اللغة ، يتم تحويل التعليمات الواردة في النص إلى كود ثنائي قابل للتنفيذ ، يتم تنفيذه بواسطة المنصة عند إضافة مستشار أو برنامج نصي أو مؤشر إلى المخطط.
ولا يعد تفكيك الكود القابل للتنفيذ إلى الأصل مهمة سهلة، حيث تساعد على حماية شفرة المصدر الخاصة بك. وعلى أي حال ، عند فك التحويل إلى شفرة المصدر ، ستفقد أسماء المتغيرات ذات المعنى من الكود الخاص بك ، وسيكون من الصعب فهم منطق البرنامج.
لغة MetaQuotes هي لغة برمجة عالية المستوى من البرمجة كائنية التوجُّه مع كتابة ثابتة ضعيفة، موروثة أو مأخوذة من لغة C++. وهى تطور منطقي للغة MQL4 ، والتى تم إصدارها مع منصة ميتاتريدر 5. وكان لها تأثير كبير فيما بعد على تطوير وتحديث لغة MQL4.
في لغة MQL5 ، توجد أداة لإنشاء المستشارين الخبراء ، مما يجعل من الممكن التخلي تمامًا عن الحاجة إلى كتابة التعليمات البرمجية يدويًا. بنقرات قليلة، ستحصل على روبوت تداول مع شفرة المصدر. يتم إعداده للتداول باستخدام الإشارات. ويعتمد التحكم في حالة حساب التداول على استراتيجيات إدارة المخاطر والأموال المتوفرة مع منصة التداول.
لا يختلف تحميل مؤشر عن تحميل أي ملف آخر على جهاز الكمبيوتر الخاص بك. ويجب أن يتم ذلك على جهاز كمبيوتر ، حيث لا يمكن استخدام MQL إلا مع إصدار سطح المكتب من منصة عميل ميتاتريدر. افتح دليل العمل الخاص بالمنصة (File -> Open Data Folder). بعد ذلك، انتقل إلى مسار MQL/indicators والصق المؤشر المحمل هنا. بعد إعادة تشغيل الجهاز، سيصبح المؤشر متاحًا في متصفح الملفات (Navigator). كل ما عليك فعله هو نقله إلى المخطط وضبط معلمات الإدخال.
في الواقع، يتم إنشاء جميع برامج MQL4 أو MQL5 باستخدام الإصدار الخامس من محرر لغة MetaQuotes. يوجد توافق بين الإصدارات الرئيسية والثانوية للغة. القيد الوحيد في هذه الحالة هو خادم MetaQuotes نفسه. فبعض الدوال والهياكل مفقودة في الإصدار الرابع من المنصة. وقد تم تغيير منطق معالجة عمليات التداول في الإصدار الخامس من الخادم جزئيًا. وهناك أيضًا اختلافات في الهيكل الداخلي للمؤشرات. في الإصدار الرابع ، لا يمكن استخدام أكثر من ثمانية مؤشرات. وفي منصة ميتاتريدر 5 ، تمت زيادة عدد أماكن تخزين بيانات (buffers) المؤشرات إلى 21.
تتيح لك دالة iCustom المدمجة استخدام إشارات من المؤشرات لتنفيذ منطق التداول داخل المستشار الخبير. إذا كان لديك مؤشر خاص بك وتريد إنشاء إشارات تداول في الاكسبيرت لإجراء عمليات التداول ، فأنت بحاجة إلى استخدام iCustom لهذا الغرض. دعونا نلقي نظرة على الوثائق. وهنا يمكنك رؤية التعريف التالي لـ MQL4:
تعريف MQL5:
بشكل أساسي، تقوم الدالة بنفس الشيء، على الرغم من اختلاف توقيعها في الإصدارين الرابع والخامس من اللغة، فلنلقِ نظرة فاحصة على كل من المعلمات:
- سطر String symbol. هو الرمز الذي سيتم حسابه.
- الإطار الزمني (Timeframe). في لغة MQL4 يكون عبارة معلمة من النوع العددى أو الأعداد الصحيحية (integer)، وفي لغة MQL5 هو أيضًا عدد صحيح ولكنه يحتوي على تعداد للأطر الزمنية
- معلمة (String name). تحتاج إلى تمرير مسار المؤشر إليه (إذا كان على سبيل المثال موجودًا في دليل آخر) وأيضًا تحتاج إلى تمرير اسم المؤشر مع الامتداد الذي نريد حسابه. بعد ذلك، يتم تمرير المعلمات المطلوبة للمؤشر الذي نريد استخدامه
- قائمة معلمات المؤشر، والتي سيتم تشغليها بواسطة دالة iCustom. يعتمد عدد المعلمات على عدد الحجج اللازمة للحصول على القيمة المطلوبة من المؤشر الخاص بك. ومن المنطقي أن تأخذ الدالة عددًا متغيرًا من المعلمات. فعلى سبيل المثال، بالنسبة لـ مؤشر التمساح "Alligator" (يتم تضمينه في منصة الميتاتريدر) سيكون الشكل كالتالى:
- أو على سبيل المثال ، بالنسبة لـ مؤشر إيشيموكو (Ichimoku)، سيكون هناك مجموعة أخرى من المتغيرات:
- وبالتالي، في الحالة الأولى، ستحتاج إلى تمرير 6 معلمات إلى الدالة للحصول على القيمة الصحيحة، أما في الحالة الثانية ستحتاج إلى 3 معلمات
- هناك نوعان من المعلمات في MQL4 من الإصدار الرابع. الأولى هى نظام العدد الصحيح (integer) والتى تشير إلى خط المؤشر وتستخدم خلال وقت التشغيل للفهرسة الداخلية للمخازن المؤقتة للبيانات
- ويشير نظام العدد الصحيح التالي إلى التحول سواء إلى الأمام أو للخلف بالنسبة للمؤشر على طول الخط الزمني.
لغة MQL هي وراثة للغة C++ ومأخوذة منها، والتى تتم بواسطتها كتابة خادم تداول ميتاتريدر وجميع التطبيقات ذات الصلة، بما في ذلك منصة العميل (Client Terminal) ومحرر اللغة (Language Editor). لسوء الحظ، إذا قارنا لغة MQL بسلفها، فمن الواضح أن اللغة تتطور ولكن مع اختلاف زمنى. ففي الوقت الحاضر، تتوافق إمكانيات MQL مع تلك الموجودة في مكتبة C++ القياسية لعام 2003. تجدر الإشارة إلى أن MQL لغة قوية للغاية ويمكن أن تغطي 99٪ من الاحتياجات الحالية للمبرمجين والمطورين.
للوهلة الأولى، قد يبدو اختلاف الكود فى الإصدارين 4 و 5 طفيفاً، ولكن لا تزال هناك اختلافات. ففي الإصدار الخامس، تم استبدال جميع وحدات الماكرو (macros) المتكررة من الإصدار الرابع بالتعدادات (enumerations).
وتم توسيع نموذج الحدث الخاص بتشغيل التطبيقات المخصصة. ظهرت مجموعة من دوال الأحداث مثل OnTrade و OnTradeTransaction و OnTesterInit و OnTesterDeinit و OnTesterPass. تم إصلاح السلوك غير الصحيح لـ OnTick و OnTimer في وضع اختبار الإستراتيجية. ويمكن الآن تشغيل دالة OnTimer بمعدل أخذ عينات مؤقت أعلى 1000 مرة من MQL4. مرة واحدة لكل ميكروثانية مقارنة بالميلي ثانية.
وقد غيّرت MQL5 منطق إرسال أوامر التداول وآلية الاستجابة لها. تم دمج العديد من دوالة التداول في MQL4 داخل دالة واحدة مع أوضاع تشغيل مختلفة تسمى OrderSend. تختلف عملية التداول نفسها في ميتاتريدر 5 عن التداول على المنصة من النسخة الرابعة. فقد تم إدخال وضع المعاوضة (netting) بالإضافة إلى الدالة التي تسمح بمعاملات التحوط (hedge). وبالإضافة إلى أوامر MT4 ، ظهرت المراكز والصفقات. تحتوي اللغة الآن على دالة OrderSendAsync لإرسال الطلبات أو أوامر التداول إلى خادم التداول من خلال الوضع اللاتزامني.
تم استبدال جميع وحدات الماكرو للغة MQL4 بالتعدادات فى لغة MQL5، لذلك يشير الجامع البرمجي الآن إلى تحويلات النوع الضمني (implicit) والتى لا تتطلب أي معامل، ويتم تنفيذها تلقائيا عندما يتم نسخ قيمة من نوع معين إلى نوع آخر موافق.
تتيح لك منصة ميتاتريدر 5 العمل مع 21 إطارًا زمنيًا قياسيًا مقارنة بـ 9 أطر زمنية في ميتاتريدر 4. كما أن المؤشرات في لغة MQL5 تحصل على عدد أكبر من أماكن التخزين (buffers) على المخطط.
يعد تحويل MQL4 إلى MQL5 مهمة سهلة بالنسبة للمبرمج المبتدئ، ولكنها تتطلب انتباهك وصبرك. سيظهر لك الجامع البرمجي معظم الأشياء غير المتوافقة مع MQL5.
ويجب الانتباه إلى معالجة أوامر التداول وإرسالها إلى الخادم.
في MQL4 ، يتم تنفيذ طلب التداول باستخدام دالة OrderSend ومجموعة من المعلمات الخاصة بها. ويتم تنفيذ تعديل الأمر وحذف الأمر المعلق بواسطة دوالة منفصلة. تحديد نتيجة الاستعلام يتم بواسطة القيم المنطقية (Boolean) التي يتم إرجاعها في نهاية سطر الدالة. باستخدام دالة GetLastError نحصل على نتيجة الاستعلام.
تحتوي MQL5 على هيكل MqlTradeRequest الخاص بإرسال أوامر التداول إلى الخادم. تحتاج إلى ملئه بالنوع المناسب للعملية ونوع الأمر. وللحصول على النتيجة، تحتاج إلى إعلان وتمرير هيكل MqlTradeResult بالرجوع إليه عند استدعاء دالة OrderSend لتلقي استجابة من الخادم، ودمج المعلمات المتباينة التي تم تمريرها مسبقًا عند استدعاء OrderSend في هيكل واحد من MqlTradeRequest ثم إرسالها إلى الخادم. نقوم بتحليل هيكل MqlTradeResult الذي تم تلقيه ردًا على ذلك. وجميع المعلومات الضرورية ستكون متاحة في الرد من الخادم.
قم بإيلاء اهتمام خاص لمعالجي الأحداث في التعليمات البرمجية الخاصة بك. فلغة MQL5 تحتوى على OnTesterTick و OnTesterTimer و OnBookEvent. يتم إطلاق تطبيقات مختلفة استجابة للأحداث من منصة التداول.
للإكسبرتات (experts) نستخدم الدوال التالية:
- OnInit، OnDeinit، OnTimer، OnTick، OnChartEvent، OnTester
- OnInit، OnDeinit، OnTimer، OnCalculate، OnChartEvent، OnTester
- OnStart (لا يمكن استخدام هذه الدالة في المؤشرات أو السكريبتات "البرامج النصية").
للمؤشرات:
للسكريبتات (scripts) الدوال التالية:
لا توجد وسيلة إطلاق للمكتبات المضمنة ، حيث يتم استخدامها حصريًا في مشاريع أكبر أخرى.
الفرق الآخر هو أن المتغيرات المحددة مسبقًا مثل Ask و Bid ، وكذلك المصفوفات Open [] ، و High [] ، و Low [] ، و Close [] ، و Volume [] ، و Time [] غير موجودة في MQL5. لذلك ، يجب تصحيح كود البرنامج من أجل الحصول على هذه البيانات بشكل مستقل باستخدام الوظائف المدمجة للوصول إلى السلاسل الزمنية CopyRates و CopyOpen و CopyHigh وما إلى ذلك. قم بتشغيل مصفوفة ديناميكية واحصل على هذه البيانات داخلها. وستهتم دالة النتيجة بتغيير حجم المصفوفة من تلقاء نفسها.
ملاحظة. هل أعجبك مقالى؟ شاركه على الشبكات الاجتماعية: سيكون ذلك أفضل "شكرا" :)
روابط مفيدة:
- أوصي بمحاولة التداول مع وسيط موثوق هنا . يتيح لك النظام التداول بنفسك أو نسخ صفقات المتداولين الناجحين من جميع أنحاء العالم.
- استخدم الرمز الترويجي BLOG للحصول على بونص إيداع 50% على منصة LiteFinance. فقط أدخل هذا الرمز في الحقل المناسب أثناء قيامك بالإيداع فى حساب التداول الخاص بك.
- دردشة المتداولين على تليجرام: https://t.me/liteforex_blog_arabian. نحن نشارك خبرتنا فى الإشارات و التداول
- قناة تليجرام تتضمن تحليلات عالية الجودة ومراجعات فوركس ومقالات تدريب وأشياء أخرى مفيدة للمتداولين https://t.me/liteforex_blog_arabian
مخطط الأسعار لـ EURJPY فى الوقت الحقيقى

يُعبّر محتوى هذا المقال عن رأي المؤلف ولا يُعبّر بالضرورة عن وجهة نظر الوسيط LiteFinance، إذ يتمّ إعداد المواد المنشورة في هذه الصفحة لأغراضٍ إعلاميّة حصرًا، وبالتالي لا ينبغي التعامُل معها على أنّها توصية أو نصيحة استثمارية بموجب التوجيه رقم 2014/65/EU.
وفقًا لقانون حقوق النشر، يُعدُّ هذا المقال ملكيةً فكرية، وبالتالي يحظر نسخه وتوزيعه دون موافقة.



















































