Home Indicatore tecnico Post

Come Disegnare il DEMA con il Ring Buffer - Guida per MetaTrader 5

Allegato
1416.zip (9.14 KB, Scarica 0 volte)

Descrizione

La classe CDEMAOnRingBuffer è progettata per calcolare l'indicatore tecnico Double Exponential Moving Average (DEMA) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class CDEMAOnRingBuffer : public CArrayRing

Titolo

#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>

Il file della classe CDEMAOnRingBuffer.mqh deve essere collocato nella cartella IncOnRingBuffer che deve essere creata in MQL5\Include\. Sono allegati alla descrizione due file con gli esempi utilizzati dalla classe in questa cartella. Anche il file con le classi del ring buffer e della Moving Average devono trovarsi in questa cartella.

Metodi della Classe

//--- metodo di inizializzazione:
bool Init( 
    // se errore restituisce false, se successo - true
    int period = 12, // il periodo del DEMA
    ENUM_MA_METHOD method = MODE_EMA, // il metodo di smoothing
    int size_buffer = 256, // la dimensione del ring buffer
    bool as_series = false // true, se è una serie temporale, altrimenti - false
);
//--- metodo di calcolo basato su una serie temporale o i buffer degli indicatori:
int MainOnArray( 
    // restituisce il numero degli elementi elaborati
    const int rates_total, // la dimensione dell'array
    const int prev_calculated, // elementi elaborati nella chiamata precedente
    const double& price[], // l'array per il calcolo
);
//--- metodo di calcolo basato su singoli elementi della serie dell'array
double MainOnValue( 
    // restituisce il valore DEMA per l'elemento specificato (bar)
    const int rates_total, // la dimensione dell'array
    const int prev_calculated, // elementi elaborati dell'array
    const int begin, // da dove iniziano i dati significativi dell'array
    const double value, // il valore dell'elemento (bar)
    const int index // l'indice dell'elemento (bar)
);

Metodi di accesso ai dati:

int BarsRequired(); // Restituisce il numero necessario di barre per disegnare l'indicatore
string Name(); // Restituisce il nome dell'indicatore
int Period(); // Restituisce il periodo
int Size(); // Restituisce la dimensione del ring buffer
double MA(int index); // Restituisce il valore della Moving Average, l'indicizzazione è simile a una serie temporale

Per ottenere i dati calcolati dell'indicatore dal ring buffer, è possibile farlo come in un normale array. Per esempio:

//--- classe con i metodi di calcolo dell'indicatore DEMA:
#include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh>
CDEMAOnRingBuffer dema;

...

//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, // la dimensione dell'array price[]
    const int prev_calculated, // barre elaborate nella chiamata precedente
    const int begin, // da dove iniziano i dati significativi
    const double& price[]) // l'array per il calcolo
{  
//--- calcolo dell'indicatore basato su una serie temporale:
    dema.MainOnArray(rates_total, prev_calculated, price);

...

//--- usa i dati dal ring buffer "dema",
//    ad esempio, copia i dati nel buffer dell'indicatore:
    for(int i=start; i<rates_total && !IsStopped(); i++)
      DEMA_Buffer[i] = dema[rates_total - 1 - i]; // la linea dell'indicatore DEMA

...

//--- restituisce il valore di prev_calculated per la prossima chiamata:
    return(rates_total);
}

Quando calcoliamo il DEMA, viene eseguito anche il calcolo della Moving Average con gli stessi parametri. Possiamo ottenere i dati dal ring buffer della MA utilizzando il metodo MA(int index):

//--- usa i dati dal ring buffer della Moving Average,
//    ad esempio, copia i dati nel buffer dell'indicatore:
    for(int i=start; i<rates_total && !IsStopped(); i++)
      MA_Buffer[i] = dema.MA(rates_total - 1 - i); // la linea dell'indicatore Moving Average

Si prega di notare che l'indicizzazione nei ring buffer è la stessa delle serie temporali.

Esempi

  1. L'indicatore calcola il file Test_DEMA_OnArrayRB.mq5 sulla base della serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray()
  2. Il file Test_DEMA_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Prima viene calcolato e disegnato l'indicatore DEMA. Poi, sulla base di questo ring buffer dell'indicatore, viene disegnato un altro DEMA.



Il risultato del lavoro del Test_DEMA_OnArrayRB.mq5 con la dimensione del ring buffer di 256 elementi



Il risultato del lavoro del Test_DEMA_OnValueRB.mq5 con la dimensione del ring buffer di 256 elementi

 

Durante la scrittura del codice sono stati utilizzati gli sviluppi di MetaQuotes Software Corp., Integer e GODZILLA.

Post correlati

Commento (0)