Część 8: Jak zaprogramować narzędzie do ochrony wypracowanego już zysku? Prezentujemy kod funkcji przesuwającej zlecenie stop loss do poziomu otwarcia pozycji, czyli tzw. metodę „breakeven”.

Najwyższa pora, by wyposażyć naszego robota inwestycyjnego w funkcję do przesuwania zlecenia stop loss z pierwotnego poziomu na poziom otwarcia pozycji.

Aktualizacja: 06.02.2017 14:31 Publikacja: 31.10.2016 13:11

Część 8: Jak zaprogramować narzędzie do ochrony wypracowanego już zysku? Prezentujemy kod funkcji przesuwającej zlecenie stop loss do poziomu otwarcia pozycji, czyli tzw. metodę „breakeven”.

Foto: Archiwum

Mowa więc będzie o przesunięciu do poziomu równowagi, w literaturze określanego najczęściej angielską nazwą „breakeven". Przy tej okazji wyjaśnimy czytelnikom, jak działa funkcja „OrderModify()" oraz pokażemy kilka kolejnych istotnych narzędzi do zarządzania otwartymi pozycjami.

Ochrona zysku

Zacznijmy od praktyki. W strategiach inwestycyjnych często stosuje się rozwiązania, których zadaniem jest ochrona wypracowanego dotychczas zysku. Nie chcemy stracić tego, co dotychczas zostało zarobione, więc modyfikujemy nasze zlecenie obronne. Rozwiązaniem minimum jest zastosowanie właśnie metody „breakeven", czyli przesunięcie stop lossa do poziomu otwarcia pozycji. To gwarantuje nam, że w razie niekorzystnej zmiany kursu przynajmniej wyjdziemy na zero. Do takich rozwiązań nie jest potrzebny robot – można to robić ręcznie, tylko trzeba obserwować wykres i saldo rachunku. W naszym technicznym portfelu „Parkietu" założenia dotyczące przesunięć stop lossa często stosuje Przemysław Smoliński, analityk DM PKO BP.

Aby zastosować metodę „breakeven", należy na początku określić zakres korzystnej zmiany notowań, po której zlecenie obronne powinno zostać przesunięte. Dla pozycji długich będziemy więc podnosić stop lossa do poziomu wejścia, jeśli notowania wzrosną o przyjętą przez nas liczbę pipsów. Dla pozycji krótkich będziemy go obniżać, jeżeli notowania spadną o taką samą wartość.

Na potrzeby tego dodatku przyjęliśmy założenia, że zmiana uprawniająca do zastosowania „breakeven" wynosi 15 pipsów. Dlatego też w edytorze kodu stworzyliśmy dodatkową zmienną BE, która ma typ double i przypisaną wartość 15 pipsów: „double BE=0.0015". Jest to zmienna globalna, więc umieszczamy ją w górnej przestrzeni pod zmiennymi określającymi stop loss i take profit.

Warunki do „breakeven"

Przejdźmy teraz do zaprogramowania samego procesu przesunięcia zlecenia. W tym celu stworzymy własną funkcję, którą nazwiemy „Breakeven()". Jest to, podobnie jak prezentowana w poprzednim materiale funkcja do zamykania pozycji „ClosePosition()", procedura, czyli zbiór instrukcji do wykonania. Dlatego typ funkcji „Breakeven" to „void". Na ilustracji powyżej prezentujemy jej kod, a w dalszej części tekstu dokładnie go omawiamy.

Stosując rozwiązanie „breakeven", nasz robot działa już na otwartej pozycji, dlatego musimy zastosować omawianą już wcześniej funkcję „OrderSelect()". Służy ona do zaznaczenia aktywnego zlecenia. Ponieważ nasz robot zawsze ma otwartą tylko jedną pozycją, to zawsze będzie ona miała indeks 0. Musimy jednak rozróżnić, czy jest to pozycja długa, czy krótka. Stąd w następnej linijce pojawia się instrukcja warunkowa „if". Za pomocą funkcji „OrderType()" sprawdza ona, z jaką pozycją mamy do czynienia („OP_BUY" to długa, „OP_SELL" to krótka).

Jeśli pozycja jest długa, to robot musi sprawdzić, czy różnica między aktualnym kursem a kursem otwarcia zaznaczonej pozycji jest większa niż przyjęty zakres „BE", czyli 15 pipsów. Kurs otwarcia uzyskamy przez wywołanie funkcji „OrderOpenPrice()", a aktualną cenę poprzez zmienną predefiniowaną „Bid". Jeśli warunek zostanie spełniony, to pozostaje tylko sprawdzić, czy już wcześniej nie dokonano przesunięcia. W tym celu sprawdzamy dodatkowy warunek, czy kurs otwarcia pozycji jest większy niż poziom pierwotnego stop lossa (wywoływany funkcją „OrderStopLoss()"). Jeśli tak, to robot ma już zielone światło do modyfikacji. Analogicznie należy postępować w przypadku pozycji krótkich, przy czym zakres zmian obliczamy przez odjęcie od ceny otwarcia ceny „Ask", a cena otwarcia ma być mniejsza niż pierwotny stop loss.

Funkcja modyfikująca

Jeśli wszystkie warunki do przesunięcia zlecenia stop loss są spełnione, to robot może użyć funkcji modyfikującej „OrderModify()" do zastosowanie mechanizmu breakeven. Funkcja modyfikująca ma typ logiczny „bool" – zwraca „true", gdy wprowadzne zmiany się powiodą, lub „false" w przeciwnym wypadku.

Na powyższej ilustracji zaprezentowany jest nagłówek funkcji OrderModify() wraz z parametrami i ich typami. Mamy tam sześć parametrów, kolejno: identyfikator zlecenia (unikalny numer zlecenia, które modyfikujemy), cenę otwarcia (tylko dla zleceń oczekujących, w naszym przypadku będzie to po prostu pierwotna cena otwarcia), nowy stop loss (poziom stop lossa po przesunięciu), nowy take profit (poziom take profit po przesunięciu), czas wygaśnięcia (tylko dla zleceń oczekujących, dlatego u nas przyjmuje wartość 0) oraz kolor strzałki prezentowanej na wykresie (parametr ten może zostać pominięty lub możemy tam wpisać etykietę „CLR_NONE", wówczas na wykresach nie będą one prezentowane).

Jak łatwo się domyślić, w naszym przypadku modyfikacji ulegnie tylko trzeci parametr. Zamiast poziomu pierwotnego stop lossa wpiszemy tam poziom otwarcia pozycji, bo to właśnie do niej linia obrony ma być przesunięta. W miejsce parametru trzeciego wystarczy więc wpisać funkcję „OrderOpenPrice()", która zwraca cenę otwarcia modyfikowanej pozycji.

Tym sposobem, przy wykorzystaniu kilku linijek kodu bazujących w większości na poznanych już elementach języka MQL, stworzyliśmy prostą funkcję do ochrony wypracowanego przez robota zysku. Aby zaczęła ona działać, musimy wywołać ją wewnątrz funkcji „OnTick()", poprzez wpisanie: „Breakeven();".

Następnie za pomocą skrótu klawiszowego „F6" możemy wywołać moduł testujący i sprawdzić, jak działa nasza modyfikacja. Po wykonaniu testu w zakładce „Rezultaty" zaznaczone są zlecenia, w których zastosowana została modyfikacja (bo spełnione zostały warunki do breakeven), a na wykresie można zobaczyć, jak zadziałało to w praktyce.

Na koniec tego materiału chcieliśmy wspomnieć, że kod naszego robota liczy już sobie prawie 100 linijek. Z uwagi na fizyczne ograniczenia trudno będzie umieścić go w całości na kolumnie gazety. Dlatego zainteresowanych zachęcamy do wysyłania e-maila do autora z prośbą o udostępnienie kodu. Chętnie zapoznamy się też z konstruktywną krytyką, sugestiami oraz modyfikacjami, które mogą usprawnić jego działanie.

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?