Home Indicatore tecnico Post

Come Disegnare l'ADX Wilder Utilizzando il Ring Buffer per MetaTrader 5

Allegato
1356.zip (10.07 KB, Scarica 0 volte)

Descrizione

La classe CADXWOnRingBuffer è progettata per calcolare l'indicatore tecnico Average Directional Movement Index Wilder (ADX Wilder) sfruttando l'algoritmo del ring buffer.

Dichiarazione

class CADXWOnRingBuffer

Titolo

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>

Il file CADXWOnRingBuffer.mqh deve essere posizionato nella cartella IncOnRingBuffer, che dovrà essere creata in MQL5\Include\. Sono allegati due file di esempio utilizzati dalla classe in questa cartella. 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( // restituisce false in caso di errore, true se ha successo
   int ma_period = 14, // il periodo di lisciatura della Media Mobile
   ENUM_MA_METHOD ma_method = MODE_SMMA, // metodo di lisciatura della Media Mobile
   int size_buffer = 256, // dimensione del ring buffer, numero di dati memorizzati
   bool as_series = false // true se è una serie temporale, false se è un indicizzazione normale dei dati di input
);
//--- metodo di calcolo basato su una serie temporale o buffer di indicatori:
int MainOnArray( // restituisce il numero di elementi elaborati
   const int rates_total, // dimensione delle 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 su base di singoli elementi della serie:
double MainOnValue( // restituisce il valore ADXW per l'elemento impostato
   const int rates_total, // dimensione dell'array
   const int prev_calculated, // elementi elaborati dell'array
   const int begin, // inizio dei dati significativi dell'array
   const double high, // valore massimo
   const double low, // valore minimo
   const double close, // prezzo di chiusura
   const int index // indice dell'elemento
);
//--- metodi di accesso ai dati:
int BarsRequired(); // Restituisce il numero necessario di barre per disegnare l'indicatore
string NameADXW(); // 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 direzionale positivo
string MAMethod(); // Restituisce il metodo di lisciatura sotto forma di stringa
int MAPeriod(); // Restituisce il periodo di lisciatura
int Size(); // Restituisce la dimensione del ring buffer

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

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>
CADXWOnRingBuffer adxw;

...

//+------------------------------------------------------------------+
//| 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:
   adxw.MainOnArray(rates_total, prev_calculated, high, low, close);

   ...
  
//--- copia dei dati dai buffer del "adxw" nell'indicatore:
   for(int i=start; i<rates_total; i++)
     {
      ADXW_Buffer[i] = adxw[rates_total-1-i]; // indice direzionale medio Wilder
      PDI_Buffer[i]  = adxw.pdi[rates_total-1-i]; // indice direzionale positivo
      NDI_Buffer[i]  = adxw.ndi[rates_total-1-i]; // indice direzionale negativo
     }

   ...
}

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

Esempi

  1. Il file Test_ADXW_OnArrayRB.mq5 calcola l'indicatore basato sulla serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray().
  2. Il file Test_ADXW_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Inizialmente viene calcolato e disegnato l'indicatore ADXW. Poi, sulla base del ring buffer di questo indicatore, vengono calcolate tre linee dell'indicatore ADXW.


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



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

 

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

Post correlati

Commento (0)