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
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
1. Abrir posición larga
Condiciones para abrir una posición larga:
- StateEMA(0)<0 y StateEMA(1)>0: la media móvil aumenta en la barra actual y en la última completada;
- StateClose(1)>0: el precio de cierre de la última barra completada es superior a la media móvil;
- 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);
- 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:
- StateEMA(0)<0 y StateEMA(1)<0: la media móvil disminuye en la barra actual y en la última completada;
- StateClose(1)<0: el precio de cierre de la barra completada es inferior a la media móvil;
- 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);
- 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 "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
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
- Señales de Trading con Patrón Hammer/Hanging Man y Estocástico en MetaTrader 5
- Procesamiento Visual de Órdenes: Mejora tu Trading en MetaTrader 4
- Crea tu Asesor Experto con MQL5: Señales de Trading Basadas en Estrellas de la Mañana/Atardecer y CCI
- Cómo Crear un Asesor Experto con MQL5: Señales de Trading Basadas en Estrellas y Estocástico
- Señales de Trading con MQL5: Patrones de Estrellas y MFI