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

Mike 2013.01.17 00:38 21 0 0
Allegato

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
   constint rates_total, // dimensione degli array
   constint prev_calculated, // elementi elaborati nella chiamata precedente
   constdouble& price[], // prezzo
   constlong& volume[]); // volume
  );
//--- metodo di calcolo basato su elementi separati dell'arraydouble MainOnValue( // restituisce il valore OBV per l'elemento impostato (barra)
   constint rates_total, // dimensione dell'array
   constint prev_calculated, // elementi elaborati dell'array
   constint begin, // da dove inizia il dato significativo dell'array
   constdouble price, // prezzo
   constlong volume, // volume
   constint index // l'indice dell'elemento (barra)
  );
//--- metodi di accesso ai dati:int BarsRequired(); // Restituisce il numero necessario di barre per disegnare l'indicatorestring Name(); // Restituisce il nome dell'indicatoreintPeriod(); // Restituisce il periodoint 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 |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
                constint prev_calculated,
                constdatetime& time[],
                constdouble& open[],
                constdouble& high[],
                constdouble& low[],
                constdouble& close[],
                constlong& tick_volume[],
                constlong& volume[],
                constint& 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.

Elenco
Commento 0