Home Indicatore tecnico Post

Calcolo dell'MFI con il Ring Buffer in MetaTrader 5: Guida Pratica

Allegato
1395.zip (10.22 KB, Scarica 0 volte)

Descrizione

La classe CMFIOnRingBuffer è progettata per calcolare l'indicatore tecnico Money Flow Index (MFI) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class CMFIOnRingBuffer : public CArrayRing

Titolo

#include <IncOnRingBuffer\CMFIOnRingBuffer.mqh>

Il file della classe CMFIOnRingBuffer.mqh deve essere collocato nella cartella IncOnRingBuffer, che deve essere creata in MQL5\Include\. Due file con esempi utilizzati da questa classe sono allegati alla descrizione. Inoltre, 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                 period         = 14,            // il periodo dell'MFI
   ENUM_MA_METHOD      method         = MODE_SMA,      // il metodo di smoothing
   ENUM_APPLIED_PRICE  applied_price  = PRICE_TYPICAL, // prezzo utilizzato per il calcolo
   ENUM_APPLIED_VOLUME applied_volume = VOLUME_TICK,   // volume utilizzato per il calcolo
   int                 size_buffer    = 256,           // la dimensione del ring buffer
   bool                as_series      = false          // true se è una serie temporale, altrimenti false
   );
//--- il metodo di calcolo basato sulle serie temporali o sui buffer degli indicatori:
int MainOnArray(// restituisce il numero degli elementi elaborati
   const int     rates_total,     // dimensione degli array
   const int     prev_calculated, // elementi elaborati nella chiamata precedente
   const double&   open[],          // prezzi di apertura
   const double&   high[],          // prezzi massimi
   const double&   low[],           // prezzi minimi
   const double&   close[],         // prezzi di chiusura
   const long&   tick_volume[],   // volume tick
   const long&   volume[]);       // volume azionario
   );
//--- metodo di calcolo basato sugli elementi della serie separati dell'array:
double MainOnValue(// restituisce il valore dell'MFI per l'elemento impostato (bar)
   const int    rates_total,     // dimensione dell'array
   const int    prev_calculated, // elementi elaborati dell'array
   const int    begin,           // da dove cominciano i dati significativi dell'array
   const double open,            // prezzo di apertura del bar
   const double high,            // prezzo massimo del bar
   const double low,             // prezzo minimo del bar
   const double close,           // prezzo di chiusura del bar
   const long   tick_volume,     // volume tick del bar
   const long   volume,          // volume azionario del 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 
string              Method();       // Restituisce il metodo in forma di stringa
ENUM_APPLIED_PRICE  Price();        // Restituisce il tipo di prezzo utilizzato
ENUM_APPLIED_VOLUME Volume();       // Restituisce il tipo di volume utilizzato
int                 Size();         // Restituisce la dimensione del ring buffer

Per ottenere i dati calcolati dell'indicatore dal ring buffer, puoi fare riferimento a essi come in un array normale. Ad esempio:

//--- la classe con i metodi di calcolo dell'indicatore MFI:
#include <IncOnRingBuffer\CMFIOnRingBuffer.mqh>
CMFIOnRingBuffer mfi;

...

//+------------------------------------------------------------------+
//| 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 basato sulle serie temporali:
   mfi.MainOnArray(rates_total, prev_calculated, open, high, low, close, tick_volume, volume);

...

//--- utilizza i dati dai ring buffer "mfi",
//    ad esempio, copia i dati nel buffer dell'indicatore:
   for(int i=start;i<rates_total && !IsStopped();i++)
      MFI_Buffer[i] = mfi[rates_total-1-i]; // linea dell'indicatore

...

//--- restituisce 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_MFI_OnArrayRB.mq5 calcola l'indicatore basato sulla serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray().
  2. Il file Test_MFI_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Inizialmente viene calcolato e disegnato l'indicatore MFI. Poi, sulla base di questo ring buffer, viene disegnato un ulteriore indicatore MFI.


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



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

Post correlati

Commento (0)