Como Utilizar a Classe COsMAOnRingBuffer para Calcular o OsMA no MetaTrader 5

Mike 2013.01.08 00:45 47 0 0
Anexo

Descrição

A classe COsMAOnRingBuffer é uma ferramenta poderosa para calcular o indicador técnico Média Móvel do Oscilador (OsMA) utilizando o algoritmo de ring buffer.

Declaração

class COsMAOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

O arquivo da classe COsMAOnRingBuffer.mqh deve ser colocado na pasta IncOnRingBuffer, que você precisa criar em MQL5\Include\. Dois arquivos com exemplos de uso estão anexados à descrição. Além disso, os arquivos de ring buffer, MACD e Média Móvel também devem estar nesta pasta.

Métodos da Classe

//--- método de inicialização:bool Init(                                  // retorna false se houver erro, true se for bem-sucedido
   int            fast_period   = 12,       // período de suavização da Média Móvel rápida
   int            slow_period   = 26,       // período de suavização da Média Móvel lenta
   int            signal_period = 9,        // período de suavização da Média Móvel do sinal
   ENUM_MA_METHOD fast_method   = MODE_EMA, // método de suavização da Média Móvel rápida
   ENUM_MA_METHOD slow_method   = MODE_EMA, // método de suavização da Média Móvel lenta
   ENUM_MA_METHOD signal_method = MODE_SMA, // método de suavização da Média Móvel do sinal
   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 indexação usual 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  
   constint     rates_total,     // tamanho do array array[]
   constint     prev_calculated, // elementos processados na chamada anterior
   constdouble &array[]          // array dos valores de entrada
   );
//--- método de cálculo baseado em elementos separados da série do array           double MainOnValue(              // retorna o valor de OsMA para o elemento definido
   constint     rates_total,     // tamanho do array
   constint     prev_calculated, // elementos processados do array
   constint     begin,           // de onde começam os dados significativos do array
   constdouble value,           // elementos significativos do array
   constint     index            // índice do elemento
   );
//--- métodos para acesso aos dados:int    BarsRequired();   // Retorna o número necessário de barras para desenhar o indicadorstring Name()            // Retorna o nome do indicadorstring FastMethod()      // Retorna o método de suavização da linha rápida em formato de textostring SlowMethod()      // Retorna o método de suavização da linha lenta em formato de textostring SignalMethod()      // Retorna o método de suavização da linha de sinal em formato de textoint    FastPeriod()      // Retorna o período de suavização da linha rápidaint    SlowPeriod()      // Retorna o período de suavização da linha lentaint    SignalPeriod()      // Retorna o período de suavização da linha de sinalint    Size();           // Retorna o tamanho do ring buffer

Para obter os dados calculados do indicador a partir do ring buffer, é possível acessá-los como em um array comum. Por exemplo:

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

...

//+------------------------------------------------------------------+//| Função de iteração do indicador personalizado                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &price[]) 
  {
//--- cálculo do indicador baseado em uma série temporal de preços:
   osma.MainOnArray(rates_total,prev_calculated,price);

...

//--- use os dados dos buffers de "osma",//    copie os dados para o buffer do indicador:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // histograma 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_OsMA_OnArrayRB.mq5 calcula o indicador baseado na série temporal de preços. A aplicação do método MainOnArray() é demonstrada.
  2. O arquivo Test_OsMA_OnValueRB.mq5 demonstra o uso do método MainOnValue(). Primeiro, o indicador OsMA é calculado e desenhado. Depois, com base neste ring buffer, um novo indicador OsMA é desenhado.


Resultado do trabalho do arquivo Test_OsMA_OnArrayRB.mq5 com o tamanho do ring buffer de 256 elementos.



Resultado do trabalho do arquivo Test_OsMA_OnValueRB.mq5 com o tamanho do ring buffer de 256 elementos.

 

O desenvolvimento deste código contou com as contribuições da MetaQuotes Software Corp., Integer e GODZILLA.

Lista
Comentário 0