W MQL4 istnieje możliwość zagnieżdżania operatorów if i else, tj. określone działanie można uzależnić od realizacji wielu warunków. Podobne przykłady wielopoziomowych warunków można zobrazować w następujący sposób: "Jeśli w niedzielę będzie słońce, to pójdę na spacer. Jeśli nie, to sprawdzę czy w telewizji będzie nowy film i jeśli tak to pooglądam go, a jeśli nie to poczytam o MQL4”. Tj. najpierw sprawdzimy czy w niedzielę będzie słońce i albo idziemy na spacer albo potem sprawdzimy co będzie w telewizji. Dalsze nasze działania są uzależnione od tego czy będzie leciał nowy film. Jak by wyglądał algorytm podjęcia decyzji w ludzkim mózgu, gdybyśmy się posługiwały językiem MQL4?
#property strict
void OnStart() // zaczynamy myśleć :)
{
//---
if(/* Jeśli w niedzielę będzie słońce */) // warunek 1
{
/* pójdę na spacer */
}
else // inaczej
{
if(/* Jeśli w telewizji będzie nowy film */) // zagnieżdżony warunek 2
{
/* będę oglądać nowy film */
}
else // inaczej
{
/* poczytam o MQL4 */
}
}
//---
}
W tym przypadku (kod 1) nasz spacer będzie uzależniony tylko od jednego warunku: czy będzie słoneczna niedziela. Z kolei o MQL4 poczytamy w przypadku jeśli nie będzie słońca i się okaże że w telewizji nie będzie nowego filmu. Przygotujmy kod skryptu tak, jakbyśmy już wiedzieli że niedziela nie będzie słoneczna, a w telewizji będzie nowy film (kod 2):
#property strict
void OnStart()
{
bool IsSunnySunday = false; // niedziela nie będzie słoneczna
bool IsNewMovie = true; // będzie nowy film
//---
if(IsSunnySunday == true) /* wynik porównania - fałsz,
dlatego nie pójdziemy na spacer
działanie przechodzi do operatora 'else' */
{
Print("Pójdę na spacer.");
}
else // przechodzimy tu
{
if(IsNewMovie == true) /* zagnieżdżony warunek
wynik porównania - prawda,
dlatego będziemy oglądać film
a nie czytać o MQL4 */
{
Print("Będę oglądać nowy film.");
}
else
{
Print("Poczytam o MQL4.");
}
}
//---
}
A co jeśli nowy film okaże się nudny? Lepiej zająć się czymś przyjemniejszym, np. poczytać o MQL4. Możemy dodać i taki warunek i dopisać co zrobimy w takiej sytuacji. Jak już opisałem w rozdziale 2.2 Operator warunkowy if ... else w przypadku jeśli po operatorach if lub else znajduje się tylko jedno działanie to klamry można nie pisać. Także operator else można pominąć jeśli alternatywne działanie nie jest przewidziane.
#property strict
void OnStart()
{
bool IsSunnySunday = false; // niedziela nie będzie słoneczna
bool IsNewMovie = true; // będzie nowy film
bool IsBoringMovie = true; // film okaże się nudny
//---
if(IsSunnySunday == true) // wynik porównania - fałsz
Print("Pójdę na spacer.");
else // przechodzimy tu
{
//---
if(IsNewMovie == true) /* zagnieżdżony warunek
wynik porównania - prawda */
{
Print("Będę oglądać nowy film.");
if(IsBoringMovie == true) // wynik porównania - prawda
Print("Film będzie nudny, lepiej poczytam o MQL4.");
}
else
Print("Poczytam o MQL4.");
//---
}
}
Teraz wiemy, że jeśli nowy film okaże się nudny to lepiej poczytamy o MQL4. Jednak jeśli film nie zawiedzie naszych oczekiwań to nic nie zmieniamy w naszym działaniu i kontynuujemy oglądanie, ponieważ brakuje opisu alternatywnego działania, tj. nie ma else połączonego z warunkiem if(IsBoringMovie == true). Spróbuj teraz logiczną zmienną IsSunnySunday zainicjować jako true. Teraz przy sprawdzeniu pierwszego warunku skrypt od razu wyśle nas na spacer, pomijając sprawdzenia kolejnych warunków. Z kolei jeśli zamienimy tylko logiczną zmienną IsNewMovie na false, to nie musimy sprawdzać jaki jest film, aby od razu przystąpić do czytania o MQL4.
MQL4 pozwala zagnieżdżać operatory if i else na wiele sposobów bez ograniczeń. Zdarzają się sytuację, kiedy trzeba opisać bardzo skomplikowane i rozbudowane zależności, np. jakieś działanie może zależeć od spełnienia bardzo wielu warunków. Można uprościć zapis kodu stosując symbole operacji logicznych && (I) oraz || (LUB) o czym się dowiesz w następnym rozdziale. Można też przygotować własne funkcje, zapisać w nich skomplikowane zależności, umieścić je w innej części kodu lub przygotować zewnętrzną bibliotekę funkcji i podpiąć ją do programu MQL4. Ale o tym później.