Stili Indicatore negli Esempi

Il Terminale Client di MetaTrader 5 comprende 38 indicatori tecnici che possono essere utilizzati in programmi con MQL5 attraverso apposite funzioni. Ma il vantaggio principale del linguaggio MQL5 è la capacità di creare indicatori personalizzati, che possono poi essere utilizzati in Expert Advisor o semplicemente applicati su grafici dei prezzi allo scopo di analisi tecnica.

L'intero set di indicatori può essere derivata da vari stili di disegno base, conosciuti come plotting. Il plotting denota un modo di visualizzazione i dati, che l'indicatore calcola, immagazzina e fornisce a richiesta. Vi sono sette tali tipi di plotting fondamentali:

  1. Una linea
  2. Una sezione (segmento)
  3. Istogramma
  4. Freccia (simbolo)
  5. Una zona verniciata (canale riempito)
  6. Bars
  7. Candele giapponesi

Ogni plotting richiede da uno a cinque array di tipo double, in cui sono memorizzati i valori degli indicatori. Allo scopo di convenienza, questi array sono associati con i buffer indicatore. Il numero di buffer in un indicatore deve essere dichiarato in anticipo utilizzando le direttive del compilatore, per esempio:

#property indicator_buffers 3 // Numero di buffers
#property indicator_plots   2 // numero di plots

Il numero di buffer in dell'indicatore è sempre maggiore o uguale al numero di plots nell'indicatore.

Poiché ogni tipo plotting base può avere variazione di colore o specifiche di costuzione, il numero effettivo di tipi di plotting in MQL5 è 18:

Plotting

Descrizione

Valore buffer

Color buffers

DRAW_NONE

Non è visivamente mostrato nel grafico, ma i valori del buffer corrispondente possono essere visualizzati nella finestra dei dati

1

-

DRAW_LINE

Una linea viene tracciata sui valori del buffer corrispondente (i valori vuoti nel buffer sono indesiderabili)

1

-

DRAW_SECTION

È disegnato come segmenti di linea tra i valori del buffer corrispondente (di solito ha svariati valori vuoti)

1

-

DRAW_HISTOGRAM

È rappresentato con un istogramma dalla linea zero ai valori del buffer corrispondente (può avere valori vuoti)

1

-

DRAW_HISTOGRAM2

È disegnato come un istogramma basato su due buffer indicatori (può avere valori vuoti)

2

-

DRAW_ARROW

Viene disegnato come simboli (possono avere valori vuoti)

1

-

DRAW_ZIGZAG

Simile allo stile DRAW_SECTION, ma a differenza di esso, può tracciare segmenti verticali su una barra

2

-

DRAW_FILLING

Riempimento colore tra due linee. 2 valori dei buffer corrispondenti sono mostrati nella Finestra Dati

2

-

DRAW_BARS

Viene disegnato come barre. 4 valori dei buffer corrispondenti vengono visualizzati nella Finestra Dati

4

-

DRAW_CANDLES

Disegnato come Candele giapponesi. 4 valori dei buffer corrispondenti vengono visualizzati nella Finestra Dati

4

-

DRAW_COLOR_LINE

Una linea per la quale è possibile alternare i colori su diverse barre o cambiare il suo colore in qualsiasi momento

1

1

DRAW_COLOR_SECTION

Simile allo stile DRAW_SECTION, ma il colore di ogni sezione può essere impostato singolarmente; il colore può anche essere impostato dinamicamente

1

1

DRAW_COLOR_HISTOGRAM

Simile allo stile DRAW_HISTOGRAM, ma ogni striscia può avere un colore diverso, è possibile impostare il colore in modo dinamico

1

1

DRAW_COLOR_HISTOGRAM2

Simile allo stile DRAW_HISTOGRAM2, ma ogni striscia può avere un colore diverso, è possibile impostare il colore in modo dinamico

2

1

DRAW_COLOR_ARROW

Simile allo stile DRAW_ARROW, ma ogni simbolo può avere il suo colore. Il colore può essere modificato dinamicamente

1

1

DRAW_COLOR_ZIGZAG

Lo stile DRAW_ZIGZAG con le opzioni di colorazione individuale di sezioni e cambiamento dinamico del colore

2

1

DRAW_COLOR_BARS

Lo stile DRAW_BARS con le opzioni di colorazione individuale delle barre e cambiamento dinamico del colore

4

1

DRAW_COLOR_CANDLES

Lo stile DRAW_CANDLES con le opzioni di colorazione individuale delle candele e colori dinamici che cambiano

4

1

 

La differenza tra un buffer indicatore ed un array

In ogni indicatore, sul suo livello globale, si dovrebbe dichiarare uno o più array di tipo double, che poi deve essere usato come un buffer utilizzando la funzione dell'indicatore SetIndexBuffer(). Per disegnare i plots indicatore, vengono utilizzati solo i valori dei buffer di indicatore, eventuali altri array non possono essere utilizzati per questo scopo. Inoltre, i valori del buffer vengono visualizzati nella finestra dei dati.

Un buffer indicatore deve essere dinamico e non richiede specificazione della grandezza - la grandezza dell'array utilizzato come buffer indicatore, viene impostato dal sottosistema di esecuzione del terminale, automaticamente

Dopo che l'array è vincolato al buffer indicatore, la direzione di indicizzazione viene impostata di default come negli array ordinari, ma è possibile utilizzare la funzione ArraySetAsSeries() per cambiare il modo di accesso agli elementi di un array. Per impostazione predefinita, il buffer indicatore viene utilizzato per memorizzare i dati utilizzati per la stampa (INDICATOR_DATA).

Se il calcolo dei valori degli indicatori richiede il possesso di calcoli intermedi e memorizza i valori aggiuntivi per ogni barra, allora un tale array può essere dichiarato come un buffer di calcolo durante il binding (INDICATOR_CALCULATIONS). Per i valori intermedi, è anche possibile utilizzare un array regolare, ma in questo caso, il programmatore deve gestire la grandezza dell'array.

Alcuni plots permettono di impostare un colore per ogni barra. Per memorizzare le informazioni sul colore, vengono utilizzati i buffers colore (INDICATOR_COLOR_INDEX). Il colore è di tipo intero color, ma tutti i buffer degli indicatori devono essere di tipo double. I valori di colore e buffers ausiliari (INDICATOR_CALCULATIONS) non possono essere ottenuti usando CopyBuffer().

Il numero di buffers indicatore deve essere specificato utilizzando la direttiva del compilatore #property indicator_buffers numero_di_buffers:

#property indicator_buffers 3  //  l'indicatore ha 3 buffers

Il numero massimo consentito di buffers in un indicatore è 512.

 

Rilevanza del Buffer Indicatore e Plotting

Ogni plotting è basata su uno o più buffer indicatore. Così, per la visualizzazione di candele semplici, sono necessari quattro valori - i prezzi Open, High, Low e Close. Di conseguenza, per visualizzare un indicatore in forma di candele, è necessario dichiarare 4 buffer indicatore e 4 array di tipo double per essi. Ad esempio:

//--- L'indicatore ha quattro buffer di indicatori
#property indicator_buffers 4
//--- L'indicatore ha un plotting
#property indicator_plots   1
//--- Il numero del plotting grafico 1 apparirà come candele
#property indicator_type1   DRAW_CANDLES
//--- Le candele saranno disegnate in clrDodgerBlue
#property indicator_color1  clrDodgerBlue
//--- 4 array per i buffer di indicatore
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

I plots grafici utilizzano automaticamente i buffer indicatore in base al numero di plot. La numerazione dei plots trame inizia con 1, la numerazione dei buffer inizia con zero. Se il primo plotting richiede 4 buffer indicatore, allora i primi 4 buffer indicatore saranno utilizzati per disegnarla. Questi quattro buffer dovrebbero collegati con gli array appropriati con l'indicizzazione corretta utilizzando la funzione SetIndexBuffer().

//--- Array con associazione ai buffers indicatore
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);  // Il primo buffer corrisponde all'indice zero
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);  // Il secondo buffer corrisponde all'indice 1
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);  // Il terzo buffer corrisponde all'indice 2
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);  // Il quarto buffer corrisponde all'indice 3

Per le candele disegnate, l'indicatore le utilizzerà solo i primi quattro buffer, perché il plotting delle "candele" è stato annunciato con il primo numero.

Modifichiamo l'esempio, e aggiungiamo un plotting di una linea semplice - DRAW_LINE. Supponiamo ora che la linea è numerata 1, e le candele sono numero 2. Il numero di buffer ed il numero di plots è aumentato.

//--- L'indicatore è dotato di 5 buffer indicatore
#property indicator_buffers 5
//--- L'indicatore ha 2 plots
#property indicator_plots   2
//--- Plot 1 è una linea
#property indicator_type1   DRAW_LINE
//--- Il colore della linea è clrDodgerRed
#property indicator_color1  clrDodgerRed
//--- Plot 2 viene disegnato come candele Giapponesi
#property indicator_type2   DRAW_CANDLES
//--- Il colore delle candele è clrDodgerBlue
#property indicator_color2  clrDodgerBlue
//--- 5 array per i buffer indicatore
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

L'ordine degli dei plots è cambiato, ed ora la linea viene prima, seguita dalle candele giapponesi. Pertanto, l'ordine dei buffer è appropriato - prima segnaliamo un buffer per la linea con l'indice pari a zero, e poi quattro buffer per le candele.

   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);  // Il primo buffer corrisponde all'indice 0
//--- Array associante con buffer di indicatori per le candele
   SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // Il secondo buffer corrisponde all'indice 1
   SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // Il terzo buffer corrisponde all'indice 2
   SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // Il quarto buffer corrisponde all'indice 3
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // Il quinto buffer corrisponde all'indice 4 

 

Il numero di buffers e plots può essere impostato solo utilizzando direttive del compilatore, è impossibile modificare queste proprietà in modo dinamico utilizzando le funzioni.

 

Color Versions of Styles

Come si può vedere dalla tabella, gli stili sono divisi in due gruppi. Il primo gruppo comprende gli stili in cui nel nome non c'è una parola COLOR, noi chiamiamo questi stili di base:

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

Nel secondo gruppo, i nomi di stile comprendono il termine COLOR, chiamiamole versioni colore:

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

Tutte le versioni di colore degli stili differiscono da quelli di base, in quanto permettono di specificare un colore per ogni parte del plotting. La minima parte del plotting è una barra, così possiamo dire dire che le versioni colore permettono di impostare il colore su ogni barra.

Eccezioni sono stili DRAW_NONE e DRAW_FILLING, non hanno versioni di colore.

Per impostare il colore tracciando su ciascuna barra, un buffer aggiuntivo per memorizzare l'indice del colore è stato aggiunto alla versione colori. Questi indici indicano il numero di un colore in un array speciale, che contiene un insieme predefinito di colori. La dimensione dell'array di colori è 64. Ciò significa che ogni versione colore di uno stile permette di disegnare un plot in 64 colori diversi.

Il set e il numero di colori nell' array speciale di colori, possono essere impostati tramite una direttiva del compilatore #proprietà indicator_color, dove è possibile specificati tutti i colori necessari separati da virgole. Ad esempio, tale iscrizione in un indicatore:

//--- Definisce 8 colori per colorare le candele (sono memorizzati nell'array speciale)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

Si afferma che per tracciarne 1, 8 colori sono impostati, che saranno collocati in un array speciale. Ulteriormente nel programma non specificheremo il colore del tracciato, ma solo il suo indice. Se vogliamo impostare il colore rosso per il numero di barra K, il valore di indice di colore da un array deve essere impostato nel buffer colore dell'indicatore Il colore rosso è specificato prima della direttiva, corrisponde al numero 0 dell' indice.

  //--- imposta il colore della candela clrRed
  col_buffer[buffer_index]=0;

L'insieme dei colori non è dato una volta per tutte, può essere variato dinamicamente utilizzando PlotIndexSetInteger(). Esempio:

      //--- Imposta il colore per ogni indice che ha proprietà PLOT_LINE_COLOR
      PlotIndexSetInteger(0,                    //  Il numero di stili grafici
                          PLOT_LINE_COLOR,      //  Identificatore proprietà
                          plot_color_ind,       //  Lìindice del colore, dove scriviamo il colore
                          color_array[i]);      //  Un nuovo colore

 

Proprietà del l'indicatore e plotting

Per i plots indicatore, le proprietà possono essere impostate mediante direttive del compilatore ed utilizzando le funzioni appropriate. Per sapere più informazioni su questo in: Collegamento tra Proprietà Indicatore e Funzioni. Il cambiamento dinamico delle proprietà di indicatori utilizzando funzioni speciali, permette di creare indicatori personalizzati più flessibili.

 

Inizio del Disegno Indicatore sul Grafico

In molti casi, a seconda delle condizioni dell'algoritmo, è impossibile avviare il calcolo dei valori degli indicatori immediatamente con la barra di corrente, in quanto è necessario prevedere un numero minimo di barre precedenti disponibili nello storico. Ad esempio, molti tipi di smoothing implicano l'utilizzo di una matrice di prezzi nelle precedenti N barre, e sulla base di questi valori, viene calcolato il valore indicatore sulla barra corrente.

In tali casi, non esiste alcun modo per calcolare i valori degli indicatori per le prime N barre, o questi valori non sono destinati ad essere visualizzati sul grafico e sono solo sussidiari al calcolo di ulteriori valori. Per evitare il plotting dell'indicatore sulle prime N barre dello storico, impostare il valore di N per la proprietà PLOT_DRAW_BEGIN per il plot corrispondente:

//--- Array associante con buffer di indicatori per le candele
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);

Qui:

  • numero_di_plot- un valore da 2zero a indicator_plots-1 (la numerazione dei plots inizia con zero).
  • N - il numero delle prime barre nello storico, in cui l'indicatore non deve essere visualizzato sul grafico.