Podstawy programowania strategii w języku MQL4 (część 5)

W dzisiejszym odcinku pokazujemy, jak stworzyć prostego robota inwestycyjnego, korzystającego z poznanych dotąd narzędzi. Do jego wypróbowania wystarczy demo Meta Trader.

Publikacja: 12.08.2016 06:00

Podstawy programowania strategii w języku MQL4 (część 5)

Foto: GG Parkiet

W ostatnich kilku odcinkach cyklu poświęconego automatyzacji handlu opisaliśmy budowę składni języka MQL. Pokazaliśmy, czym są i do czego służą zmienne, operatory, instrukcje warunkowe, pętle oraz funkcje. Za pomocą tych elementów możemy budować wskaźniki, skrypty oraz strategie inwestycyjne. Dziś pokażemy, jak napisać prostą strategię, wykorzystując to, o czym dotychczas pisaliśmy. Od razu zaznaczmy, że nie będzie to zaawansowany automat zarabiający pieniądze. Jego celem jest tylko pokazanie, jak tworzyć kod programu. Będzie to prosty model bazujący na wyglądzie ostatniej świecy.

Tworzymy nowy EA

Budowanie automatu transakcyjnego zaczynamy oczywiście od uruchomienia Meta Editora, który kryje się w górnym pasku menu Meta Tradera, pod ikonką przypominającą książkę. Po otwarciu edytora należy wybrać „Plik", a następnie „Nowy". Wówczas pojawi nam się okno, w którym możemy wybrać, jaki rodzaj narzędzi będziemy tworzyć. Nas interesuje EA, czyli z ang. Expert Advisor, w wolnym tłumaczeniu oznaczający automatyczną strategię inwestycyjną. Kiedy klikniemy „Dalej", pokaże nam się okno kreatora, w którym możemy zdefiniować nazwę EA, podać autora oraz zdefiniować niektóre zmienne wejściowe, jak na przykład poziom stop loss i take profit. Nie musimy tego robić tutaj, będziemy mieć na to mnóstwo miejsca po otwarciu edytora kodu.

Po kliknięciu „Zakończ" otworzy nam się okno Meta Editora z wygenerowanym kodem startowym. Na obrazku obok jest pokazany przykład takiego kodu wraz z opisem poszczególnych elementów. U samej góry mamy tzw. dyrektywy preprocesora. Od innych elementów kodu odróżnia je to, że zaczynają się od znaku „#". Jak czytamy na stronach Bossafx.pl, „preprocessor jest to specjalny podprogram kompilatora MQL4, uruchamiany tylko podczas kompilacji kodu źródłowego mq4 do kodu wykonywalnego ex4". Na potrzeby tego odcinka nie musimy specjalnie zagłębiać się w ten temat.

Oprócz dyrektyw w kodzie startowym mamy również trzy funkcje specjalne, opisywane w poprzednim odcinku: OnInit() (odpowiedzialna za inicjalizację EA), OnDeinit() (odpowiedzialną za zakończenie działania EA) oraz OnTick() (używana tylko dla EA, by aktualizować działanie EA po każdym nowym ticku na wykresie).

Miejsce pomiędzy dyrektywami oraz funkcjami specjalnymi to przestrzeń globalna, w której będziemy deklarować zmienne i tworzyć własne funkcje. Istnieje niepisana zasada, że zmienne deklarujemy na górze (nad OnInit), a funkcje na dole (pod OnTick).

Deklaracja zmiennych

Zacznijmy od ustalenia zmiennych. Wiemy już, jak je nazywać i deklarować, ale nie wiemy jeszcze, że rozróżnia się zmienne globalne i lokalne. Te pierwsze deklarowane są w przestrzeni globalnej i dzięki temu widoczne są dla wszystkich wykorzystywanych w kodzie funkcji. Dzięki temu odwołanie się do zmiennej globalnej wewnątrz jakiejś funkcji będzie dla programu czytelne. Ze zmiennymi lokalnymi natomiast mamy do czynienia wtedy, gdy są one deklarowane tylko wewnątrz jakiejś funkcji i tylko przez tę funkcje są rozpoznawane. Przykładowo – jeśli w przestrzeni globalnej zadeklarujemy zmienną: „string globalna", a wewnątrz funkcji OnInict() zmienną: „string lokalna", i będziemy chcieli obie zmienne wykorzystać w funkcji OnTick(), pojawi nam się błąd przy kompilacji programu, że zmienna „lokalna" jest nierozpoznana. Dlatego właśnie przy deklarowaniu zmiennych należy dobrze się zastanowić, które mają bardziej uniwersalny charakter, a które są specyficzne.

W naszym prostym EA będziemy potrzebować dwóch uniwersalnych zmiennych pokazujących odległości zleceń stop loss i take profit. Będą one wykorzystywane później m.in. w poznanej tydzień temu funkcji OrderSend(), dlatego zadeklarujemy je w przestrzeni globalnej. Na obrazku obok widzimy, jak mogą one zostać zadeklarowane. Dla obu wykorzystaliśmy typ double, ponieważ wyrażone są one w cenach. Zakładając, że będziemy grać tylko na parze EUR/USD, możemy z góry przyjąć, że odległość zlecenia obronnego będzie wynosić 50 pipsów (0,005), a zlecenia realizującego zysk 150 pipsów (0,015), zgodnie z zasadą, by zachować relację zysk/ryzyko na poziomie 3 do 1. Przypominamy, że nadając zmiennym wartości za pomocą operatora przypisania „=", dokonujemy tzw. inicjacji zmiennych. W tym miejscu warto też wspomnieć, że na końcu każdej deklaracji stawiamy średnik. Jego brak jest jednym z najczęściej popełnianych błędów na początku przygody z programowaniem.

Kryteria kupna i sprzedaży

Na potrzeby tego odcinka stworzymy proste reguły transakcji, imitujące grę z trendem. I tak pozycję długą będziemy otwierać tylko wtedy, gdy na wykresie pojawiły się trzy wzrostowe świece z rzędu, a krótką, gdy pojawiły się trzy spadkowe świece. Aby stworzyć takie kryteria za pomocą MQL, musimy wykorzystać instrukcję warunkową „if". Z kolei przy tworzeniu warunku musimy wykorzystać dwie zmienne tablicowe (dla cen otwarcia Open[] oraz zamknięcia Close[]), operator logiczny „AND" (symbol „&&") oraz operatory porównania „". Na obrazku obok widoczne są oba warunku – dla kupna i sprzedaży. Zwracamy tylko uwagę, że numery w zmiennych tablicowych: 1, 2, 3 – to indeksy ostatnich trzech, zbudowanych już świec (ta dopiero budowana ma indeks 0).

Jeżeli warunki kupna bądź sprzedaży są spełnione, to mamy zielone światło do wysłania zlecenia na rynek. W tym celu wykorzystujemy funkcję OrderSend(). Na obrazku obok widzimy tę funkcję dla zlecenia sprzedaży wraz z odpowiednimi parametrami, kolejno: handlujemy na parze EUR/USD, po trzech spadkowych świecach otwieramy pozycję krótką, stąd etykieta „OP_SELL"; sprzedajemy 1 lota, transakcja zawierana jest po cenie niższej, czyli Bid, dopuszczalny poślizg wynosi 50 pipsów, zlecenie stop loss oddalone jest w górę od aktualnej ceny o wielkość zmiennej stop_loss, a zlecenie take profit oddalone jest w dół o wielkość zmiennej take_profit.

Tak zbudowane instrukcje warunkowe wraz z funkcjami składającymi zlecenia należy umieścić wewnątrz funkcji OnTick(). Dzięki temu nasz robot będzie na bieżąco monitorował rynek i gdy na danym wykresie EUR/USD pojawi się odpowiednia seria świec, zostanie zawarta transakcja i ustawione zlecenia stop loss i take profit.

Zachęcamy czytelników do wypróbowania powyższych instrukcji na demo Meta Tradera. Tylko pisząc kod, można się nauczyć programować. Osoby, które spróbują swoich sił, zauważą, że robot zawiera transakcje przy każdym ticku cenowym, a nie tylko wtedy, gdy pojawia się na wykresie nowa świeca. Dlaczego? O tym w kolejnym odcinku „Profesjonalnego inwestora".

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?