Home Indicatore tecnico Post

Come Utilizzare il COBVOnRingBuffer per Calcolare l'OBV in MetaTrader 5

Allegato
1402.zip (6.42 KB, Scarica 0 volte)

Descrizione

La classe COBVOnRingBuffer è progettata per calcolare l'indicatore tecnico On Balance Volume (OBV) utilizzando l'algoritmo del ring buffer.

Dichiarazione

class COBVOnRingBuffer : public CArrayRing

Inclusione

#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>

Il file della classe COBVOnRingBuffer.mqh deve essere posizionato nella cartella IncOnRingBuffer, che deve essere creata all'interno di MQL5\Include\. Due file contenenti esempi della classe sono allegati alla descrizione. Anche il file con la classe del ring buffer deve trovarsi in questa cartella.

Metodi della Classe

//--- metodo di inizializzazione:
bool Init( // se errore restituisce false, se successo - true
   int period = 0, // il periodo dell'OBV
   int size_buffer = 256, // dimensione del ring buffer
   bool as_series = false // true, se è una serie temporale, altrimenti false
);

Il periodo dell'OBV viene utilizzato come nel caso di Integer: se il valore è 0 (default), l'indicatore funziona come quello incluso nel terminale - verrà calcolato per tutte le barre del grafico. In caso di un altro valore positivo specificato, viene utilizzato il numero di barre (principio della media mobile) per il calcolo del valore ad ogni barra del grafico.

//--- metodo di calcolo basato su una serie temporale 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& price[], // prezzo
   const long& volume[]); // volume
  );
//--- metodo di calcolo basato su elementi separati dell'array
double MainOnValue( // restituisce il valore OBV per l'elemento impostato (barra)
   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 price, // prezzo
   const long volume, // volume
   const int index // l'indice dell'elemento (barra)
  );
//--- 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
int Size(); // Restituisce la dimensione del ring buffer

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

//--- la classe con i metodi di calcolo dell'indicatore OBV:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

//+------------------------------------------------------------------+
//| 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 su una serie temporale:
      obv.MainOnArray(rates_total, prev_calculated, close, tick_volume);

...

//--- utilizzare i dati dal ring buffer "obv",
//    ad esempio, copiare i dati nel buffer dell'indicatore:
   for(int i=start; iIsStopped(); i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // linea dell'indicatore

...

//--- valore di ritorno di prev_calculated per la prossima chiamata:
   return(rates_total);
  }

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

Esempi

  1. L'indicatore calcola il file Test_OBV_OnArrayRB.mq5 sulla base della serie temporale dei prezzi. Viene dimostrato l'uso del metodo MainOnArray().
  2. Il file Test_OBV_OnValueRB.mq5 dimostra l'uso del metodo MainOnValue(). Inizialmente, l'indicatore OBV viene calcolato e disegnato. Successivamente, sulla base di questo indicatore, viene disegnato un altro OBV utilizzando il ring buffer.


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



Il risultato del lavoro del Test_OBV_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)