Inicio Trading Sistemático Publicación

Crea tu Asesor Experto en MetaTrader 5: Señales de Trading con Media Móvil y ADX

Archivos adjuntos
258.zip (3.23 KB, Descargar 0 veces)

MQL5 Wizard es una herramienta fantástica que te permite generar automáticamente el código de tus Asesores Expertos (EAs). Si quieres profundizar en cómo crear EAs listos para usar, te recomiendo que eches un vistazo a Creando Asesores Expertos en MQL5 Wizard.

En este artículo, exploraremos una estrategia de trading que se basa en el cruce de precios con el indicador de Media Móvil, confirmada por el indicador ADX. Esta estrategia se denomina "Señales basadas en el cruce de precios con MA confirmadas por ADX" al crear el EA automáticamente en MQL5 Wizard.

Los señales de trading son las siguientes:

  • Compra: el precio de cierre de la última barra completada es superior a la media móvil, y la media móvil aumenta en las barras actuales y la pasada.
  • Venta: el precio de cierre de la última barra completada es inferior a la media móvil, y la media móvil disminuye en las barras actuales y la pasada.
  • Para filtrar señales falsas, se verifica la fuerza de la tendencia (ADX>ADXmin) y la dirección de la tendencia utilizando los Índices de Movimiento Direccional (DI+ y DI-).

Esta estrategia está implementada en la clase CSignalADX_MA (debes colocarla en terminal_data_folder/MQL5/Include/Expert/Signal/SignalADX-MA.mqh).

Figura 1. Señales de trading basadas en el cruce de precios con Media Móvil, confirmadas por ADX

Figura 1. Señales de trading basadas en el cruce de precios con Media Móvil, confirmadas por ADX

Señales de Trading

La estrategia de trading está implementada en la clase CSignalADX_MA, que tiene métodos protegidos para facilitar el acceso a indicadores y valores de precios:

double   PlusADX(int ind)     // devuelve el valor de la línea DI+ de la barra
double   MainADX(int ind)     // devuelve el valor de la línea principal de la barra
double   MinusADX(int ind)    // devuelve el valor de la línea DI- de la barra
double   EMA(int ind)         // devuelve el valor de la media móvil de la barra
double   Close(int ind)       // devuelve el valor del precio de cierre de la barra
double   StateADX(int ind)    // devuelve la diferencia entre las líneas DI+ y DI-
double   StateEMA(int ind)    // devuelve el valor positivo si la EMA aumenta y negativo si disminuye
double   StateClose(int ind)  // devuelve la diferencia entre el precio de cierre y la media móvil
Una característica de esta implementación es la verificación adicional de la presencia de tendencia (usando el Indicador de Movimiento Direccional). Esto permite filtrar señales falsas y verificar las condiciones de trading usando los valores de la barra actual (que aún no se ha completado).

1. Abrir posición larga

Condiciones para abrir una posición larga:

  1. StateEMA(0)<0 y StateEMA(1)>0: la media móvil aumenta en la barra actual y en la última completada;
  2. StateClose(1)>0: el precio de cierre de la última barra completada es superior a la media móvil;
  3. MainADX(0)>mínimo_ADX: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (para comprobar la presencia de tendencia);
  4. StateADX(0)>0: DI+ es mayor que DI- en la barra actual.
//+------------------------------------------------------------------+
//| Comprueba las condiciones para abrir una posición larga (compra) |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- condición 1: la media móvil aumenta en las barras actuales y la pasada 
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- condición 2: el precio de cierre de la última barra es mayor que la media móvil 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- condición 3: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (umbral de tendencia) 
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condición 4: el valor de DI+ es mayor que DI- en la barra actual
    bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
   sl   =m_symbol.Ask()-m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Ask()+m_take_profit*m_adjusted_point;
//--- comprobación de todas las condiciones
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

2. Cerrar posición larga

Condiciones para cerrar una posición larga:

  1. StateEMA(0)<0 y StateEMA(1)<0: la media móvil disminuye en la barra actual y en la última completada;
  2. StateClose(1)<0: el precio de cierre de la barra completada es inferior a la media móvil;
  3. MainADX(0)>mínimo_ADX: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (para comprobar la presencia de tendencia);
  4. StateADX(0)<0: DI- es mayor que DI+ en la barra actual.
//+------------------------------------------------------------------+
//| Comprueba las condiciones para cerrar una posición larga          |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
//--- condición 1: la media móvil disminuye en las barras actuales y la pasada 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- condición 2: el precio de cierre de la barra completada es inferior a la media móvil 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- condición 3: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (umbral de tendencia) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condición 4: el valor de DI- es mayor que DI- en la barra actual
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
//--- comprobación de todas las condiciones
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

3. Abrir posición corta

Las condiciones para abrir una posición corta son las mismas que las condiciones para cerrar una posición larga.

//+------------------------------------------------------------------+
//| Comprueba las condiciones para abrir una posición corta (venta) |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- condición 1: la media móvil disminuye en las barras actuales y la pasada 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
//--- condición 2: el precio de cierre de la barra completada es inferior a la media móvil 
   bool Sell_Condition_2=(StateClose(1)<0);
//--- condición 3: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (umbral de tendencia) 
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condición 4: el valor de DI- es mayor que DI- en la barra actual
   bool Sell_Condition_4=(StateADX(0)<0);
//---
   price=0.0;
   sl   =m_symbol.Bid()+m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Bid()-m_take_profit*m_adjusted_point;
//--- comprobación de todas las condiciones
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

4. Cerrar posición corta

Las condiciones para cerrar una posición corta son las mismas que las condiciones para abrir una posición larga.

//+------------------------------------------------------------------+
//| Comprueba las condiciones para cerrar una posición corta          |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
//--- condición 1: la media móvil aumenta en las barras actuales y la pasada
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
//--- condición 2: el precio de cierre de la última barra es mayor que la media móvil 
   bool Buy_Condition_2=(StateClose(1)>0);
//--- condición 3: el valor de ADX de la barra actual es mayor que el valor mínimo especificado (umbral de tendencia)
    bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
//--- condición 4: el valor de DI+ es mayor que DI- en la barra actual
   bool Buy_Condition_4=(StateADX(0)>0);
//---
   price=0.0;
//--- comprobación de todas las condiciones
  return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

Creando un Asesor Experto con MQL5 Wizard

Para crear un robot de trading basado en esta estrategia, necesitas seleccionar las propiedades de la señal como "Señales basadas en el cruce de precios con MA confirmadas por ADX" en la opción "Creando Asesores Expertos" de MQL5 Wizard:

Figura 2. Selecciona

Figura 2. Selecciona "Señales basadas en el cruce de precios con MA confirmadas por ADX" en MQL5 Wizard

A continuación, debes especificar el algoritmo de trailing stop que necesites y el sistema de gestión de dinero y riesgos. El código del Asesor Experto se creará automáticamente, y podrás compilarlo y probarlo en el Tester de Estrategias del terminal del cliente MetaTrader 5.


Resultados de la Prueba

Veamos el backtesting del Asesor Experto con datos históricos (EURUSD H1, período de prueba: 1.1.2010-05.01.2011, PeriodoADX=33, MinimumADX=22, PeriodoMA=39, StopLoss=400, TakeProfit=900).

En la creación del Asesor Experto se utilizó un volumen fijo (Trading Fixed Lot, 0.1), no se usa el algoritmo de Trailing Stop (Trailing no usado).

Figura 3. Resultados históricos de backtesting del Asesor Experto, basado en el cruce de precios con MA confirmadas por ADX

Figura 3. Resultados históricos de backtesting del Asesor Experto, basado en el cruce de precios con MA confirmadas por ADX


Archivos Adjuntos: El archivo SignalADX-MA.mqh con la clase CSignalADX_MA debe ser colocado en terminal_data_folder/MQL5/Include/Expert/Signal/.

El archivo ma_crossover_adx.mq5 contiene el código del Asesor Experto, creado usando MQL5 Wizard.


Publicaciones relacionadas

Comentarios (0)