Como Usar a Classe CEROnRingBuffer para Calcular o Efficiency Ratio no MetaTrader 5

Mike 2013.01.08 23:46 26 0 0
Anexo

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

  1. 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.
  2. 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 GODZILLA.

Lista
Comentário 0