مشاركة: هيا نصنع مؤشر بأيدينا
على بركة الله
سنبدأ من الأن الدروس العملية وصناعة البرامج
.
اليوم سنبدأ بصنع مؤشر بسيط , وهو ما سيقدم لنا الكثير في فهمنا لهذه اللغة .
وهو سيقوم على عملية طرح اعلى سعر ( High ) من اقل سعر ( Low ) ويخرج النتائج
ثم ماذا
يوجد مشكلة فى كتابة الكود . هل من مساعد ؟؟؟؟؟؟؟؟؟؟؟
مشاركة: هيا نصنع مؤشر بأيدينا
على بركة الله
سنبدأ من الأن الدروس العملية وصناعة البرامج
.
اليوم سنبدأ بصنع مؤشر بسيط , وهو ما سيقدم لنا الكثير في فهمنا لهذه اللغة .
وهو سيقوم على عملية طرح اعلى سعر ( High ) من اقل سعر ( Low ) ويخرج النتائج
ثم ماذا
هذا الكود ماذا يعنى
علما بان السطر الازرق هو اول سطر تم كتابته يدويا
اما باقى الاسطر البرتقالى كتبت اليا بمعرفة البرنامج
كود:
//---- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
قمنا فى هذا السطر بتعريف مصفوفة باسم ExtMapBuffer1 يوضع فيها قيم المؤشر و هى من النوع ارقام غير صحيحة ( بفاصلة عشرية) و الدليل انها مسبوقة بكلمة double
و لكن كيف عرفت انها مصفوفة و لم تقل متغير ؟
لانها متبوعة بالاقواس []
مشاركة: هيا نصنع مؤشر بأيدينا
مشاركة: هيا نصنع مؤشر بأيدينا
ثم ماذا
هذا الكود ماذا يعنى
كود:
//| 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);
}
//+------------------------------------------------------------------+
مشاركة: هيا نصنع مؤشر بأيدينا
اقتباس:
المشاركة الأصلية كتبت بواسطة ahmed hanafy
نحن نتحدث عن لغة MQL4
ادواتها :
الدوال دوال أساسية ( موجودة جاهزة داخل اللغة ) ( ()init() , deinit() , start ):
" كل برنامج في لغة MQL4 سواء كان مؤشر , اكسبرت او اسكربت فهو يبدأ دائما بالدالة " ()init " اختصار كلمة بدأ (initialize) وهي تعمل بمجرد وضع البرنامج ( اكسبرت او مؤشر او اسكربت) على شارت الميتاتريدر , ووظيفتها بدء عمل المتغيرات الرئيسية بالبرنامج . و متى انتهى عمل البرنامج تقوم باغلاق الشارت او مسح المؤشر او الاكسبرت اواغلاق الميتا تريدر. تقوم الدالة " ()deinit " بعملها لأنهاء البرنامج .
الدالة الثالثة " ()start " ( اهم الدوال على الإطلاق ) تعمل بصفة دائمة كلما استقبلت معطيات وقيم جديدة في متغيراتها ( تحرك السعر يعطي قيم جديدة للهاي واللو والكلوز وقيم المؤشرات المختلفة هي قيم تتغير طوال الوقت ) , احب ان اخبركهنا انك ستقضي 90% من حياتك البرمجية داخل هذه الدالة .
سنعرف الكثير عن هذه الدوال الأساسية في حياتنا العملية عندما نبرمج ونكتب المؤشرات والإكسبرتات الخاصة بنا ان شاء الله ."
و الان جاء دورها
مشاركة: هيا نصنع مؤشر بأيدينا
و الان جاء دورها
اولا الدلة init() 1
اول دالة تعمل في البرنامج( المؤشر ) قبل اي دالة أخرى .
و تكون مسبوقة بالرمزINT و يليها ()
يجب هنا وضع قيم المتغيرات الأبتدائية للمؤشر بين قوسين {} .
كود:
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
string short_name = "Your first indicator is running!";
IndicatorShortName(short_name);
//----
return(1);
}
مشاركة: هيا نصنع مؤشر بأيدينا
طيب و المعنى
:016:
اولا : SetIndexStyle(0,DRAW_LINE)
و معناها اننا سنقوم برسم خط واحد فقط ؟
ازاى ؟
الرقم صفر يمثل عدد الخطوط المرسومة
جميل قوى و هو صفر يعنى واحد ؟
نعم . فالارقام المسموح بها فى هذا المكان ثمانية اى اننا يمكن ان نرسم ثمانية خطوط تبدأ من الصفر حتى 7 . يبقى لو خط واحد نكتب صفر و لو خطين زى الاستوكستيك نكتب 1 و لو 3 خطوط زى ADX نكتب 2 و هكذا و هكذا
اما جملة DRAW_LINE ( لرسم خط ) طيب و ايه كمان ممكن نكتبه
DRAW_SECTION ( لرسم قطع او نقط )
DRAW_HISTOGRAM ( لرسم الهيستوجرام )
DRAW_ARROW ( لرسم سهم )
DRAW_NONE (بدون رسم اي شئ )
مشاركة: هيا نصنع مؤشر بأيدينا
ثانيا : SetIndexBuffer(0,ExtMapBuffer1)
و معناها لدينا مؤشر واحد سنأخذ القيم التى سترسم من المصفوفة ExtMapBuffer1
بمعنى ادق :
في حالة مؤشرنا هذا , فالمصفوفة ستوفر القيم من المتغير ExtMapBuffer1 لتقوم برسم خط واحد على الشارت
مشاركة: هيا نصنع مؤشر بأيدينا
ثالثا
string short_name = "Your first indicator is running!";
تقوم بتحديد اسم المؤشر الذى سيكتب على الشاشه اثناء تشغيله. اخترنا العبارة Your first indicator is runningو يمكنك اختيار اى عبارة اخرى
رابعا
IndicatorShortName(short_name)
نحن نخبر البرنامج بان هذه العبارة هى التى ستكتب على الشاشة عند التشغيل
وبقيت RETURN وهي الجملة المسئولة عن انهاء الدالة ()init وتمرير البرنامج الى الدالة ()start لتبدأ عملها .
مشاركة: هيا نصنع مؤشر بأيدينا
و الان جاء دورها
ثانيا
دالة انتهاء المؤشر () deinit :
هذه اخر دالة يستدعيها المؤشر , هنا يمكنك وضع اوامر نهاية البرنامج
كود:
int deinit()
{
//----
//----
return(0);
}
لا جديد يمكن قوله على هذه الدالة .
مشاركة: هيا نصنع مؤشر بأيدينا
و الان وصلنا النهاية
ثالثا
دالة start() 1
كما عرفنا سنقضي تقريبا %90 من حياتنا البرمجية داخل اقواس الدالة ()start . وذلك لأنها أهم دالة من الدوال الرئيسية في لغة MQL4 .
وعلى عكس الدالتين السابقتين ()init و ()deinit . فهي لا تنتهي مرة واحدة من طرف المستخدم , وانما كل مرة يتحرك فيها السعر على الشارت الموضوع فيه المؤشر , تعمل هذه الدالة .
دالة ()start مثل جميع دوال MQL4 تعود بنتيجة محددة returtn . حيث ان (0)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);
}
//+------------------------------------------------------------------+
مشاركة: هيا نصنع مؤشر بأيدينا
و سيتم شرحه فى المشاركة القادمة
مشاركة: هيا نصنع مؤشر بأيدينا
الدالة الهامة جدا
start()1
و تكون مسبوقة بالرمزINT و يليها ()
يجب هنا وضع قيم المتغيرات الأبتدائية للمؤشر بين قوسين {} .
كما فى السطر الاول من الكود
int start() 1
مشاركة: هيا نصنع مؤشر بأيدينا
الدالة الهامة جدا
start()1
اما السطر الثانى
كود:
int counted_bars=IndicatorCounted();
هنا نحن عرفنا متغير ما على انه عدد صحيح int وسميناه ( counted_bars ) واسندنا له قيمة محددة وهي الدالة ( int IndicatorCounted() ) ... ( اي ان القيمة الناتجة من هذه الدالة ستعود الى هذا المتغير .)
وهي الدالة التي ستعود بقيمة ما (عدد صحيح) وهذه القيمة هي عدد الشموع المحسوبة عن طريق مؤشرنا هذا ( مثلا المتوسط المتحرك 5 , عدد الشموع هنا 5 ) لكن في حالة مؤشرنا هنا واحد فقط .
مع بداية تشغيل المؤشر على الشارت سيحسب القيمة 0 وذلك لأنه لم يقم بحساب اي عدد من الشموع بعد .
بعد ذلك يقوم بحساب الشموع (البارات) الموجودة على الشارت .
اما الكود
كود:
if (counted_bars<0) return(-1);
فعمله هو
هذه الجملة ( counted_bars ) تحمل القيمة الناتجة من الدالة ()int IndicatorCounted ومن ثم تقوم الجملة الشرطية بعملها .
يجب ان تكون القيمة اكبر من او تساوي 0 اما ان تكون اصغر من الصفر فهذا معناه ان هناك خطأ وسيتم انهاء الدالة ( في مثال المتوسط 5 لم يجد المؤشر 5 شموع على الشارت ليقوم بحساباته ولن يظهر على الشارت )
وهذا ما يعنيه السطر اعلاه
و كذلك
;--if (counted_bars>0) counted_bars
هنا إذا جائت النتيجة صحيحة . وعدد البارات اكبر من الصفر ( اي ان عدد البارات على الشارت اكبر من المطلوب في المؤشر ).
سيتم انقاص قيمة واحد من الناتج ( -- هي للإنقاص , راجع درس العمليات ) وبإنقاصها ستعود الدالة للحساب والمقارنة من جديد ( وهكذا يتم اصدار قيمة بعد قيمة لرسم المؤشر متصلا على الشارت مع كل شمعة ).