المؤشرات المخصصة
Custom Indicators
متاح المئات من المؤشرات المخصصة لمنصة MetaTrader عبر الإنترنت. إذا قررت استخدام مؤشر مخصص في خبيرك المستشار، سيتعين عليك بذل بعض الجهد. من الأفضل أن تحصل على ملف الشفرة المصدرية .mq4 عند استخدام مؤشر مخصص. على الرغم من أنه من الممكن استخدام مؤشر مخصص بدونه، إلا أن وجود شفرة المصدر سيسهل تحديد مؤشرات المؤشر لمعلمة الوضع (Mode).
لدى لغة MQL وظيفة مدمجة للتعامل مع المؤشرات المخصصة وهي iCustom(). هنا بناء الجملة:
المعاملات:
symbol: اسم الرمز أو الأداة المالية التي ترغب في تطبيق المؤشر المخصص عليها.
timeframe: الإطار الزمني أو الفترة الزمنية التي سيتم حساب المؤشر المخصص وعرضها عليها.
name: اسم ملف المؤشر المخصص. يجب أن يشمل امتداد الملف (مثال: "indicator.ex4" أو "indicator.mq4").
...: معلمات إضافية خاصة بالمؤشر المخصص. تعتمد هذه المعلمات على المؤشر ويجب تقديمها بالترتيب الصحيح كما هو متوقع من المؤشر.
قيمة الإرجاع:
تقوم الوظيفة بإرجاع قيمة من النوع double تمثل القيمة المحسوبة للمؤشر في الشريط المحدد.
من الجدير بالذكر أنه لاستخدام المؤشر المخصص بشكل فعال، من المستحسن أن تكون لديك ملف شفرة المصدر .mq4 للمؤشر.
طريقة أسهل للعثور على المعلمات هي التحقق من المتغيرات الخارجية (extern variables) في بداية ملف شفرة المصدر للمؤشر. سيتم سرد جميع معلمات المؤشر وأنواع بياناتها وقيمها الافتراضية هنا. يمكنك ببساطة نسخ ولصق هذا الكود إلى قسم المتغيرات الخارجية في خبيرك المستشار.
يجب أن يكون لكل متغير خارجي في المؤشر المخصص معلمة مقابلة في وظيفة iCustom()، ويجب أن تكون في نفس الترتيب الذي يظهرون به في المؤشر. يمكنك استخدام ثابت للمعلمات التي لا يلزم تغييرها (مثل السلاسل الإعلامية أو الإعدادات غير الأساسية).
فيما يلي مثال: المؤشر المخصص الشهير Slope Direction Line يحتوي على هذه المتغيرات الخارجية المدرجة في شفرة المصدر. سنقوم بإنشاء متغيرات خارجية لهذه الإعدادات في خبيرنا المستشار:
سنستخدم المعرفات SlopePeriod، SlopeMethod و SlopePrice للمتغيرات الخارجية في خبيرنا المستشار.
هنا كيف ستبدو وظيفة iCustom() لهذا المؤشر المحدد، جنبًا إلى جنب مع المتغيرات الخارجية:
قيمة NULL تشير إلى أننا نستخدم رمز الرسم البياني الحالي، والقيمة 0 تمثل الفترة الزمنية الحالية للرسم البياني. "Slope Direction Line" هو اسم ملف المؤشر. SlopePeriod، SlopeMethod، و SlopePrice هي ثلاثة معلمات للمؤشر. نحن نستخدم فهرس الوضع الافتراضي 0، والشيفت (Shift) هو الشريط الحالي.
على الرغم من أن مؤشر Slope Direction Line يتم رسمه على شكل خط واحد، إلا أنه في الواقع مكون من اثنين من البافرات المختلفة. اعتمادًا على ما إذا كان سعر المؤشر يتحرك لأعلى أو لأسفل، يتغير اللون (والبافر)،
إذا قمت بإلحاق المؤشر برسم بياني وعرض نافذة البيانات في MetaTrader، سترى قيمتين لـ Slope Direction Line. تعرض القيمة الأولى سعرًا عندما يزداد قيمة المؤشر. يكون الخط أزرقًا افتراضيًا. تعرض القيمة الثانية سعرًا عندما تنخفض قيمة المؤشر. يكون هذا الخط أحمرًا افتراضيًا.
نحتاج إلى تحديد فهرس الوضع (Mode index) لكلتا الخطوط. أسهل طريقة للقيام بذلك هي النظر إلى شفرة المصدر. في وظيفة init()، سترى العديد من الأسطر التي تستخدم لإعلان وتعيين الخصائص لبافرات المؤشر.
تُعيد الدالة SetIndexBuffer() الأولى ضبط بافر المؤشر بفهرس 0، وتستخدم المصفوفة Uptrend. يمكننا التخمين من اسم المصفوفة أن ذلك ينطبق على الخط الأزرق للمؤشر. تفعل الدالة الثانية نفس الشيء للمصفوفة DnTrend. لاحظ الدوال SetIndexStyle() في الأسفل التي تضبط البافرات 0 و 1 لرسم خط صلب.
البافر الثالث، ذو الفهرس 2 والمصفوفة ExtMapBuffer، يستخدم للحساب فقط. وبناءً على ذلك، يمكننا الاستنتاج بأن البافرات 0 و 1 تحتوي على معلومات سعر المؤشر. واستنادًا إلى معرفات المصفوفة، يكون 0 هو خط الاتجاه الصاعد، و 1 هو خط الاتجاه الهابط. فيما يلي كيفية إعلان المؤشرات:
يرجى ملاحظة أن المعامل Mode - الذي هو قبل الأخير - تم تعيينه ليكون فهرس البافر المناسب - 0 لـ SlopeUp و 1 لـ SlopeDown. وتم تعيين المعامل Shift - الأخير تمامًا - ليكون 1، مما يتحقق من قيمة الإغلاق للشريط الأخير.
من الجيد التأكد المزدوج من استخدام معاملات Mode الصحيحة. أضف دالة Print() إلى خبيرك المستشار، وقم بتشغيل اختبار تاريخي في استراتيجي تستر باستخدام "الأسعار المفتوحة فقط" كنموذج اختبار. تأكد من تعيين المعامل Shift ليكون 1 في وظيفة iCustom().
دالة Print() تقوم بطباعة قيمة بافرات المؤشر إلى السجل (الـ log)، جنبًا إلى جنب مع الوقت والتاريخ للشريط السابق. يمكنك عرض السجل تحت علامة التبويب Journal في نافذة استراتيجي تستر.
فيما يلي نتائج دالة Print() في السجل:
قيمة SlopeUp، 2147483647، هي عدد صحيح كبير جدًا يمثل حالة EMPTY_VALUE لمؤشر مخصص. يمكنك في الواقع استخدام هذا كشرط تداول. تُعيد SlopeDown قيمة المؤشر للشريط السابق. Time يشير إلى الشريط الذي نريد العثور عليه في الرسم البياني.
انقر فوق زر "Open Chart" في نافذة استراتيجي تستر لفتح رسم بياني مع تطبيق المؤشر الخاص بك بالفعل. ابحث عن الشريط المشار إليه في السجل بواسطة الوقت، وتأكد من تطابق قيم المؤشرات في نافذة البيانات مع تلك المطبوعة في السجل. إذا لم يتطابقان، فعليك ضبط معامل Mode في دالة iCustom() حتى تجد البافر الصحيح.
هكذا سنستخدم مؤشر Slope Direction Line في خبيرنا المستشار. إذا كان الاتجاه صعوديًا، فإن SlopeUp ستعيد قيمة السعر، بينما ستعيد SlopeDown EMPTY_VALUE أو 2147483647. والعكس ينطبق عندما يكون الاتجاه هابطًا.
هذه الشروط تقوم ببساطة بفحص أي من الخطوط هو يساوي EMPTY_VALUE وأي منها ليس كذلك
Custom Indicators
متاح المئات من المؤشرات المخصصة لمنصة MetaTrader عبر الإنترنت. إذا قررت استخدام مؤشر مخصص في خبيرك المستشار، سيتعين عليك بذل بعض الجهد. من الأفضل أن تحصل على ملف الشفرة المصدرية .mq4 عند استخدام مؤشر مخصص. على الرغم من أنه من الممكن استخدام مؤشر مخصص بدونه، إلا أن وجود شفرة المصدر سيسهل تحديد مؤشرات المؤشر لمعلمة الوضع (Mode).
لدى لغة MQL وظيفة مدمجة للتعامل مع المؤشرات المخصصة وهي iCustom(). هنا بناء الجملة:
كود PHP:
double iCustom(string Symbol, int Timeframe, string IndicatorName, Indicator Parameters,
int Mode, int Shift);
symbol: اسم الرمز أو الأداة المالية التي ترغب في تطبيق المؤشر المخصص عليها.
timeframe: الإطار الزمني أو الفترة الزمنية التي سيتم حساب المؤشر المخصص وعرضها عليها.
name: اسم ملف المؤشر المخصص. يجب أن يشمل امتداد الملف (مثال: "indicator.ex4" أو "indicator.mq4").
...: معلمات إضافية خاصة بالمؤشر المخصص. تعتمد هذه المعلمات على المؤشر ويجب تقديمها بالترتيب الصحيح كما هو متوقع من المؤشر.
قيمة الإرجاع:
تقوم الوظيفة بإرجاع قيمة من النوع double تمثل القيمة المحسوبة للمؤشر في الشريط المحدد.
من الجدير بالذكر أنه لاستخدام المؤشر المخصص بشكل فعال، من المستحسن أن تكون لديك ملف شفرة المصدر .mq4 للمؤشر.
طريقة أسهل للعثور على المعلمات هي التحقق من المتغيرات الخارجية (extern variables) في بداية ملف شفرة المصدر للمؤشر. سيتم سرد جميع معلمات المؤشر وأنواع بياناتها وقيمها الافتراضية هنا. يمكنك ببساطة نسخ ولصق هذا الكود إلى قسم المتغيرات الخارجية في خبيرك المستشار.
يجب أن يكون لكل متغير خارجي في المؤشر المخصص معلمة مقابلة في وظيفة iCustom()، ويجب أن تكون في نفس الترتيب الذي يظهرون به في المؤشر. يمكنك استخدام ثابت للمعلمات التي لا يلزم تغييرها (مثل السلاسل الإعلامية أو الإعدادات غير الأساسية).
فيما يلي مثال: المؤشر المخصص الشهير Slope Direction Line يحتوي على هذه المتغيرات الخارجية المدرجة في شفرة المصدر. سنقوم بإنشاء متغيرات خارجية لهذه الإعدادات في خبيرنا المستشار:
كود PHP:
//---- input parameters
extern int period=80;
extern int method=3; // MODE_SMA
extern int price=0; // PRICE_CLOSE
كود PHP:
// External variables
extern int SlopePeriod = 80;
extern int SlopeMethod = 3;
extern int SlopePrice = 0;
كود PHP:
iCustom(NULL,0,"Slope Direction Line",SlopePeriod,SlopeMethod,SlopePrice,0,0);
على الرغم من أن مؤشر Slope Direction Line يتم رسمه على شكل خط واحد، إلا أنه في الواقع مكون من اثنين من البافرات المختلفة. اعتمادًا على ما إذا كان سعر المؤشر يتحرك لأعلى أو لأسفل، يتغير اللون (والبافر)،
إذا قمت بإلحاق المؤشر برسم بياني وعرض نافذة البيانات في MetaTrader، سترى قيمتين لـ Slope Direction Line. تعرض القيمة الأولى سعرًا عندما يزداد قيمة المؤشر. يكون الخط أزرقًا افتراضيًا. تعرض القيمة الثانية سعرًا عندما تنخفض قيمة المؤشر. يكون هذا الخط أحمرًا افتراضيًا.
نحتاج إلى تحديد فهرس الوضع (Mode index) لكلتا الخطوط. أسهل طريقة للقيام بذلك هي النظر إلى شفرة المصدر. في وظيفة init()، سترى العديد من الأسطر التي تستخدم لإعلان وتعيين الخصائص لبافرات المؤشر.
كود PHP:
SetIndexBuffer(0, Uptrend);
SetIndexBuffer(1, Dntrend);
SetIndexBuffer(2, ExtMapBuffer);
...
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
تُعيد الدالة SetIndexBuffer() الأولى ضبط بافر المؤشر بفهرس 0، وتستخدم المصفوفة Uptrend. يمكننا التخمين من اسم المصفوفة أن ذلك ينطبق على الخط الأزرق للمؤشر. تفعل الدالة الثانية نفس الشيء للمصفوفة DnTrend. لاحظ الدوال SetIndexStyle() في الأسفل التي تضبط البافرات 0 و 1 لرسم خط صلب.
البافر الثالث، ذو الفهرس 2 والمصفوفة ExtMapBuffer، يستخدم للحساب فقط. وبناءً على ذلك، يمكننا الاستنتاج بأن البافرات 0 و 1 تحتوي على معلومات سعر المؤشر. واستنادًا إلى معرفات المصفوفة، يكون 0 هو خط الاتجاه الصاعد، و 1 هو خط الاتجاه الهابط. فيما يلي كيفية إعلان المؤشرات:
كود PHP:
double SlopeUp = iCustom(NULL,0,"Slope Direction Line",SlopePeriod,SlopeMethod,
SlopePrice,0,1);
double SlopeDown = iCustom(NULL,0,"Slope Direction Line",SlopePeriod,SlopeMethod,
SlopePrice,1,1);
من الجيد التأكد المزدوج من استخدام معاملات Mode الصحيحة. أضف دالة Print() إلى خبيرك المستشار، وقم بتشغيل اختبار تاريخي في استراتيجي تستر باستخدام "الأسعار المفتوحة فقط" كنموذج اختبار. تأكد من تعيين المعامل Shift ليكون 1 في وظيفة iCustom().
كود PHP:
Print("Slope Up: "+SlopeUp+", Slope Down: "+SlopeDown+" Time: "+TimeToStr(Time[1]));
فيما يلي نتائج دالة Print() في السجل:
كود PHP:
Slope Up: 2147483647.00000000, Slope Down: 1.50483900 Time: 2009.11.26 16:00
قيمة SlopeUp، 2147483647، هي عدد صحيح كبير جدًا يمثل حالة EMPTY_VALUE لمؤشر مخصص. يمكنك في الواقع استخدام هذا كشرط تداول. تُعيد SlopeDown قيمة المؤشر للشريط السابق. Time يشير إلى الشريط الذي نريد العثور عليه في الرسم البياني.
انقر فوق زر "Open Chart" في نافذة استراتيجي تستر لفتح رسم بياني مع تطبيق المؤشر الخاص بك بالفعل. ابحث عن الشريط المشار إليه في السجل بواسطة الوقت، وتأكد من تطابق قيم المؤشرات في نافذة البيانات مع تلك المطبوعة في السجل. إذا لم يتطابقان، فعليك ضبط معامل Mode في دالة iCustom() حتى تجد البافر الصحيح.
هكذا سنستخدم مؤشر Slope Direction Line في خبيرنا المستشار. إذا كان الاتجاه صعوديًا، فإن SlopeUp ستعيد قيمة السعر، بينما ستعيد SlopeDown EMPTY_VALUE أو 2147483647. والعكس ينطبق عندما يكون الاتجاه هابطًا.
كود PHP:
if(SlopeUp != EMPTY_VALUE && SlopeDown == EMPTY_VALUE) // Buy
if(SlopeUp == EMPTY_VALUE && SlopeDown != EMPTY_VALUE) // Sell