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 (puedes ver más en Creando Asesores Expertos en MQL5 Wizard). Esto te permite verificar tus ideas de trading rápidamente; 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 básica 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.
Existen libros como "Estrategias de los Mejores Traders" (en ruso), que consideran muchas estrategias de trading. En este artículo nos enfocaremos en patrones de velas de reversión, confirmados por osciladores como Estocástico, CCI, MFI y RSI.
Lo mejor 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, solo es necesario escribir una clase derivada de CCandlePattern y añadir las características necesarias (por ejemplo, la confirmación mediante osciladores).
Aquí consideraremos las señales basadas en el patrón de velas de reversión "Hammer/Hanging Man", confirmado por el indicador CCI. 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 Reversales: "Hammer" y "Hanging Man"
1.1. Hammer
El "Hammer" es una vela con un cuerpo pequeño y una larga mecha inferior, formada después de un movimiento de precio a la baja. El patrón "Hammer" indica el final de una tendencia bajista.
El color del cuerpo de la vela no es importante, pero un "hammer" alcista indica un mayor potencial alcista. El cuerpo del patrón "Hammer" suele formarse cerca del mínimo de la vela anterior. La larga mecha inferior y la corta mecha superior conducen a un mayor potencial del patrón de reversión.

Fig. 1. Patrón de vela 'Hammer'
El reconocimiento del patrón "Hammer" se implementa en el método CheckPatternHammer() de la clase CCandlePattern:
//+------------------------------------------------------------------+ //| Revisa la formación del patrón de vela "Hammer" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHammer() { //--- Hammer if((MidPoint(1)<CloseAvg(2)) && // tendencia a la baja (MathMin(Open(1),Close(1))>(High(1)-(High(1)-Low(1))/3.0)) && // cuerpo en el 1/3 superior (Close(1)<Close(2)) && (Open(1)<Open(2))) // espacio del cuerpo return(true); //--- return(false); }
El método CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) de la clase CCandlePattern se utiliza para verificar la formación del patrón de vela "Hammer".
1.2. Hanging Man
El "Hanging Man" es una vela con un cuerpo pequeño y una larga mecha inferior, formada después de un movimiento de precio al alza. El patrón "Hanging Man" indica el final de una tendencia alcista.
El color del cuerpo de la vela no es importante, pero una vela bajista indica un mayor potencial bajista. El cuerpo del patrón "Hanging Man" suele formarse cerca del máximo de la vela anterior. La larga mecha inferior y la corta mecha superior conducen a un mayor potencial del patrón de reversión.

Fig. 2. Patrón de vela 'Hanging Man'
El reconocimiento del patrón "Hanging Man" se implementa en el método CheckPatternHangingMan() de la clase CCandlePattern:
//+------------------------------------------------------------------+ //| Revisa la formación del patrón de vela "Hanging Man" | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternHangingMan() { //--- Hanging man if((MidPoint(1)>CloseAvg(2)) && // tendencia al alza (MathMin(Open(1),Close(1)>(High(1)-(High(1)-Low(1))/3.0)) && // cuerpo en el 1/3 superior (Close(1)>Close(2)) && (Open(1)>Open(2))) // espacio del cuerpo return(true); //--- return(false); }
El método CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) de la clase CCandlePattern se utiliza para verificar la formación del patrón de vela "Hanging Man".
2. Señales de Trading Confirmadas por el Indicador RSI
Las señales de trading para abrir posiciones largas o cortas deben estar confirmadas por el indicador RSI. El valor del RSI debe ser menor o mayor que niveles críticos (40 para posición larga y 60 para posición corta).
El cierre de la posición abierta depende de los valores del RSI. Puede hacerse en 2 casos:
- si el RSI ha alcanzado el nivel crítico opuesto (70 para posición larga y 30 para posición corta)
- si la señal de reversa no está confirmada (cuando el RSI alcanza los siguientes niveles: 30 para posición larga y 70 para posición corta)

Fig. 3. Patrón 'Harami' confirmado por el indicador RSI
- int CH_HM_RSI::LongCondition() - verifica las condiciones para abrir una posición larga (devuelve 80) y cerrar la posición corta (devuelve 40);
- int CH_HM_RSI::ShortCondition() - verifica las condiciones para abrir una 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 "Hammer" debe ser confirmada por el indicador RSI: RSI(1)<40 (el valor del RSI de la última barra completada debe ser menor que 40).
La posición corta debe cerrarse si el indicador RSI 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 CH_HM_RSI::LongCondition() { int result=0; //--- idx puede usarse para determinar el modo de trabajo del Asesor Experto //--- idx=0 - en este caso el EA verifica condiciones de trading en cada tick //--- idx=1 - en este caso el EA verifica condiciones de trading solo en barras de noticias int idx =StartIndex(); //--- verificando condiciones para abrir posición larga //--- formación del patrón Hammer y RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_HAMMER) && (RSI(1)<40)) result=80; //--- verificando 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(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) result=40; //--- devolver resultado return(result); }
2.2. Abrir posición corta/Cerrar posición larga
La formación del patrón "Hanging Man" debe ser confirmada por el indicador RSI: RSI(1)>60 (el valor del RSI de la última barra completada debe ser mayor que 60).
La posición larga debe cerrarse si el indicador RSI 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 CH_HM_RSI::ShortCondition() { int result=0; //--- idx puede usarse para determinar el modo de trabajo del Asesor Experto //--- idx=0 - en este caso el EA verifica condiciones de trading en cada tick //--- idx=1 - en este caso el EA verifica condiciones de trading solo en barras de noticias int idx =StartIndex(); //--- verificando condiciones para abrir posición corta //--- formación del patrón Hanging Man y RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_HANGING_MAN) && (RSI(1)>60)) result=80; //--- verificando condiciones para cerrar posición larga //--- cruce de línea de señal de niveles de sobrecompra/sobreventa (hacia abajo 70, hacia abajo 30) if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) result=40; //--- devolver resultado return(result); }
2.3. Creando un Asesor Experto usando MQL5 Wizard
La clase CH_HM_RSI no está incluida en las clases de la Librería Estándar, para usarla es necesario descargar el archivo ach_hm_rsi.mqh (consulta los adjuntos) y guardarlo en la carpeta client_terminal_data\MQL5\Include\Expert\Signal\MySignals. Lo mismo debe hacerse con el archivo candlepatterns.mqh. Puedes usarlo en MQL5 Wizard después de reiniciar el MetaEditor.
Para crear un Asesor Experto, lanza el MQL5 Wizard:

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

Fig. 5. Propiedades generales del Asesor Experto
Después de eso, necesitamos seleccionar los módulos de señales de trading utilizados.

Fig. 6. Propiedades de señales del Asesor Experto
En nuestro caso, usamos solo un módulo de señales de trading.
Añadiendo el módulo de Señales basadas en Hammer/Hanging Man confirmadas por RSI:

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

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

Fig. 9. Propiedades de trailing del Asesor Experto
Con 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_AH_HM_RSI.mq5, que se guardará en terminal_data_folder\MQL5\Experts\.
Los parámetros de entrada predeterminados del Asesor Experto generado son:
//--- entradas para la 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)
deben ser reemplazados por:
//--- entradas para la 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 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 valores fijos del umbral:
- Abrir posición: 80;
- Cerrar posición: 40.
El Asesor Experto generado por MQL5 Wizard abre y cierra posiciones utilizando los "votos" de los módulos de señales de trading. El voto del módulo principal (como contenedor, contiene todos los módulos añadidos) también se usa, 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 votos. En nuestro caso, tenemos: módulo principal + 1 módulo de señales de trading, así que necesitamos tener esto en cuenta al establecer los valores umbrales. Debido a este hecho, los ThresholdOpen y ThresholdClose deben establecerse como 40=(0+80)/2 y 20=(0+40)/2.
