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

2.10. Operator przerywania break

Operator break służy do przerywania operatorów switch , for , while i do ... while . Działanie break zostało już opisane przy okazji omówienia operatora wyboru wielowariantowego switch. W przypadku pozostałych operatorów też może zaistnieć sytuacja, kiedy dalsze działanie pętli nie jest potrzebne i należy ją przerwać.

Dla zobrazowania tej sytuacji, niżej przedstawiam kod skryptu, który szuka numer indeksu świecy dla której jej najwyższa cena (High) będzie większa lub równa wartości 1.13, tak dla przykładu. Nas będzie interesować pierwsza taka świeca i kiedy ona zostanie znaleziona przerywamy dalsze poszukiwania. Szukać będziemy dla EURUSD w przedziale czasowym 4 godziny (H4). Poszukiwania zawęzimy do 100 świec, tj. skrypt zacznie szukać od bieżącej z indeksem 0 do świecy z indeksem 99. Najwyższe ceny świec będziemy szukać przebierając predefiniowaną tablicę High[] za pomocą operatora pętli for.

Kod 1
#property strict

void OnStart()
  {
//---
   double Level   = 1.13; /* deklaracja zmiennej Level jako
                             poziomu ceny dla porównywania
                             i przypisanie jej wartości 1.13 */

   int BarNumbers = 100;  /* deklaracja zmiennej BarNumbers jako
                             ilość przeszukiwanych świec
                             i przypisanie jej wartości 100 */


//--- pętla 'for'
   for(int i = 0; i < BarNumbers; i++)
     {
      //--- warunek 'if' wewnątrz pętli 'for'
      if(High[i] >= Level)
        {
         //--- jeśli znalazła się taka świeca, poinformujemy o tym
         Print("Pierwsza świeca, dla której High jest większe lub równe ",
               Level , ", ma indeks " , i);
         //--- a następnie przerywamy tę pętlę
         break;
        }
      //---
     }

   Print("Działanie skryptu zakończone.");
//---
  }

A teraz po kolei.

Najpierw określamy poziom, do którego będą porównywane ceny High (Level = 1.13) i ilość przeszukiwanych świec (BarNumbers = 100). Następnie, w nagłówku for tworzymy zmienną i, która będzie pełnić rolę licznika, a następnie przypisujemy jej wartość 0 (int i = 0) i właśnie od świecy z indeksem 0 zaczniemy szukać. Ilość iteracji ograniczamy do wartości zmiennej BarNumbers (i < BarNumbers), tj. do 99-ej świecy włącznie i po każdej iteracji zwiększamy licznik o 1 (i++).

Teraz przejdźmy do najciekawszej części kodu - do operatora if, który znajduje się wewnątrz pętli for.

Kod 2
      //--- warunek 'if' wewnątrz pętli 'for'
      if(High[i] >= Level)
        {
         //--- jeśli znalazła się taka świeca, poinformujemy o tym
         Print("Pierwsza świeca, dla której High jest większe lub równe ",
               Level , ", ma indeks " , i);
         //--- a następnie przerywamy tę pętlę
         break;
        }

Tu w nagłówku if podczas każdej iteracji porównujemy High świecy z Level (High [i] >= Level). W trakcie 1-ej iteracji, kiedy i = 0, zamiast i do tablicy High w [] podstawia się cyfra 0 i porównuje się High[0] z Level. Jeśli High będzie mniejsze (warunek - fałsz), to instrukcje zapisane w ciele if, tj. wewnątrz {}, nie zostaną zrealizowane. Operator for przejdzie do 2-ej iteracji, gdzie if będzie porównywać kolejny High[1] z Level, itd.

Dopiero w przypadku, kiedy skrypt trafi na High większy lub równy Level (warunek - prawda), realizują się działania zapisane w ciele if. Widzimy tu 2 instrukcje: 1 - funkcja Print() w dzienniku logów terminala wyświetli informację o numerze indeksu świecy, 2 - operator break przerwie pętlę i program przejdzie do Print(), znajdującej się po pętli.

Rys. 1. Przykład stosowania operatora break.


Na powyższym obrazku widać wynik działania skryptu (kod 1). W dzienniku logów terminala widzimy, że skrypt znalazł świecę z indeksem 7 odpowiadającą warunkowi. W oknie notowań umieściłem linię poziomą dla wartości 1.13000 i strzałką pokazałem właściwą świecę, High której jako pierszy jest większy lub równy temu poziomowi ceny. Ponieważ skrypt znalazł pierwszą świecę odpowiadającą naszemu warunkowi, to nie musiał już dalej analizować pozostałe świece z indeksami od 8 do 99.


Na poniższym obrazku przedstawiono schemat działania operatora break. Wewnątrz pętli for (lub while lub do … while) widać jak iteracje powtarzają się jedna po drugiej (zielone strzałki) i jeśli w trakcie którejś z nich zaistnieje sytuacja, kiedy całą pętlę trzeba przerwać, wtedy break ją przerywa i program przechodzi do realizacji instrukcji zapisanych po pętli (czerwona strzałka).

Rys. 2. Schemat działania operatora break.


Operator break przerywa działanie pętli for, while, do ... while oraz operatora wyboru wielowariantowego switch.