Inicio Indicador técnico Publicación

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

Archivos adjuntos
1422.zip (6.86 KB, Descargar 0 veces)

Descripción

El CFractalsOnRingBuffer está diseñado para calcular el indicador técnico de fractales utilizando el algoritmo del buffer circular.

Declaración

class CFractalsOnRingBuffer

Título

#include <IncOnRingBuffer\CFractalsOnRingBuffer.mqh>

El archivo CFractalsOnRingBuffer.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. El archivo con la clase del buffer circular 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  bars_right  = 2,        // el número de barras a la derecha del extremo
   int  bars_left   = 2,        // el número de barras a la izquierda del extremo
   int  size_buffer = 256,      // el tamaño del buffer circular
   bool as_series   = false     // true, si es una serie temporal, de lo contrario - 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 los arrays
   const int     prev_calculated, // elementos procesados en la llamada anterior
   const double& high[],          // el array de los máximos
   const double& low[],           // el array de los mínimos
   );
//--- método de cálculo de fractal basado en elementos de la serie del array high[]
double MainOnHigh(               // devuelve el valor del fractal superior para el elemento index-bars_right (barra)
   const int    rates_total,     // el 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 high,            // el máximo de la barra actual
   const int    index            // el índice del elemento (barra) actual
   );
//--- método de cálculo del fractal inferior basado en elementos de la serie del array low[]
double MainOnLow(                // devuelve el valor del fractal inferior para el elemento index-bars_right (barra)
   const int    rates_total,     // el 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 low,             // el mínimo actual de la barra, el máximo del elemento actual del array
   const int    index            // el índice del elemento (barra) actual
   );
//--- 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 NameUpper()      // Devuelve el nombre de los fractales superiores
string NameLower()      // Devuelve el nombre de los fractales inferiores
int    BarsRight()      // Devuelve el número de barras a la derecha del extremo
int    BarsLeft()       // Devuelve el número de barras a la izquierda del extremo
int    Size();          // Devuelve el tamaño del buffer circular

Para obtener los datos calculados del indicador desde los buffers circulares, es posible hacerlo como desde un array común. Por ejemplo:

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

...

//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- cálculo del indicador basado en la serie temporal de precios:
   fractals.MainOnArray(rates_total,prev_calculated,high,low);

...

//--- usar los datos de los buffers circulares "fractals",
//    por ejemplo, copiar los datos en el buffer del indicador:
   for(int i=start;i<rates_total-BarsRight && !IsStopped();i++)
     {
      UpperBuffer[i] = fractals.upper[rates_total-1-i]; // fractales superiores
      LowerBuffer[i] = fractals.lower[rates_total-1-i]; // fractales inferiores
     }

...

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

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_Fractals_OnArrayRB.mq5 sobre la base de la serie temporal de precios. Se demuestra la aplicación del método MainOnArray().
  2. El archivo Test_Fractals_OnValueRB.mq5 demuestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador de fractales. Luego, sobre la base de este indicador, se dibuja otro fractal usando el buffer circular.


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



El resultado del trabajo del Test_Fractals_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)