English Русский 中文 Deutsch 日本語
preview
Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 11): EA de señales Heikin Ashi

Desarrollo de un kit de herramientas para el análisis de la acción del precio (Parte 11): EA de señales Heikin Ashi

MetaTrader 5Ejemplos |
186 0
Christian Benjamin
Christian Benjamin

Introducción

Las fórmulas matemáticas son la base del análisis de la evolución de los precios, ya que ofrecen un método objetivo para descifrar los datos del mercado y orientar las decisiones de inversión. En el mercado de divisas sudafricano, por ejemplo, un operador que evalúe el par ZARUSD podría utilizar una media móvil simple de 50 días para detectar cambios de tendencia, al tiempo que aplica la desviación estándar para medir la volatilidad del mercado, confirmando así posibles rupturas. La incorporación de fórmulas para el dimensionamiento de posiciones y la gestión de riesgos, como el cálculo del tamaño de la operación en función de un porcentaje de riesgo establecido y la distancia de stop-loss, permite al operador gestionar eficazmente el riesgo y establecer objetivos de beneficio claros mediante herramientas como los retrocesos de Fibonacci.

En este artículo, nos complace presentar la técnica Heikin Ashi para el cálculo de reversiones de tendencia, añadiendo así otra capa a nuestra estrategia integrada que combina el análisis cuantitativo con los métodos clásicos de acción del precio. Una ventaja significativa de Heikin Ashi es su capacidad para filtrar el ruido del mercado, lo que permite a los operadores centrarse en la tendencia subyacente sin distraerse con fluctuaciones menores de los precios. Este enfoque suaviza las fluctuaciones del mercado y garantiza que las decisiones se basen en datos, proporcionando un marco disciplinado aplicable a diversos mercados financieros de todo el mundo.

Comenzaremos definiendo Heikin Ashi y explorando sus orígenes. A continuación, sin rodeos innecesarios, nos sumergiremos directamente en la estrategia para que puedas comprender exactamente cómo funciona. También examinaremos otras funciones clave, proporcionaremos el código completo y, finalmente, revisaremos los resultados antes de concluir el artículo. Ahora, echemos un vistazo al índice.


Heikin Ashi

La técnica Heikin Ashi fue desarrollada por Munehisa Homma, un comerciante de arroz japonés del siglo XVIII al que también se le atribuye ser el pionero de los gráficos de velas japonesas, una herramienta fundamental en el análisis técnico. Originario de Japón, Heikin Ashi fue diseñado para ayudar a los operadores a obtener una perspectiva más clara de las tendencias del mercado, centrándose en el movimiento medio de los precios en lugar de en las formaciones individuales de las velas. En japonés, Heikin significa «promedio» o «equilibrio», mientras que Ashi se traduce como «barra» o «vela». Este nombre refleja el principio básico de los gráficos Heikin Ashi: suavizar los datos de precios para ofrecer una visión más equilibrada y menos volátil de los movimientos del mercado. Echemos un vistazo al siguiente diagrama, que ilustra cómo un gráfico de velas tradicional se transforma en un gráfico Heikin Ashi más suave.

Heikin Ashi frente al gráfico de velas tradicionales

Figura 1. Gráfico suavizado

La siguiente tabla compara las velas tradicionales y las velas Heikin Ashi, destacando sus diferencias clave.

Característica Velas tradicionales Velas Heikin Ashi
Base de cálculo
Utiliza los precios reales de apertura, máximo, mínimo y cierre.
Utiliza una fórmula modificada que promedia los datos de precios.
Visualización de volatilidad
Muestra las fluctuaciones y diferencias reales de precios.
Suaviza la acción del precio, reduciendo el ruido.
Claridad de la tendencia
Puede ser volátil, con velas rojas y verdes alternadas incluso en las tendencias.
Proporciona tendencias más suaves con menos cambios de color.
Visibilidad de la brecha (gap)
Muestra las brechas (gaps) de precios entre las velas japonesas.
Rara vez muestra diferencias debido a la fórmula de promedio.
Señales de reversión
Muestra reversiones rápidas y mechas.
Las reversiones son más lentas, pero más fuertes cuando se confirman.
Representación de precios
Refleja los precios reales del mercado.
Precios promedio, lo que significa que el último precio no coincide con el precio real de mercado.


Estrategia

Esta estrategia se basa en cuatro funciones principales de nuestro EA en MQL5: cálculo de Heikin Ashi, confirmación de tendencias, identificación de señales de reversión y confirmación de señales mediante el RSI. Analicemos cada uno de ellos en detalle a continuación.

Cálculo de Heikin Ashi

Los gráficos Heikin Ashi se construyen utilizando cuatro puntos de datos clave: precios de apertura, máximos, mínimos y cierre de cada período. Estos valores se procesan para generar velas Heikin Ashi, que difieren de las velas tradicionales. En lugar de reflejar la evolución del precio sin procesar, las velas Heikin Ashi utilizan cálculos de precios promediados, combinando los precios de apertura y cierre, así como los precios máximos y mínimos, para crear una representación más fluida de las tendencias del mercado. 

Este efecto suavizante minimiza el impacto de las fluctuaciones repentinas de los precios, reduciendo el ruido del mercado y facilitando la identificación de las tendencias. Como resultado, las velas Heikin Ashi suelen presentar cuerpos más pequeños y mechas más largas, lo que resalta el impulso del mercado y filtra la volatilidad a corto plazo. Para implementar la estrategia Heikin Ashi, el siguiente diagrama de flujo muestra cómo los datos tradicionales de las velas se transforman en un gráfico Heikin Ashi suave y centrado en las tendencias. Este proceso filtra el ruido del mercado y ofrece una perspectiva más clara de la tendencia predominante. A continuación se detalla paso a paso cómo funciona:

Vela Heikin Ashi

Figura 2. Diagrama de flujo

El diagrama de flujo ilustra cómo los datos OHLC tradicionales se transforman en velas Heikin Ashi. El proceso comienza con datos brutos del mercado, que luego se suavizan calculando un promedio del precio de cierre (haClose). El precio de apertura (haOpen) se determina utilizando los valores de la vela anterior para crear continuidad, mientras que haHigh y haLow garantizan que la vela refleje todo el rango de movimientos del precio. El resultado es una vela que reduce la volatilidad a corto plazo, haciendo que las tendencias generales sean más visibles. A continuación se muestra el fragmento de código MQL5 para la función que calcula las velas Heikin Ashi.

void CalculateHeikinAshi()
{
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
   {
      Print("Failed to copy rates. Copied: ", copied);
      return;
   }

   ArraySetAsSeries(rates, true);

   // Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

   // Calculate Heikin-Ashi values for each bar
   for(int i = copied - 1; i >= 0; i--)
   {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0
                                   : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
   }

   Print("Heikin-Ashi Calculation Complete");
}

El resultado es una serie de velas Heikin Ashi que filtran gran parte del ruido del mercado, permitiendo que la tendencia subyacente se haga más evidente.

Confirmación de tendencia

Antes de intentar identificar cualquier señal de reversión, el EA realiza una confirmación de la tendencia para asegurarse de que existe un movimiento direccional fuerte. Esto implica analizar un número específico de velas Heikin Ashi consecutivas. Para una tendencia alcista, el EA comprueba que el haClose de cada vela sea superior al de la vela siguiente, mientras que para una tendencia bajista, verifica que los valores haClose sean consecutivamente inferiores. El número de velas necesarias para confirmar la tendencia se controla mediante parámetros de entrada, lo que garantiza que solo se tengan en cuenta las tendencias bien establecidas. Este riguroso control minimiza el riesgo de señales falsas al confirmar que el mercado muestra una tendencia decisiva antes de pasar a la detección de reversiones.

int consecutive = 0;
for(int i = 2; i <= TrendCandles + 1; i++)
{
   if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
      consecutive++;
   else
      break;
}
if(consecutive < ConsecutiveCandles)
   return false;

Este paso garantiza que solo se tenga en cuenta una señal cuando haya pruebas sólidas de una tendencia en curso, lo que reduce las posibilidades de que se produzcan señales falsas debido a fluctuaciones aleatorias del mercado.

Identificación de señales de reversión

Tras confirmar una tendencia establecida, el EA procede a identificar posibles señales de reversión examinando detenidamente la estructura de la siguiente vela Heikin Ashi. En esta etapa, el EA calcula el cuerpo de la vela como la diferencia absoluta entre haClose y haOpen, y mide la sombra en función de la dirección de interés, centrándose en la sombra inferior para una reversión alcista y en la sombra superior para una reversión bajista. Una condición clave es que la relación entre la sombra y el cuerpo debe superar un umbral predefinido. Esta elevada relación entre la sombra y el cuerpo indica que el mercado ha rechazado con fuerza la tendencia predominante, como lo demuestra la larga mecha en relación con el pequeño cuerpo. Este patrón sirve como un indicador sólido de que podría estar produciéndose un cambio de tendencia.

// Check for a strong reversal candlestick
double body = MathAbs(haClose[1] - haOpen[1]);
double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1])
                                : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
   return false;

Este paso filtra las señales débiles o ambiguas al exigir una característica de reversión fuerte en la estructura de la vela antes de continuar.

Confirmación de la señal con el RSI

El último paso de la estrategia consiste en confirmar la señal de reversión utilizando el índice de fuerza relativa (Relative Strength Index, RSI), lo que añade un nivel adicional de validación. Una vez identificada una posible reversión mediante los criterios de Heikin Ashi, el EA recupera el último valor del RSI para evaluar el impulso del mercado. Para una señal de reversión alcista, el RSI debe estar por debajo de un umbral de compra designado, lo que indica que el activo está sobrevendido; por el contrario, para una reversión bajista, el RSI debe superar un umbral de venta especificado, lo que sugiere que el activo está sobrecomprado. Solo cuando se cumplen tanto el patrón Heikin Ashi como la condición RSI, el EA genera una señal de trading, como dibujar una flecha de compra o venta en el gráfico. Este enfoque de doble confirmación ayuda a reducir las señales falsas, garantizando que las operaciones solo se ejecuten cuando varios indicadores corroboren un cambio de tendencia en el mercado.

// Get RSI Value
double rsiValue;
if(!GetRSIValue(rsiValue))
{
   Print("Failed to retrieve RSI value.");
   return;
}

// Detect potential reversals with RSI confirmation
if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
{
   DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
   Print("Bullish Reversal Detected - RSI:", rsiValue);
}
else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
{
   DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
   Print("Bearish Reversal Detected - RSI:", rsiValue);
}

La confirmación del RSI añade una capa de análisis del impulso. Al combinar la acción del precio a través de Heikin Ashi con el impulso a través de RSI el EA mejora la fiabilidad de las señales, garantizando que las operaciones solo se realicen cuando varios indicadores coincidan.


Otras funciones

Parámetros de entrada

Antes de profundizar en la lógica central, debemos definir un conjunto de parámetros de entrada que nos permitan ajustar con precisión el comportamiento del EA. Estos parámetros nos permiten controlar las reglas de confirmación de tendencias, las condiciones de reversión, los umbrales de volumen, la configuración del RSI y la visualización de señales, todo ello sin modificar el código.

input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

Estos parámetros nos permiten controlar aspectos clave de la estrategia. La configuración de TrendCandles define cuántas velas Heikin Ashi tenemos en cuenta al identificar tendencias. ShadowToBodyRatio garantiza que solo se tengan en cuenta las velas de fuerte reversión. ConsecutiveCandles filtra las tendencias débiles al requerir al menos dos velas para confirmar una dirección. RSI_Buy_Threshold y RSI_Sell_Threshold añaden otra capa de confirmación utilizando el RSI. BuyArrowColor y SellArrowColor nos permiten personalizar cómo aparecen las señales en el gráfico.

Variables globales

Para garantizar que nuestros cálculos se ejecuten de manera eficiente, declaramos matrices globales para almacenar los valores de Heikin Ashi, así como un identificador para el indicador RSI.

double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

Utilizamos estas variables para almacenar los valores calculados de Heikin Ashi y obtener lecturas de RSI de forma dinámica en nuestro EA.

Inicialización (OnInit)

Cuando adjuntamos el EA al gráfico, la función OnInit() se ejecuta primero. Configura nuestras matrices Heikin Ashi e inicializa el indicador RSI.

int OnInit()
{
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
   }

   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
   {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
   }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
}

Aquí, configuramos nuestras matrices en orden inverso, por lo que la última vela siempre está en el índice 0. Comprobamos si hay suficientes barras disponibles antes de realizar los cálculos. Inicializamos el indicador RSI y gestionamos cualquier error en caso de fallo. Si todo está configurado correctamente, el EA imprime un mensaje de confirmación y comienza a funcionar.

Procesamiento de ticks (OnTick)

Esta función se ejecuta con cada nueva fluctuación de precio, asegurando que analicemos continuamente el mercado e identifiquemos posibles señales de negociación.

void OnTick()
{
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
   {
      Print("Not enough bars for tick processing.");
      return;
   }

   CalculateHeikinAshi();

   double rsiValue;
   if(!GetRSIValue(rsiValue))
   {
      Print("Failed to retrieve RSI value.");
      return;
   }

   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)
   {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
   }
   else if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)
   {
      DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
      Print("Bearish Reversal Detected - RSI:", rsiValue);
   }
}

Generamos un nombre único para cada flecha en función de la marca de tiempo de la señal. Si se encuentra una flecha existente con el mismo nombre, la eliminamos para evitar el desorden. Luego, creamos un nuevo objeto de flecha y establecemos sus propiedades (color, tamaño y tipo). Si la operación se realiza correctamente, imprimiremos un mensaje confirmando que la flecha se ha colocado correctamente.

Limpieza al desinicializar (OnDeinit)

Cuando eliminamos el EA del gráfico, necesitamos liberar los recursos del indicador para evitar problemas de memoria.

void OnDeinit(const int reason)
{
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
}

Esta función garantiza que el indicador RSI se elimine correctamente cuando el EA deje de ejecutarse.


Código MQL5

//+------------------------------------------------------------------+
//|                                        Heikin Ashi Signal EA.mq5 |
//|                              Copyright 2025, Christian Benjamin. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Christian Benjamin."
#property link      "https://www.mql5.com/en/users/lynnchris"
#property version   "1.00"
#property strict

//--- Input parameters
input int TrendCandles = 3;                 // Number of candles for trend detection
input double ShadowToBodyRatio = 1.5;       // Shadow-to-body ratio for reversal detection
input int ConsecutiveCandles = 2;           // Consecutive candles to confirm trend
input int RSI_Period = 14;                  // RSI Period
input double RSI_Buy_Threshold = 34.0;      // RSI level for buy confirmation
input double RSI_Sell_Threshold = 65.0;     // RSI level for sell confirmation
input color BuyArrowColor = clrGreen;       // Buy signal color
input color SellArrowColor = clrRed;        // Sell signal color

//--- Global variables
double haClose[], haOpen[], haHigh[], haLow[];
int rsiHandle;

//+------------------------------------------------------------------+
//| Expert initialization                                            |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(haClose, true);
   ArraySetAsSeries(haOpen, true);
   ArraySetAsSeries(haHigh, true);
   ArraySetAsSeries(haLow, true);

   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for initialization.");
      return INIT_FAILED;
     }

// Initialize RSI indicator
   rsiHandle = iRSI(_Symbol, _Period, RSI_Period, PRICE_CLOSE);
   if(rsiHandle == INVALID_HANDLE)
     {
      Print("Failed to create RSI indicator.");
      return INIT_FAILED;
     }

   Print("EA Initialized Successfully");
   return INIT_SUCCEEDED;
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(Bars(_Symbol, _Period) < TrendCandles + 2)
     {
      Print("Not enough bars for tick processing.");
      return;
     }

// Calculate Heikin-Ashi
   CalculateHeikinAshi();

// Get RSI Value
   double rsiValue;
   if(!GetRSIValue(rsiValue))
     {
      Print("Failed to retrieve RSI value.");
      return;
     }

// Detect potential reversals with RSI confirmation
   if(DetectReversal(true) && rsiValue < RSI_Buy_Threshold)  // Bullish reversal with RSI confirmation
     {
      DrawArrow("BuyArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_BID), 233, BuyArrowColor);
      Print("Bullish Reversal Detected - RSI:", rsiValue);
     }
   else
      if(DetectReversal(false) && rsiValue > RSI_Sell_Threshold)  // Bearish reversal with RSI confirmation
        {
         DrawArrow("SellArrow", iTime(NULL, 0, 0), SymbolInfoDouble(_Symbol, SYMBOL_ASK), 234, SellArrowColor);
         Print("Bearish Reversal Detected - RSI:", rsiValue);
        }
  }

//+------------------------------------------------------------------+
//| Calculate Heikin-Ashi                                            |
//+------------------------------------------------------------------+
void CalculateHeikinAshi()
  {
   MqlRates rates[];
   int copied = CopyRates(_Symbol, _Period, 0, Bars(_Symbol, _Period), rates);

   if(copied < TrendCandles + 2)
     {
      Print("Failed to copy rates. Copied: ", copied);
      return;
     }

   ArraySetAsSeries(rates, true);

// Resize arrays to match the number of copied bars
   ArrayResize(haClose, copied);
   ArrayResize(haOpen, copied);
   ArrayResize(haHigh, copied);
   ArrayResize(haLow, copied);

// Calculate Heikin-Ashi
   for(int i = copied - 1; i >= 0; i--)
     {
      haClose[i] = (rates[i].open + rates[i].high + rates[i].low + rates[i].close) / 4.0;
      haOpen[i] = (i == copied - 1) ? (rates[i].open + rates[i].close) / 2.0 : (haOpen[i + 1] + haClose[i + 1]) / 2.0;
      haHigh[i] = MathMax(rates[i].high, MathMax(haOpen[i], haClose[i]));
      haLow[i] = MathMin(rates[i].low, MathMin(haOpen[i], haClose[i]));
     }

   Print("Heikin-Ashi Calculation Complete");
  }

//+------------------------------------------------------------------+
//| Detect Reversals with Trend Confirmation                         |
//+------------------------------------------------------------------+
bool DetectReversal(bool isBullish)
  {
   int direction = isBullish ? 1 : -1;

// Confirm trend location: Check for consecutive candles in the same direction
   int consecutive = 0;
   for(int i = 2; i <= TrendCandles + 1; i++)
     {
      if((haClose[i] > haClose[i + 1] && isBullish) || (haClose[i] < haClose[i + 1] && !isBullish))
         consecutive++;
      else
         break;
     }
   if(consecutive < ConsecutiveCandles)
      return false;

// Check for a strong reversal candlestick
   double body = MathAbs(haClose[1] - haOpen[1]);
   double shadow = (direction > 0) ? MathAbs(haLow[1] - haOpen[1]) : MathAbs(haHigh[1] - haOpen[1]);

// Avoid division by zero and confirm shadow-to-body ratio
   if(body == 0.0 || (shadow / body) < ShadowToBodyRatio)
      return false;

// Confirm the reversal with the next candlestick (opposite direction)
   return ((haClose[0] - haOpen[0]) * direction < 0);
  }

//+------------------------------------------------------------------+
//| Get RSI Value                                                    |
//+------------------------------------------------------------------+
bool GetRSIValue(double &rsiValue)
  {
   double rsiBuffer[];
   if(CopyBuffer(rsiHandle, 0, 0, 1, rsiBuffer) > 0)
     {
      rsiValue = rsiBuffer[0];
      return true;
     }
   return false;
  }

//+------------------------------------------------------------------+
//| Draw Arrow                                                       |
//+------------------------------------------------------------------+
void DrawArrow(string name, datetime time, double price, int code, color clr)
  {
   name += "_" + IntegerToString(time);
   if(ObjectFind(0, name) != -1)
      ObjectDelete(0, name);

   if(ObjectCreate(0, name, OBJ_ARROW, 0, time, price))
     {
      ObjectSetInteger(0, name, OBJPROP_ARROWCODE, code);
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
      Print("Arrow Drawn: ", name, " at ", price);
     }
   else
     {
      Print("Failed to create arrow: ", GetLastError());
     }
  }

//+------------------------------------------------------------------+
//| Expert deinitialization                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(rsiHandle != INVALID_HANDLE)
      IndicatorRelease(rsiHandle);
  }
//+------------------------------------------------------------------+


Resultados

En mi proceso de pruebas, utilicé tanto pruebas retrospectivas como pruebas en el mercado real para evaluar el rendimiento del EA.
  • Pruebas retrospectivas

Ejecuté el EA con datos históricos para verificar su viabilidad básica y descubrir sus fortalezas y debilidades. This phase confirms that the approach works under known market conditions, although it can’t fully replicate real-world factors like slippage or variable spreads. Veamos el siguiente GIF.

Pruebas retrospectivas V100

Figura 3. Pruebas retrospectivas del índice V100

A continuación, presento resultados adicionales de pruebas retrospectivas para tres pares diferentes durante un período de 27 días para evaluar la precisión de la señal. Una señal se consideraba exitosa si el mercado cambiaba de dirección después de la confirmación.

  • EURUSD

Señal Total Ganadoras  % Precisión
Compra  20  17 85%
Venta   10  8 80%

  • Índice Crash 900

Señal Total Ganadoras  % Precisión
Compra 18 14 77.8%
Venta  25 15 60%

  • Índice sintético Step (Deriv)

Señal Total Ganadoras  % Precisión
Compra 18 15 83.3.%
Venta  22 14  63.6%

El EA ha demostrado ser muy eficaz, alcanzando una precisión mínima del 77,8 % en las señales de compra y al menos del 60 % en las señales de venta en todos los pares probados.

  • Pruebas de mercado en vivo
Las pruebas en vivo proporcionaron información sobre el rendimiento del EA en las condiciones actuales del mercado. Esta evaluación en tiempo real reveló la eficacia con la que EA gestiona la volatilidad del mercado y los retos de ejecución. Dados los riesgos que conlleva, comencé con una pequeña asignación para gestionar la exposición.

Pruebas en vivo

Figura 4. Pruebas de mercado en vivo del índice V25

Conclusión clave

Las pruebas retrospectivas validan la estrategia en teoría, mientras que las pruebas en vivo demuestran su rendimiento práctico. Ambas etapas son cruciales para perfeccionar el EA y garantizar que sea lo suficientemente robusto para el trading en el mundo real.


Conclusión

La estrategia Heikin-Ashi es especialmente eficaz para filtrar las fluctuaciones del mercado. También me ha resultado útil para identificar puntos de reversión del mercado. Después de probarlo como cualquier otra herramienta, descubrí que funciona de manera más eficiente cuando se utiliza junto con otras estrategias. Es importante experimentar con las entradas del código y probar en una cuenta demo o mediante pruebas retrospectivas hasta que logre el mejor rendimiento según sus preferencias. Agradecemos enormemente sus sugerencias.

Fecha Nombre de la herramienta  Descripción Versión  Actualizaciones  Notas
01/10/24 Chart Projector Script para superponer la evolución del precio del día anterior con efecto fantasma. 1.0 Lanzamiento inicial Primera herramienta en Lynnchris Tool Chest.
18/11/24 Analytical Comment Proporciona información del día anterior en formato tabular, además de anticipar la dirección futura del mercado. 1.0 Lanzamiento inicial Segunda herramienta en Lynnchris Tool Chest.
27/11/24 Analytics Master Actualización periódica de los indicadores del mercado cada dos horas.  1.01 Segundo lanzamiento Tercera herramienta en Lynnchris Tool Chest.
02/12/24 Analytics Forecaster  Actualización periódica de los indicadores del mercado cada dos horas con integración de Telegram. 1.1 Tercera edición Herramienta número 4
09/12/24 Volatility Navigator El EA analiza las condiciones del mercado utilizando los indicadores Bandas de Bollinger, RSI y ATR. 1.0 Lanzamiento inicial Herramienta número 5
19/12/24 Mean Reversion Signal Reaper  Analiza el mercado utilizando una estrategia de reversión a la media y proporciona señales.  1.0  Lanzamiento inicial  Herramienta número 6 
09/01/25  Signal Pulse  Analizador de múltiples marcos temporales. 1.0  Lanzamiento inicial  Herramienta número 7 
17/01/25  Metrics Board  Panel con botones para análisis.  1.0  Lanzamiento inicial Herramienta número 8 
21/01/25 External Flow Análisis mediante bibliotecas externas. 1.0  Lanzamiento inicial Herramienta número 9 
27/01/25 VWAP Precio medio ponderado por volumen.   1.3  Lanzamiento inicial  Herramienta número 10 
02/02/25  Heikin Ashi Signal EA Suavizado de tendencias e identificación de señales de reversión.  1.0  Lanzamiento inicial  Herramienta número 11 


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/17021

Archivos adjuntos |
Ingeniería de características con Python y MQL5 (Parte III): El ángulo del precio (2) Coordenadas polares Ingeniería de características con Python y MQL5 (Parte III): El ángulo del precio (2) Coordenadas polares
En este artículo, hacemos nuestro segundo intento de convertir los cambios en los niveles de precios de cualquier mercado en un cambio correspondiente en el ángulo. En esta ocasión, seleccionamos un enfoque matemáticamente más sofisticado que el que elegimos en nuestro primer intento, y los resultados obtenidos sugieren que nuestro cambio de enfoque puede haber sido la decisión correcta. Únase a nosotros hoy para debatir cómo podemos utilizar las coordenadas polares para calcular el ángulo formado por los cambios en los niveles de precios, de una manera significativa, independientemente del mercado que esté analizando.
Predicción de tendencias con LSTM para estrategias de seguimiento de tendencias Predicción de tendencias con LSTM para estrategias de seguimiento de tendencias
La memoria a corto y largo plazo (Long Short-Term Memory, LSTM) es un tipo de red neuronal recurrente (Recurrent Neural Network, RNN) diseñada para modelar datos secuenciales capturando de manera efectiva las dependencias a largo plazo y abordando el problema del gradiente que se desvanece. En este artículo, exploraremos cómo utilizar LSTM para predecir tendencias futuras, mejorando el rendimiento de las estrategias de seguimiento de tendencias. El artículo tratará sobre la introducción de conceptos clave y la motivación detrás del desarrollo, la obtención de datos de MetaTrader 5, el uso de esos datos para entrenar el modelo en Python, la integración del modelo de aprendizaje automático en MQL5 y la reflexión sobre los resultados y las aspiraciones futuras basadas en pruebas estadísticas retrospectivas.
Creación de un Panel de administración de operaciones en MQL5 (Parte IX): Organización del código (I) Creación de un Panel de administración de operaciones en MQL5 (Parte IX): Organización del código (I)
Este debate profundiza en los retos que se plantean al trabajar con grandes bases de código. Exploraremos las mejores prácticas para la organización del código en MQL5 e implementaremos un enfoque práctico para mejorar la legibilidad y la escalabilidad del código fuente de nuestro Panel de administración de operaciones. Además, nuestro objetivo es desarrollar componentes de código reutilizables que puedan beneficiar a otros desarrolladores en el desarrollo de sus algoritmos. Sigue leyendo y únete a la conversación.
Características del Wizard MQL5 que debe conocer (Parte 53): Market Facilitation Index (MFI) Características del Wizard MQL5 que debe conocer (Parte 53): Market Facilitation Index (MFI)
El Market Facilitation Index (MFI) es otro indicador de Bill Williams que tiene como objetivo medir la eficiencia del movimiento de los precios en relación con el volumen. Como siempre, analizamos los distintos patrones de este indicador dentro de los límites de una clase de señales de ensamblaje del asistente y presentamos una variedad de informes de pruebas y análisis para los distintos patrones.