بسم الله الرحمن الرحيم
مرحبا بكم في الدرس الخامس ... الحلقات والقرارات (جزء 2)
تحدثنا في الدرس السابق عن الحلقات
وكما ذكرنا من قبل , فالحلقات هي احدى طريقتين تقومان على تغيير التسلسل الطبيعي لتنفيذ اوامر البرنامج من القمة للقاع ( راجع الدرس السابق ).
حسنا , الطريقة الأخرى هي القرارات decisions .
القرارات decision هي جملة برمجية تقوم بعمل انتقال امر برمجي لمرة واحدة لجزء أخر من البرنامج معتمدا على قيمة المتغير.
(هذا الدرس اسهل من الدرس السابق وستروا بأنفسكم )
هناك عدة انواع من القرارات في لغة MQL4 :
1- الجملة الشرطية ( إذا ) .. ( if ) :
( إذا أخطأ علي فاضربوه ) .. حسنا ماذا لو لم يخطئ علي ؟ فلن يتم تنفيذ البرنامج (هذا مثال سريع قبل الدخول في التفاصيل )
الجملة ( if ) هي اسهل انواع الجمل الشرطية ( القرارات ).
دعونا نأخذ مثالا :
كود PHP:
if( x < 100 )
Print("hi");
هنا الكلمة المحجوزة ( if ) جاء بعدها القوسان ( ) وبداخلهم جاء تعبير الأختبار ( هل تتذكروه ) على هذه الصورة ( X<100 ) , متى جاءت النتيجة بين القوسين صحيحة true سيقوم جسد الجملة بتنفيذ الأمر (Print("hi")
,, وكمتى جاءت خاطئة false فسينتقل التسلسل التنفيذي للأوامر الى جزء أخر من البرنامج .
* الجمل المتعددة في جسد الجملة ( if ) (الأوامر ) :
مثل ما رأينا في الحلقات , فالجملة ( if ) يمكن ان تتكون من اكثر من جملة تنفيذية ويحاطون بالقوسين { }.
( لاحظ انه لو وجدت جملة واحدة لن نحتاج الى هذه الأقواس { } )
مثال :
كود PHP:
if(current_price==stop_lose)
{
Print("you have to close the order");
PlaySound("warning.wav");
}
ملاحظة : العلامة == الموجودة في تعبير الأختبار , هي احد عمليات المقارنة وليست = عملية مساواة (راجع درس العمليات والتعبيرات) ... هذه مصدر العديد من أخطاء الكتابة البرمجية نظرا للتشابه بينهم .
* التداخل Nesting :
يمكن للحلقات والقرارات ان يتداخلوا في بعضهم البعض , بمعنى انه يمكنك كتابة حلقة ( for ) داخل جملة شرطية ( if ) والعكس بالعكس ... تسمى هذه العملية بالتداخل Nesting .
مثال :
كود PHP:
for(int i=2 ; i<10 ; i++)
if(i%2==0)
{
Print("It's not a prime nomber");
PlaySound("warning.wav");
}
في هذا المثال تم وضع الجملة الشرطية (القرار) ( if ) بداخل الحلقة ( for ) .
2- الجملة الشرطية ( إذا .. وإلا ) .. ( if .. else ) :
( اذا أخطأ علي فاضربوه والا فأكرموه ) هنا البرنامج سينفذ ايا من الأمرين , ان أخطأ علي true سيتم ضربه , وان لم يخطئ false سيتم تنفيذ الأمر الثاني وهو الأكرام .
.
هذه الجملة تختلف عن سابقتها ان لها نتيجيتين واحدة في حالة true والأخرى false ( في الجملة if كانت هناك نتيجة واحدة فقط في حالة صحة تعبير الأختبار true اما الحالة false فينتقل البرنامج الى جزء أخر منه )
تتكون هذه الجملة من الكلمة المحجوزة if متبوعة بجملة تنفيذ او اكثر , وكلمة محجوزة أخرى هي else متبوعة بجملة تنفيذ او اكثر .
مثال :
كود PHP:
if(current_price>stop_lose)
Print("It’s too late to stop, please stop!");
else
Print("you playing well today!");
ترجمة هذا المثال على النحو التالي :
إذا (السعر الحالي > وقف الخسارة )
اطبع جملة ("انت متأخر جدا , ارجوك اغلق العقد")
والا
اطبع جملة ("انت تضارب جيدا اليوم")
اعتقد الترجمة هذه تشرح الموضوع كاملا 
* التداخل Nesting في جملة ( if .. else ) :
لايمكن لجملة ( if .. else ) ان تتداخل مع جملة ( if ) , ولكن يمكن ان نجعل جملة ( if .. else ) تتداخل مع جملة ( if .. else ) أخرى ... وهكذا .
في هذا المثال :
كود PHP:
if(current_price>stop_lose)
Print("It’s too late to stop, please stop!");
if(current_price==stop_lose)
Print("It’s time to stop!");
else
Print("you playing well today!");
توجد مشكلة برمجية هنا , حيث الجملتين الشرطيتين هنا متعارضتين وسيواجه الكومبيوتر مشكلة ايهما ينفذ ؟
ان جاء السعر اعلى من وقف الخسارة هناك امران احداهما "انتا متاخر جدا , ارجوك اغلق العقد " في الجملة الأولى ,, والأخرى "انت تضارب جيدا اليوم" ( نتيجة انه false ان لم يحدث == في الجملة الثالثة .
وهذا خطا برمجي ان يكون هناك اكثر من امر شبيه عند تحقق شروط متشابهة ( فأيهما ينفذ ؟)
هناك حل لهذا الأمر :
* ان نحيط الجملة ( if.. else ) بكاملها بالقوسين { }
مثال :
كود PHP:
if(current_price>stop_lose)
{
Print("It’s too late to stop, please stop!");
if(current_price==stop_lose)
Print("It’s time to stop!");
else
Print("you playing well today!");
}
ومن الأفضل تجنب التداخل مع جملة ( if .. else )
3- الجملة الشرطية ( التوزيع ) .. ( switch ) :
تستخدم هذه الجملة في حالة تعدد القيم لمتغير واحد فكل قيمة لها تنفيذ برمجي محدد .
دعونا نرى مثالا :
كود PHP:
switch(x)
{
case 'A':
Print("CASE A");
break;
case 'B':
case 'C':
Print("CASE B or C");
break;
default:
Print("NOT A, B or C");
break;
}
كيف يعمل هذا الكود (الجملة البرمجية في المثال) ؟
تبدا الجملة بالكلمة المحجوزة switch لتوزع اوامر التنفيذ لقيم النتغير x المختلفة .
وتاتي الأوامر بين القوسين { } .
الجملة switch تربط المتغير x بجميع القيم الداخلة للبرنامج وتتعامل معها على هذا النحو :
في حالة x==A سيخرج الكومبيوتر الناتج ( case A ) والا سينفذ الأمر Break (راجع هذا الأمر في الدرس السابق)
في حالة x==B او x==C سيخرج الكومبيوتر الناتج ( case B or case C ) وذلك لعدم وجود الأمر Brea.
في حالة !==x اي ان x لا تتطابق مع اي من القيم السابقة سيخرج الكومبيوتر النتيجة الأفتراضية ( Not caseA,caseB or case C )
في الدرس القادم بأذن الله سنتكلم عن الوظائف في لغة MQL4