Home Indicatore tecnico Post

Calcolare il TEMA con il Ring Buffer: Guida per MetaTrader 5

Allegato
1417.zip (11.22 KB, Scarica 0 volte)

Descrizione

La classe CTEMAOnRingBuffer è stata progettata per il calcolo dell'indicatore tecnico Triple Exponential Moving Average (Triple Exponential Moving Average, TEMA) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class CTEMAOnRingBuffer : public CArrayRing

Titolo

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

Il file della classe CTEMAOnRingBuffer.mqh deve essere posizionato nella cartella IncOnRingBuffer, che deve essere creata in MQL5\Include\. Due file con gli esempi utilizzati dalla classe sono allegati alla descrizione. Anche i file con le classi del ring buffer, DEMA e 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 TEMA
   ENUM_MA_METHOD method      = MODE_EMA, // il metodo di smussamento
   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 per calcolare basato su elementi separati della serie dell'array           
double MainOnValue(              // restituisce il valore TEMA per l'elemento impostato (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 è come in una serie temporale
double              DEMA(int index); // Restituisce il valore DEMA, l'indicizzazione è come in una serie temporale

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

//--- classe con i metodi di calcolo dell'indicatore TEMA:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...

//+------------------------------------------------------------------+
//| 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:
    tema.MainOnArray(rates_total,prev_calculated,price);

...

//--- utilizza i dati dal ring buffer "tema",
//    ad esempio, copia i dati nei buffer degli indicatori:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // la linea dell'indicatore TEMA

...

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

Durante il calcolo del TEMA, vengono effettuati anche i calcoli della Moving Average e della DEMA con gli stessi parametri. Possiamo ottenere i dati dai buffer MA e DEMA utilizzando i metodi MA(int index) e DEMA(int index), rispettivamente:

//--- utilizza i dati dai buffer Moving Average e DEMA,
//    ad esempio, copia nei buffer degli indicatori:
   for(int i=start;i<rates_total && !IsStopped();i++)
     {
      MA_Buffer[i]   = dema.MA(rates_total-1-i);   // la linea dell'indicatore Moving Average
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // la linea dell'indicatore DEMA
     }

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

Esempi

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


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



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

 

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

Post correlati

Commento (0)