Odbierz zniżkę na szkolenie i stwórz swój pierwszy automat w MQL4!
banner

Pętla MQL – co to jest i jak ją wykorzystać?

W tym artykule dowiesz się czym jest pętla mql oraz w jaki sposób możesz je wykorzystać w swoim tradingu. W pierwszej kolejności warto zastanowić się, co to znaczy pętla? Pętla najczęściej kojarzy nam się ze zdarzeniami, okolicznościami, bądź czynnościami, które występują w sposób ciągły, powtarzalny. 

Osoba, która używa stwierdzenia “zapętliłem się”, np. w znaczeniu miejsca w jakim się obecnie znalazł w życiu, najczęściej ma na myśli powtarzające się czynniki, czy sytuację życiowe, z których ciężko się wyrwać. Tyle słowem wstępu, gdyż nie chodzi o kontekst psychologiczny danego zagadnienia, lecz wykorzystanie go w programowaniu, a dokładnie w programowaniu strategii tradingowych. Po co wykorzystywać pętlę w spekulacji giełdowej?

Podstawy MQL4

Do czego pętla mql może być wykorzystana?

Pętle przy tworzeniu strategii automatycznych stosuje się z tych samych powodów, co w programowaniu ogólnie. W momencie, gdy mamy do czynienia z czynnościami powtarzalnymi wewnątrz tworzonego przez nas kodu, wówczas możemy uznać za zasadne ich wykorzystanie. 

Wyobraźmy sobie sytuację, w której na potrzeby tworzonej strategii inwestycyjnej, potrzebujemy uzyskać informacje odnośnie średniej ceny otwarcia, z ostatnich 5 świec. Możemy zastosować bardzo prosty sposób:

//Tworzymy zmienną sredniaCena i przypisujemy wartość 0
   double sredniaCena = 0.0;

//Dodajemy wartości ostatnich 5 cen otwarcia do siebie
   sredniaCena+=Open[0];
   sredniaCena+=Open[1];
   sredniaCena+=Open[2];
   sredniaCena+=Open[3];
   sredniaCena+=Open[4];

//Dzielimy wartość zmiennej przez 5, by uzyskać średnią
   sredniaCena/=5;

Wykorzystując pętle możemy zrobić to znacznie szybciej.

//Tworzymy zmienną sredniaCena i przypisujemy wartość 0
   double sredniaCena = 0.0;
//Tworzymy pętle
   for(int i =0; i<5; i++)
     {
      sredniaCena+=Open[i];
     }
   sredniaCena/=5;

Jak widać na powyższym przykładzie, nie jest to szczególnie problematyczna kwestia, by znaleźć średnią z tak małego zbioru. Właściwie to dla tych paru linijek, można by wręcz zrezygnować ze stosowania pętli. Co jednak, jeśli będziemy chcieli znaleźć średnią dla 100, albo 1000 cen? Wtedy już wypisywanie wartości pojedynczo jest czasochłonne i generalnie bez sensu. Jeśli nie wiesz, czy wykorzystać pętle czy nie, to odpowiedź przyjdzie z pytaniem: “Czy stosując pętle zaoszczędzę sobie czasu?”. 

Jak skonstruowana jest pętla ‘for’?

Najlepiej zrozumieć pewne czynności na przykładach, stąd też pojawił się przykład pętli, której zadaniem jest obliczanie średniej. Jeśli już miałeś/-aś styczność z programowaniem w języku MQL, wówczas wiesz, że rozwiązanie może przyjść z wykorzystaniem funkcji iMA. W ten sposób możesz znaleźć poszukiwaną wartość. Pętla natomiast ma znacznie szersze zastosowanie. Stosując ją, możemy z jej pomocą sprawdzić dowolny zbiór, szukając danych wartości. 

By wiedzieć, jak co wykorzystać, musimy zrozumieć, jak pętla jest w ogóle skonstruowana. Pętla ‘for’, którą miałem okazję wyżej zaprezentować, jest pętlą która znana jest programistom języka C (zarówno C++, jak i C#). Jeśli jednak nie miałeś okazji wcześniej programować, w tych językach, to dobrze trafiłeś. Poniżej podałem przykład, który rozbiłem na czynniki pierwsze.

   for(int i=0; i<10; i++)
     {
      //wnętrze pętli
     }

i=0 
Powyżej stworzyliśmy zmienną z przypisaną wartością. Będziemy wykorzystywać ją w każdej iteracji. Iteracja, to pojedyncze działanie pętli. W tym przypadku stworzone zmienna ‘i’ wynosi 0, co oznacza że od tej wartości będziemy zaczynać działanie pętli.

i<10
Pętla trwa dopóki ‘i’ jest mniejsze, niż 10. Jeśli kolejna iteracja spowodowałaby, iż ‘i’ byłoby równe, bądź większe niż 10, wówczas pętla kończy swoje działanie. 

i++
Kierunek pętli oraz o ile ma wzrastać, bądź maleć przy każdej iteracji. W powyższym przypadku zastosowano inkrementację, czyli zwiększanie zmiennej ‘i’ o 1. Gdyby zamiast tego zastosować by i–, wówczas miałaby miejsce dekrementacja, czyli zmniejszanie o 1. Gdyby jednak było np. i+=2/i-=2, wówczas przy każdej iteracji ‘i’ zwiększa się/maleje o 2.

Pętla ‘while’

Występuje kilka rodzajów pętli. Pętle‘for’ opisałem powyżej. Stosujemy ją, gdy wiemy ile iteracji w danej pętli planujemy przeprowadzić. Stąd musimy zaznaczyć, że pętla będzie trwała, dopóki ‘i’ będzie powyżej, bądź poniżej określonej wartości. Gdy jednak nie wiemy ile iteracji wystąpi przy danej pętli, wówczas warto skorzystać z pętli ‘while’. Pętla ‘while’ jest to pętla, która wykonywana jest tak długo, dopóki spełniony jest dany warunek. Zapisuje ją się w następujący sposób:

   while(warunek)
     {
      //wnętrze pętli
     }

W nawiasie po słowie while wpisz warunek, który ma zostać spełniony. Jeśli ten warunek jest spełniony, wówczas pętla jest realizowana. W innym wypadku, pętla jest pomijana. 

   int a=0;
   int b=0;
   while(a>0)
     {
      b++;
     }

W powyższym przykładzie, podano warunek, że jeśli ‘a’ jest większe, niż 0, wówczas wartość ‘b’ jest zwiększana o 1. Pętla while, działa tak długo, dopóki dany warunek jest prawdziwy. Dlatego też warto zwrócić uwagę na to, że bardzo łatwo wykorzystując ten typ pętli, możemy stworzyć tzw. pętle nieskończoną. A co jak napiszę ten kod inaczej?

   int a=1;
   int b=0;
   while(a>0)
     {
      b++;
     }

Kiedy pętla while przestaje działać? W którym momencie, ‘a’ przestaje być większe od zera? Ten kod tego nie przewidział, stąd też pętla ta będzie zwiększała wartość ‘b’ do… nieskończoności. Ponoć Chuck Norris policzył do nieskończoności dwa razy 🙂 Ale jeśli Ty nim nie jesteś, to prawdopodobnie po odpaleniu takiego kodu na platformie, będziesz ją musiał zamknąć, by wymusić przerwanie odpalonego skryptu z powyższym kodem. Istnieją też sposoby na przerywanie pętli, ale o tym napiszę poniżej. 

Pętla “do … while”

W przypadku, gdy zgłebiamy pętle mql, to warto jeszcze omówić jeden typ. Chodzi o pętle “do … while”. Pętla ta wygląda tak:

   do
     {
      //co ma zostać wykonane
     }
   while(warunek);

Na pierwszy rzut oka, widać, że pętla ma inną konstrukcję, niż te dotychczas poznane. W pierwszej kolejności po operatorze ‘do’ podawane jest działanie, które ma wystąpić, warunek zaś dopiero później. W ten sposób zlecone działanie, jest wykonane przynajmniej raz. Przykład najlepiej to zobrazuje:

  int a=0;
  int b=0;

   do
     {
      b++;
     }
   while(a>0);

   Alert("Wartość 'b' = ",b);

Wówczas wyskakujące okno Alert, na platformie MetaTrader powinno zaprezentować nam następującą treść:

pętle MQL
źródło: Platforma MetaTrader4

Gdyby zaś ‘a’ było większe niż 0, wówczas nastąpiłaby kolejna iteracja w pętli i trwałaby tak długo, dopóki a jest większe niż 0. Co można zrobić, by uniknąć pętli nieskończonej? Możemy zapisać, kiedy wartość ‘a’ ma maleć.

   int a =5;
   int b=0;

   do
     {
      b++;
      a--;
     }
   while(a>0);

   Alert("Wartość 'b' = ",b);
mql language
źródło: Platforma MetaTrader4

Przypisałem zmiennej ‘a’ wartość 5. Następnie przy każdej iteracji stosuję dekrementację (odejmujemy o 1). Pętla jest przerwana po piątej iteracji. Jest to bardzo ważne, aby przy zastosowaniu pętli z operatorem ‘while’, warunek był wartością zmieniającą się w czasie. Inaczej program nigdy nie przejdzie do dalszej części kodu. 

Petla MQL – mogę przerwać albo pominąć?

Programując, często nie potrzebujesz, by pętla mql została wykonana do końca. Wystarczy wyobrazić sobie sytuację, w której chcemy sprawdzić np. ostatnich 50 świec i znaleźć pierwszą, która ma np. wysokość powyżej 100 pipsów. W takiej sytuacji możemy przerwać pętle operatorem ‘break’, gdy znajdziemy szukaną wartość.

Stwórzmy zatem następujący kod:

   double wysokosc=0.0;
   int swieca=-1;

   for(int i=0; i<50; i++)
     {
      wysokosc= High[i]-Low[i];
      if(wysokosc>0.0100)
        {
         swieca=i;
         break;
        }
     }
   Alert("Najbliższa świeca powyżej 100 pipsów to świeca z indeksem: ",swieca);

Gdy wysokość świecy jest powyżej 100 pipsów, to przypisujemy wartość ‘i’, zmiennej ‘swieca’. Przerywamy pętle i w nowym oknie wyświetla się informacja, jaki indeks ma szukana przez nas świeca. Jeśli indeks wynosi 0, to oznacza, że obecna świeca jest tą, której szukamy, jeśli 1, tzn. że wcześniejsza, itp., itd.

Wiemy zatem, że możemy przerywać pętle, natomiast co w przypadku, gdy chcemy pomijać dane iterację. Przykładem jest sytuacja, w której zależy nam na zsumowaniu wartości korpusów wzrostowych świec, z ostatnich 50 świec. W takim wypadku chcemy pomijać wszystkie spadkowe świece. Potrzebujemy skorzystać z operatora kontynuacji – continue.

   double suma=0.0;
   double korpus =0.0;

   for(int i=1; i<51; i++)
     {
      korpus=Close[i]-Low[i];
      if(korpus<0)
        {
         continue;
        }
      suma+=korpus;
     }
   Alert("W ciągu ostatnich 50 świec, suma pipsów wzrostowych świec to: ",suma);

Pętla MQL- podsumowanie

Pętle mql, czyli te które znaleźć możemy w języku mql4 oraz mql5, to te same pętle znane programistom C++. Mają one dosyć szerokie zastosowanie. Możemy je wykorzystać, zarówno do prostych obliczeń, jak i też zawiłych czynności. Poznałeś ich konstrukcję. Teraz będzie Ci łatwiej je wykorzystać.

Stawiając pierwsze kroki z pętlami w MQL, ucz się na przykładach, które rozumiesz. Sprawdzenie trudnej i skomplikowanej (przynajmniej na pierwszy rzut oka) funkcji wykorzystującej pętle, spowoduje tylko niepotrzebny zamęt w Twojej głowie. Najlepiej poćwiczyć ich wykorzystanie za pomocą prostych zadań. Mogą one dotyczyć np. sprawdzenia ile świec jest wzrostowych, bądź które z otwartych pozycji jest najbliższe do zlecenia obronnego stop loss. Co byś nie robił – pamiętaj, że najważniejsze to mieć z tego frajdę 🙂

Możesz również polubić…