النتائج 1 إلى 4 من 4
- 21-01-2015, 12:12 PM #1
أهم الأخطاء الشائعة عند برمجة إكسبرت وكيفية حلها
بعد التحديث الأخير للغة MQL4 ظهرت بعض الأخطاء الشائعة عند عمل Compile للبرامج القديمه سوف أقوم بشرحها في هذا الموضوع بالإضافة لشرح أهم الأخطاء الشائعه عند البرمجه وعند تشغيل البرنامج ليكون مرجع دائم للمتعلمين الجدد لهذه اللغه
بعد التحديث الأخير للغه تم إضافة Property إسمه strict
كود PHP:#property strict
إذا لم تستخدم strict فسوف يتجاهل الكومبايلر هذه التحذيرات .
التحذيرات المشروحه في هذا الموضوع في حال إستخدام property strict فسوف تظهر كأخطاء يجب تفاديها
يوجد ثلاثة أنواع من الأخطاء في لغة MQL4
1- أخطاء تظهر عند عمل Compile للبرنامج وفي هذه الحاله لن يعمل البرنامج
2- أخطاء تظهر عند تشغيل البرنامج في الميتاتريدر
3- تحذيرات تظهر عند عمل Compile للبرنامج
سوف أقوم بشرح كل جزء بالتفصيل على مراحل
1- أخطاء تظهر عند عمل Compile للبرنامج وفي هذه الحاله لن يعمل البرنامج
1.1- إستخدام switch في المقارنه illegal switch expression type
لا يمكن إستخدام أي قيم غير الأعداد الصحيحه في المقارنه
كود 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");
يظهر هذا الخطأ عند محاولة تغيير قيمة متغير خارجي داخل كود البرنامج
كود 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);
أحيانا الخطأ يكون بأسماء أخرى على حسب مكان الخطأ
unexpected token
unbalanced right parenthesis
يحدث غالبا بدون قصد عند فتح قوس { أو ( وعدم إغلاقه مثلا ويجب تتبع البرنامج سطر سطر حتى إيجاد مكان الخطأ وتصحيحه
2- أخطاء تظهر عند تشغيل البرنامج على الميتاتريدر
2.1- خطأ في حجم اللوت invalid lots amount for OrderSend function
رقم الخطأ 4051 ويظهر عندما يحاول الإكسبرت فتح صفقه ويظهر خطأ بسبب حجم اللوت إما بسبب صغر حجم اللوت أقل من البروكر الذي يسمح به أو أكبر من حجم اللوت الذي يسمح به البروكر أو به فاصله عشريه لا يسمح بها البروكر مثلا حجم اللوت 1.21 والبروكر لا يسمح بحجم لوت أقل من 0.01 بالتالي يجب أن يكون حجم اللوت 1.2 فقط
التصحيح :
أولا قم بتعريف متغير لتحديد أقل حجم لوت يقبله البروكر
كود PHP:int Lot_Decimal;
كود 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;
كود 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
يظهر الخطأ عند القسمه على 0 ويتوقف البرنامج عن العمل في بعض الأحيان
الصحيح
قم بوضع شرط للتأكد من أن المقسوم عليه لا يساوي0 في حال كنت تتوقع أن تساوي قيمته 0 في بعض الأحيان
كود PHP:int A=10;
int B=0;
int result;
if(B!=0)result=A/B;
سابقا كان يمكن إستخدام 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.1- إستخدام المقارنه الخطائة expression not boolean
يظهر هذا الخطأ عند وضع مقارنة (يساوي) وإستخدام = بدلا من ==
كود PHP:int Num=10;
if(Num = 10)
كود PHP:int Num=10;
if(Num == 10)
يظهر هذا التحذير عند إستدعاء دالة معرفه في اللغه تعود بقيمة معينه ولا يتم إرجاع هذه القيمه
كود 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);
كود PHP:bool select=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
عندما تقوم بتعريف دالة ولا تعود بقيمة الداله بإستخدام 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);
}
عند تعريف المتغير يجب أن يمرر بإستخدام العنوان في ذاكرة الجهاز أو 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);
}
يظهر عند تعريف أي متغير وعدم إستخدامه داخل الكود
كود PHP:int var;
قم بحذف المتغيرات الغير مستخدمه لأنها تأخذ مساحه من الميموري بدون فائده
هذا ما أتذكره إلى الآن و الموضوع سيظل محدث دائما بأهم الأخطاء التي تظهر حتى يكون مرجع دائم ومتجدد بإذن الله
- 21-01-2015, 01:20 PM #2
جزاك الله تعالى خيرا مشرفنا الحبيب اسامه
أطال الله فى عمرك
- 08-07-2020, 03:02 AM #3
جزاك الله خيراااااااااااااااااااا
- 08-07-2020, 12:32 PM #4
السلام عليكم أخي العزيز
كيف أصح هذه الأخطاء المرافقة