Inicio Indicador técnico Publicación

Cómo dibujar el TEMA con un buffer circular en MetaTrader 5

Descripción

La clase CTEMAOnRingBuffer está diseñada para calcular el indicador técnico Triple Media Móvil Exponencial (TEMA) utilizando el algoritmo del buffer circular.

Declaración

class CTEMAOnRingBuffer : public CArrayRing

Título

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

El archivo de la clase CTEMAOnRingBuffer.mqh debe ser colocado en la carpeta IncOnRingBuffer que necesitas establecer en MQL5\Include\. Dos archivos con ejemplos utilizados por la clase de esta carpeta están adjuntos a la descripción. El archivo con las clases del buffer circular, DEMA y Media Móvil también debe 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 TEMA
   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 temporal, de otro modo - false
   );
//--- método de cálculo basado en una serie temporal o los buffers del indicador:          
int MainOnArray(                  // devuelve el número de elementos procesados  
   const int     rates_total,     // el tamaño de la matriz
   const int     prev_calculated, // elementos procesados en la llamada anterior
   const double& price[],         // la matriz para el cálculo
   );
//--- método para cálculo basado en elementos de la serie separados de la matriz           
double MainOnValue(              // devuelve el valor TEMA para el elemento establecido (barra)
   const int    rates_total,     // el tamaño de la matriz
   const int    prev_calculated, // elementos procesados de la matriz
   const int    begin,           // desde donde comienza la información significativa de la matriz
const double value,           // el valor del elemento (barra) 
const int    index            // el índice del elemento (barra)
   );
//--- 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 índice es como en una serie temporal
double              DEMA(int index); // Devuelve el valor de DEMA, el índice es como en una serie temporal

Para obtener los datos calculados del indicador desde el buffer circular, es posible hacerlo como desde una matriz común. Por ejemplo:

//--- clase con los métodos de cálculo del indicador TEMA:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // el tamaño de la matriz price[]
                 const int prev_calculated,  // barras procesadas en la llamada anterior
                 const int begin,            // desde donde comienza la información significativa
                 const double& price[])      // la matriz para el cálculo
  {
//--- cálculo del indicador basado en una serie temporal:
    tema.MainOnArray(rates_total,prev_calculated,price);

...

//--- usar los datos del buffer circular "tema",
//    por ejemplo, copiar los datos en el buffer del indicador:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // la línea del indicador TEMA

...

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

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

//--- usar los datos de los buffers de Media Móvil y DEMA,
//    por ejemplo, copiarlos en los buffers 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 Media Móvil
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // la línea del indicador DEMA
     }

Ten en cuenta que la indexación en los buffers circulares es la misma que en la serie temporal.

Ejemplos

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


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



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

 

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

Publicaciones relacionadas

Comentarios (0)