Guida all'Utilizzo della Classe COsMAOnRingBuffer per l'OsMA in MetaTrader 5

Mike 2013.01.08 00:45 17 0 0
Allegato

Descrizione

La classe COsMAOnRingBuffer è progettata per calcolare l'indicatore tecnico Media Mobile dell'Oscillatore (Moving Average of Oscillator, OsMA) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class COsMAOnRingBuffer : public CArrayRing

Titolo

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

Il file della classe COsMAOnRingBuffer.mqh deve essere posizionato nella cartella IncOnRingBuffer, che deve essere creata in MQL5\Include\. Due file con gli esempi utilizzati dalla classe di questa cartella sono allegati alla descrizione. I file con il ring buffer, il MACD e le classi delle Medie Mobili devono essere presenti in questa cartella.

Metodi della classe

//--- metodo di inizializzazione:
bool Init(                                  // se c'è un errore ritorna false, se ha successo - true
   int            fast_period   = 12,       // periodo di Media Mobile veloce
   int            slow_period   = 26,       // periodo di Media Mobile lenta
   int            signal_period = 9,        // periodo di Media Mobile del segnale
   ENUM_MA_METHOD fast_method   = MODE_EMA, // metodo di Media Mobile veloce
   ENUM_MA_METHOD slow_method   = MODE_EMA, // metodo di Media Mobile lenta
   ENUM_MA_METHOD signal_method = MODE_SMA, // metodo di Media Mobile del segnale
   int            size_buffer   = 256,      // dimensione del ring buffer
   bool           as_series     = false     // true se è una serie temporale
   );
//--- metodo di calcolo basato su serie temporali o buffer di indicatori:
int MainOnArray(                  // ritorna il numero di elementi elaborati
   const int     rates_total,     // dimensione dell'array
   const int     prev_calculated, // elementi elaborati nella chiamata precedente
   const double &array[]          // array dei valori di input
   );
//--- metodo di calcolo basato sugli elementi della serie separati:
double MainOnValue(              // ritorna il valore OsMA per l'elemento impostato
   const int    rates_total,     // dimensione dell'array
   const int    prev_calculated, // elementi elaborati dell'array
   const int    begin,           // da dove inizia il dato significativo dell'array
   const double value,           // elementi significativi dell'array
   const int    index            // indice dell'elemento
   );
//--- metodi di accesso ai dati:
int    BarsRequired();   // Ritorna il numero necessario di barre per disegnare l'indicatore
string Name()            // Ritorna il nome dell'indicatore
string FastMethod()      // Ritorna il metodo di smoothing della linea veloce
string SlowMethod()      // Ritorna il metodo di smoothing della linea lenta
string SignalMethod()     // Ritorna il metodo di smoothing della linea segnale
int    FastPeriod()      // Ritorna il periodo di smoothing della linea veloce
int    SlowPeriod()      // Ritorna il periodo di smoothing della linea lenta
int    SignalPeriod()      // Ritorna il periodo di smoothing della linea segnale
int    Size();           // Ritorna la dimensione del ring buffer

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

//--- la classe con i metodi di calcolo dell'indicatore OsMA:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...
//+------------------------------------------------------------------+
//| 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 su una serie temporale di prezzi:
   osma.MainOnArray(rates_total,prev_calculated,price);
...
//--- usa i dati dai buffer di "osma",
//    copiando i dati nel buffer dell'indicatore:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // istogramma dell'indicatore
//--- ritorna il valore di prev_calculated per la prossima chiamata:
   return(rates_total);
  }

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

Esempi

  1. Il file Test_OsMA_OnArrayRB.mq5 calcola l'indicatore basato su serie temporali di prezzo. È dimostrato l'uso del metodo MainOnArray().
  2. Il file Test_OsMA_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Inizialmente viene calcolato e disegnato l'indicatore OsMA, quindi sulla base di questo ring buffer viene disegnato un altro indicatore OsMA.


Il risultato dell'esecuzione di Test_OsMA_OnArrayRB.mq5 con una dimensione del ring buffer di 256 elementi.



Il risultato dell'esecuzione di Test_OsMA_OnValueRB.mq5 con una dimensione del ring buffer di 256 elementi.

 

Nel codice sono stati utilizzati sviluppi di MetaQuotes Software Corp., Integer e GODZILLA.

Elenco
Commento 0