Come Utilizzare il MACD con il Ring Buffer in MetaTrader 5

Mike 2012.12.28 17:51 22 0 0
Allegato

Descrizione

La classe CMACDOnRingBuffer è progettata per il calcolo dell'indicatore tecnico Moving Average Convergence/Divergence (MACD) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class CMACDOnRingBuffer

Titolo

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

Il file della classe CMACDOnRingBuffer.mqh deve essere collocato nella cartella IncOnRingBuffer, che deve essere creata in MQL5\Include\. Due file con gli esempi utilizzati dalla classe in questa cartella sono allegati alla descrizione. Anche il file con la classe del ring buffer e la classe di Moving Average devono trovarsi in questa cartella.

Metodi della Classe

//--- metodo di inizializzazione:
bool Init(// se errore ritorna false, se successo - true
   int fast_period = 12, // il periodo della media mobile veloce
   int slow_period = 26, // il periodo della media mobile lenta
   int signal_period = 9, // il periodo della media mobile del segnale
   ENUM_MA_METHOD fast_method = MODE_EMA, // metodo di smoothing della media mobile veloce
   ENUM_MA_METHOD slow_method = MODE_EMA, // metodo di smoothing della media mobile lenta
   ENUM_MA_METHOD signal_method = MODE_SMA, // metodo di smoothing della media mobile del segnale
   int size_buffer = 256, // dimensione del ring buffer
   bool as_series = false);
//--- metodo di calcolo basato su una serie temporale o buffer dell'indicatore:
int MainOnArray(// ritorna il numero di elementi elaborati
   const int rates_total,
   const int prev_calculated,
   const double &array[]);
//--- metodo di calcolo basato su singoli elementi della serie:
double MainOnValue(// ritorna il valore MACD per l'elemento impostato
   const int rates_total,
   const int prev_calculated,
   const int begin,
   const double value,
   const int index);
//--- metodi di accesso ai dati:
int BarsRequired(); // Restituisce il numero necessario di barre per disegnare l'indicatore
string Name(); // Restituisce il nome dell'indicatore
string NameMain(); // Restituisce il nome della linea principale dell'indicatore
string NameSignal(); // Restituisce il nome della linea di segnale dell'indicatore
string FastMethod(); // Restituisce il metodo di smoothing della linea veloce in forma di stringa
string SlowMethod(); // Restituisce il metodo di smoothing della linea lenta in forma di stringa
string SignalMethod(); // Restituisce il metodo di smoothing della linea di segnale in forma di stringa
int FastPeriod(); // Restituisce il periodo di smoothing della linea veloce
int SlowPeriod(); // Restituisce il periodo di smoothing della linea lenta
int SignalPeriod(); // Restituisce il periodo di smoothing della linea di segnale
int Size(); // Restituisce la dimensione del ring buffer

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

//--- la classe con i metodi di calcolo dell'indicatore MACD:
#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>
CMACDOnRingBuffer macd;

...

//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const int begin, 
                const double &price[]) 
  {
//--- calcolo dell'indicatore basato sulla serie temporale dei prezzi:
   macd.MainOnArray(rates_total,prev_calculated,price);

...

//--- utilizzo dei dati dai buffer "macd",
//    copiare i dati nei buffer dell'indicatore:
   for(int i=start;i<rates_total;i++)
     {
      MainBuffer[i] = macd[rates_total-1-i]; // istogramma dell'indicatore
      SignalBuffer[i] = macd.signal[rates_total-1-i]; // linea di segnale dell'indicatore
     }
//--- valore di prev_calculated per la prossima chiamata:
   return(rates_total);
  }

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

Esempi

  1. Il file Test_MACD_OnArrayRB.mq5 calcola l'indicatore basato sulla serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray()
  2. Il file Test_MACD_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Inizialmente, l'indicatore MACD viene calcolato e disegnato. Poi, sulla base del ring buffer di questo indicatore, viene disegnato un altro indicatore MACD.


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



Il risultato del lavoro del Test_MACD_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.

Elenco
Commento 0