Discusión sobre el artículo "Automatización de estrategias de trading en MQL5 (Parte 24): Sistema de ruptura de la sesión de Londres con gestión del riesgo y stops dinámicos"

 

Artículo publicado Automatización de estrategias de trading en MQL5 (Parte 24): Sistema de ruptura de la sesión de Londres con gestión del riesgo y stops dinámicos:

En este artículo, desarrollamos un sistema de ruptura de la sesión de Londres que identifica rupturas del rango previo a la apertura de Londres y coloca órdenes pendientes con direcciones de trading y parámetros de riesgo personalizables. Incorporamos funciones como órdenes de stop dinámico, ratios riesgo-beneficio, límites máximos de pérdidas y un panel de control para la monitorización y gestión en tiempo real.

La estrategia de ruptura de la sesión de Londres aprovecha el aumento de la volatilidad que se produce durante la apertura del mercado de Londres, identificando el rango de precios que se forma en las horas previas a la apertura de Londres y colocando órdenes pendientes para aprovechar las rupturas de dicho rango. Esta estrategia es importante porque la sesión de Londres suele caracterizarse por una elevada liquidez y fuertes fluctuaciones de precios, lo que ofrece oportunidades fiables de obtener beneficios; sin embargo, requiere una gestión cuidadosa del riesgo para evitar falsas rupturas y drawdowns.

Lo conseguiremos calculando los máximos y mínimos previos a la sesión de Londres para establecer órdenes stop de compra y venta con desplazamientos, incorporando ratios de riesgo-rentabilidad para las órdenes de cierre de take profit, stops dinámicos para asegurar las ganancias, y límites en las posiciones abiertas y en la reducción máxima (drawdown) diaria con el fin de proteger el capital. Tenemos previsto utilizar un panel de control para la monitorización en tiempo real y las comprobaciones específicas de cada sesión, con el fin de garantizar que las operaciones se realicen únicamente dentro de rangos definidos, lo que hará que el sistema sea adaptable a las diferentes condiciones del mercado. En resumen, esta es una representación del sistema que queremos lograr.

PLAN ESTRATÉGICO


Autor: Allan Munene Mutiiria

 
etherxp #:
Gracias ;)

Bienvenido

[Eliminado]  
¿Puedes subir el indicador aquí?
 
hungxiro #:
¿Puedes subir el indicador aquí?

Por favor, lee el artículo anterior.

 
Bonito artículo. ¡Gracias por tu esfuerzo!
 
Kyle Young Sangster #:
Bonito artículo. ¡Gracias por tu esfuerzo!

De nada. Gracias por tu amable comentario. De nada.

 

He descargado y ejecutado este código tal cual en el Strategy Tester. Detecta el rango de cada día y dibuja el rectángulo en el gráfico. Sin embargo, no realiza ninguna operación cada día (cuando se supone que debería hacerlo). A lo largo de un mes y medio, solo realizó tres operaciones.


historial comercial


El segundo problema es que los niveles de máximo y mínimo, así como los niveles de compra y venta del panel de control, no se actualizan.

El panel de control no se actualiza


Los niveles de rango máximo y mínimo se detectan claramente en el gráfico, por lo que supongo que los niveles de compra y venta también deberían mostrarse en el gráfico y actualizarse en el panel de control, ya que se derivan directamente de los niveles de rango máximo y mínimo.

¿Qué sugerencias tenéis para que esto funcione correctamente?

Gracias de antemano.

 
Kyle Young Sangster Strategy Tester. Calcula el rango de cada día y dibuja el rectángulo en el gráfico. Sin embargo, no realiza ninguna operación cada día (suponiendo que debería hacerlo). A lo largo de un mes y medio, solo realizó tres operaciones.



El segundo problema es que los niveles máximos y mínimos, así como los niveles de compra y venta del panel de control, no se actualizan.


Los niveles de rango máximo/mínimo se ven claramente en el gráfico, por lo que supongo que los niveles de compra/venta también deberían mostrarse en el gráfico y actualizarse en el panel de control, ya que se derivan directamente de los niveles de rango máximo/mínimo.

¿Qué sugerencias tenéis para que esto funcione correctamente?

Gracias de antemano.

No puedo editar mi comentario; utilizo la versión 5.00, compilación 5214 de MT5

 
Kyle Young Sangster Strategy Tester. Calcula el rango de cada día y dibuja el rectángulo en el gráfico. Sin embargo, no realiza ninguna operación cada día (aunque se supone que debería hacerlo). A lo largo de un mes y medio, solo realizó tres operaciones.



El segundo problema es que los niveles máximos y mínimos, así como los niveles de compra y venta del panel de control, no se actualizan.


Los niveles de rango máximo y mínimo se ven claramente en el gráfico, por lo que supongo que los niveles de compra y venta también deberían mostrarse en el gráfico y actualizarse en el panel de control, ya que se derivan directamente de los niveles de rango máximo y mínimo.

¿Qué sugerencias tenéis para que esto funcione correctamente?

Gracias de antemano.

Hola. Gracias por tu amable respuesta y tus comentarios. Suponiendo que en realidad no hayas leído el artículo, simplemente lo has instalado y puesto en marcha; el programa se desarrolló con el par AUDUSD, así que pruébalo primero con ese par antes de pasar a otras divisas. Eso te permitirá comprenderlo en profundidad, ya que los puntos deben ajustarse a medida que cambian los pares. Quizá también debas revisar el diario en busca de posibles pistas sobre por qué podría estar fallando, posiblemente debido a una configuración incorrecta, pero, aparentemente, los puntos para el AUDUSD y el EURUSD deberían funcionar casi de la misma manera. Por ejemplo, lo estás ejecutando en el EURUSD, así que hacemos una prueba similar e intentamos ver qué pasa.

PRUEBA DEL EURUSD

Por la imagen, se ve que hay un error ahí. Eso haría que la prueba no se ejecutara correctamente.

Otra posible razón podrían ser unos datos históricos poco fiables, especialmente si se ejecuta con datos muy antiguos. En tu ejemplo, lo ejecutas a partir de 2020. Así que probemos y veamos qué ocurre con el periodo que se aprecia en tu captura de pantalla.

DATOS HISTÓRICOS INSUFICIENTES

Tras la prueba del periodo comprendido entre el 1 de enero de 2020 y el 31 de enero de 2020 —técnicamente, enero de 2020—, en realidad no se realizó ninguna operación. Como puedes ver, la calidad de los datos es deficiente; un 15 % es muy poco fiable. Las secciones en rojo muestran datos completamente nulos y, al pasar el cursor por encima, se puede ver el periodo en blanco. Ahora probemos con los datos de enero de 2025 y veamos qué pasa.

100 DATOS

En la imagen se puede ver que, con una calidad del historial del 100 %, tenemos algunas operaciones: 19 en un mes.

Así que, en relación con tu problema, quizá debas comprobar la calidad de tus datos de prueba, ya que hemos demostrado que la configuración por defecto funciona bien con el par EURUSD. Espero que esto aclare las cosas y te resulte útil. Gracias. Que tengas buenas operaciones.

 
Kyle Young Sangster Strategy Tester. Calcula el rango de cada día y dibuja el rectángulo en el gráfico. Sin embargo, no realiza una operación cada día (suponiendo que debería hacerlo). A lo largo de un mes y medio, solo realizó tres operaciones.



El segundo problema es que los niveles máximos y mínimos, así como los niveles de compra y venta del panel de control, no se actualizan.


Los niveles de rango máximo/mínimo se muestran claramente en el gráfico, por lo que supongo que los niveles de compra/venta también deberían aparecer en el gráfico y actualizarse en el panel de control, ya que se derivan directamente de los niveles de rango máximo/mínimo.

¿Qué sugerencias tenéis para que esto funcione correctamente?

Gracias de antemano.

En cuanto a tu segunda duda, el artículo lo explica, pero suponiendo que tu problema se deba a datos de prueba insuficientes y para darte una pista, cuando se está calculando el rango, siempre verás el estado «Calculando...» hasta que haya datos suficientes para establecer la sesión del rango de Londres o cualquier otra sesión que definas en los parámetros de entrada. Suponiendo que utilices la configuración predeterminada, con 3 horas previas a Londres, y que la hora que aparece en la captura de pantalla compartida sea el 13 de febrero, dos barras después de las 22:00, lo que equivale a 2 × 15 minutos = 30, lo que da como resultado las 22:30, está fuera del intervalo de tiempo de cálculo del rango; por lo tanto, los datos del panel deberían seguir siendo visibles, ya que el rango establecido anteriormente sigue vigente, a menos que aún no se haya encontrado la primera sesión, y se borrarán cuando se alcance el cálculo del rango a partir de medianoche. Véase a continuación:

const int PreLondonStartHour = 3; //--- Hora de inicio fijada antes de Londres
const int PreLondonStartMinute = 0; //--- Se ha corregido el minuto de inicio antes de Londres

Quizá te interese ver la lógica que se muestra a continuación para determinar el intervalo

//+------------------------------------------------------------------+
//| Consultar las condiciones de negociación y realizar órdenes                        |
//+------------------------------------------------------------------+
void CheckTradingConditions(datetime currentTime) {
   MqlDateTime timeStruct;            //--- Estructura temporal
   TimeToStruct(currentTime, timeStruct); //--- Convertir la hora
   datetime today = StringToTime(StringFormat("%04d.%02d.%02d", timeStruct.year, timeStruct.mon, timeStruct.day)); //--- Obtener la fecha de hoy

   datetime preLondonStart = today + PreLondonStartHour * 3600 + PreLondonStartMinute * 60; //--- Inicio antes de Londres
   datetime londonStart = today + LondonStartHour * 3600 + LondonStartMinute * 60; //--- Inicio en Londres
   datetime londonEnd = today + LondonEndHour * 3600 + LondonEndMinute * 60; //--- Fin de Londres
   analysisTime = londonStart;        //--- Establecer el tiempo de análisis

   if (currentTime < analysisTime) return; //--- Salir si es antes del análisis

   double preLondonRange = GetRange(preLondonStart, currentTime, PreLondonHigh, PreLondonLow, PreLondonHighTime, PreLondonLowTime); //--- Obtener rango
   if (preLondonRange < MinRangePoints || preLondonRange > MaxRangePoints) { //--- Comprobar los límites del rango
      noTradeToday = true;            //--- Establecer «sin operaciones»
      sessionChecksDone = true;       //--- Comprobaciones realizadas
      DrawSessionRanges(preLondonStart, londonEnd); //--- Dibujar rangos
      return;                         //--- Salir
   }

   LondonRangePoints = preLondonRange; //--- Establecer puntos de rango
   PlacePendingOrders(PreLondonHigh, PreLondonLow, today); //--- Realizar pedidos
   noTradeToday = true;               //--- Establecer «sin operaciones»
   sessionChecksDone = true;          //--- Comprobaciones realizadas
   DrawSessionRanges(preLondonStart, londonEnd); //--- Dibujar rangos
}

y cómo se establece.

//+------------------------------------------------------------------+
//| Actualizar el panel con los datos actuales                                   |
//+------------------------------------------------------------------+
void UpdatePanel() {
   string rangeText = "Range (points): " + (LondonRangePoints > 0 ? DoubleToString(LondonRangePoints, 0) : "Calculating..."); //--- Dar formato al texto de un rango
   ObjectSetString(0, panelPrefix + "RangePoints", OBJPROP_TEXT, rangeText); //--- Actualizar el texto del rango

   //---

}

Observa la imagen siguiente; aunque desconocemos el año de tu prueba, tomaremos el 2025; si se trata de 2020, como en tu caso, no disponemos de datos de calidad para ese año, por lo que, en cualquier caso, utilizaremos 2025 y, por lo tanto, el cálculo del intervalo debería comenzar a medianoche.

23:55

En la imagen se puede ver que los datos de las 23:55 siguen intactos. Sin embargo, al llegar la medianoche, deberíamos reiniciar. Véase a continuación.

DATOS DE MEDIANOCHE 00:00

Se puede observar que hemos restablecido los datos a medianoche para el cálculo del intervalo. De hecho, una vez realizado el cálculo del rango, la visualización puede ayudarte a comprender qué ha ocurrido realmente. Por ejemplo, en tu caso, utilizando la configuración predeterminada, veremos las barras de rango desde las 03:00 hasta las 08:00, ya que eso es lo que hemos definido. Véase a continuación:

HORARIO DEL CAMPO DE TIRO

Espero que esto aclare las cosas de nuevo. Puedes ajustar todo según tu estilo de negociación. Para evitar los problemas a los que te enfrentas, es recomendable utilizar datos de prueba fiables. Gracias.