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ć.