Como Usar a Classe CTEMAOnRingBuffer para Calcular o TEMA no MetaTrader 5

Mike 2013.01.17 00:39 15 0 0
Anexo

Descrição

A classe CTEMAOnRingBuffer foi desenvolvida para calcular o indicador técnico Média Móvel Exponencial Tripla (TEMA) utilizando o algoritmo do buffer circular. Essa implementação traz uma forma eficaz de trabalhar com dados de séries temporais.

Declaração da Classe

class CTEMAOnRingBuffer : public CArrayRing

Inclusão do Arquivo

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

O arquivo CTEMAOnRingBuffer.mqh deve ser colocado na pasta IncOnRingBuffer, que deve ser criada em MQL5\Include\. Dois arquivos com exemplos usados pela classe estão anexados à descrição. Os arquivos de classes do buffer circular, DEMA e Média Móvel também devem estar nesta pasta.

Métodos da Classe

//--- método de inicialização:
bool Init( // se erro, retorna false; se sucesso, true
   int period = 12, // o período do TEMA
   ENUM_MA_METHOD method = MODE_EMA, // método de suavização
   int size_buffer = 256, // tamanho do buffer circular
   bool as_series = false // true se for uma série temporal, caso contrário, false
   );
//--- método de cálculo baseado em uma série temporal ou nos buffers de indicadores:
int MainOnArray( // retorna o número de elementos processados
   const int rates_total, // tamanho do array
   const int prev_calculated, // elementos processados na chamada anterior
   const double& price[], // array para cálculo
   );
//--- método para cálculo baseado em elementos de séries específicas do array
double MainOnValue( // retorna o valor do TEMA para o elemento definido (bar)
   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 (bar)
   const int index // índice do elemento (bar)
   );
//--- 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
int Size(); // Retorna o tamanho do buffer circular
double MA(int index); // Retorna o valor da Média Móvel, indexação como em uma série temporal
double DEMA(int index); // Retorna o valor do DEMA, indexação como em uma série temporal

Para obter os dados calculados do indicador a partir do buffer circular, é possível proceder da mesma forma que com um array comum. Por exemplo:

//--- classe com os métodos de cálculo do indicador TEMA:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...

//+------------------------------------------------------------------+
//| Função de iteração do indicador personalizado |
//+------------------------------------------------------------------+
int OnCalculate( const int rates_total, // o tamanho do array price[]
         const int prev_calculated, // barras processadas na chamada anterior
         const int begin, // de onde começam os dados significativos
         const double& price[]) // o array para cálculo
  {
//--- cálculo do indicador baseado em uma série temporal:
    tema.MainOnArray(rates_total, prev_calculated, price);

...

//--- usar os dados do buffer circular "tema",
//    por exemplo, copiar os dados no buffer do indicador:
   for(int i=start; iIsStopped(); i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // a linha do indicador TEMA

...

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

Ao calcular o TEMA, também são calculadas a Média Móvel e o DEMA com os mesmos parâmetros. Podemos obter os dados do buffer circular da MA e DEMA utilizando os métodos MA(int index) e DEMA(int index), respectivamente:

//--- usar os dados dos buffers circulares da Média Móvel e DEMA,
//    por exemplo, copiá-los nos buffers de indicadores:
   for(int i=start; iIsStopped(); i++)
     {
      MA_Buffer[i] = dema.MA(rates_total-1-i); // a linha do indicador da Média Móvel
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // a linha do indicador DEMA
     }

Atenção: a indexação nos buffers circulares é a mesma que nas séries temporais.

Exemplos

  1. O indicador calcula o arquivo Test_TEMA_OnArrayRB.mq5 com base na série temporal de preços. A aplicação do método MainOnArray() é demonstrada.
  2. O Test_TEMA_OnValueRB.mq5 demonstra o uso do método MainOnValue(). Primeiramente, o indicador TEMA é calculado e desenhado. Em seguida, com base nesse buffer circular do indicador, um novo TEMA é desenhado.


Resultado do trabalho do arquivo Test_TEMA_OnArrayRB.mq5 com o tamanho do buffer circular de 256 elementos



Resultado do trabalho do arquivo Test_TEMA_OnValueRB.mq5 com o tamanho do buffer circular de 256 elementos

 

O desenvolvimento do código contou com a colaboração da MetaQuotes Software Corp., Integer e GODZILLA.

Lista
Comentário 0