Inicio Indicador técnico Publicación

Cómo Dibujar el ADX Wilder con Buffer Circular en MetaTrader 5

Archivos adjuntos
1356.zip (10.07 KB, Descargar 0 veces)

Descripción

La clase CADXWOnRingBuffer está diseñada para el cálculo del índice de movimiento direccional promedio Wilder (ADX Wilder) utilizando el algoritmo de buffer circular. Este indicador es esencial para los traders que buscan entender la fuerza de una tendencia en el mercado.

Declaración

class CADXWOnRingBuffer

Título

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>

El archivo de la clase CADXWOnRingBuffer.mqh debe ubicarse en la carpeta IncOnRingBuffer que debes crear en MQL5\Include\. He adjuntado dos archivos de ejemplo que utilizan la clase desde esta carpeta. También requieren que los archivos de la clase de buffer circular y la clase de Media Móvil 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 ma_period = 14, // período de suavizado de Media Móvil
   ENUM_MA_METHOD ma_method = MODE_SMMA, // método de suavizado de Media Móvil
   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 buffers de indicador:
int MainOnArray( // devuelve el número de elementos procesados
   const int rates_total, // tamaño de los arrays
   const int prev_calculated, // elementos procesados en la llamada anterior
   const double &high[], // array de valor máximo
   const double &low[], // array de valor mínimo
   const double &close[] // array de precios de cierre
  );
//--- método de cálculo basado en elementos separados de la serie del array
double MainOnValue( // devuelve el valor de ADXW 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 high, // valor máximo
   const double low, // valor mínimo
   const double close, // precio de cierre
   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 NameADXW(); // Devuelve el nombre del indicador
string NameNDI(); // Devuelve el nombre de la línea del indicador de movimiento direccional negativo
string NamePDI(); // Devuelve el nombre de la línea del indicador direccional positivo
string MAMethod(); // Devuelve el método de suavizado en forma de línea de texto
int MAPeriod(); // Devuelve el período de suavizado
int Size(); // Devuelve el tamaño del buffer circular

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

#include <IncOnRingBuffer\CADXWOnRingBuffer.mqh>
CADXWOnRingBuffer adxw;

...

//+------------------------------------------------------------------+
//| 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:
   adxw.MainOnArray(rates_total,prev_calculated,high,low,close);

   ...
   
//--- copia de los datos desde los buffers de "adxw" en el indicador:
   for(int i=start;i<rates_total;i++)
     {
      ADXW_Buffer[i] = adxw[rates_total-1-i]; // índice de movimiento direccional promedio Wilder
      PDI_Buffer[i]  = adxw.pdi[rates_total-1-i]; // índice direccional positivo
      NDI_Buffer[i]  = adxw.ndi[rates_total-1-i]; // índice direccional negativo
     }

   ...
} 

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

Ejemplos

  1. El archivo Test_ADXW_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_ADXW_OnValueRB.mq5 muestra el uso del método MainOnValue(). Primero se calcula y dibuja el indicador ADXW. Luego, con base en el buffer circular de este indicador, se calculan las tres líneas del indicador ADXW.


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



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

 

Desarrollos de MetaQuotes Software Corp., Integer y GODZILLA.

Publicaciones relacionadas

Comentarios (0)