El MQL5 Wizard te permite crear Asesores Expertos listos para usar, basados en las clases de la librería estándar que vienen con el terminal del cliente (consulta Creación de Asesores Expertos en MQL5 Wizard para más detalles). Te permite validar rápidamente tus ideas de trading; solo necesitas crear tu propia clase de señales de trading. La estructura de esta clase y un ejemplo se pueden encontrar en el artículo MQL5 Wizard: Cómo crear un módulo de señales de trading.
La idea general es la siguiente: la clase de señales de trading se deriva de CExpertSignal. Luego, es necesario sobreescribir los métodos virtuales LongCondition() y ShortCondition() con tus propios métodos.
Existe un libro titulado "Estrategias de los mejores traders" (en ruso), donde se consideran muchas estrategias de trading. Nosotros nos enfocaremos en patrones de velas de reversión, confirmados por los osciladores Estocástico, CCI, MFI y RSI.
La mejor manera es crear una clase separada, derivada de CExpertSignal para verificar la formación de patrones de velas. Para confirmar las señales de trading generadas por los patrones de velas, es suficiente con escribir la clase, derivada de CCandlePattern y añadir las funciones necesarias (por ejemplo, confirmación por osciladores).
Aquí consideraremos las señales basadas en el patrón de velas de reversión "Bullish Harami/Bearish Harami", confirmadas por el indicador Market Facilitation Index (MFI). El módulo de señales de trading se basa en la clase CCandlePattern, que es un ejemplo simple de su uso para crear señales de trading con patrones de velas.
1. Patrones de velas de reversión "Bullish Harami" y "Bearish Harami"
1.1. Bullish Harami
El patrón de reversión Bullish Harami se forma en una tendencia bajista cuando una gran vela es seguida por una vela más pequeña cuyo cuerpo se encuentra dentro del rango vertical del cuerpo más grande. Este patrón indica que la tendencia bajista podría estar revirtiendo, señalando que es un buen momento para entrar en una posición larga. La segunda vela se abre con un hueco al alza.
Cuanto más pequeña sea la segunda vela (blanca), más probable es la reversión.

Fig. 1. Patrón de vela "Bullish Harami"
El reconocimiento del patrón "Bullish Harami" se implementa en el método CheckPatternBullishHarami() de la clase CCandlePattern:
//+------------------------------------------------------------------+ //| Verifica la formación del patrón de vela Bullish Harami | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishHarami() { //--- Bullish Harami if((Close(1)>Open(1)) && // la última barra completada es alcista (día blanco) ((Open(2)-Close(2)>AvgBody(1)) && // la vela anterior es bajista, su cuerpo es mayor que el promedio (largo negro) ((Close(1)<Open(2)) && // el precio de cierre de la vela alcista es menor que el precio de apertura de la vela bajista (Open(1)>Close(2))) && // el precio de apertura de la vela alcista es mayor que el precio de cierre de la vela bajista (MidPoint(2)<CloseAvg(2))) // tendencia bajista return(true); //--- return(false); }
El método CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) de la clase CCandlePattern se utiliza para verificar la formación del patrón de vela "Bullish Harami".
1.2. Bearish Harami
El patrón de reversión Bearish Harami se forma en una tendencia alcista, cuando una gran vela es seguida por una vela más pequeña cuyo cuerpo se encuentra dentro del rango vertical del cuerpo más grande. Este patrón indica que la tendencia alcista podría estar revirtiendo, señalando que es un buen momento para entrar en una posición corta. La segunda vela se abre con un hueco a la baja.
Cuanto más pequeña sea la segunda vela (negra), más probable es la reversión.

Fig. 2. Patrón de vela "Bearish Harami"
El reconocimiento del patrón "Bearish Harami" se implementa en el método CheckPatternBearishHarami() de la clase CCandlePattern:
//+------------------------------------------------------------------+ //| Verifica la formación del patrón de vela Bearish Harami | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishHarami() { //--- Bearish Harami if((Close(1)<Open(1)) && // la última barra completada es bajista (día negro) ((Close(2)-Open(2)>AvgBody(1)) && // la vela anterior es alcista, su cuerpo es mayor que el promedio (largo blanco) ((Close(1)>Open(2)) && // el precio de cierre de la vela bajista es mayor que el precio de apertura de la vela alcista (Open(1)<Close(2))) && // el precio de apertura de la vela bajista es menor que el precio de cierre de la vela alcista (MidPoint(2)>CloseAvg(2))) // tendencia alcista return(true); //--- return(false); }
El método CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) de la clase CCandlePattern se utiliza para verificar la formación del patrón de vela "Bearish Harami".
2. Señales de trading, confirmadas por el indicador MFI
Las señales de trading para abrir posiciones largas o cortas deben ser confirmadas por el indicador MFI. El valor del indicador MFI debe ser inferior a 40 (para posiciones largas) o superior a 60 (para posiciones cortas).
El cierre de las posiciones abiertas depende de los valores del indicador MFI. Esto puede hacerse en 2 casos:
- si el MFI ha alcanzado el nivel crítico opuesto (70 para posición larga y 30 para posición corta)
- si la señal inversa no está confirmada (cuando el indicador MFI alcanza los siguientes niveles: 30 para posición larga y 70 para posición corta)

Fig. 3. Patrón "Bullish Harami", confirmado por el indicador MFI
- int CBH_BH_MFI::LongCondition() - verifica condiciones para abrir posición larga (devuelve 80) y cerrar la posición corta (devuelve 40);
- int CBH_BH_MFI::ShortCondition() - verifica condiciones para abrir posición corta (devuelve 80) y cerrar la posición larga (devuelve 40).
2.1. Abrir posición larga/Cerrar posición corta
La formación del patrón "Bullish Harami" debe ser confirmada por el indicador MFI: MFi(1)<40 (el valor del indicador MFI de la última barra completada debe ser menor que 40).
La posición corta debe cerrarse si el MFI ha cruzado hacia arriba los niveles críticos (70 o 30).
//+------------------------------------------------------------------+ //| Verifica condiciones para entrada y salida del mercado | //| 1) Entrada al mercado (abrir posición larga, resultado=80) | //| 2) Salida del mercado (cerrar posición corta, resultado=40) | //+------------------------------------------------------------------+ int CBH_BH_MFI::LongCondition() { int result=0; //--- idx puede ser usado para determinar el modo de trabajo del Asesor Experto //--- idx=0 - en este caso el EA verifica las condiciones de trading en cada tick //--- idx=1 - en este caso el EA verifica las condiciones de trading solo en barras de noticias int idx =StartIndex(); //--- verificando las condiciones para abrir posición larga //--- formación del patrón Bullish Harami y MFI<40 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (MFI(1)<40)) result=80; //--- verificando las condiciones para cerrar posición corta //--- cruce de línea de señal de niveles de sobrecompra/sobreventa (hacia arriba 30, hacia arriba 70) if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) result=40; //--- devolver resultado return(result); }
2.2. Abrir posición corta/Cerrar posición larga
La formación del patrón "Bearish Harami" debe ser confirmada por el indicador MFI: MFI(1)>60 (el valor del indicador MFI de la última barra completada debe ser mayor que 60).
La posición larga debe cerrarse si el MFI ha cruzado hacia abajo los niveles críticos (70 o 30).
//+------------------------------------------------------------------+ //| Verifica condiciones para entrada y salida del mercado | //| 1) Entrada al mercado (abrir posición corta, resultado=80) | //| 2) Salida del mercado (cerrar posición larga, resultado=40) | //+------------------------------------------------------------------+ int CBH_BH_MFI::ShortCondition() { int result=0; //--- idx puede ser usado para determinar el modo de trabajo del Asesor Experto //--- idx=0 - en este caso el EA verifica las condiciones de trading en cada tick //--- idx=1 - en este caso el EA verifica las condiciones de trading solo en barras de noticias int idx =StartIndex(); //--- verificando las condiciones para abrir posición corta //--- formación del patrón Bearish Harami y MFI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (MFI(1)>60)) result=80; //--- verificando las condiciones para cerrar posición larga //--- cruce de línea de señal de niveles de sobrecompra/sobreventa (hacia arriba 70, hacia abajo 30) if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30))) result=40; //--- devolver resultado return(result); }
2.3. Creando un Asesor Experto usando MQL5 Wizard
La clase CBH_BH_MFI no se incluye en las clases de la Librería Estándar. Para usarla, es necesario descargar el archivo abh_bh_mfi.mqh (ver adjuntos) y guardarlo en la carpeta client_terminal_data\MQL5\Include\Expert\Signal\MySignals. Lo mismo debe hacerse con el archivo acandlepatterns.mqh. Puedes usarlo en MQL5 Wizard después de reiniciar el MetaEditor.
Para crear un Asesor Experto, lanza el MQL5 Wizard:

Fig. 4. Creando un Asesor Experto usando MQL5 Wizard
Especifica el nombre del Asesor Experto:

Fig. 5. Propiedades generales del Asesor Experto
Después, selecciona los módulos de señales de trading que vas a usar.

Fig. 6. Propiedades de la señal del Asesor Experto
En nuestro caso, usamos solo un módulo de señales de trading.
Añadiendo el módulo de señales: Señales basadas en Bullish Harami/Bearish Harami confirmadas por MFI:

Fig. 7. Propiedades de la señal del Asesor Experto
Módulo de señales de trading añadido:

Fig. 8. Propiedades de la señal del Asesor Experto
Puedes seleccionar cualquier propiedad de trailing, pero usaremos "Trailing Stop no utilizado":

Fig. 9. Propiedades de trailing del Asesor Experto
Respecto a las propiedades de gestión de dinero, usaremos "Trading con volumen de operación fijo":

Fig. 10. Propiedades de gestión de dinero del Asesor Experto
Al presionar el botón "Finalizar", obtendremos el código del Asesor Experto generado, ubicado en Expert_ABH_BH_MFI.mq5, el cual se guardará en terminal_data_folder\MQL5\Experts\.
Los parámetros de entrada predeterminados del Asesor Experto generado son:
//--- entradas para señal principal input int Signal_ThresholdOpen =10; // Valor umbral de señal para abrir [0...100] input int Signal_ThresholdClose =10 // Valor umbral de señal para cerrar [0...100] input double Signal_PriceLevel =0.0 // Nivel de precio para ejecutar una operación input double Signal_StopLevel =50.0 // Nivel de Stop Loss (en puntos) input double Signal_TakeLevel =50.0 // Nivel de Take Profit (en puntos)
debe ser reemplazado por:
//--- entradas para señal principal input int Signal_ThresholdOpen =40; // Valor umbral de señal para abrir [0...100] input int Signal_ThresholdClose =20 // Valor umbral de señal para cerrar [0...100] input double Signal_PriceLevel =0.0 // Nivel de precio para ejecutar una operación input double Signal_StopLevel =0.0 // Nivel de Stop Loss (en puntos) input double Signal_TakeLevel =0.0 // Nivel de Take Profit (en puntos)
Los parámetros de entrada Signal_ThresholdOpen/Signal_ThresholdClose permiten especificar los niveles umbrales para abrir y cerrar posiciones.
En el código de los métodos LongCondition() y ShortCondition() de la clase de señales de trading hemos especificado los valores fijos del umbral:
- Abrir posición: 80;
- Cerrar posición: 40.
El Asesor Experto generado por MQL5 Wizard abre y cierra posiciones usando los "votos" de los módulos de señales de trading. El voto del módulo principal (como contenedor, consta de todos los módulos añadidos) también se utiliza, pero sus métodos LongCondition() y ShortCondition() siempre devuelven 0.
Los resultados de los votos del módulo principal también se utilizan en el "promedio" de los votos. En nuestro caso, tenemos: módulo principal + 1 módulo de señales de trading, así que debemos tener en cuenta este hecho al establecer los valores umbrales. Debido a esto, los valores ThresholdOpen y ThresholdClose deben establecerse como 40=(0+80)/2 y 20=(0+40)/2.
