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
- O arquivo
Test_OsMA_OnArrayRB.mq5calcula o indicador baseado na série temporal de preços. A aplicação do métodoMainOnArray()é demonstrada. - O arquivo
Test_OsMA_OnValueRB.mq5demonstra o uso do métodoMainOnValue(). 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.
Comentário 0