Como Utilizar a Classe COBVOnRingBuffer para Calcular o OBV no MetaTrader 5

Mike 2013.01.17 00:38 18 0 0
Anexo

Descrição

A classe COBVOnRingBuffer foi desenvolvida para calcular o indicador técnico On Balance Volume (On Balance Volume, OBV) utilizando o algoritmo do buffer circular.

Declaração

class COBVOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>

O arquivo da classe COBVOnRingBuffer.mqh deve ser colocado na pasta IncOnRingBuffer, que precisa ser criada em MQL5\Include\. Estão anexados à descrição dois arquivos com os exemplos usados pela classe dessa pasta. O arquivo com a classe do buffer circular também deve estar nessa pasta.

Métodos da Classe

//--- método de inicialização:bool Init( // se erro, retorna false; se sucesso, true
   int period = 0, // o período do OBV
   int size_buffer = 256, // o tamanho do buffer circular
   bool as_series = false// true se for uma série temporal, caso contrário - false
   );

O período do OBV é usado como no caso do Integer: se o valor for 0 (padrão), o indicador funcionará como o incluído no terminal - ele será calculado para todas as barras do gráfico. Para qualquer outro valor positivo especificado, um número de barras é utilizado (princípio da Média Móvel) para o cálculo do valor em cada barra do gráfico.

//--- método de cálculo baseado em uma série temporal ou nos buffers do indicador:int MainOnArray( // retorna o número de elementos processados
   constint rates_total, // o tamanho dos arrays
   constint prev_calculated, // elementos processados na chamada anterior
   constdouble& price[], // preço
   constlong& volume[]); // volume
   );
//--- método de cálculo baseado em elementos separados do arraydouble MainOnValue( // retorna o valor do OBV para o elemento (barra) definido
   constint rates_total, // o tamanho do array
   constint prev_calculated, // elementos processados do array
   constint begin, // de onde os dados significativos do array começam
   constdouble price, // preço
   constlong volume, // volume
   constint index // o índice do elemento (barra)
   );
//--- métodos de acesso aos dados:int BarsRequired(); // Retorna o número necessário de barras para desenhar o indicadorstring Name(); // Retorna o nome do indicadorint Period(); // Retorna o períodoint Size(); // Retorna o tamanho do buffer circular

Para obter os dados calculados do indicador a partir do buffer circular, é possível fazê-lo como de um array comum. Por exemplo:

//--- a classe com os métodos de cálculo do indicador OBV:#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

//+------------------------------------------------------------------+//| Função de iteração do indicador personalizado |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
                constint prev_calculated,
                constdatetime& time[],
                constdouble& open[],
                constdouble& high[],
                constdouble& low[],
                constdouble& close[],
                constlong& tick_volume[],
                constlong& volume[],
                constint& spread[]) {
//--- cálculo do indicador baseado em uma série temporal:
      obv.MainOnArray(rates_total, prev_calculated, close, tick_volume);

...

//--- usar os dados do buffer circular "obv",//    por exemplo, copiar os dados no buffer do indicador:
   for(int i=start;i<rates_total && !IsStopped();i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // linha do indicador

...

//--- retornar o valor de prev_calculated para a próxima chamada:
   return(rates_total);
  }

Por favor, note que a indexação no buffer circular é a mesma que na série temporal.

Exemplos

  1. O indicador calcula o arquivo Test_OBV_OnArrayRB.mq5 com base na série temporal de preços. A aplicação do método MainOnArray() é demonstrada.
  2. O arquivo Test_OBV_OnValueRB.mq5 demonstra o uso do método MainOnValue(). Primeiro, o indicador OBV é calculado e desenhado. Então, com base nesse buffer circular do indicador, mais um OBV é desenhado.


O resultado do trabalho do Test_OBV_OnArrayRB.mq5 com o tamanho do buffer circular de 256 elementos



O resultado do trabalho do Test_OBV_OnValueRB.mq5 com o tamanho do buffer circular de 256 elementos

 

Na elaboração do código, foram utilizados os desenvolvimentos da MetaQuotes Software Corp., Integer e GODZILLA.

Lista
Comentário 0