Indicatori : atunci si acum

February 28, 2010
By Bogdan Baltatu, MQLmagazine editor

[English version] [MQLmagazine.com in english] [Editia romaneasca]

Una dintre marile schimbari aduse de MetaQuotes la limbajul MQL5 este apelarea diferita a functiilor care returneaza date despre valorile indicatorilor. In acest articol voi prezenta comparativ diferentele dintre cele doua doua limbaje , MQL4 si MQL5 , cu privire la folosirea indicatorilor.

Pentru a intelege maiĀ  bine trecerea o sa incep cu o scurta descriere a modului de lucru in MQL4 dupa care o sa prezint modul de lucru in MQL5 punand accept pe modificari.

Sa plecam de la unul din cei mai folositi indicatori si anume Mediile Mobile.

Daca vroiam sa aflam o valoare a mediei mobile ne foloseam de functia iMA() care are urmatorul prototip:

1
2
double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method,
int applied_price, int shift)

Nu o sa mai descriu fiecare parametru in parte pentru ca daca stiti ce este o medie mobila, este foarte usor sa-i identificati dupa nume. Vreau totusi sa fac o precizare si anume ca indexul (shift) spunea pentru care bara din chart vrem sa calculam valoarea mediei mobile, numerotarea barelor facandu-se de la bara curenta catre cea mai veche bara din chart. Shift-ul orizontal (ma_shift) era foarte putin folosit ; de regula era setat la 0. In cazul in care avea valoare, valorile mediei mobile erau impinse spre dreapta cu ma_shift pozitii. De exemplu, in conditiile in care se dorea valoarea corespunzatoare barei curente, shift-ul folosit era 0 , iar pentru a 5-a bara in urma se folosea 5. In ambele cazuri ma_shift era 0. Daca am fi setat ma_shift la 3, pentru shift 0 s-ar fi scos valoarea care era normal pe pozitia 3, iar pentru 5 s-ar fi scos valoarea care ar fi fost normal pe pozitia 8.

Functia iMA() se folosea in special cand ne interesa un numar mic de valori imediate , de exemplu valorile pe bara curenta sau primele 2 bare pentru a vedea daca a avut loc o intersectie a doua medii mobile.

Daca vroiam sa sa aplicam media mobila pe alte valori, nu neaparat date de piata, ne foloseam de functia iMAOnArray() care are urmatorul prototip:

1
double iMAOnArray(double array[], int total, int period, int ma_shift, int ma_method, int shift)

Aceastei functii-i trimiteam pe prima pozitie un vector in care se aflau datele si era necesar sa folosim functia ArraySetAsSeries() pentru a seta semnificatia shift-ului , si anume inceputul sau sfarsitul tabloului.

In MQL5 lucrurile s-au schimbat. In primul rand nu mai exista functii care se refera la indicatori si se termina cu ‘OnArray’ si are scop calcularea indicatorului pe valorile dintr-un vector, dar si functia de baza , in cazul nostru iMA() are alt prototip:

1
2
3
4
5
6
7
8
int  iMA(
string               symbol,            // simbol
ENUM_TIMEFRAMES      period,            // timeframe
int                  ma_period,         // perioada mediei
int                  ma_shift,          // shift orizontal
ENUM_MA_METHOD       ma_method,         // tip netezire
ENUM_APPLIED_PRICE   applied_price      // tipul pretului aplicat
);

Tipurile s-au mai schimbat, dar in esenta sintaxa a ramas la fel. Ce a disparut, este shift-ul.

De aceasta data functia iMA() intoarce un handler (referinta) , intreg , numar care este referinta la chiar la parametrii mediei mobile; acest handler este folosit ulterior in program pentru a extrage valorile mediei mobile, caci MT5 cunoaste deja parametrii, inca de la executia iMA(). Prin urmare indicatorii in MQL5 returneaza handlere , folosite pentru calcule ulterioare, in vreme ce in MQL4 indicatorii returneaza valori punctuale.

Pentru a avea intr-o matrice rezultatele calculate de media mobila trebuie sa folosim functia CopyBuffer().

Functia BarsCalculated() returneaza numarul de bare calculate pentru indicatorul specificat , cu alte cuvinte intoarce numarul de elemente care sunt in matrice. Acest lucru ne poate fi folositor in functia CopyBuffer(). Prototipul functiei este :

1
2
3
int  BarsCalculated(
   int       indicator_handle     // handler de indicator
);

Functia are un singur parametru si acesta este referinta indicatorului , referinta care este intoarsa de functia iMA (in cazul nostru).

Functia CopyBuffer extrage valorile calculate pentru un indicator, cunoscandu-i parametrii via referinta. Functia are trei prototipuri , putand copia intr-o matrice :
- Un numar de elemente raportat la o pozitia de start.
- Un numar de elemente raportat o data de start
- Un numar de elemente dintr-o data de start si o data de sfarsit.

Mai jos o sa ma refer la un singur prototip , cel care mi se pare mie a fi cel mai utilizat si anume:

1
2
3
4
5
6
7
int  CopyBuffer(
   int       indicator_handle,     // handler
   int       buffer_num,           // indexul bufferului intre buffere
   int       start_pos,            // pozitia de start
   int       count,                // numarul de elemente de copiat
   double   buffer[]              // tabloul tinta
);

Se observa ca parametrul al doilea , buffer_num , reprezinta numarul bufferului pe care il dorim sa ni-l scrie in matricea tinta. In our case, iMA(), functia intoarce un singur buffer si anume number 0. Primul numar de buffer este 0!! Nu confundati indexul din buffer cu numarul bufferului. Indexul din buffer este pozitia elementului (care corespunde valorii unei bare) , pe cand numarul bufferului este setul de elemente extras. De exemplu pentru stochastic, numarul de buffer 0 este linia principala , (Main Line), iar numarul 1 este linia de semnal (Signal Line). Toti indicatorii care au un singur set de date (gen medii mobile) au un singur numar de buffer, si anume 0.

Below is the code sample using all the three functions to fill the array with the calculated values for moving averages.

1
2
3
4
5
double MA_array[];
int handle;
handle=iMA(NULL,PERIOD_CURRENT,13,0,MODE_SMA,PRICE_CLOSE);
int buffer_num=BarsCalculated(handle);
CopyBuffer(handle,0,0,buffer_num,MA_array);

Functia ArraySetAsSeries(), preluata de altfel din MQL4, seteaza flagul ca AS_SERIES la cerere. Functia are 2 parametri. Primul este tabloul pe care il setam ca si serie temporala (sau nu) iar al doilea parametru arata directia de ordonare : true pt ordine inversa (ca serie temporala), de la ultimul element, care devine primul (index 0), sau false pentru ordinea originala.

1
2
3
4
bool  ArraySetAsSeries(
void  array[],     // tablou prin referinta
bool  set          // true inseamna ordine inversa de indexare
);

In MQL4 numai unii indicatori puteau fi calculati pe tablouri, si anume : iBandsOnArray() , iCCIOnArray() , iEnvelopesOnArray() , iMomentumOnArray() , iRSIOnArray() si iStdDevOnArray().

Datorita schimbarilor aduse de MetaQuotes acum la orice indicator poate lucra pe tablouri.

Concluzia ar fi ca noul limbaj MQL5 ofera multe avantaje din punctul de vedere al accesarii si utilizarii indicatorilor in experti.

Leave a Reply