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

Mike 2013.01.08 00:45 16 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  
   const int     rates_total,     // tamanho do array array[]
   const int     prev_calculated, // elementos processados na chamada anterior
   const double &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
   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,           // elementos significativos do array
   const int     index            // índice do elemento
   );
//--- métodos para acesso aos dados:
int    BarsRequired();   // Retorna o número necessário de barras para desenhar o indicador
string Name()            // Retorna o nome do indicador
string FastMethod()      // Retorna o método de suavização da linha rápida em formato de texto
string SlowMethod()      // Retorna o método de suavização da linha lenta em formato de texto
string SignalMethod()      // Retorna o método de suavização da linha de sinal em formato de texto
int    FastPeriod()      // Retorna o período de suavização da linha rápida
int    SlowPeriod()      // Retorna o período de suavização da linha lenta
int    SignalPeriod()      // Retorna o período de suavização da linha de sinal
int    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                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &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