MQL – Mój pierwszy wskaźnik

MQL - roboty inwestycyjne

W poprzednim artykule „MQL – programowanie robotów handlu automatycznego” przedstawiłem podstawy języka MQL. Pozwala on tworzyć programy wspierające inwestowanie na rynkach finansowych. Dzisiaj zbudujemy własny wskaźnik analizy technicznej, który pomaga w podejmowaniu decyzji transakcyjnych. Zapraszam do drugiej części kursu. 

Założenia

Wyobraźmy sobie, że chcemy zidentyfikować i zobrazować ruch ceny, jaki wykonała w ciągu danego interwału czasowego reprezentującego pojedynczą świeczkę. Dlatego stworzymy wskaźnik, który w sposób graficzny przedstawi nam różnicę między ceną zamknięcia a ceną otwarcia. Przy czym nie interesuje nas cena najniższa oraz najwyższa. Nie wiem, czy taki wskaźnik może być przydatny w strategii inwestycyjnej, ale na potrzeby nauki języka MQL nada się idealnie.

Implementacja

Do stworzenia przykładowego wskaźnika wykorzystamy kreator dostarczony przez platformę MetaEditor. Klikamy więc ikonkę mql_7 na pasku narzędzi lub wybieramy z menu Plik -> Nowy.

MQL - custom indicator wizard
Z pierwszego okna wybieramy „Własny wskaźnik” i klikamy „Dalej”. Jak widzisz, na tym ekranie możeny wybierać spośród większej liczby programów niż tylko tych trzech, o których wspominałem w poprzednim artykule „MQL – programowanie robotów handlu automatycznego”. Biblioteki, Nagłówki oraz Szablony nie są samodzielnymi programami handlu automatycznego i na tym etapie nie będziemy zawracać sobie nimi głowy. Zainteresowanych tymi elementami odsyłam do dokumentacji.

MQL - wizard

Na kolejnym ekranie musimy uzupełnić kilka podstawowych informacji dotyczących tworzonego wskaźnika, takich jak jego nazwa, dane autora oraz ewentualny link do strony internetowej. W tym miejscu możemy również zdefiniować listę parametrów wejściowych. Jedyną zagadką mogą być parametry. Są to dane wejściowe dla wskaźnika. Czym natomiast są parametry? Tutaj możesz zdefiniować dane wejściowe dla danego wskaźnika, które później na platformie MT4 możesz dowolnie dopasowywać do poszczególnych wykresów różnych instrumentów finansowych. Przykładem takich parametrów może być na przykład okres czy przesunięcie dla średniej kroczącej lub poziom wyprzedania i wykupienia dla oscylatora stochastycznego.

MQL - Wizard

W oknie widocznym powyżej określamy parametry rysowania naszego wskaźnika. Musimy tu ustawić następujące elementy:

  1. Wskaźnik w oddzielnym oknie – pozwala ustalić, czy chcemy, aby nasz wskaźnik umieszczony był na wykresie ceny, czy w oddzielnym oknie poniżej głównego wykresu.
  2. Minimum – dostępne tylko w przypadku generowania wskaźnika w oddzielnym oknie. Określa dolny margines dla wykresu.
  3. Maksimum – analogicznie jak minimum; określa górny margines dla wykresu.
  4. Indeksy – tutaj definiujesz wszystkie obiekty, z jakich będzie się składał Twój wskaźnik i  ustalasz ich kolory. Do wyboru mamy linie, sekcje, histogramy oraz strzałki. W naszym przykładzie potrzebować będziemy na razie tylko jedną linię. Wybierzemy kolor czerwony.

Wszystkie początkowe ustawienia wskaźnika można później dowolnie zmieniać z poziomu kodu. Nie ma więc obowiązku pamiętania o dodaniu wszystkich parametrów czy wszystkich obiektów od razu w kreatorze.

Klikamy „Zakończ”.

MQL - indicator

Kod wskaźnika zaczyna się od bloku komentarza, który zawiera nazwę wskaźnika, jego autora oraz stronę www. Następnie widzimy ustawienia właściwości programu. Wykorzystywana jest w tym celu dyrektywa #property. Jak łatwo się domyślić ,wszystkie te dane pochodzą z uzupełnianych przed chwilą przez nas okien kreatora.

Właściwości ogólne:

  • copyright – nazwa autora;
  • link – odnośnik do podanej strony www.

Właściwości rysowania:

  • indicator_separate_window – wskaźnik wyświetlany w oddzielnym oknie;
  • indicator_chart_window – wskaźnik wyświetlany na wykresie ceny;
  • indicator_minimum – minimalna wartość wskaźnika wyświetlanego w oddzielnym oknie, np. 0;
  • indicator_maximum – maksymalna wartość wskaźnika wyświetlanego w oddzielnym oknie, np. 100;
  • indicator_buffers – ustawienie liczby buforów, która odpowiada liczbie linii wskaźnika; maksymalna wartość, to 8;
  • indicator_levelN – określenie poziomu wskaźnika o numerze linii N; wartość tego parametru musi zawierać się między indicator_minimum, a indicator_maximum, a N między 1 a 8;
  • indicator_colorN – ustawienie koloru linii, gdzie N to numer linii (indicator_color1, indicator_color2, …).

Poniżej opisanych przed chwilą ustawień parametrów programu mamy deklarację zmiennej tablicowej ExtMapBuffer1[]. Posłuży ona do przechowywania wartości dla linii wskaźnika. Gdyby nasz wskaźnik składał się z dwóch linii, potrzebowalibyśmy drugiej takiej zmiennej, na przykład ExtMapBuffer2[].

Dalej widzimy wspomniane przeze mnie w poprzednim artykule funkcje specjalne init(), deinit() oraz start(). Przyjrzymy się w pierwszej kolejności funkcji init(), która posiada już pewien kod wygenerowany przez MetaEditor.

MQL - indicator

Metoda SetIndexStyle pozwala ustawić parametry rysowania obiektu wskaźnika o danym indeksie.

1
void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)
  • index – indeks linii; indeksowanie zaczyna się od zera, zatem pierwsza linia będzie miała indeks o numerze 0, druga linia indeks 1, itd.;
  • type – typ rysowanego obiektu (DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM, DRAW_ARROW), np. linia, sekcja, histogam, strzałka;
  • style – styl rysowania (STYLE_SOLID,  STYLE_DASH, STYLE_DOT), np. linia ciągła, przerywana, kropkowana, itp.;
  • width – szerokość linii;
  • clr – kolor linii obiektu.

Metoda SetIndexBuffer przypisuje danemu obiektowi wskaźnika jego wartości. W naszym przykładzie dla linii o indeksie 0 przypisujemy wartości z tablicy ExtMapBuffer1.

1
bool SetIndexBuffer(int index, double array[])
  • index – indeks linii;
  • array[] – tablica wartości.

Dopiszmy w końcu trochę własnego kodu. W pierwszym kroku dodamy wyświetlanie nazwy wskaźnika w jego oknie.

MQL - indicator

Metoda IndicatorShortName przyjmuje parametr typu string, który wyświetlany będzie w lewym górnym rogu okna ze wskaźnikiem.

Przejdźmy teraz do metody start(). Jak pamiętamy, wywoływana jest ona po każdej zmianie notowania danego instrumentu finansowego. To właśnie w niej umieścimy całą logikę rysowania naszego wskaźnika.

MQL - custom indicator

Widzimy, że w tej metodzie środowisko również wygenerowało nam fragment kodu. Mamy tu jednoczesną deklarację i inicjalizację zmiennej counted_bars wartością zwracaną przez funkcję IndicatorCounted().

int IndicatorCounted() – zwraca liczbę słupków (świec), dla których wyliczany był wskaźnik. Przy pierwszym uruchomieniu wskaźnika wynosi zero, ponieważ nie przeliczył jeszcze żadnego słupka. Później wartość ta wyniesie liczba wszystkich słupków na wykresie -1. Prościej mówiąc, funkcja ta zwraca liczbę słupków, które nie zmieniły się od ostatniego wywołania.

Doprowadźmy metodę start() do postaci jak poniżej i przyjrzyjmy się poszczególnym jej elementom.

MQL - custom indicator

Wyrażenie warunkowe „if” sprawdza, czy zliczanie słupków nie dało nam wartości mniejszej od zera, co oznaczałoby wystąpienie błędu podczas tej operacji. W takim przypadku przerywamy wyliczenia.

Następnie deklarujemy zmienną pomocniczą pos, którą inicjujemy wartością reprezentującą indeks najstarszego słupka, od którego musimy zacząć przeliczanie wskaźnika.

Predefiniowana zmienna Bars daje liczbę wszystkich słupków na wykresie. Ich indeksowanie zaczyna się od zera, od najnowszego słupka do najstarszego. Zatem indeks 0 ma słupek aktualnie tworzony.

Załóżmy, że na wykresie mamy 100 słupków (tyle zwraca metoda Bars). W momencie dodania wskaźnika do tego wykresu metoda IndicatorCounted() da wartość 0. Zatem index słupka, od którego musimy zacząć wyliczenia wynosi 99 (100 – 0 – 1).

Znowu deklarujemy sobie kilka zmiennych pomocniczych typu double (closePrice, openPrice, result), które za chwilkę wykorzystamy do obliczania wartości wskaźnika.

Zaczynamy pętle (while) po słupkach, które muszą zostać przeliczone. Dla każdego takiego słupka pobieramy jego cenę otwarcia oraz cenę zamknięcia, wykorzystując w tym celu predefiniowane tablice Open[] oraz Close[]. Zawierają one ceny otwarcia oraz zamknięcia dla każdego słupka na danym wykresie. Open[index] zwraca cenę otwarcia dla słupka o podanym indeksie, a Close[index] analogicznie cenę zamknięcia.

Po otrzymaniu niezbędnych nam cen do zmiennej result przypisujemy różnicę między nimi. Będzie to poziom naszego wskaźnika dla danego słupka. Jak widać w kolejnym wierszu kodu, musimy ją zatem ustawić w tablicy wartości linii (ExtMapBuffer1[]) na pozycji odpowiadającej wyliczanemu słupkowi.

W ostatniej linii wewnątrz pętli przechodzimy do kolejnego słupka poprzez zmniejszenie wartości zmiennej pos o 1. Tak samo traktujemy wszystkie słupki na danym wykresie.

Kompilacja i instalacja wskaźnika

Zanim będziemy mogli skorzystać z utworzonego wskaźnika na platformie transakcyjnej, należy skompilować napisany przez nas kod. Kompilacja i instalacja wskaźnika tworzonego poprzez kreator jest bardzo prosta. Wystarczy wcisnąć przycisk „Kompiluj” lub klawisz F5 i jeśli nie otrzymamy żadnych informacji o błędach, możemy od razu przejść do platformy transakcyjnej MetaTrader i tam dodać go do wykresu.

Jak dodać wskaźnik do wykresu? Jak zwykle, mamy kilka możliwości:

  1. Menu: Wstaw -> Wskaźniki -> Własne -> Atena Indicator
  2. Pasek narzędzi: MQL - custom indicator -> Własne -> Atena Indicator
  3. Nawigator: Wskaźniki własne -> Atena Indicator. Możemy albo dwukrotnie kliknąć lewym przyciskiem myszy na nazwie wskaźnika, bądź przeciągnąć go, również lewym przyciskiem myszy, na wykres.

MQL - custom indicator

Tak oto prezentuje się stworzony przez nas wskaźnik. Jak widać, w miejscach, gdzie cena wykonała duży ruch w górę w danym okresie, wartość wskaźnika wyraźnie wybija w górę. Analogicznie dla spadków ceny wartość wskaźnika spada poniżej zera.

Praca domowa

W ramach ćwiczeń proponuję wykonanie małego zadania. Do naszego wskaźnika trzeba dodać drugą linię prezentującą różnicę między ceną najwyższą i ceną najniższą w danym przedziale czasowym. W razie problemów służę pomocą. Czekam też na wasze wnioski i przemyślenia.

Podsumowanie

Mimo dużej liczby już istniejących wskaźników analizy technicznej, nic nie stoi na przeszkodzie, aby stworzyć swój własny. Taki, który pozwoli interpretować dane pochodzące z rynku i przez to pomoże podejmować jak najlepsze decyzje inwestycyjne. Najczęstszym zastosowaniem większości wskaźników jest pomoc w określeniu panującego aktualnie na rynku trendu bądź wygenerowanie sygnału otwarcia lub zamknięcia pozycji.

Przypominam, że przykład zawarty w tym artykule służy jedynie celom edukacyjnym, a inwestowanie na rynkach finansowym wiąże się z ryzykiem utraty wniesionego kapitału. Jednocześnie zapraszam do kolejnej części kursu, w której pokażę, jak stworzyć własny skrypt w języku MQL.

 

 

Dodaj komentarz

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