Inicio Indicador técnico Publicación

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

Archivos adjuntos
1416.zip (9.14 KB, Descargar 0 veces)

Descripción

La clase CDEMAOnRingBuffer está diseñada para calcular el indicador técnico DEMA (Double Exponential Moving Average) utilizando el algoritmo del buffer circular.

Declaración

class CDEMAOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>

El archivo CDEMAOnRingBuffer.mqh debe colocarse en la carpeta IncOnRingBuffer, la cual debe ser creada en MQL5\Include\. Se adjuntan dos archivos con los ejemplos utilizados por la clase de esta carpeta. El archivo con las clases de el buffer circular y el Moving Average también deben estar en esta carpeta.

Métodos de la clase

//--- método de inicialización:
bool Init(                                // si hay error devuelve false, si tiene éxito - true
   int            period      = 12,       // el periodo del DEMA 
   ENUM_MA_METHOD method      = MODE_EMA, // el método de suavizado
   int            size_buffer = 256,      // el tamaño del buffer circular
   bool           as_series   = false     // true, si es una serie de tiempo, de lo contrario - false
   );
//--- el método de cálculo basado en una serie de tiempo o los buffers del indicador:
int MainOnArray(                  // devuelve el número de elementos procesados  
   const int     rates_total,     // el tamaño del arreglo
   const int     prev_calculated, // elementos procesados en la llamada anterior
   const double& price[],         // el arreglo para el cálculo
   );
//--- el método para cálculo basado en elementos de la serie separados del arreglo
double MainOnValue(              // devuelve el valor de DEMA para el elemento (barra) establecido 
   const int    rates_total,     // el tamaño del arreglo
   const int    prev_calculated, // elementos procesados del arreglo
   const int    begin,           // desde donde comienzan los datos significativos del arreglo
const double value,           // el valor del elemento (barra)
const int    index            // el índice del elemento (barra)
   );

//--- los 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
int                 Period();       // Devuelve el periodo
int                 Size();         // Devuelve el tamaño del buffer circular
double              MA(int index);  // Devuelve el valor de la Media Móvil, el indexado es como en una serie de tiempo

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

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

...

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // el tamaño del arreglo price[]
                 const int prev_calculated,  // barras procesadas en la llamada anterior
                 const int begin,            // desde donde comienzan los datos significativos
                 const double& price[])      // el arreglo para el cálculo
  {
//--- cálculo del indicador basado en una serie de tiempo:
    dema.MainOnArray(rates_total,prev_calculated,price);

...

//--- usa los datos del buffer circular "dema",
//    por ejemplo, copia los datos en el buffer del indicador:
   for(int i=start;i<rates_total && !IsStopped();i++)
      DEMA_Buffer[i] = dema[rates_total-1-i]; // la línea del indicador DEMA

...

//--- devuelve el valor de prev_calculated para la próxima llamada:
   return(rates_total);
  }

Al calcular el DEMA, también se realiza el cálculo de la Media Móvil con los mismos parámetros. Podemos obtener los datos del buffer de la MA utilizando el método MA(int index):

//--- usa los datos del buffer circular de la Media Móvil,
//    por ejemplo, copia los datos en el buffer del indicador:
   for(int i=start;i<rates_total && !IsStopped();i++)
      MA_Buffer[i] = dema.MA(rates_total-1-i); // la línea del indicador de la Media Móvil

Ten en cuenta que la indexación en los buffers circulares es la misma que en las series de tiempo.

Ejemplos

  1. El indicador calcula el archivo Test_DEMA_OnArrayRB.mq5 sobre la base de la serie de tiempo de precios. Se demuestra la aplicación del método MainOnArray().
  2. El archivo Test_DEMA_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador DEMA. Luego, sobre la base de este buffer circular del indicador, se dibuja otro DEMA.


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



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

 

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

Publicaciones relacionadas

Comentarios (0)