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
- O indicador calcula o arquivo
Test_OBV_OnArrayRB.mq5com base na série temporal de preços. A aplicação do métodoMainOnArray()é demonstrada. - O arquivo
Test_OBV_OnValueRB.mq5demonstra o uso do métodoMainOnValue(). 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.

Comentário 0