Clase para Dibujar MACD con Buffer Circular en MetaTrader 5

Mike 2012.12.28 17:51 20 0 0
Archivos adjuntos

Descripción

La clase CMACDOnRingBuffer está diseñada para calcular el indicador técnico conocido como Convergencia/Divergencia de la Media Móvil (MACD) utilizando el algoritmo de buffer circular. Este enfoque permite una gestión más eficiente de los datos a medida que se procesan en MetaTrader 5.

Declaración

class CMACDOnRingBuffer

Título

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

El archivo de la clase CMACDOnRingBuffer.mqh debe ubicarse en la carpeta IncOnRingBuffer, que deberás establecer en MQL5\Include\. Además, se adjuntan dos archivos con ejemplos utilizados por la clase desde esta carpeta. Es importante que el archivo con la clase de buffer circular y la clase de Media Móvil también estén en esta carpeta.

Métodos de la Clase

//--- método de inicialización:
bool Init(                                  // si hay error, devuelve false, si es exitoso - true
   int            fast_period   = 12,       // periodo de suavizado de la Media Móvil rápida
   int            slow_period   = 26,       // periodo de suavizado de la Media Móvil lenta
   int            signal_period = 9,        // periodo de suavizado de la Media Móvil de señal
   ENUM_MA_METHOD fast_method   = MODE_EMA, // método de suavizado de la Media Móvil rápida
   ENUM_MA_METHOD slow_method   = MODE_EMA, // método de suavizado de la Media Móvil lenta
   ENUM_MA_METHOD signal_method = MODE_SMA, // método de suavizado de la Media Móvil de señal
   int            size_buffer   = 256,      // tamaño del buffer circular, número de datos almacenados
   bool           as_series     = false     // true si es una serie temporal, false si es un índice normal de los datos de entrada
   );
//--- método de cálculo basado en una serie temporal o el buffer del indicador:          
int MainOnArray(                  // devuelve el número de elementos procesados  
   const int     rates_total,     // tamaño del array array[]
   const int     prev_calculated, // elementos procesados en la llamada anterior
   const double &array[]          // array de valores de entrada
   );
//--- método de cálculo basado en los elementos separados de la serie del array           
double MainOnValue(              // devuelve el valor del MACD para el elemento establecido
   const int    rates_total,     // tamaño del array
   const int    prev_calculated, // elementos procesados del array
   const int    begin,           // desde donde comienzan los datos significativos del array
   const double value,           // valor del elemento del array
   const int    index            // índice del elemento
   );
//--- métodos de acceso a los datos:
int    BarsRequired();   // Devuelve el número necesario de barras para dibujar el indicador
string Name()            // Devuelve el nombre del indicador
string NameMain()            // Devuelve el nombre de la línea principal del indicador
string NameSignal()          // Devuelve el nombre de la línea de señal 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

Puedes obtener los datos calculados del indicador desde el buffer circular de la misma manera que lo harías con un array normal. Por ejemplo:

//--- la clase con los métodos de cálculo del indicador MACD:
#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>
CMACDOnRingBuffer macd;

...

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

...

//--- usar los datos de los buffers circulares "macd",
//    copiar los datos en los buffers del indicador:
   for(int i=start;i<rates_total;i++)
     {
      MainBuffer[i]   = macd[rates_total-1-i];          // histograma del indicador
      SignalBuffer[i] = macd.signal[rates_total-1-i];   // línea de señal del indicador
     }
//--- valor de retorno de prev_calculated para la próxima llamada:
   return(rates_total);
  }

Ten en cuenta que el índice en el buffer circular es el mismo que en la serie temporal.

Ejemplos

  1. El archivo Test_MACD_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_MACD_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador MACD. Luego, en base al buffer circular de este indicador, se dibuja otro indicador MACD.


Resultado del trabajo del Test_MACD_OnArrayRB.mq5 con el tamaño del buffer circular de 256 elementos



Resultado del trabajo del Test_MACD_OnValueRB.mq5 con el tamaño del buffer circular de 256 elementos

 

Este desarrollo se realizó utilizando los trabajos de MetaQuotes Software Corp., Integer y GODZILLA.

Lista
Comentarios 0