Część 5: Tworzymy prostego robota inwestycyjnego, składającego się z poznanych dotąd elementów języka MQl. Do jego wypróbowania wystarczy demo platformy MetaTrader.

Po lekturze dotychczasowych materiałów tego dodatku wiemy już czym są i do czego służą zmienne, operatory, instrukcje warunkowe, pętle oraz funkcje.

Aktualizacja: 06.02.2017 14:42 Publikacja: 31.10.2016 11:48

Część 5: Tworzymy prostego robota inwestycyjnego, składającego się z poznanych dotąd elementów języka MQl. Do jego wypróbowania wystarczy demo platformy MetaTrader.

Foto: Archiwum

Za pomocą tych elementów możemy budować wskaźniki, skrypty oraz strategie inwestycyjne. Przyszedł więc czas, by zaprogramować własną strategię. Od razu zaznaczmy, że nie będzie to zaawansowany automat zarabiający pieniądze. Chcemy na prostym przykładzie pokazać, jak tworzyć kod programu. Będzie to prosty model bazujący na układzie ostatnich świec na wykresie.

Tworzymy nowy EA

Budowanie automatu transakcyjnego zaczynamy oczywiście od uruchomienia Meta Editora, który kryje się w górnym pasku menu MetaTradera, 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ę naszego 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 powyżej 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 tym etapie nauki programowania nie musimy specjalnie zagłębiać się w ten temat.

Oprócz dyrektyw w kodzie startowym mamy również trzy funkcje specjalne: 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 OnInit() 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 nie rozpoznana. Dlatego właśnie przy deklarowaniu zmiennych należy dobrze się zastanowić, które mają bardziej uniwersalny charakter (globalne), a które są specyficzne (lokalne).

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 już funkcji OrderSend(), dlatego zadeklarujemy je w przestrzeni globalnej. Na obrazku powyżej 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, przed czym już przestrzegaliśmy czytelników, jest jednym z najczęściej popełnianych błędów na początku przygody z programowaniem.

Kryteria kupna i sprzedaży

Zaprogramujmy teraz proste reguły zawierania 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 (cena zamknięcia wyższa od ceny otwarcia), a krótką, gdy pojawiły się trzy spadkowe świece (cena zamknięcia niższa od ceny otwarcia). 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 warunki – 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 MetaTradera. 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 tak się dzieje? O tym w następnym materiale.

Inwestycje
Promocja na ETF-y również w Noble Securities
https://track.adform.net/adfserve/?bn=77855207;1x1inv=1;srctype=3;gdpr=${gdpr};gdpr_consent=${gdpr_consent_50};ord=[timestamp]
Inwestycje
Tomasz Bursa, OPTI TFI: WIG ma szanse na rekord, nawet na 100 tys. pkt.
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ć?
Materiał Promocyjny
Cyfrowe narzędzia to podstawa działań przedsiębiorstwa, które chce być konkurencyjne
Inwestycje
Co dalej z WIG20? Czy zbliża się moment korekty spadkowej?
Inwestycje
Ropa naftowa szuka pretekstu do ruchu w górę