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
- 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.
- 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.
Comentário 0