Cómo Dibujar el OsCD Usando el Buffer Circular en MetaTrader 5

Mike 2013.01.08 00:45 20 0 0
Archivos adjuntos

Descripción

La clase COsMAOnRingBuffer está diseñada para calcular el indicador técnico Media Móvil del Oscilador (Moving Average of Oscillator, OsMA) utilizando el algoritmo del buffer circular.

Declaración

class COsMAOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

El archivo de la clase COsMAOnRingBuffer.mqh debe colocarse en la carpeta IncOnRingBuffer que debe establecerse en MQL5\Include\. Se adjuntan dos archivos con ejemplos utilizados por la clase desde esta carpeta. Los archivos que contienen el buffer circular, el MACD y las clases de Media Móvil también deben estar en esta carpeta.

Métodos de la clase

//--- método de inicialización:
bool Init(                                  // si hay error devuelve falso, si es exitoso - verdadero
   int            fast_period   = 12,       // el periodo de la media móvil rápida
   int            slow_period   = 26,       // el periodo de la media móvil lenta
   int            signal_period = 9,        // el periodo de la media móvil de señal
   ENUM_MA_METHOD fast_method   = MODE_EMA, // el método de la media móvil rápida
   ENUM_MA_METHOD slow_method   = MODE_EMA, // el método de la media móvil lenta
   ENUM_MA_METHOD signal_method = MODE_SMA, // el método de la media móvil de señal
   int            size_buffer   = 256,      // el tamaño del buffer circular, número de datos almacenados
   bool           as_series     = false     // verdadero, si es una serie temporal, falso si es un indexado normal de datos
   );
//--- el método de cálculo basado en una serie temporal o buffer de indicador:
int MainOnArray(                  // devuelve el número de elementos procesados
   const int     rates_total,     // el tamaño del array array[]
   const int     prev_calculated, // elementos procesados en la llamada anterior
   const double &array[]          // el array de los valores de entrada
   );
//--- el método de cálculo basado en los elementos separados de la serie del array
double MainOnValue(              // devuelve el valor de OsMA para el elemento establecido
   const int     rates_total,     // el tamaño del array
   const int     prev_calculated, // elementos procesados del array
   const int     begin,           // desde donde inician los datos significativos del array
   const double value,           // elementos significativos del array
   const int     index            // el índice del elemento
   );
//--- los métodos para acceder a los datos:
int    BarsRequired();   // Devuelve el número necesario de barras para dibujar el indicador
string Name()            // Devuelve el nombre del indicador
string FastMethod()      // Devuelve el método de suavizado de la línea rápida en forma de texto
string SlowMethod()      // Devuelve el método de suavizado de la línea lenta en forma de texto
string SignalMethod()     // Devuelve el método de suavizado de la línea de señal en forma de texto
int    FastPeriod()      // Devuelve el periodo de suavizado de la línea rápida
int    SlowPeriod()      // Devuelve el periodo de suavizado de la línea lenta
int    SignalPeriod()      // Devuelve el periodo de suavizado de la línea de señal
int    Size();           // Devuelve el tamaño del buffer circular

Para obtener los datos calculados del indicador desde el buffer circular, es posible hacerlo como desde un array normal. Por ejemplo:

//--- la clase con los métodos del cálculo del indicador OsMA:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                    |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- el cálculo del indicador basado en una serie temporal de precios:
   osma.MainOnArray(rates_total,prev_calculated,price);

...

//--- usar los datos de los buffers de "osma",
//    copiar los datos en el buffer del indicador:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // histograma del indicador
//--- valor de retorno de prev_calculated para la próxima llamada:
   return(rates_total);
  }

Ten en cuenta que la indexación en el buffer circular es la misma que en la serie temporal.

Ejemplos

  1. El archivo Test_OsMA_OnArrayRB.mq5 calcula el indicador basado en la serie temporal de precios. Se demuestra la aplicación del método MainOnArray()
  2. El archivo Test_OsMA_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador OsMA. Luego, sobre la base de este buffer circular de este indicador se dibuja otro indicador OsMA.


El resultado del trabajo del archivo Test_OsMA_OnArrayRB.mq5 con el tamaño del buffer circular de 256 elementos.



El resultado del trabajo del archivo Test_OsMA_OnValueRB.mq5 con el tamaño del buffer circular de 256 elementos.

 

Al escribir el código se utilizaron los desarrollos de MetaQuotes Software Corp.Integer GODZILLA.

Lista
Comentarios 0