10 مرفق
أهم الأخطاء الشائعة عند برمجة إكسبرت وكيفية حلها
بعد التحديث الأخير للغة MQL4 ظهرت بعض الأخطاء الشائعة عند عمل Compile للبرامج القديمه سوف أقوم بشرحها في هذا الموضوع بالإضافة لشرح أهم الأخطاء الشائعه عند البرمجه وعند تشغيل البرنامج ليكون مرجع دائم للمتعلمين الجدد لهذه اللغه
بعد التحديث الأخير للغه تم إضافة Property إسمه strict
كود PHP:
#property strict
والمقصود به أن يقوم الكومبايلر بإستخدام الشروط القصوى لكتابة اللغه مثلا عدم تجاهل التحذيرات فعند إستخدام strict لا يمكن عمل كومبايل للبرنامج إلا بعد إصلاح هذه التحذيرات بعكس
إذا لم تستخدم strict فسوف يتجاهل الكومبايلر هذه التحذيرات .
التحذيرات المشروحه في هذا الموضوع في حال إستخدام property strict فسوف تظهر كأخطاء يجب تفاديها
يوجد ثلاثة أنواع من الأخطاء في لغة MQL4
1- أخطاء تظهر عند عمل Compile للبرنامج وفي هذه الحاله لن يعمل البرنامج
2- أخطاء تظهر عند تشغيل البرنامج في الميتاتريدر
3- تحذيرات تظهر عند عمل Compile للبرنامج
سوف أقوم بشرح كل جزء بالتفصيل على مراحل
1- أخطاء تظهر عند عمل Compile للبرنامج وفي هذه الحاله لن يعمل البرنامج
1.1- إستخدام switch في المقارنه illegal switch expression type
الملف المرفق 427544
لا يمكن إستخدام أي قيم غير الأعداد الصحيحه في المقارنه
كود PHP:
double value=0.1;
switch(value)
{
case 0:Print("some text");
case 0.1:Print("some text");
case 0.2:Print("some text");
}
الصحيح
إستخدم if بدلا من switch إذا كان في المقارنه أعداد غير صحيحه
كود PHP:
double value=0.1;
if(value==0)Print("some text");
if(value==0.1)Print("some text");
if(value==0.2)Print("some text");
1.2- خطأ عند تغيير قيمة المتغيرات الخارجيه constant cannot be modified
الملف المرفق 427554
يظهر هذا الخطأ عند محاولة تغيير قيمة متغير خارجي داخل كود البرنامج
كود PHP:
Lots=Lots*2;;
OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"EA",MagicNumber,0,Blue);
الصحيح
قم بتعريف متغير جديد داخل الداله وقم بتغيير قيمته ثم إستخدامه لاحقا
كود PHP:
double newlot=Lots*2;
OrderSend(Symbol(),OP_BUY,newlot,Ask,3,0,0,"EA",MagicNumber,0,Blue);
1.3- خطأ عند إستخدام الأقواس unbalanced parentheses
أحيانا الخطأ يكون بأسماء أخرى على حسب مكان الخطأ
unexpected token
unbalanced right parenthesis
الملف المرفق 427556
يحدث غالبا بدون قصد عند فتح قوس { أو ( وعدم إغلاقه مثلا ويجب تتبع البرنامج سطر سطر حتى إيجاد مكان الخطأ وتصحيحه
2- أخطاء تظهر عند تشغيل البرنامج على الميتاتريدر
2.1- خطأ في حجم اللوت invalid lots amount for OrderSend function
الملف المرفق 427553
رقم الخطأ 4051 ويظهر عندما يحاول الإكسبرت فتح صفقه ويظهر خطأ بسبب حجم اللوت إما بسبب صغر حجم اللوت أقل من البروكر الذي يسمح به أو أكبر من حجم اللوت الذي يسمح به البروكر أو به فاصله عشريه لا يسمح بها البروكر مثلا حجم اللوت 1.21 والبروكر لا يسمح بحجم لوت أقل من 0.01 بالتالي يجب أن يكون حجم اللوت 1.2 فقط
التصحيح :
أولا قم بتعريف متغير لتحديد أقل حجم لوت يقبله البروكر
كود PHP:
int Lot_Decimal;
ثم بداخل الداله OnInit ستحدد أقل حجم لوت يقبله البروكر
كود PHP:
if(MarketInfo(Symbol(),MODE_MINLOT)<0.1)Lot_Decimal=2;
else if(MarketInfo(Symbol(),MODE_MINLOT)<1)Lot_Decimal=1;
else Lot_Decimal=0;
ثم في الداله OrderSend
كود PHP:
double lot;
if(Lots>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
else if(Lots<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
OrderSend(Symbol(),OP_BUY,NormalizeDouble(lot,Lot_Decimal),Ask,3,0,0,"EA",MagicNumber,0,Blue);
2.2- خطأ القسمه على 0 zero divide
الملف المرفق 427555
يظهر الخطأ عند القسمه على 0 ويتوقف البرنامج عن العمل في بعض الأحيان
الصحيح
قم بوضع شرط للتأكد من أن المقسوم عليه لا يساوي0 في حال كنت تتوقع أن تساوي قيمته 0 في بعض الأحيان
كود PHP:
int A=10;
int B=0;
int result;
if(B!=0)result=A/B;
2.3- خطأ إسم العمله غير صحيح unknown symbol name
سابقا كان يمكن إستخدام 0 بدلا من Null أو Symbol لمعرفة إسم العمله وإستخدامها في الدوال المختلفه مثل OrderSend
لكن بعد التحديث الأخير لا يمكن إستخدام 0
كود PHP:
OrderSend(0,OP_BUY,lot,Ask,3,0,0,"EA",MagicNumber,0,Blue);
الصحيح
كود PHP:
OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,0,"EA",MagicNumber,0,Blue);
3- تحذيرات تظهر عند عمل Compile للبرنامج
3.1- إستخدام المقارنه الخطائة expression not boolean
الملف المرفق 427542
يظهر هذا الخطأ عند وضع مقارنة (يساوي) وإستخدام = بدلا من ==
كود PHP:
int Num=10;
if(Num = 10)
الصحيح
كود PHP:
int Num=10;
if(Num == 10)
3.2- الداله تعود بقيمة معينه return value of .... should be checked
الملف المرفق 427545
يظهر هذا التحذير عند إستدعاء دالة معرفه في اللغه تعود بقيمة معينه ولا يتم إرجاع هذه القيمه
كود PHP:
OrderSend(Symbol(),OP_BUY,Lots,Ask,3*P,0,0,"EA",MagicNumber,0,Blue);
الصحيح
كود PHP:
int ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3*P,0,0,"EA",MagicNumber,0,Blue);
يتم تعريف المتغير حسب نوع القيمه التي تعود بها الداله مثلا الداله OrderSelect تعود بقيمة true أو false فيتم تعريف المتغير لها من نوع bool
كود PHP:
bool select=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
3.3- دالة معرفة لا تعود بقيمة معينه not all control paths return a value
الملف المرفق 427546
عندما تقوم بتعريف دالة ولا تعود بقيمة الداله بإستخدام return
جميع الدوال المعرفه يجب أن تعود بقيمة معينه ما عدا الداله من نوع void
كود PHP:
int calculate()
{
int A=10; int B=20;
int result=A*B;
Print(result);
}
الصحيح
كود PHP:
void calculate()
{
int A=10; int B=20;
int result=A*B;
Print(result);
}
3.4- تعريف متغير array parameter للداله arrays passed by reference only
الملف المرفق 427548
عند تعريف المتغير يجب أن يمرر بإستخدام العنوان في ذاكرة الجهاز أو address
كود PHP:
void calculate(int array[])
{
int result=array[0]*array[1];
Print(result);
}
الصحيح
يجب إستخدام & قبل تعريف المصفوفه
كود PHP:
void calculate(int &array[])
{
int result=array[0]*array[1];
Print(result);
}
3.5- تعريف متغير وعدم إستخدامه variable ... not used
الملف المرفق 427550
يظهر عند تعريف أي متغير وعدم إستخدامه داخل الكود
الصحيح
قم بحذف المتغيرات الغير مستخدمه لأنها تأخذ مساحه من الميموري بدون فائده
هذا ما أتذكره إلى الآن و الموضوع سيظل محدث دائما بأهم الأخطاء التي تظهر حتى يكون مرجع دائم ومتجدد بإذن الله