Podstawy programowania strategii w języku MQL, cz. 3

W dzisiejszym odcinku cyklu pokazujemy, jak działają instrukcje warunkowe „if" oraz „if else", a także pętle „for" i „while". Narzędzia te dają nam bardzo wiele możliwości.

Publikacja: 29.07.2016 06:23

Powyższy obrazek pokazuje okno Meta Editora z przykładowym zastosowaniem instrukcji warunkowej „if”.

Powyższy obrazek pokazuje okno Meta Editora z przykładowym zastosowaniem instrukcji warunkowej „if”. Na początku zadeklarowane są dwie zmienne typu bool (typ logiczny): przeciecie_sredniej oraz oscylatro_stoch. W praktyce pod tymi zmiennymi kryłyby się wartości funkcji („true” albo „false”) sprawdzających, czy na wykresie spełnione są odpowiednie warunki dotyczące położenia średnich kroczących oraz oscylatora. Jeżeli oba warunki są spełnione (wykorzystanie operatora logicznego „&&”), algorytm wysyłałby zlecenie na rynek. Gdyby jednak jeden z warunków albo obydwa spełnione nie były, program pominąłby instrukcje składania zlecenia. Jak widać – operator „if” podobnie jak typ zmiennych „bool” podświetlone są na niebiesko, z kolei funkcja „OrderSend()” na fioletowo. Kolorowanie składni ułatwia nawigację kodu.

Foto: GG Parkiet

Kontynuujemy nasz cykl artykułów poświęcony programowaniu narzędzi inwestycyjnych w języku MQL. Jak dotąd opisaliśmy typy zmiennych – zwykłe i tablicowe, rodzaje operacji, które mogą być na owych zmiennych przeprowadzane, oraz metody dodawania komentarzy w kodzie, które znacznie ułatwiają proces programowania. Dziś zajmiemy się kolejnymi elementami MQL, które znacznie poszerzają możliwości kodowania. Omówimy instrukcje warunkowe „if" i „if else" oraz pętle „for" i „while".

Instrukcje warunkowe

Bardzo istotną cechą algorytmów inwestycyjnych jest możliwość podejmowania przez nie decyzji. Często zdarza się bowiem, że program na podstawie zastanych okoliczności musi po prostu dokonać odpowiedniego wyboru. Załóżmy przykładowo, że budujemy robota, który otwiera pozycje tylko w warunkach podwyższonej zmienności, mierzonej wskaźnikiem ATR. Aby algorytm wiedział, jak postępować, musimy użyć w kodzie instrukcji warunkowej „if". Jest to zwykłe wyrażenie „jeżeli", które uzależnia wykonanie pewnych instrukcji od spełnienia odpowiednich warunków. W naszym przykładzie warunkiem byłaby zmienność większa od konkretnego poziomu (na przykład ATR>100 pipsów), a instrukcją do wykonania – złożenie zlecenia na rynku. Czytelnicy, którzy zapoznali się z poprzednim artykułem cyklu, od razu zauważą, że w instrukcjach warunkowych wykorzystuje się operatory relacji – w tym przypadku operator większości „>", dzięki którym można porównać zmienne i zwrócić programowi wartość „true" lub „false".

Składnia instrukcji warunkowej wygląda następująco: „if (warunek) instrukcja;". Jeżeli warunek w nawiasie jest spełniony, czyli zwracana jest wartość „true", program wykona instrukcję. Jeśli warunek nie jest spełniony („false"), wówczas instrukcja jest pomijana. Tutaj warto wspomnieć, że instrukcji może być więcej niż jedna, wówczas ma ona postać blokową i zajmuje kilka linijek kodu. W takiej sytuacji instrukcja warunkowa ma postać: „if (warunek) {instrukcja1; instrukcja2; instrukcja3;}". Jeśli więc instrukcji do wykonania jest więcej niż jedna, musimy je zamknąć w nawias klamrowy, a każdą instrukcję kończyć średnikiem.

Ponadto – także warunków może być więcej niż jeden. W takiej sytuacji „łączymy" je za pomocą operatorów logicznych, o których pisaliśmy tydzień temu, czyli „AND" (&&) albo „OR" (||), albo logiczne zaprzeczenie (!). Przypominamy tutaj, że od wyboru operatora zależy sposób podejmowania decyzji i zwracana wartość „true" lub „false".

Wracając jeszcze do przykładu z uzależnieniem złożenia zlecenia od wielkości ATR, warto wspomnieć, że programowi można również zapisać instrukcję wykonywaną, gdy zwracana jest wartość „false". Jeżeli zatem ATR jest mniejszy lub równy 100 pipsów, możemy „poprosić" program o wysłanie komunikatu typu: „Nie można złożyć zlecenia. Za niska zmienność". W tym celu wykorzystujemy operator „else", który mówi po prostu, co program ma zrobić w przeciwnym przypadku. Trzymając się naszego przykładu, wyglądałoby to mniej więcej tak: „if(ATR>100) kupuj; else Print("Nie można złożyć zlecenia. Za niska zmienność.");". Widać więc od razu, że instrukcja „if else" pozwala zdecydować, która z dwóch instrukcji (albo bloków instrukcji) ma być wykonana. Dzięki temu możemy jeszcze bardziej rozbudować nasz algorytm i „przygotować" go na różne rynkowe scenariusze. Instrukcje warunkowe są jednymi z najczęściej wykorzystywanych w pisaniu strategii, dlatego warto dobrze się z nimi zapoznać.

Pętle „for" i „while"

Często zdarza się, że chcemy, by nasz inwestycyjny robot wykonywał jedno i to samo zadanie wiele razy. Na przykład dodawał do każdej nowej ceny otwarcia wartość wskaźnika zmienności ATR, tworząc tym samym coś w rodzaju progu wybicia, po którego przekroczeniu może zostać zawarta transakcja. Aby coś takiego stworzyć, najlepiej użyć pętli, czyli specjalnej instrukcji, która będzie wykonywać określone zadanie określoną liczbę razy (pętla „for") lub dopóki jakiś warunek jest spełniony (pętla „while").

Zacznijmy od pętli „for". Jej schemat wygląda następująco: „for(inicjalizacja; warunek pętli; aktualizacja) {instrukcja do wykonania}". W praktyce może to wyglądać tak: „for(int i=0; i

Co to wszystko oznacza? Żeby zdefiniować programowi powtarzanie czynności pętlą for, należy odpowiedzieć sobie na trzy pytania. Po pierwsze – od czego należy zacząć, czyli jaką wartość przyjmuje na początku licznik pętli (inicjalizacja)? Licznik jest zawsze liczbą całkowitą, bo pętla może się wykonać 5 czy 10 razy, ale nie 2,5 razy (stąd deklaracja zmiennej: „int i=0;"). W naszym przypadku zaczynamy od 0 (może to być na przykład numer świecy). Drugie pytanie – co dzieje się w następnym kroku z licznikiem „i" (aktualizacja)? W naszym przypadku „i++" oznacza inkrementację, czyli zwiększanie o 1 (na przykład sprawdzanie każdej kolejnej świecy). W kolejnych krokach „i" będzie przyjmować wartości 1, 2, 3 itd. I w końcu trzecie pytanie – jak długo licznik „i" będzie się zwiększał (warunek pętli)? W naszym przykładzie pętla będzie wykonywana, dopóki „i" jest mniejsze od 10 – dopóki to wyrażenie jest prawdziwe, dopóty schemat będzie działał i wykonywana będzie instrukcja zapisana w nawiasach klamrowych. W naszym przykładzie pętla „for" wypisałaby funkcją „Print()" dziesięć razy komunikat „Wykonanie pętli numer: i", wpisując zamiast „i" kolejno cyfry od 0 do 9.

Pętla „while" wygląda jak pętla „for" pozbawiona inicjalizacji i aktualizacji – zostaje sam warunek i instrukcja do wykonania. W tym przypadku program sprawdza, czy warunek w nawiasach jest spełniony (zwraca wartość „true"), a jeśli tak, to wykonywana jest instrukcja z nawiasów klamrowych. Przykładowa pętla może więc wyglądać następująco: „while(liczba_pozycji

Sposób działania instrukcji warunkowych oraz pętli najlepiej zrozumieć poprzez samodzielne ich napisanie w MetaEditorze, skompilowanie i sprawdzenie wyniku. Można również kopiować instrukcje dostępne w sieci (na forach lub serwisach dedykowanych MQL) i studiować ich kod oraz działanie.

Zainteresowanych pogłębieniem wiedzy odsyłamy do wideobloga pod adresem: https://www.youtube.com/user/Jimdandy1958/featured. Autor od blisko trzech lat tworzy filmy szkoleniowe, na których od podstaw pokazuje programowanie MQL. Temat pętli jest poruszany m.in. w trzeciej części odcinka 9., przy okazji tworzenia wskaźnika MACD.

Inwestycje
Tomasz Bursa, OPTI TFI: WIG ma szanse na rekord, nawet na 100 tys. pkt.
https://track.adform.net/adfserve/?bn=77855207;1x1inv=1;srctype=3;gdpr=${gdpr};gdpr_consent=${gdpr_consent_50};ord=[timestamp]
Inwestycje
Emil Łobodziński, BM PKO BP: Nasz rynek pozostaje atrakcyjny, ale...
Inwestycje
GPW i rajd św. Mikołaja. Czy to może się udać?
Inwestycje
Co dalej z WIG20? Czy zbliża się moment korekty spadkowej?
Materiał Promocyjny
Cyfrowe narzędzia to podstawa działań przedsiębiorstwa, które chce być konkurencyjne
Inwestycje
Ropa naftowa szuka pretekstu do ruchu w górę
Inwestycje
O tym huczy cała Wall Street. Jak Saylor zahipnotyzował inwestorów?