MQL – Mój pierwszy skrypt

MQL - roboty inwestycyjne

Zapraszam do trzeciej części kursu poświęconego językowi MQL. W pierwszej poznaliśmy jego podstawy oraz środowisko programistyczne MetaEditor. W drugiej stworzyliśmy pierwszy wskaźnik analizy technicznej. Nadszedł czas na implementację własnego skryptu. Jak pewnie pamiętasz, chodzi o programy, które wykonują się tylko raz, po czym automatycznie przestają działać.

Założenia

Czy zawsze pamiętasz o ustawieniu poziomu stop loss dla swoich zleceń giełdowych? Jak wiadomo, zarządzanie pozycjami jest obowiązkowym elementem wszystkich skutecznych strategii inwestycyjnych. Za każdym razem powinniśmy więc zabezpieczać otwieraną pozycję, ustawiając jej odpowiedni stop loss. Ma to ogromne znaczenie dla zainwestowanego kapitału.

Inaczej rzecz się ma z poziomem take profit. Ta kwestia nie jest już tak krytyczna. Wielu traderów wcale go nie używa, ale jest też spore grono korzystające z tego poziomu. Osobiście należę to tej pierwszej grupy. Prowadzę swoje pozycje, przesuwając poziom stop loss i pozwalam, by rynek sam je zamknął.

Stworzymy dzisiaj skrypt, który automatycznie ustawi za nas poziomy stop loss oraz take profit ,oddalony o ustaloną liczbę pipsów. Nie będzie to bardzo skomplikowany program, ale dzięki niemu poznasz kilka bardzo przydatnych funkcji języka MQL operujących na zleceniach.

Implementacja

Tworzenie skryptu za pomocą kreatora wygląda analogicznie jak w przypadku wskaźników. Jeśli któryś z jego kroków będzie niejasny, zapraszam do poprzedniego artykułu „MQL – Mój pierwszy wskaźnik”, gdzie znajdziesz dokładny opis poszczególnych etapów generowania programu za pomocą kreatora.

MQL - script

Wciskamy przycisk „Dalej” i na kolejnym ekranie uzupełniamy informacje dotyczące tworzonego skryptu.

MQL - custom script

To wszystko. Po wciśnięciu przycisku „Zakończ” środowisko wygeneruje nam szablon kodu skryptu.

MQL - custom script

Pierwsza rzecz, która rzuca się w oczy, to brak metod init() oraz deinit(). Wynika to ze specyfiki działania skryptów. Metoda start() wywoływana jest tylko raz. Nie ma więc potrzeby inicjalizacji i deinicjalizacji zmiennych. Nic nie stoi jednak na przeszkodzie, by dodać te funkcje.

Możemy zaczynać kodować. Pierwsze, co zrobimy, to dodamy właściwość show_inputs zaraz poniżej wcześniejszych parametrów copyright oraz link.

MQL - custom script

#property show_inputs – dodanie tej dyrektywy wymusza po każdym uruchomieniu skryptu podanie jego parametrów wejściowych. Jeśli nie wymaga on żadnych danych z zewnątrz, można usunąć ten element.

 

Nie chcemy, by stop loss oraz take profit były na sztywno zdefiniowane w kodzie. Zależy nam na tym, by można było dopasować te wartości do każdej pary walutowej oraz do każdego interwału czasowego. Dlatego dodamy parametry wejściowe dla naszego skryptu. Definiujemy je podobnie jak zwykle zmienne, ale dodatkowo przed typem zmiennej należy dodać słówko extern.

MQL - custom script

Przy każdym uruchomieniu skryptu będziemy mogli podać poziom stop loss oraz take profit lub wykorzystać ich wartości domyślne. Powyższe dwie linie kodu umieszczamy poniżej zdefiniowanych dyrektyw #property, a powyżej metody start().

Czas na logikę działania skryptu. Przyjrzyjmy się jej, krok po kroku.

MQL - custom script
MQL - custom script

W metodzie start() definiujemy zmienną pomocniczą i oraz total, do której przypisujemy wartość zwróconą poprzez funkcję OrdersTotal().

int OrdersTotal() – zwraca liczbę wszystkich otwartych oraz oczekujących zleceń

 
Następnie w pętli for iterując po każdym zleceniu, próbujemy ustawić im poziomy stop loss oraz take profit poprzez wywołanie metody setStopLossAndTakeProfit().

Wewnątrz niej zaczynamy od wybrania zlecenia do przetwarzania według podanej pozycji. Wykorzystujemy w tym celu metodę OrderSelect().

bool OrderSelect(int index, int select, int pool = MODE_TRADES) – funkcja wybiera zlecenie do przyszłego przetwarzania. Jeśli się to uda, zwróci true, w przeciwnym razie – false. Parametry:

  • index  – indeks zlecenia lub identyfikator (ticket) w zależności od drugiego parametru;
  • select – flaga wyboru trybu identyfikacji zlecenia; może przyjąć dwie wartości:
    • SELECT_BY_POS – wyszukiwanie poprzez pozycję zlecenia,
    • SELECT_BY_TICKET – wyszukiwanie według identyfikatora zlecenia;
  • pool – opcjonalny parametr używany, gdy parametr select ma wartość SELECT_BY_POS. Określa on, z której puli zleceń wybrać pozycję. W trybie MODE_TRADES (default) wybierze ze zleceń otwartych i oczekujących, a w trybie MODE_HISTORY wybrane zostanie zlecenie z historii (zlecenia zamknięte i anulowane).

 

Potrzebujemy jeszcze typ zlecenia oraz jego cenę otwarcia.

MQL - custom script

int OrderType() – zwraca typ zlecenia. Może to być jedna z wartości:

  • OP_BUY – pozycja kupna,
  • OP_SELL – pozycja sprzedaży,
  • OP_BUYLIMIT – zlecenie oczekujące typu buy limit
  • OP_BUYSTOP – zlecenie oczekujące typu buy stop
  • OP_SELLLIMIT – zlecenie oczekujące typu sell limit
  • OP_SELLSTOP – zlecenie oczekujące typu sell stop

 

double OrderOpenPrice() – zwraca cenę otwarcia wybranego wcześniej zlecenia (poprzez metodę OrderSelect()).

 
Na podstawie tych wartości oraz wartości punktowej symbolu jesteśmy w stanie określić poziomy S/L oraz T/P dla wybranego zlecenia.

MQL - custom script

double Point – obecna wartość punktowa symbolu

 
Mając te poziomy, pozostaje nam już tylko sama modyfikacja zlecenia. Służy do tego metoda OrderModify().

MQL - custom script

bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color = CLR_NONE) – metoda pozwalająca na zmianę parametrów otwartych zleceń bądź oczekujących na realizację. W przypadku sukcesu zwróci true, w przeciwnym razie – false. Parametry price oraz expiration mogą być modyfikowane tylko dla zleceń oczekujących. Parametry:

  • ticket – unikatowy identyfikator zlecenia
  • price – nowa cena zlecenia oczekującego
  • stoploss – nowy poziom stop loss
  • takeprofit – nowy poziom take profit
  • expiration – data wygaśnięcia zlecenia oczekującego
  • arrow_color – kolor strzałki

 
Ticket aktualnie przetwarzanego zlecenia otrzymaliśmy poprzez funkcję OrderTicket(), a jego cenę z metody OrderOpenPrice(). Pod parametry stoploss oraz takeprofit podstawiliśmy wyliczone przed chwilą wartości. Natomiast jako parametr expiration przekazaliśmy 0, ponieważ nie chcemy modyfikować daty wygaśnięcia. Dla zleceń już otwartych i tak nie mamy takiej możliwości. Koloru strzałki również nie ustawiamy.

int OrderTicket() – zwraca unikatowy numer (tzw. ticket) aktualnie wybranego zlecenia (poprzez metodę OrderSelect()).

 
Na koniec wykorzystaliśmy jeszcze metodę GetLastError(), która zwraca kod ostatniego błędu, jaki wystąpił. W naszym przypadku będzie to ewentualny błąd pochodzący z funkcji OderModify().

Kompilacja i instalacja

Brawo. Napisaliśmy właśnie nasz pierwszy skrypt. Wciskamy więc F5 (lub przycisk Kompiluj) i jeśli nie ma żadnych błędów, przechodzimy do platformy transakcyjnej Meta Trader.

Uruchomienie oraz testy

Zanim jednak uruchomimy nowo utworzony skrypt, otwórzmy kilka przykładowych pozycji. Może to być dowolna para walutowa, w dowolnym interwale czasowym. Pamiętajmy tylko, żeby nie ustawiać im poziomu stop loss oraz take profit. Tym ma się zająć nasz skrypt.

MQL - custom script

Podobnie jak w przypadku wskaźników, tutaj również możemy uruchomić nasz program na kilka sposobów. Wykorzystamy okno nawigatora, w którym lokalizujemy gałąź Skrypty, a w niej nasz skrypt Atena Script. Możemy dwukrotnie kliknąć lewym przyciskiem myszy na jego nazwie lub prawym przyciskiem i wybrać Zastosuj na wykresie.

MQL - custom script

Zanim skrypt zacznie działać, wyświetli się okno z jego właściwości, gdzie musimy podać mu parametry wejściowe (wymusiliśmy to poprzez dyrektywę #property show_inputs). W naszym przypadku będzie to liczba pipsów dla stop loss oraz dla take profit.

MQL - custom script

Wciśnijmy OK i spójrzmy na rezultat działania naszego kodu.

MQL - custom script

Jak widać, wszystkim zleceniom zostały ustawione poziomy S/L oraz T/P, czyli dokładnie to, o co nam chodziło.

Podsumowanie

Skrypty mogą być ciekawym narzędziem, które wyręczą nas w pewnych częstych i monotonnych czynnościach. Charakteryzują się tym, że po wykonaniu wszystkich zaprogramowanych czynności automatycznie kończą swoje działanie.

Jestem bardzo ciekaw Twojej opinii na ten temat. Podaj, proszę, w komentarzu przykłady zastosowania skryptów w inwestowaniu na rynkach finansowych. Może stosujesz już jakieś skrypty?

Dziękuję bardzo za poświęcony czas i zapraszam jeszcze do ostatniej, czwartej części kursu. Pokażę w niej, jak stworzyć własną, automatyczną strategię inwestycyjną.

  

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *