Programujemy wskaźnik – kanał cenowy

Tytułowy indykator to niezbędna część naszej strategii inwestycyjnej. Jest on bowiem potrzebny do wyznaczania sygnałów kupna i sprzedaży.

Aktualizacja: 06.02.2017 14:04 Publikacja: 18.11.2016 09:37

MQL | Zapis wskaźnika w formie kodu programistycznego. Końcowa część kodu zawiera pętlę for, która k

MQL | Zapis wskaźnika w formie kodu programistycznego. Końcowa część kodu zawiera pętlę for, która każdej świecy przyporządkowuje odpowiednie maksimum. Dla aktualnej świecy szukamy maksimum z dziesięciu poprzednich, stąd w ostatnim parametrze funkcji iHighest przesunięcie (i+1). Wcześniej następuje wybór świec do sprawdzenia. Funkcja IndicatorCounted zwraca liczbę świec, które nie zmieniły się od ostatniej kalkulacji wskaźnika. Dzięki temu możemy zoptymalizować wyliczenia poprzez pominięcie tych świec, a uwzględnienie tylko nowo powstałych (stąd formuła Bars-counted_bars). To znane rozwiązanie, opisane m.in. tu: http://bossa.pl/index.jsp?layout=2&page=0&news_cat_id=1212. PZ

Foto: GG Parkiet

W zestawie wskaźników platformy Meta Trader, przynajmniej tej udostępnionej przez serwis bossa.pl, nie znaleźliśmy interesującego nas kanału cenowego. Dlatego, korzystając z języka MQL, musimy napisać go sami. Jak? O tym dzisiejszy odcinek „Profesjonalnego inwestora".

Funkcje wyglądu obiektów

W cyklu artykułów o podstawach programowania pokazaliśmy, jak kodować automatyczną strategię, dlatego, otwierając Meta Editora, wybieraliśmy EA. Teraz wybieramy Custom Indicator, który służy do pisania wskaźników. Zakładamy, że czytelnicy zapoznali się ze wspomnianym cyklem o kodowaniu, dlatego nie będziemy tłumaczyć wszystkich terminów. Jeśli ktoś będzie miał problemy, odsyłamy do naszych poprzednich artykułów oraz wskazanych tam źródeł.

Większość wskaźników to pochodna ceny, dlatego tworzą je liczby obliczone według pewnego wzoru. Nasz kanał cenowy to po prostu najwyższa cena zamknięcia z dziesięciu ostatnich świec oraz najniższa cena zamknięcia z ostatnich dziesięciu świec. Wskaźnik składać się będzie z dwóch obiektów – linii górnej i dolnej. Aby program rozróżniał obie linie, musimy nadać im inne numery, zwane indeksami. W tym celu używamy funkcji SetIndexBuffer, która posiada dwa parametry. Pierwszy to właśnie numer indeksu. W MQL można programować wskaźniki mające maksymalnie osiem obiektów (linii, strzałek itp.), więc wartość indeksu może przyjmować wielkości od 0 do 7. Nasza górna linia dostanie indeks 0, a dolna 1. Drugi parametr to tablica z wartościami wskaźnika – dla górnej będą to wartości maksimum (double High_array[]), a dla dolnej minimum (double Low_array[]).

Następnym krokiem jest zaprogramowanie ustawień dotyczących wyglądu wskaźnika. W tym celu używamy funkcji SetIndexStyle, która posiada pięć parametrów. Pierwszy to indeks obiektu (u nas linii), którego styl określamy. Drugi odpowiada za wygląd owego obiektu – czy ma to być linia, histogram, czy chociażby zestaw strzałek. Jeżeli wybierzemy linię o grubości 1, to wówczas możemy ustawić w trzecim parametrze wygląd owej linii (czy ma być przerywana, czy ma być zestawem kropek itp.). Przy większych grubościach tej modyfikacji nie możemy wprowadzić. Czwarty parametr określa właśnie grubość obiektu (od 1 do 5), a piąty kolor (na przykład Red, czyli czerwony).

Kolejny krok to określenie, od którego momentu na wykresie wskaźnik ma być rysowany. Ponieważ bazujemy na ekstremach z ostatnich dziesięciu sesji, to chcemy, by zaczynał od 11. świecy, licząc od lewej strony wykresu. W celu zaprogramowania tych ustawień używamy funkcji SetIndexDrawBegin, która ma dwa parametry. Pierwszy to indeks obiektu, a drugi numer świecy, od której zaczynamy rysowanie.

Korzystając z funkcji SetIndexLabel, można naszym obiektom nadać nazwy, co jest szczególnie przydatne, gdy owych obiektów jest dużo. My górną linię nazwiemy TOPBAND, a dolną BOTBAND. Funkcja ma dwa parametry. Pierwszy to standardowo indeks obiektu, a drugi to po prostu nazwa ujęta w cudzysłów, na przykład: SetIndexLabel(0, „TOPBAND").

Zapełnienie tablicy

Czas na wypełnienie tablicy wartościami wskaźnika. Skupmy się na górnej linii kanału. Aby wyznaczyć najwyższą cenę z jakiegoś przedziału czasowego, możemy skorzystać z funkcji iHighest. Co ważne, zwraca on nie cenę, ale numer świecy z najwyższą ceną z danego okresu. Aby otrzymać ową cenę, musimy użyć stałej Close[], która zwraca cenę zamknięcia świecy o danym numerze, podanym w nawiasie kwadratowym. Dlatego w nawiasach umieszczamy funkcję iHighest z odpowiednimi parametrami. Jakimi? Jest ich pięć. Pierwszy to instrument, który analizujemy (NULL oznacza wykres, na którym otwarto wskaźnik). Drugi to interwał czasowy (0 oznacza ten interwał, który jest aktualnie na wykresie). Trzeci to typ ceny (maksymalna, minimalna itd.). W naszym przypadku będzie to cena zamknięcia (MODE_CLOSE), bowiem takie przyjęliśmy założenie. Piąty to zakres czasowy, czyli liczba świec, wśród których szukamy maksimum (u nas 10). Ostatni parametr mówi, od której świecy poszukiwania się zaczynają (licząc od prawej, gdzie 0 to świeca aktualnie rysowana). W naszym przypadku maksymalną cenę zamknięcia z poprzednich dziesięciu świec otrzymalibyśmy poprzez taką komendę: Close[iHighest(NULL,0,MODE_CLOSE,10,1)].

Aby przedstawiona wcześniej seria funkcji Set narysowała nam górną bandę kanału na wykresie, musimy zapełnić tablicę High_array[]. W tym celu zastosować należy pętlę for, która dla każdej świecy obliczy cenowe maksimum i przyporządkuje je do odpowiedniej szufladki w tablicy. Zapis pętli widoczny jest na załączonej ilustracji, a obok niej jest dokładny opis zastosowanego kodu. Na wykresie widoczny jest wynik końcowy, czyli niebieska linia wyznaczająca górną bandę kanału. Aby wyznaczyć dolną, należy postępować analogicznie, tworząc obiekt o indeksie 1 i stosując funkcję iLowest. Zachęcamy do samodzielnego kodowania wskaźnika. Poszczególne parametry (na przykład kolorami, zakresem czasowym funkcji iHighest) można zmieniać, a efekty sprawdzać na bieżąco – wystarczy wcisnąć przycisk kompilacji i wrócić do wykresu, na którym używamy wskaźnika.

W ten sposób otrzymujemy zakres zmienności, który w naszej strategii wyznacza potencjalne poziomy otwierania pozycji. Sygnałem kupna jest wybicie górą, a sygnałem sprzedaży wybicie w dół.

[email protected]

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ę