النتائج 1 إلى 4 من 4
- 21-01-2015, 12:12 PM #1
أهم الأخطاء الشائعة عند برمجة إكسبرت وكيفية حلها
بعد التحديث الأخير للغة MQL4 ظهرت بعض الأخطاء الشائعة عند عمل Compile للبرامج القديمه سوف أقوم بشرحها في هذا الموضوع بالإضافة لشرح أهم الأخطاء الشائعه عند البرمجه وعند تشغيل البرنامج ليكون مرجع دائم للمتعلمين الجدد لهذه اللغه
بعد التحديث الأخير للغه تم إضافة Property إسمه strict
والمقصود به أن يقوم الكومبايلر بإستخدام الشروط القصوى لكتابة اللغه مثلا عدم تجاهل التحذيرات فعند إستخدام 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 إذا كان في المقارنه أعداد غير صحيحه
1.2- خطأ عند تغيير قيمة المتغيرات الخارجيه constant cannot be modifiedكود 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);
قم بتعريف متغير جديد داخل الداله وقم بتغيير قيمته ثم إستخدامه لاحقا
1.3- خطأ عند إستخدام الأقواس unbalanced parenthesesكود 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 فقط
التصحيح :
أولا قم بتعريف متغير لتحديد أقل حجم لوت يقبله البروكر
ثم بداخل الداله OnInit ستحدد أقل حجم لوت يقبله البروكركود PHP:int Lot_Decimal;
ثم في الداله OrderSendكود 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 في بعض الأحيان
2.3- خطأ إسم العمله غير صحيح unknown symbol nameكود 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);
3- تحذيرات تظهر عند عمل Compile للبرنامجكود 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)
3.2- الداله تعود بقيمة معينه return value of .... should be checkedكود PHP:int Num=10;
if(Num == 10)

يظهر هذا التحذير عند إستدعاء دالة معرفه في اللغه تعود بقيمة معينه ولا يتم إرجاع هذه القيمه
الصحيحكود PHP:OrderSend(Symbol(),OP_BUY,Lots,Ask,3*P,0,0,"EA",MagicNumber,0,Blue);
يتم تعريف المتغير حسب نوع القيمه التي تعود بها الداله مثلا الداله OrderSelect تعود بقيمة true أو false فيتم تعريف المتغير لها من نوع boolكود PHP:int ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3*P,0,0,"EA",MagicNumber,0,Blue);
3.3- دالة معرفة لا تعود بقيمة معينه not all control paths return a valueكود 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);
}
3.4- تعريف متغير array parameter للداله arrays passed by reference onlyكود 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);
}
يجب إستخدام & قبل تعريف المصفوفه
3.5- تعريف متغير وعدم إستخدامه variable ... not usedكود 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
السلام عليكم أخي العزيز
كيف أصح هذه الأخطاء المرافقة
الأكثر زيارة
رد مع اقتباس