Wskaźniki własne użytkownika

Tworzenie własnych wskaźników w języku MQL4 jest jedną z podstawowych zalet i właściwości tego języka, który został specjalnie opracowany i dostosowany do tworzenia własnych wskaźników.

Wskaźniki wyróżnia to, że działają w oknie wykresu podstawowego oraz mogą prezentować dane wyliczeniowe w postaci wykresów, dlatego też został opracowany zestaw funkcji wspierających prezentacje danych na wykresach, które zamieszczone są w kolejnych podpunktach tego działu.

Proszę pamiętać, że zamieszczone tutaj funkcje przeznaczone są do tworzenia wskaźników i nie należy ich stosować w EA, skryptach czy bibliotekach.

IndicatorBuffers

Funkcja ustawia i określa maksymalną ilość buforów, które będą wykorzystywane przez wskaźnik. Maksymalna ilość buforów może przyjąć wartość 8. Bufory indeksowane są wartościami od 0 do 7. Należy pamiętać, że ustawiając ilość buforów powodujemy, że dla każdego bufora alokowana jest tablica o długości równej ilości słupków na danym wykresie. Z punktu widzenia optymalizacji i wydajności kodu nie powinniśmy ustawiać większej ilość buforów niż w rzeczywistości będziemy wykorzystywać.

Składnia:

void IndicatorBuffers( int count )
Parametry
count – maksymalna ilość buforów które będą wykorzystywane do obliczeń,
wartość nie może być większa niż 8
Wartość zwracana
brak

Przykład:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Silver
//---- parametry wejściowe, użytkownika
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- bufory dla wyliczonych wartości wskaźnika
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
//+------------------------------------------------------------------+
//| Funkcja inicjalizująca wskaźnik |
//+------------------------------------------------------------------+
int init()
{
//---- dodanie dwóch dodatkowoy buforów
IndicatorBuffers(3);
//---- ustwienie stylów wydruku dla wykresu wskaźnia
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
SetIndexDrawBegin(0,SignalSMA);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- przypisanie indeksu dla każdego bufora danych
SetIndexBuffer(0,ind_buffer1);
SetIndexBuffer(1,ind_buffer2);
SetIndexBuffer(2,ind_buffer3);
//---- nazwa skrócona wskaźnika
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- koniec inicjalizacji wskaźniak
return(0);
}

IndicatorCounted

Funkcja zwraca ilość słupków, które nie uległy zmianie od ostatniego przeliczenia wskaźnika. W większości przypadków wyliczenie wartości wskaźnika polega na przeliczeniu każdego słupka, oraz umieszczenie tej wartość w buforze. Wartości z tego bufora mogą być prezentowane w postaci wykresu. Jednocześnie, jak pamiętamy z poprzednich rozdziałów jeśli kwotowania nadchodzą zbyt często (częściej niż czas jednej iteracji obliczeniowej funkcji start()) to zostaną pominięte, dlatego funkcja IndicatorCounted idealnie nadaje się do optymalizacji obliczeń i skrócenia czasu obliczeń z oszczędnością mocy obliczeniowych komputera.

Dokonując obliczeń w pętli dla wszystkich wartości wykresu możemy posłużyć się funkcją IndicatorCounted i przeliczyć tylko te ostatnie słupki z wykresu, które się zmieniły. Należy jednak pamiętać, że niektóre algorytmy obliczeniowe pomimo zmiany jednego słupka powinny przeliczyć też słupki poprzednie, co należy uwzględnić w wyliczeniach.

Składnia:

int IndicatorCounted()
Parametry
brak
Wartość zwracana
Ilość słupków na wykresie, które uległy zmianie lub -1 jeśli błąd funkcji

Przykład:

// Korzystamy z funkcji IndicatorCounted() oraz Bars w celu określenia jaka
ilość słupków uległa zmianie, ile jst nowych słupków
int start()
{
int limit;
int counted_bars=IndicatorCounted();
//---- sprawdź czy nie ma błędu
if(counted_bars<0) return(-1);
//---- sprawdzenie czy są nowe słupki
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- obliczenia w pętli dla nowych słupków
for(int i=0; i<limit; i++)
{
ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
}
return(0);
}

IndicatorShortName

Funkcja ustawia tak zwaną skróconą nazwę wskaźnika, która wyświetlana jest w oknie wskaźnika lub w oknie podglądu danych. Nazwa skrócona wykorzystywana jest też do poszukiwania identyfikatora okna wskaźnika.

Składnia:

void IndicatorShortName( string name )
Parametry
name – nazwa skrócona wskaźnika
Wartość zwracana
brak

Przykład:

int init()
{
//---- dodanie dwóch dodatkowych buforów
IndicatorBuffers(3);
//---- ustawienie stylów wydruku dla wykresu wskaźnika
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
SetIndexDrawBegin(0,SignalSMA);
//---- dodanie dwóch dodatkowych miejsc po przecinku do wskaźnika do
domyślnej wartości dla danego symbolu
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- przypisanie indeksu dla każdego bufora danych
SetIndexBuffer(0,ind_buffer1);
SetIndexBuffer(1,ind_buffer2);
SetIndexBuffer(2,ind_buffer3);
//---- nazwa skrócona wskaźnika
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- koniec inicjalizacji wskaźnika
return(0);
}

SetIndexArrow

Funkcja ustawia znak graficzny strzałki, którą będzie rysowany wykres. W rzeczywistości kodem strzałki może być dowolny znak graficzny z zestawu fontów Wingdings. Najczęściej wykorzystuje się tą funkcje dla wykresów typu ARROW lub ZIGZAG.

Składnia:

void SetIndexArrow( int index, int code )
Parametry
index - indeks bufora wykresu z zakresu 0 do 7
Code – kod strzałki, symbol graficznego
Wartość zwracana
brak

Przykład:

int init()
{
//---- ustawienie dwóch buforów dla wykresów
SetIndexBuffer(0,ExtUppperBuffer);
SetIndexBuffer(1,ExtLowerBuffer);
//---- ustawienie parametrów stylu wykresu
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
//---- ustawienie opisu buforów
SetIndexLabel(0,"Fractal Up");
SetIndexLabel(1,"Fractal Down");
//---- inicjalizacja zakończona
return(0);
}

SetIndexBuffer

Funkcja przypisuje danemu buforowi indeks o wartościach od 0 do 7 czyli do maksymalnej ilości buforów (wykresów danych wskaźnika wyświetlanych jednocześnie w oknie wykresu głównego). Jeśli udało się prawidłowo przypisać indeks do bufora to funkcja zwraca wartość true w przeciwnym razie false. Kod błędu przypisania indeksu możemy pobrać za pomocą funkcji GetLastError().

Składnia:

bool SetIndexBuffer( int index, double array[] )
Parametry
index - indeks bufora wykresu z zakresu 0 do 7
array[] – bufor danych wyliczeniowych dla wskaźnika (prezentowanych na
wykresie)
Wartość zwracana
true – przypisanie indeksu bufora zakończone sukcesem
false– przypisanie indeksu bufora nie powidło się

Przykład:

double ExtBufferSilver[];
int init()
{
SetIndexBuffer(0, ExtBufferSilver); // bufor przypisany do pierwszego
indeksu (pierwszej linii wykresu wskaźnika)
// ...
}

SetIndexDrawBegin

Funkcja ustawia liczbę słupków wykresu, od których ma zostać rysowany wykres. Początek rysowania określa się od lewej do prawej czyli funkcja może być przydatna jeśli nie chcemy wyświetlać wszystkich obliczeń historycznych lub po prostu początkowe obliczenia mogą być nieprawidłowe np. dla wyliczenia średniej z 20 okresów pierwsze 19 słupków będzie posiadało wartości nie w pełni prawidłowe, wówczas możemy je „ukryć” stosując funkcje SetIndexDrowBegin().

Składnia:

void SetIndexDrawBegin( int index, int begin )
Parametry
index - indeks bufora wykresu z zakresu 0 do 7
begin – pierwszy słupek od lewej na którym ma być rysowany wykres
Wartość zwracana
brak

Przykład:

int init()
{
//---- dodanie dwóch dodatkowych buforów
IndicatorBuffers(3);
//---- ustawienie stylów wydruku dla wykresu wskaźnika
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
//---- ustawienie początkowego słupka od lewej, od którego zacznie się
rysowanie wykresu
SetIndexDrawBegin(0,SignalSMA);
//---- dodanie dwóch dodatkowych miejsc po przecinku do wskaźnika do
domyślnej wartości dla danego symbolu
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- przypisanie indeksu dla każdego bufora danych
SetIndexBuffer(0,ind_buffer1);
SetIndexBuffer(1,ind_buffer2);
SetIndexBuffer(2,ind_buffer3);
//---- nazwa skrócona wskaźnika
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- koniec inicjalizacji wskaźnika
return(0);
}

SetIndexLabel

Funkcja ustawia nazwę bufora wskaźnika prezentowaną w okienku „Okno Danych”

Składnia:

void SetIndexLabel( int index, string text )
Parametry
index - indeks bufora wykresu z zakresu 0 do 7
text – Nazwa bufora, indeks. Jeśli NULL (“”) to dane nie będą prezentowane
Wartość zwracana
brak

Przykład:

int init()
{
//---- ustawienie dwóch buforów dla wykresów
SetIndexBuffer(0,ExtUppperBuffer);
SetIndexBuffer(1,ExtLowerBuffer);
//---- ustawienie parametrów stylu wykresu
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
//---- ustawia wartości “puste” wykresu na 0.0
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- ustawienie opis buforów w oknie “Okno Danych”
SetIndexLabel(0,"Fractal Up");
SetIndexLabel(1,"Fractal Down");
//---- inicjalizaca zakończona
return(0);
}

SetIndexEmptyValue

Funkcja ustawia wszystkie wartości bufora wykresu które będą przyjmowały wartość typu EMPTY_VALUE (0x7FFFFFFF). Funkcja przydatna jest do „wyzerowania”, ustawienia stałych wartości dla słupków na których brak danych wykresu, np. wskaźnik Fractal występuje tylko na określonych słupkach.

Składnia:

void SetIndexEmptyValue( int index, double value)
Parametry
index - indeks bufora wykresu z zakresu 0 do 7
value – wartość którą będą ustawiane "puste" wartości wskaźnika
Wartość zwracana
brak

Przykład:

int init()
{
//---- ustawienie dwóch buforów dla wykresów
SetIndexBuffer(0,ExtUppperBuffer);
SetIndexBuffer(1,ExtLowerBuffer);
//---- ustawienie parametrów stylu wykresu
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,218);
//---- ustawia wartości “puste” wykresu na 0.0
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
//---- ustawienie opisu buforów
SetIndexLabel(0,"Fractal Up");
SetIndexLabel(1,"Fractal Down");
//---- inicjalizaca zakończona
return(0);
}

SetIndexShift

Funkcja ustawia przesunięcie bufora wykresu w stosunku do słupków danych wykresu podstawowego. Przesunięcie może przyjmować wartości dodatnie lub ujemne, jeśli jest wartością dodatnią to przesunięcie następuje w prawo, a jeśli ujemną to w lewo.

Składnia:

void SetIndexShift( int index, int shift )
Parametry
index – indeks bufora wykresu z zakresu 0 do 7
shift – liczba o którą należy przesunąć słupki do obliczeń w stosunku do
słupków podstawowego wykresu
Wartość zwracana
bak

Przykład:

//+------------------------------------------------------------------+
//| Alligator inicjalizacja wskaźnika |
//+------------------------------------------------------------------+
int init()
{
//---- ustawienie przesunięcia wykresu
SetIndexShift(0,JawsShift);
SetIndexShift(1,TeethShift);
SetIndexShift(2,LipsShift);
//---- ustawienie pierwszej pozycji do rysowania na wykresie
SetIndexDrawBegin(0,JawsShift+JawsPeriod);
SetIndexDrawBegin(1,TeethShift+TeethPeriod);
SetIndexDrawBegin(2,LipsShift+LipsPeriod);
//---- ustawienie trzech indeksów, bufiorów
SetIndexBuffer(0,ExtBlueBuffer);
SetIndexBuffer(1,ExtRedBuffer);
SetIndexBuffer(2,ExtLimeBuffer);
//---- ustawienie styl rysowania linii
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
//---- ustawienie nazwy dla okna podglądu danych “Okno Danych”
SetIndexLabel(0,"Gator Jaws");
SetIndexLabel(1,"Gator Teeth");
SetIndexLabel(2,"Gator Lips");
//---- koniec inicjalizacji
return(0);
}

SetIndexStyle

Funkcja ustawia nowy typ, styl, szerokość i kolor danej linii wskaźnika.

Składnia:

void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY,
color clr=CLR_NONE)
Parametry
index – indeks bufora wykresu z zakresu 0 do 7
type – typ wykresu:
DRAW_LINE – linowy
DRAW_SECTION – sekcje
DRAW_HISTOGRAM – histogram
DRAW_ARROW – symbole
DRAW_ZIGZAG – rysuje linie pomiędzy wartościami high/low
DRAW_NONE – nie rysuje wykresu
style – styl linii wykresu:
STYLE_SOLID – punkty, piksele, linie
STYLE_DASH – kreski
STYLE_DOT – kropki
STYLE_DASHDOT – kreska i kropka
STYLE_DASHDOTDOT – kreska i podwójna kropka
width – szerokość linii z zakresu 1 do 5, jeśli EMPTY to szerokość nie może
być zmieniana
clr – kolor kreślonej linii
Wartość zwracana
brak

Przykład:

SetIndexStyle(3, DRAW_LINE, EMPTY, 2, Red);

SetLevelStyle

Funkcja ustawia nowy styl, szerokość, kolor linii poziomej, która może być prezentowana i wykorzystywana przez wskaźnik.

Składnia:

void SetLevelStyle( int draw_style, int line_width, color clr=CLR_NONE)
Parametry
draw_style styl rysowania linki poziomu:
STYLE_SOLID – punkty, piksele, linie
STYLE_DASH - kreski
STYLE_DOT - kropki
STYLE_DASHDOT – kreska i kropka.
STYLE_DASHDOTDOT – kreska i podwójna kropka
line_width – szerokość linii z zakresu 1 do 5, jeśli EMPTY to szerokość nie
może być zmieniana
clr – kolor kreślonej linii
Wartość zwracana
brak

Przykład:

//---- pokazuje czerwoną linie poziomu
SetLevelStyle(STYLE_SOLID,2,Red)

SetLevelValue

Funkcja ustala wartość dla danej linii poziomej, która może być prezentowana przez wskaźnik.

Składnia:

void SetLevelValue( int level, double value )
Parametry
level – identyfikator poziom od 0 do 31
Value – wartość reprezentująca dany poziom
Wartość zwracana
brak

Przykład:

// ustawia wartość 3.14 dla poziomu 1
SetLevelValue(1,3.14);

Niniejszy materiał, przygotowany przez DM BOŚ S.A. ma charakter wyłącznie informacyjny, prezentowany jest w celach edukacyjnych i nie stanowi porady prawnej oraz nie jest rekomendacją osobistą w ramach świadczenia usługi doradztwa inwestycyjnego zgodnie z przepisami prawa. DM BOŚ S.A. nie udziela gwarancji dokładności, aktualności, oraz kompletności niniejszych informacji. Zaleca się przeprowadzenie we własnym zakresie niezależnego przeglądu informacji z niniejszego materiału.

1/1