2. MQL4 dla początkujących. Część II.

2.4. Zagnieżdżanie warunków if ... else

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?

Kod 1
#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):

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.

Kod 3
#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.