Inicio Trading Sistemático Publicación

Señales de Trading con MQL5: Patrones de Estrellas y MFI

Archivos adjuntos
323.zip (6.46 KB, Descargar 2 veces)

El MQL5 Wizard te permite crear Asesores Expertos listos para usar, basados en las clases de la biblioteca estándar que vienen con el terminal cliente (puedes consultar Crear Asesores Expertos en MQL5 Wizard para más detalles). Esta herramienta permite validar tus ideas de trading rápidamente; solo necesitas crear tu propia clase de señales de trading. La estructura de esta clase y ejemplos están disponibles 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 sobrescribir los métodos virtuales LongCondition() y ShortCondition() con tus propios métodos.

Hay un libro titulado "Estrategias de los Mejores Traders" (en ruso) que analiza diversas estrategias de trading. Aquí, nos enfocaremos en los patrones de velas de reversión, confirmados por los osciladores Estocástico, CCI, MFI y RSI.

La mejor forma 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 patrones de velas, basta con escribir una clase derivada de CCandlePattern y añadir las características necesarias (por ejemplo, confirmación por osciladores).

A continuación, analizaremos las señales basadas en los patrones de reversión "Estrella de la Mañana/Estrella de la Noche" (Morning Doji Star/Evening Doji Star), confirmadas por el indicador MFI. El módulo de señales de trading se basa en la clase CCandlePattern, que es un ejemplo sencillo de su uso para crear señales de trading con patrones de velas.

1. Patrones de Velas de Reversión: "Estrella de la Mañana" y "Estrella de la Noche"

1.1. Estrella de la Mañana

Este patrón indica la reversión de una tendencia bajista y está compuesto por tres velas (Fig. 1). Tras una larga vela negra, aparece una vela (el color no es importante) con un cuerpo pequeño, que se sitúa fuera del cuerpo de la vela negra. El cuerpo pequeño indica que la fuerza de los toros y los osos es igual y el mercado está listo para cambiar de tendencia.

La tercera vela del patrón es una vela alcista, cuyo cuerpo no se superpone con el cuerpo de la segunda vela, y el precio de cierre se encuentra dentro del cuerpo de la primera (bajista). La vela resultante del modelo también se muestra en la Figura 1.

Si la segunda vela es del tipo doji, el modelo se denomina "Estrella Doji de la Mañana".

Fig. 1. Patrones de velas

Fig. 1. Patrones de velas "Estrella de la Mañana" y "Estrella Doji de la Mañana"

La identificación del patrón "Estrella de la Mañana" se realiza mediante los métodos CheckPatternMorningStar() y CheckPatternMorningDoji() de la clase CCandlePattern:

//+------------------------------------------------------------------+
//| Verifica la formación del patrón "Estrella de la Mañana"           |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningStar()  
  {  
//--- Estrella de la Mañana
   if((Open(3)-Close(3)>AvgBody(1))             && // vela bajista, su cuerpo mayor que el cuerpo promedio
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // segunda vela tiene un cuerpo pequeño (menor que la mitad del cuerpo promedio)
      (Close(2)<Close(3))                       && // cierre de la segunda vela es menor que el cierre de la primera
      (Open(2)<Open(3))                         && // apertura de la segunda vela es menor que la apertura de la primera
      (Close(1)>MidOpenClose(3)))                  // cierre de la última vela completada es mayor que el centro de la primera
      return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Verifica la formación del patrón "Estrella Doji de la Mañana"     |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternMorningDoji()  
  {  
//--- Estrella Doji de la Mañana
   if((Open(3)-Close(3)>AvgBody(1)) && // vela bajista con cuerpo mayor que el cuerpo promedio 
      (AvgBody(2)<AvgBody(1)*0.1)   && // la segunda vela tiene un cuerpo muy pequeño (doji)
      (Close(2)<Close(3))           && // cierre de la segunda vela es menor que el cierre de la primera
      (Open(2)<Open(3))             && // apertura de la segunda vela es menor que la apertura de la primera
      (Open(1)>Close(2))             && // gap alcista en la última vela completada
      (Close(1)>Close(2)))             // cierre de la última vela completada es mayor que el cierre de la segunda
      return(true);
//---
   return(false);
  }

Los métodos CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) y CheckCandlestickPattern(CANDLE_PATTERN_MORNING_DOJI) de la clase CCandlePattern se utilizan para verificar la formación de los patrones "Estrella de la Mañana" y "Estrella Doji de la Mañana".


1.2. Estrella de la Noche

Este patrón indica la reversión de una tendencia alcista y también está compuesto por tres velas (Fig. 2). Después de una larga vela blanca, aparece una vela (el color no es importante) con un cuerpo pequeño, que se sitúa fuera del cuerpo de la vela blanca. El cuerpo pequeño indica que la fuerza de los toros y los osos es igual y el mercado está listo para cambiar de tendencia.

La tercera vela del patrón es una vela bajista, cuyo cuerpo no se superpone con el cuerpo de la segunda vela, y el precio de cierre se encuentra dentro del cuerpo de la primera (alcista). La vela resultante del modelo también se muestra en la Figura 2.

Si la segunda vela es del tipo doji, el modelo se denomina "Estrella Doji de la Noche".

Fig. 2. Patrones de velas

Fig. 2. Patrones de velas "Estrella de la Noche" y "Estrella Doji de la Noche"

A continuación, se presentan los métodos para identificar los patrones "Estrella de la Noche" y "Estrella Doji de la Noche":

//+------------------------------------------------------------------+
//| Verifica la formación del patrón "Estrella de la Noche"           |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningStar()  
  {  
//--- Estrella de la Noche
   if((Close(3)-Open(3)>AvgBody(1))             && // vela alcista con cuerpo mayor que el cuerpo promedio
      (MathAbs(Close(2)-Open(2)<AvgBody(1)*0.5) && // segunda vela tiene un cuerpo pequeño (menor que la mitad del cuerpo promedio)
      (Close(2)>Close(3))                       && // cierre de la segunda vela es mayor que el cierre de la primera
      (Open(2)>Open(3))                         && // apertura de la segunda vela es mayor que la apertura de la primera
      (Close(1)<MidOpenClose(3)))                  // cierre de la última vela completada es menor que el centro de la primera
      return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Verifica la formación del patrón "Estrella Doji de la Noche"     |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternEveningDoji()  
  {  
//--- Estrella Doji de la Noche
   if((Close(3)-Open(3)>AvgBody(1)) && // vela alcista con cuerpo mayor que el cuerpo promedio 
      (AvgBody(2)<AvgBody(1)*0.1)   && // la segunda vela tiene un cuerpo muy pequeño (doji)
      (Close(2)>Close(3))           && // cierre de la segunda vela es mayor que el cierre de la primera
      (Open(2)>Open(3))             && // apertura de la segunda vela es mayor que la apertura de la primera
      (Open(1)<Close(2))             && // gap bajista en la última vela completada
      (Close(1)<Close(2)))             // cierre de la última vela completada es menor que el cierre de la segunda
      return(true);
//---
   return(false);
  }

Los métodos CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) y CheckCandlestickPattern(CANDLE_PATTERN_EVENING_DOJI) de la clase CCandlePattern se utilizan para verificar la formación de los patrones "Estrella de la Noche" y "Estrella Doji de la Noche".


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 menor que 40 (para posiciones largas) o mayor que 60 (para posiciones cortas).

El cierre de una posición abierta depende de los valores del indicador MFI. Esto se puede realizar en 2 casos:

  1. si el MFI ha alcanzado el nivel crítico opuesto (70 para posición larga y 30 para posición corta)
  2. 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)

Figura 3. Patrón de

Figura 3. Patrón de "Estrella de la Mañana", confirmado por el indicador MFI


  • int CMS_ES_MFI::LongCondition() - verifica las condiciones para abrir una posición larga (devuelve 80) y cerrar una posición corta (devuelve 40);
  • int CMS_ES_MFI::ShortCondition() - verifica las condiciones para abrir una posición corta (devuelve 80) y cerrar una posición larga (devuelve 40).

2.1. Abrir posición larga/Cerrar posición corta

  1. La formación del patrón "Estrella de la Mañana" 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).

  2. La posición corta debe cerrarse si el indicador 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 CMS_ES_MFI::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();
//--- verificación de condiciones para abrir posición larga
//--- formación del patrón Estrella de la Mañana y MFI<40
  if(CheckCandlestickPattern(CANDLE_PATTERN_MORNING_STAR) && (MFI(1)<40))
     result=80;
//--- verificación de condiciones para cerrar posición corta
//--- cruce de niveles sobrecomprados/sobrevendidos de la línea de señal (hacia arriba 30, hacia arriba 70)
  if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70)))
     result=40;
//--- retorno del resultado
   return(result);
  }


2.2. Abrir posición corta/Cerrar posición larga

  1. La formación del patrón "Estrella de la Noche" 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).

  2. La posición larga debe cerrarse si el indicador 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 corta, resultado=80)       |
//| 2) Salida del mercado (cerrar posición larga, resultado=40)     |
//+------------------------------------------------------------------+
int CMS_ES_MFI::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();
//--- verificación de condiciones para abrir posición corta
//--- formación del patrón Estrella de la Noche y MFI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_EVENING_STAR) && (MFI(1)>60))
     result=80;
//--- verificación de condiciones para cerrar posición larga
//--- cruce de niveles sobrecomprados/sobrevendidos de la línea de señal (hacia arriba 70, hacia abajo 30)
   if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30)))
     result=40;
//--- retorno del resultado
   return(result);
  }


2.3. Creando un Asesor Experto usando MQL5 Wizard

La clase CMS_ES_MFI no está incluida en las clases de la Biblioteca Estándar, por lo que necesitarás descargar el archivo ams_es_mfi.mqh (ver adjuntos) y guardarlo en la carpeta de datos del terminal_cliente\MQL5\Include\Expert\Signal\MySignals. Lo mismo debe hacerse con el archivo acandlepatterns.mqh. Podrás 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

Fig. 4. Creando un Asesor Experto usando MQL5 Wizard

Especificamos el nombre del Asesor Experto:

Fig. 5. Propiedades generales del Asesor Experto

Fig. 5. Propiedades generales del Asesor Experto

Después, necesitamos seleccionar los módulos de señales de trading que utilizaremos.

Fig. 6. Propiedades de señales del Asesor Experto

Fig. 6. Propiedades de señales del Asesor Experto

En nuestro caso, utilizamos solo un módulo de señales de trading.

Añadiendo el módulo de Señales basadas en Estrella de la Mañana/Estrella de la Noche confirmadas por MFI:

Fig. 7. Propiedades de señales del Asesor Experto

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

Fig. 8. Propiedades de señales del Asesor Experto

Puedes seleccionar cualquier propiedad de trailing, pero utilizaremos "Trailing Stop no utilizado":

Fig. 9. Propiedades de trailing del Asesor Experto

Fig. 9. Propiedades de trailing del Asesor Experto

En cuanto a las propiedades de gestión del dinero, utilizaremos "Trading con volumen fijo":

Fig. 10. Propiedades de gestión del dinero del Asesor Experto

Fig. 10. Propiedades de gestión del dinero del Asesor Experto

Al presionar el botón "Finalizar", obtendremos el código del Asesor Experto generado, ubicado en Expert_AMS_ES_MFI.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 un trato
input double         Signal_StopLevel       =50.0;   // Nivel de Stop Loss (en puntos)
input double         Signal_TakeLevel       =50.0     // Nivel de Take Profit (en puntos)

deberán reemplazarse 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 un trato
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 umbral 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 de 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, que consiste en 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 "votos". En nuestro caso tenemos: módulo principal + 1 módulo de señales de trading, por lo que debemos tener en cuenta este hecho al establecer los valores de umbral. Debido a esto, el ThresholdOpen y el ThresholdClose deben establecerse como 40=(0+80)/2 y 20=(0+40)/2.

Los valores de los parámetros de entrada Signal_StopLevel y Signal_TakeLevel se establecen en 0, lo que significa que el cierre de las posiciones se realizará solo cuando las condiciones de cierre sean verdaderas.


2.4. Resultados de las pruebas históricas

Veamos la prueba del Asesor Experto en datos históricos (EURUSD H1, período de prueba: 2010.01.01-2011.03.16, PeriodMFI=49, MA_period=3).

En la creación del Asesor Experto utilizamos un volumen fijo (Trading Fixed Lot, 0.1), no se utiliza el algoritmo de Trailing Stop (Trailing not used).

Fig. 11. Resultados de la prueba del Asesor Experto, basado en Estrellas de la Mañana/Noche + MFI

Fig. 11. Resultados de la prueba del Asesor Experto, basado en Estrellas de la Mañana/Noche + MFI


El mejor conjunto de parámetros de entrada se puede encontrar utilizando el Tester de Estrategias del terminal cliente de MetaTrader 5.

El código del Asesor Experto creado por MQL5 Wizard está adjunto en expert_ams_es_mfi.mq5.

Publicaciones relacionadas

Comentarios (0)