 |
02-07-2009, 09:24 AM
|
#1 (permalink)
|
|
المدير التنفيذي للموقع الالكتروني
|
دورة تعليم لغة MQL4 (المحاضرة الحادية عشر)
بسم الله الرحمن الرحيم
مرحبا بكم في الدرس العاشر ... برمجة مؤشرك الأول (جزء 2)
في الدرس السابق لم نقم بكتابة اي سطر من الأكواد , وذلك لأن برنامج التوجيه قام بكتابة الأكواد نيابة عنا , شكرا له .
اليوم سنقوم بإضافة بعض الأسطر البرمجية (الأكواد) للمؤشر الناتج من برنامج التوجية ( الدرس السابق ) لنجعله اكثر فعالية .
وبعد ذلك سنقوم بشرح الأكواد جميعها سطرا سطرا .
دعونا نبدأ على بركة الله :
* الأكواد التي تمت اضافتها الى المؤشر ( التي قمت انا بإضافتها يدويا ولا يمكن لبرنامج التوجيه اضافتها بمفرده ):
وهي الأكواد ذات اللون الأحمر (الأكواد الأخرى هي من الدرس السابق) :
كود PHP:
//+------------------------------------------------------------------+
//| My_First_Indicator.mq4 |
//| dr_waleed |
//| http://www.moneyexpertsclub.com |
//+------------------------------------------------------------------+
#property copyright "dr_waleed"
#property link "http://www.moneyexpertsclub.com"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
string short_name = "Your first indicator is running!";
IndicatorShortName(short_name); //----
return(1);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//---- check for possible errors
if (counted_bars<0) return(-1);
//---- last counted bar will be recounted
if (counted_bars>0) counted_bars--;
int pos=Bars-counted_bars;
double dHigh , dLow , dResult;
Comment("Hi! I'm here on the main chart windows!");
//---- main calculation loop
while(pos>=0)
{
dHigh = High[pos];
dLow = Low[pos];
dResult = dHigh - dLow;
ExtMapBuffer1[pos]= dResult ;
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+
ما هي طريقة الشرح ؟
سأقوم بكتابة سطور الأكواد التي سيتم شرحها اولا , وبعد ذلك سنكتب الشرح تحتها .
في وسط الشرح قد اتوقف قليلا لأتطرق لبعض الأمور العامة او تذكير بدروس سابقة .
الأن دعونا نغوص ونتعمق في الأكواد ( هذا العالم الساحر ) :
كود PHP:
//+------------------------------------------------------------------+
//| My_First_Indicator.mq4 |
//| dr_waleed |
//| http://www.moneyexpertsclub.com |
//+------------------------------------------------------------------+
التعليقات comments :
اول خمسة أسطر من من الأكواد هي عبارة عن تعليقات .
نحن نستخدم التعليقات لنكتب بعض الملاحظات داخل اكواد البرنامج ويتم تجاهلها من قبل المجمع compiler .
تكتب التعليقات لعدة أغراض منها :
* للتوثيق مثل حقوق المبرمج وتاريخ برمجته للبرنامج واسم موقعه الخاص او بريده الأليكتروني ... الخ .
* لتوضيح كيفية عمل المعادلات وطريقة عمل الأكواد .
* لتكون الأكواد اكثر وضوحا لأي مستخدم قد يرى الأكواد .
يمكننا ان نكتب التعليقات بإحدى طريقتين :
1- تعليقات السطر الواحد : وتبدأ ب ( // ) وتنتهي بنهاية السطر .
2- تعليقات متعددة الأسطر : وتبدأ ب ( * / ) وتنتهي ب ( / * ) .
( راجع التعليقات بالدرس الأول .. القواعد Syntax)
برنامج التوجيه يقوم اوتوماتيكيا بكتابة هذه الأسطر في مرحلة كتابة ( Name , Auther ,Link ) في الصورة 4 من الدرس السابق (برمجة المؤشر جزء 1) .
كود PHP:
#property copyright "dr_waleed"
#property link "http://www.moneyexpertsclub.com"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
بيان الملكية والخصائص Property directive :
كما تلاحظ في جميع السطور السابقة انها تبدأ بالكلمة ( property# ) وهذا لأنها احد انواع البيانات ما قبل المعالجة , تسمى ببيان الملكية والخصائص .
بيانات ما قبل المعالجة هي تعليمات تعطيها للمجمع compiler ليقوم بكتابتها في ملف ( ex4 ) دون معالجة برمجية .
وهي معرفات لقيم ثابتة لا تتغير وتدعى “Controlling Compilation” .
وايضا هي احد مكونات لغة MQL4 , ووظيفتها وضع وإظهار خصائص البرنامج ( المؤشر ).
كمثال : هل سيظهر المؤشر على الشاشة الرئيسية للشارت ام في نافذة مستقلة ؟ من هو كاتب البرنامج ؟ وهكذا ..
ملاحظة : تنتهي هذه البيانات بنهاية السطر ولا تنتهي بأي علامة ترقيم مثل الفاصلة المنقوطة ; .
سنحاول هنا ان نناقش بيانات الملكية والخصائص Property directive المتاحة في لغة MQL4 :
* خاصية رابط الموقع Link :
وهي الخاصية التي تسمح لك بوضع رابط لموقع ما (موقعك الشخصي مثلا) من خلال الخطوة الثانية لبرنامج التوجيه امام كلمة Link , (كما في الصورة 4 من الدرس السابق) .
رمز البيان المخصص لها هو من نوع مترابط الكلمات string ( راجع الدرس الثاني)
* خاصية الحقوق copyright :
وهي الخاصية التي تمثل اسم المبرمج , وهي تشبه الخاصية Link في كيفية وضعها ونوع رمز البيان المخصص لها .
* خاصية نافذة الشارت الرئيسية indicator_chart_window :
متى وضعت هذه الخاصية ( وترجمتها : مؤشر نافذة الشارت ) سيظهر مؤشرك على النافذة الرئيسية للشارت (كما في الصورة 1) .
يجب عليك استخدام احد الخيارين لكيفية ظهور مؤشرك , اما ظهوره على النافذة الرئيسية للشارت وهنا عليك باستخدام هذه الخاصية , او ظهوره في نافذة مستقلة وهنا عليك استخدام خاصية أخرى وهي ( indicator_separate_window ).
ولا يسمح لك ابدا ان تستخدم الخاصيتين في نفس البرنامج ( المؤشر ).
رمز البيان هنا من نوع void وهو ما معناه ان هذه الخاصية لا تأخذ اي قيم ( واضح انها لا تحتاجها , فقط تذكر الخاصية وسيفهم البرنامج المطلوب منه عمله ).
* خاصية النافذة المستقلة indicator_separate_window :
اذا قمت بإختيار هذه الخاصية سيظهر المؤشر في نافذة مستقلة (الصورة 1) .
يمكنك ان تضع محيط رقمي للمؤشر في نافذته المستقلة ( المحيط الرقمي لمؤشر ال RSI مثلا هو رقم 100 حده الأقصى , ورقم 0 حده الأدنى ). وفي هذه الحالة ستستخدم خاصيتان لذلك , وهما ( indicator_minimum ) للحد الأدنى للمؤشر , و ( indicator_maximum ) للحد الأقصى للمؤشر .
كما يمكننا ان مستويات محددة للمؤشر في نافذته المستقلة على شكل خطوط مثلا ( مثال ذلك في مؤشر RSI هما المستويان 70 و 30 اللذان يظهران على الشارت في نافذته المستقلة ) , والخاصية المستخدمة لذلك هي ( indicator_levelN ) حيث ان ( N ) هي عدد المستويات المطلوبه ( اما قيمة المستوى فهو القيمة المعطاة له ) .
كلا من الخاصيتين ( indicator_chart_window ) و ( indicator_separate_window ) هما من النوع void اي لا يأخذون اي قيم (كما ذكرنا من قيل) فقط تكتبهم كما هم .
في حالة مؤشرنا هذا سنستخدم خاصية النافذة المستقلة indicator_separate_window :
كود PHP:
#property indicator_separate_window
* الحد الأدنى للمؤشر indicator_minimum :
بمساعدة هذه الخاصية يمكننا وضع قيمة للحد الأدنى لمحيط النافذة المستقلة والتي تعتبر الحد السفلي لهذه النافذة .
مثال :
كود PHP:
#propery indicator_minimum 0
#propery indicator_ maximum 100
كود PHP:
في هذا المثال وضعنا الحد السفلي للنافذة رقم ( 0 ) والحد العلوي لها رقم ( 100 ) .
بمعنى أخر ان مدى تحرك المؤشر في نافذته الخاصة هو ما بين ال 0 وال 100 .
نوع البيانات المستخدمة لهذه الخاصية هي ( integer ) اي عدد صحيح .
* الحد الأعلى للمؤشر indicator_maximum :
بمساعدة هذه الخاصية يمكننا وضع قيمة للحد الأقصى لمحيط النافذة المستقلة والتي تعتبر الحد العلوي لهذه النافذة .
يجب ان تكون قيمة هذه الخاصية اعلى من قيمة خاصية الحد الأدنى .
نوع البيانات المستخدمة لهذه الخاصية هي ( integer ) اي عدد صحيح .
* خاصية المستوى indicator_levelN :
بمساعدة هذه الخاصية يمكننا وضع مستوى رقمي محدد للمؤشر داخل محيطه الرقمي المحصور بين حده الأعلى وحده السفلي.
يجب ان تكون قيمته اكبر من الحد الأدنى واصغر من الحد الأعلى.
( N ) تمثل عدد المستويان المطلوب رسمها على نافذة المؤشر ويمكننا رسم الى 8 مستويات كحد اقصى لنا .
مثال
كود PHP:
#property indicator_minimum 0
#property indicator_minimum 100
#property indicator_level1 10 //وضع قيمة المستوى الأول
#property indicator_level2 65.5 //وضع قيمة المستوى الثاني
نوع البيانات المستخدمة لهذه الخاصية هي ( double ) اي عدد حقيقي .
* خاصية عدد وحدات المؤشر indicator_buffers :
بمساعدة هذه الخاصية يمكننا وضع عدد محدد من وحدات الذاكرة ( مصفوفة ) تمكننا من استخدام اكثر من وحدة للمؤشر ( خطين للمؤشر بدلا من واحد مثلا )
لنفترض اننا وضعنا قيمة 2 لهذه الخاصية ( المدى المسموح لنا من 1 الى 8 ) فإننا نخبر المؤشر بعدد وحدتين له
( الستوكاستيك مثلا له خطان K+ و D+ اي ان قيمة هذه الخاصية عنده 2 ,, ال ADx قيمة الخاصية فيه 3 لوجود 3 خطوط هم تكوين هذا المؤشر )
في مؤشرنا هنا قيمة هذه الخاصية هنا 1( بفر 1 )
كود PHP:
#property indicator_buffers 1
وهذا لأننا نستخدم خط واحد فقط للمؤشر .
* خاصية اللون indicator_colorN :
كما اننا نستطيع ان نستخدم حتى 8 خطوط للمؤشر , يمكننا وضع لون خاص لكل منهم عن طريق هذه الخاصية ( indicator_colorN ) حيث ان ( N ) هي رقم الخط المعرف بالخاصية السابقة ( indicator_buffers ) .
المستخدم العادي للمؤشر يمكنه تغيير اللون عن طريق نافذة خصائص المؤشر مؤشرنا هنا لونه أحمر
كود PHP:
#property indicator_color1 Red
كود PHP:
نوع البيانات المستخدمة لهذه الخاصية هي ( color ) اي لون .
كود PHP:
double ExtMapBuffer1
المصفوفات Arrays :
في حياتنا العادية نحن عادة نجمع الأشياء المتشابهة تحت تصنيف واحد , كذلك في اللغات البرمجية نحتاج ان نجمع البيانات المتشابهة داخل وحدة ما نطلق عليها اسم المصفوفة , وهي من تقوم بهذه المهمة .
المصفوفات تشبه تماما الجداول , فأنت تجمع بيانات ما في جدول وتتعامل معها من ارقام صفوف هذا الجدول , حسنا , الصفوف في الجدول تسمى قوائم Indexes المصفوفة .
لكي تقوم بإعداد declaration اي مصفوفة بالبرنامج , عليك بكتابة مثل هذا الكود :
كود PHP:
int my_array[50];
هنا انت اعددت مصفوفة من نوع ( integer ) اعداد صحيحة , تحمل 50 بيانا , لكل بيان قيمته الخاصة به .
يمكنك ان تستدعي اي بيان تريده منهم عن طريق قائمة هذا البيان هكذا :
كود PHP:
My_array[10] = 500;
هنا انت وضعت القيمة 500 للبيان رقم 10 في المصفوفة .
يمكنك ان تدمج عملية الإعداد والأستدعاء في سطر واحد هكذا ( تجمع الكودين السابقين في كود واحد ) :
كود PHP:
int my_array[5] = {1,24,15,66,500};
( سأعطيكم مثالا يشرح لغز المصفوفة هذا ,, المتوسط المتحرك 5 مثلا , مع كل شمعة ساعة جديدة يعطي قيمة جديد على شارت الساعة , سنأخذ قيم 5 شموع لهذا المتوسط , فيكون كاالتالي :
1.2469=[1] MA5
1.2676=[2] MA5
1.2659=[3] MA5
1.2359=[4] MA5
1.2229=[5] MA5
وهكذا هذه مصفوفة للموفنج افرج 5 وقيمه لأخر 5 شمعات .)
في حالة مؤشرنا هنا , فنحن نستخدم هذا الكود :
كود PHP:
double ExtMapBuffer1[];
هنا نحن اعددنا مصفوفة نوعها (doble) اي عدد حقيقي , وسنستخدم هذه المصفوفة لحساب القيم الخاصة بنا والتي سترسم على الشارت .
الدوال المتخصصة Special functions :
الدوال عبارة عن قالب من الأكواد , وتشبه في عملها الألات , تأخذ المواد الخام وتخرج لنا المنتج ( راجع درس الدوال ) .
في لغة MQL4 هناك 3 دوال رئيسية متخصصة :
* دالة ابتداء المؤشر () init :
اول دالة تعمل في البرنامج ( المؤشر ) قبل اي دالة أخرى .
يجب هنا وضع قيم المتغيرات الأبتدائية للمؤشر .
* دالة تشغيل المؤشر () start :
هنا يكون معظم عمل المؤشر , في كل لحظة يستقبل فيها المؤشر قيم جديدة , يقوم بإستدعاء هذه الدالة .
* دالة انتهاء المؤشر () deinit :
هذه اخر دالة يستدعيها المؤشر , هنا يمكنك وضع اوامر نهاية البرنامج .
كود PHP:
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
string short_name = "Your first indicator is running!";
IndicatorShortName(short_name);
دوال المؤشر العامة :
لا استطيع ان اشرح جميع دوال المؤشرات في هذا الدرس , ولكن سنتطرق لها في الدروس القادمة ان شاء الله مع التفاصيل , ولهذا سنتكلم هنا في هذا عن دوال مؤشراتنا فقط .
* دالة تصميم وشكل المؤشر SetIndexStyle :
كود PHP:
void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color
clr=CLR_NONE)
هذه الدالة هي المسئولة عن شكل وتصميم خط المؤشر .
الأن انظر لما بين الأقواس في كود الدالة اعلاه لنرى كيف تحدد هذه الدالة تصميم وشكل المؤشر :
**اعدادات قوائم ( index ) هذه الدالة تتراوح من 1 الى 7 ( وذلك لأنها تبدأ من 0 وهي الشمعة الحالية ومحدودة ب 8 مستويات كما اسلفنا ) .
كما تحدد اي من الخطوط نريد ان نضبط تصميمه .
** بالنسبة لإعدادات الشكل العام للمؤشر ( type ) , يمكن ان تكون احد الثوابت التالية :
DRAW_LINE ( لرسم خط )
DRAW_SECTION ( لرسم قطع او نقط )
DRAW_HISTOGRAM ( لرسم الهيستوجرام )
DRAW_ARROW ( لرسم سهم )
DRAW_NONE (بدون رسم اي شئ )
** بالنسبة لإعدادات شكل خط المؤشر ( style ) , يمكن ان تكون احد الثوابت التالية :
STYLE_SOLID ( خط متصل ) ______
STYLE_DASH ( خطوط طويلة منفصلة ) _ _ _ _ _
STYLE_DOT ( خط منقط ) .........
STYLE_DASHDOT ( خط طويل ومنقط بالتبادل ) _._._._._._
STYLE_DASHDOTDOT ( طويل ومنقط ومنقط ) _.._.._.._.._
ويمكن ان تكون Empty , اي انها افتراضية وليس هناك نغيير في شكل او تصميم المؤشر .
** بالنسبة لإعدادات عرض خط المؤشر ( width ) , يمكن ان تكون احد الثوابت التالية :
تتراوح من القيم 1 الى 5 ,, ويمكن ان تأخذ القيمة Empty اي انها افتراضية وليس هناك نغيير في عرض خط المؤشر .
** اعدادات اللون ( clr ) لتحديد لون المؤشر :
ويمكن ان تأخذ قيمة اي كود اي لون مسموح به في لغة MQL4 .
القيمة الإفتراضية CLR_NONE معناها انها حالة فارغة من الألوان .
في سطرنا الكودي هذا في المؤشر :
كود PHP:
SetIndexStyle(0,DRAW_LINE);
كود PHP:
قمنا بتحديد القيمة 0 للقوائم ( index ) وتعني اننا سنعمل على الخط الأول فقط ( والوحيد ). والقيمة DRAW_LINE لتعني ان سنرسم خطا على الشارت . وسنترك بقية الإعدادات في الدالة على حالتها اللإفتراضية . * دالة الربط SetIndexBuffer :
كود PHP:
bool SetIndexBuffer( int index, double array[])
هذه الدالة هي التي تحدد عدد الوحدات في المؤشر بربط قيم المؤشر بعدد الوحدات بها لتصنع مصفوفة .
تقوم الدالة بأخذ قيمة للوحدة 0 اولا ,ويتبعها قيمة للوحدة 1 ثانيا ... الخ .
في حالة مؤشرنا هذا , فالمصفوفة ستوفر القيم من المتغير ExtMapBuffer1 لتقوم برسم خط واحد على الشارت ( في حالتنا هنا ان هناك خط واحد فقط حددناه مسبقا )
* دالة الإسم القصير IndicatorShortName :
ووظيفتها طباعة نص محدد والذي يظهر في الزاوية اليسرى العليا على نافذة المؤشر .
في مؤشرنا هنا اعددنا المتغير short_name وأعطيناه القيمة “You first indicator is running” .
ومن ثم مررناه الى هذه الدالة لتقوم بعملها بإظهاره على الشارت .هكذا :
كود PHP:
string short_name = "Your first indicator is running!";
IndicatorShortName(short_name);
وهي الجملة المسئولة عن انهاء الدالة ()init وتمرير البرنامج الى الدالة ()start لتبدأ عملها .
كود PHP:
int deinit()
{
//----
//----
return(0);
}
لا جديد يمكن قوله على هذه الدالة .
سنستمر مع الأكواد الى الدرس القادم بإذن الله ,
ارجو ان تكونوا قد استمتعتم بهذا الدرس المرهق .
|
|
|
22-02-2010, 01:50 AM
|
#8 (permalink)
|
|
فوركساوي جديد
|
رد: دورة تعليم لغة MQL4 (المحاضرة الحادية عشر)
اقتباس:
* خاصية المستوى indicator_levelN :
بمساعدة هذه الخاصية يمكننا وضع مستوى رقمي محدد للمؤشر داخل محيطه الرقمي المحصور بين حده الأعلى وحده السفلي.
يجب ان تكون قيمته اكبر من الحد الأدنى واصغر من الحد الأعلى.
( N ) تمثل عدد المستويان المطلوب رسمها على نافذة المؤشر ويمكننا رسم الى 8 مستويات كحد اقصى لنا .
مثال
|
يعطيك العافية بس يا ليت توضيح للاقتباس السابق
وكذلك البفر وصلت لهالفقرة بس مافهمتها
بانتظار الرد
|
|
|
|
الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
|
|
|
(عرض الكل)
الاعضاء الذين شاهدو هذا الموضوع: 51
|
|
ماهر العمر, ADHAM, ala011, alhariry00, ana sayed, Azazeez, bellura2001, booksguy, ام كرار, المتداول هناك, cadecortx, العابد7, ابومريم1, edwardwadid, egycoins, elhou1981, falcon_1, feryhunter2, genedy, hany_elkoptan, hasan, hluvr, حاتم اسماعيل, ياسرابوعمر, حسين الصائغ, khaled, khalidaalmasry, king alx, laith_r, M!Ss.Do3n, Mandour, Monostar, mood1982, MR.S, nader_ph, رويد, oudathothefa, زهور احمد, pghdad_1, raid, ralph kabota, sam_samir3, soma1970, sunegypt, Tato4all, the ikoder, vimessage, waleed elzelaky, wolf_lb, yasserbeshara
|
| أدوات الموضوع |
|
|
| انواع عرض الموضوع |
العرض العادي
|
تعليمات المشاركة
|
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك
كود HTML معطلة
|
|
|
| عزيزي العضو/الزائر.. نحيطك علماً بأن مواضيع المنتدى لاتمثل رأي الإدارة وإنما تمثل رأي كاتبها. |
|