Podstawy programowania strategii w MQL4 (część 9)

W artykule pokazujemy, jak zaprogramować mechanizm stop lossa kroczącego. Poruszamy też kwestię zmiennych zewnętrznych.

Publikacja: 09.09.2016 08:31

Podstawy programowania strategii w MQL4 (część 9)

Foto: GG Parkiet

W dzisiejszym odcinku „Profesjonalnego inwestora" kontynuujemy podjęty poprzednim razem temat dotyczący ochrony wypracowanego zysku. Tydzień temu pokazaliśmy, jak zaprogramować funkcję „Breakeven", która po odpowiednio dużej, korzystnej zmianie kursu automatycznie przesunie nam zlecenie stop loss do poziomu otwarcia pozycji. Dziś pokażemy, jak stworzyć funkcję, które będzie ten stop loss podwyższać jeszcze bardziej. Zajmiemy się więc kodowaniem stopa kroczącego, z ang. „trailing stop".

Ruchoma linia obrony

Narzędzie stopa kroczącego jest bardzo często wykorzystywane w automatycznych i półautomatycznych strategiach inwestycyjnych. Jego zadaniem jest przesuwanie zlecenia stop loss wraz z korzystną zmianą kursu. Co istotne, mechanizm ten działa tak, że stop nie może się już cofnąć – albo pozostaje na poprzednim poziomie, albo zmienia się w kierunku korzystnej zmiany kursu. Dlatego też dla pozycji długich „trailing stop" będzie funkcją niemalejącą, a dla krótkich nierosnącą.

Przy programowaniu tego narzędzia warto sobie odpowiedzieć na dwa pytania. Po pierwsze – kiedy stop kroczący ma zostać aktywowany? Innymi słowy – jak dużo robot musi zarobić, by włączyć ochronę zysku. Po drugie – w jakiej odległości od aktualnej ceny ma być stop loss utrzymywany? Tutaj ustalamy więc, w jaki sposób nasza linia obrony będzie kroczyć.

Na potrzeby naszego cyklu ustaliliśmy, że stop kroczący będzie aktywowany, gdy kurs EUR/USD oddali się od ceny otwarcia pozycji o 25 pipsów na naszą korzyść. Zlecenie będzie natomiast tak przesuwane, by jego odległość od aktualnego kursu wynosiła zawsze 15 pipsów. Ustalenia te są oczywiście jednymi z wielu możliwych i raczej nadają się do aktywnej gry (stop zależny od aktualnej ceny Bid lub Ask). Kodowanie daje na szczęście tak dużą elastyczność, że mechanizm przesuwania linii obrony można uzależnić na przykład od poprzedniej ceny minimalnej bądź maksymalnej i ówczesnej wartości wskaźnika zmienności ATR. Wszystko zależy od potrzeb i wyobraźni programisty. My chcemy tylko zarysować podstawową mechanikę działania i kodowania takiego narzędzia.

Trailing Stop w MQL

Czytelnicy, którzy zapoznali się z poprzednim artykułem tego cyklu, mogą się domyślać, że do zaprogramowania stopa kroczącego również wykorzystamy funkcję OrderModify(), a logika instrukcji warunkowych będzie zbliżona do tych wykorzystywanych przy tworzeniu „Breakeven". Zanim jednak przejdziemy do tworzenia samej funkcji, musimy zainicjować w przestrzeni globalnej dwie nowe zmienne. Pierwsza przechowywać będzie poziom aktywacji stopa. Nazwiemy ją „TrailStart", przypiszemy wartość 0.0025 i nadamy typ „double". Będzie więc ona wyglądać następująco: „double TrailStop=0.0025;". Druga przechowywać będzie odległość, w jakiej stop ma być utrzymywany od obecnej ceny. Nazwiemy ją „TrailStep", przypiszemy wartość 0.0015 i nadamy również typ „double". Będzie więc ona wyglądać tak: „double TrailStep=0.0015;".

Naszą funkcję przesuwającą stop nazwiemy po prostu „TrailingStop()". Jej kod widoczny jest na ilustracji powyżej. Podobnie jak nasze poprzednie dzieło „Breakeven", ta funkcja również będzie procedurą, stąd typ „void".

Wewnątrz nawiasów klamrowych umieszczamy instrukcje do wykonania. Standardowo zaczynamy od zaznaczenia zlecenia przy użyciu funkcji „OrderSelect()". Następnie musimy sprawdzić, czy zaznaczona pozycja jest długa czy krótka. Jeśli długa, to należy w pierwszej kolejności sprawdzić, czy aktualna cena przekroczyła już poziom aktywacji kroczącego stopa. Stąd w kodzie znajduje się warunek sprawdzający, czy różnica między aktualną ceną „Bid" a ceną otwarcia pozycji jest większa niż 0.0025 (wielkość „TrailStart"). W tym właśnie miejscu robot sprawdza, czy zarobił już na tyle dużo, by móc włączyć mechanizm kroczącej linii obrony. Jeśli tak, to musi dokonać jeszcze jednego sprawdzenia – czy aktualny stop loss jest położony niżej niż cena „Bid" pomniejszona o wartość „TrailStep", czyli 0.0015. W tym miejscu robot sprawdza więc, czy stop loss utrzymywany jest na właściwym poziomie. Jeśli jest za nisko (czyli warunek jest spełniony), to przy pomocu funkcji „OrderModify()" stop loss zostanie po prostu podciągnięty do wymaganego poziomu.

Tutaj warto zaznaczyć, że w następnym wywołaniu naszej funkcji „TrailingStop()", funkcja „OrderStopLoss()" będzie już zaktualizowana o nową wartość, wynikającą z dokonanej modyfikacji. Jeśli do tego momentu cena „Bid" się obniży, to robot nie będzie stopa modyfikował. Jeśli natomiast pójdzie w górę, wówczas po raz kolejny zostanie wywołana funkcja „OrderModify()".

Dla pozycji krótkich mechanizm działa analogicznie, z tym że używamy ceny „Ask", a stop umieszczany jest powyżej aktualnych kwotowań (patrz ilustracja). Aby uruchomić nasza nową funkcję, musimy ją wywołać wewnątrz funkcji „OnTick()".

Zmienne zewnętrzne

Na koniec tego artykułu chcielibyśmy pokazać pewną dodatkową opcję, która może ułatwić większe spersonalizowanie obsługi naszego robota. Chodzi mianowicie o zastosowanie zmiennych zewnętrznych, które deklarujemy w przestrzeni globalnej, a przed ich nazwą oraz typem stosujemy słowo „extern". Dzięki nim deklarowane zmienne są parametrami, które możemy modyfikować w oknie pojawiającym się, gdy uruchamiamy naszego robota na wykresie.

Przykładowo, możemy zdefiniować sobie zmienną typu logicznego „bool" o nazwie „TrailingNeeded", której domyślnie przypiszemy wartość „true". Jeśli przed wywołaniem funkcji „TrailingStop()" umieścimy warunek „if (TrailingNeeded) TrailingStop();", to robot będzie używał naszej funkcji do stopa kroczącego. Jeśli jednak we wspomnianym oknie zmienimy wartość parametru „TrailingNeeded" z „true" na „false", wówczas robot owej funkcji nie będzie stosował.

Zmienne zewnętrzne możemy zastosować do wszystkich zmiennych globalnych. Dzięki temu stop loss, take profit, BE itp. mogą być modyfikowane indywidualnie nie z poziomu kodu MQL, ale już w oknie parametrów naszego robota.

[email protected]

Materiał Partnera
Zasadność ekonomiczna i techniczna inwestycji samorządów w OZE
Inwestycje
ESRS G1 Postępowanie w biznesie
Inwestycje
Złoto już powyżej 3300 dolarów za uncję
Inwestycje
Złoto może być nawet dwa razy droższe
Inwestycje
Krajowy popyt na obligacje nie odpuszcza
Inwestycje
Trump przegrywa we własną grę. Na rynkach ogromny chaos