Descrição
A classe CEROnRingBuffer foi desenvolvida para calcular o indicador técnico Efficiency Ratio (ER), que é utilizado na Média Móvel Adaptativa (Adaptive Moving Average, AMA), empregando o algoritmo do ring buffer.
Declaração
class CEROnRingBuffer : public CArrayRing
Título
#include <IncOnRingBuffer\CEROnRingBuffer.mqh>O arquivo da classe CEROnRingBuffer.mqh deve ser colocado na pasta IncOnRingBuffer, que precisa ser criada em MQL5\Include\. Dois arquivos com exemplos que utilizam a classe dessa pasta estão anexados à descrição. O arquivo com a classe do ring buffer também deve estar nesta pasta.
Métodos da Classe
//--- método de inicialização: bool Init( // se erro, retorna false; se sucesso, retorna true int period = 34, // período de cálculo do ER int size_buffer = 256, // tamanho do ring buffer, número de dados armazenados bool as_series = false // true, se for uma série temporal; false - se for um índice comum dos dados de entrada );
//--- método de cálculo baseado em uma série temporal ou buffer de indicador: int MainOnArray( // retorna o número de elementos processados const int rates_total, // tamanho do array array[] const int prev_calculated, // elementos processados na chamada anterior const double &array[] // o array dos valores de entrada );
//--- método de cálculo baseado em elementos separados da série do array double MainOnValue( // retorna o valor do ER para o elemento definido const int rates_total, // tamanho do array const int prev_calculated, // elementos processados do array const int begin, // de onde começam os dados significativos do array const double value, // valor do elemento do array const int index // índice do elemento );
//--- métodos de acesso aos dados: int BarsRequired(); // Retorna o número necessário de barras para desenhar o indicador string Name() // Retorna o nome do indicador int Period() // Retorna o período de cálculo do ER int Size(); // Retorna o tamanho do ring buffer
Os dados calculados do indicador podem ser obtidos do ring buffer como de um array comum. Por exemplo:
//--- classe com os métodos de cálculo do indicador ER: #include <IncOnRingBuffer\CEROnRingBuffer.mqh> CEROnRingBuffer er; ... //+------------------------------------------------------------------+ //| Função de iteração do indicador personalizado | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- cálculo do indicador baseado na série temporal de preços: er.MainOnArray(rates_total,prev_calculated,price); ... //--- usar dados do ring buffer "er", // por exemplo, copiar dados nos buffers do indicador: for(int i=start;i<rates_total;i++) { ER_Buffer[i] = er[rates_total-1-i]; // linha do indicador } //--- retorna o valor de prev_calculated para a próxima chamada: return(rates_total); }
Por favor, note que a indexação no ring buffer é a mesma que na série temporal.
Exemplos
- O arquivo Test_ER_OnArrayRB.mq5 calcula o indicador com base na série temporal de preços. A aplicação do método MainOnArray() é demonstrada.
- O arquivo Test_ER_OnValueRB.mq5 demonstra o uso do método MainOnValue(). Primeiro, o indicador ER é calculado e desenhado. Então, com base no ring buffer deste indicador, mais um ER é desenhado.

O resultado do trabalho do Test_ER_OnArrayRB.mq5 com o tamanho do ring buffer de 256 elementos

Os resultados do trabalho do Test_ER_OnValueRB.mq5 com o tamanho do ring buffer de 256 elementos
Ao escrever o código, foram utilizados os desenvolvimentos da MetaQuotes Software Corp., Integer e GODZILLA.
Comentário 0