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
- L'indicatore calcola il file Test_DEMA_OnArrayRB.mq5 sulla base della serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray()
- 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
- Indicatori per la Raccolta Dati: Buffer Orari in MetaTrader 5
- Indice di Volatilità Chaikin: Scegli il Giusto Algoritmo di Smussamento per MetaTrader 5
- Volatilità Stocastica: Indicatore per MetaTrader 5 da Utilizzare sul Grafico
- Notis: L'Indicatore per Misurare la Volatilità su MetaTrader 5
- Indice di Vigorità Relativa (RVI): Guida all'Utilizzo su MetaTrader 5