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
- 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