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"
Echa un vistazo al nuevo artículo: Automatización de estrategias de trading en MQL5 (Parte 24): Sistema de ruptura en la sesión de Londres con gestión de riesgos y stops dinámicos.
Autor: Allan Munene Mutiiria
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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:
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso








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:
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.
Autor: Allan Munene Mutiiria