Home Indicatore tecnico Post

Guida all'Utilizzo della Classe CADXOnRingBuffer per l'ADX in MetaTrader 5

Allegato
1343.zip (9.86 KB, Scarica 0 volte)

Descrizione

La classe CADXOnRingBuffer è stata progettata per calcolare l'indicatore tecnico Average Directional Movement Index (ADX) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class CADXOnRingBuffer

Intestazione del file

#include <IncOnRingBuffer\CADXOnRingBuffer.mqh>

Il file della classe CADXOnRingBuffer.mqh deve essere collocato nella cartella IncOnRingBuffer, che deve essere creata in MQL5\Include\. Due file di esempio utilizzati dalla classe sono allegati alla descrizione. Il file con la classe del ring buffer e la classe della Media Mobile devono anch'essi trovarsi in questa cartella.

Metodi della classe

//--- metodo di inizializzazione:
bool Init(                                // se errore ritorna false, se successo - true
   int            ma_period   = 14,       // periodo di smussamento della Media Mobile
   ENUM_MA_METHOD ma_method   = MODE_EMA, // metodo di smussamento della Media Mobile
   int            size_buffer = 256,      // dimensione del ring buffer, numero di dati memorizzati
   bool           as_series   = false     // true, se serie temporale, false se indicizzazione normale dei dati di input
   );             
//--- metodo di calcolo basato su serie temporali o buffer di indicatori:          
int MainOnArray(                  // restituisce il numero di elementi elaborati  
   const int     rates_total,     // la dimensione degli array
   const int     prev_calculated, // elementi elaborati nella chiamata precedente
   const double &high[]           // array dei valori massimi
   const double &low[]            // array dei valori minimi
   const double &close[]           // array dei prezzi di chiusura
   );
//--- metodo di calcolo basato su elementi separati della serie dell'array            
double MainOnValue(              // restituisce il valore ADX per l'elemento impostato
   const int     rates_total,     // la dimensione dell'array
   const int     prev_calculated, // elementi elaborati dell'array
   const int     begin,           // da dove iniziano i valori significativi dell'array
   const double high,            // valore massimo 
   const double low,             // valore minimo 
   const double close,           // prezzo di chiusura 
   const int     index            // l'indice dell'elemento
   );
//--- metodi di accesso ai dati:
int     BarsRequired();   // Restituisce il numero necessario di barre per disegnare l'indicatore
string NameADX();        // Restituisce il nome dell'indicatore
string NameNDI();        // Restituisce il nome della linea dell'indicatore di movimento direzionale negativo
string NamePDI();        // Restituisce il nome della linea dell'indicatore di movimento direzionale positivo
string MAMethod();       // Restituisce il metodo di smussamento in forma di stringa
int     MAPeriod();       // Restituisce il periodo di smussamento
int     Size();           // Restituisce la dimensione del ring buffer

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

#include <IncOnRingBuffer\CADXOnRingBuffer.mqh>
CADXOnRingBuffer adx;

...

//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- calcolo dell'indicatore:
   adx.MainOnArray(rates_total,prev_calculated,high,low,close);

   ...
     
//--- copia dei dati dai ring buffers "adx" all'indicatore:
   for(int i=start;i<rates_total;i++)
     {
      ADX_Buffer[i]=adx[rates_total-1-i];      // indice di movimento direzionale medio
      PDI_Buffer[i]=adx.pdi[rates_total-1-i];  // indice di movimento direzionale positivo
      NDI_Buffer[i]=adx.ndi[rates_total-1-i];  // indice di movimento direzionale negativo
     }

   ...
}

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

Esempi

  1. Il file Test_ADX_OnArrayRB.mq5 calcola l'indicatore sulla base della serie temporale dei prezzi. Viene dimostrato l'utilizzo del metodo MainOnArray().
  2. Il file Test_ADX_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). All'inizio viene calcolato e disegnato l'indicatore ADX. Poi, sulla base del ring buffer di questo indicatore, vengono calcolate tre linee dell'indicatore ADX.


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



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

 

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

Post correlati

Commento (0)