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 CMACDOnRingBufferTí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
- 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().
- 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.
Comentarios 0