De novato a experto: Noticias animadas utilizando MQL5 (VII) Estrategia para el trading de noticias tras el impacto
Contenido:
- Introducción
- Explorando el concepto de estrategia
- Implementación final: Integración de la estrategia post-impacto en el EA News Headline
- Pruebas
- Conclusión
- Lecciones clave
- Archivos adjuntos
Introducción
La estrategia que exploramos en el artículo anterior se centraba en colocar órdenes pendientes poco antes de la publicación de una noticia de gran impacto. El objetivo era obtener beneficios de las fuertes fluctuaciones de precios que suelen seguir a este tipo de acontecimientos. Si bien este enfoque puede ser efectivo, existen escenarios en los que resulta insuficiente, como cuando se activa una de las órdenes pero no alcanza el nivel de toma de ganancias, y en su lugar termina alcanzando el stop loss.
Afortunadamente, en nuestra implementación anterior, incorporamos lógica al EA para cancelar automáticamente la orden pendiente opuesta tan pronto como se activara una de ellas. Esta automatización es crucial, ya que evita que ambas órdenes se activen durante un movimiento de latigazo (whipsaw), una situación que de otro modo podría resultar en una doble pérdida. Al basarse en la velocidad algorítmica para tomar estas decisiones en milisegundos, el EA ofrece un nivel de precisión que es prácticamente imposible de lograr manualmente.
Sin embargo, si un trader desea evitar por completo este riesgo de movimiento de latigazo (whipsaw), se hace necesaria una estrategia alternativa. En este análisis, nos centraremos en una estrategia de trading posterior a la publicación de noticias —que consiste en ejecutar operaciones después de un evento de gran impacto— diseñada para complementar y ampliar las capacidades del Asesor Experto (EA) de titulares de noticias existente.
En la siguiente sección, profundizaremos en el plan de integración de esta estrategia y evaluaremos su viabilidad mediante el análisis del historial de gráficos y la implementación de la lógica en tiempo real.
Explorando el concepto de estrategia
Para nuestras pruebas e investigaciones, planeamos utilizar datos de gráficos históricos para analizar el comportamiento del mercado tras eventos noticiosos de gran impacto, en particular la publicación de las cifras de empleo no agrícola (NFP, por sus siglas en inglés). Dado que los anuncios de las nóminas no agrícolas se realizan de forma regular (normalmente el primer viernes de cada mes), son fáciles de identificar y de alinear con las fechas conocidas del calendario. Esto las hace ideales para estudiar cómo responde la acción del precio en los minutos y horas posteriores a la noticia.
Al consultar las fechas de publicación de las NFP en el calendario económico y observar los datos gráficos en el marco temporal de minutos en torno a esos eventos, podemos obtener información valiosa sobre cómo se comportan los diferentes instrumentos después del impacto de las noticias. Este enfoque nos permite diseñar y perfeccionar nuestra herramienta de trading posterior al impacto, que complementará la estrategia de órdenes pendientes existente al proporcionar oportunidades de entrada una vez que la volatilidad inicial se estabilice y surja una dirección clara.
Este método de pruebas históricas nos permite simular y perfeccionar la lógica de trading incluso fuera de las condiciones del mercado en tiempo real, lo que lo convierte en una forma eficaz de validar nuestro marco de ejecución posterior a la publicación de noticias antes de su implementación completa. Lea a continuación para obtener más detalles.
Explorando el historial de la acción del precio con un asesor experto personalizado.
En esta sección, desarrollaremos un Asesor Experto (EA) en MQL5 que nos permitirá "viajar en el tiempo" a través de datos históricos de gráficos utilizando el Probador de estrategias de MetaTrader 5. El objetivo es observar manualmente la acción del precio poco después de los principales impactos económicos, en particular la publicación de las cifras de empleo no agrícola (NFP, por sus siglas en inglés), y recopilar información valiosa para diseñar nuestra estrategia de trading posterior al impacto.
Esta etapa sirve como una oportunidad de aprendizaje práctico para profundizar nuestra comprensión de la programación MQL5, al tiempo que nos familiarizamos con el funcionamiento del Probador de estrategias. Al centrarnos en acontecimientos históricos específicos, podemos simular condiciones reales del mercado y analizar cómo se comportó el precio en los momentos posteriores a noticias de gran impacto.
Los conocimientos y las observaciones obtenidos durante esta fase de pruebas nos ayudarán a validar nuestras hipótesis de trading antes de pasar a la implementación final. En definitiva, esto sienta las bases para integrar una lógica de trading posterior al impacto más sofisticada en el Asesor Experto (EA) principal de titulares de noticias, lo que le permite prepararse para las noticias y actuar de forma inteligente después de ellas.
El informe de nóminas no agrícolas (NFP, por sus siglas en inglés) es uno de los datos económicos más influyentes en los mercados financieros, especialmente para los pares de divisas que incluyen el dólar estadounidense (USD). Su anuncio suele provocar movimientos de precios inmediatos y a menudo bruscos, lo que lo convierte en un candidato ideal tanto para estrategias de trading previas como posteriores a la noticia. Para realizar pruebas y desarrollar estrategias, los pares principales con el dólar estadounidense, como EURUSD, GBPUSD, USDJPY y USDCHF, son los instrumentos más relevantes porque reaccionan de forma más consistente y significativa a la publicación de los datos de empleo no agrícola (NFP). Esto los convierte en entornos de prueba ideales para algoritmos que buscan explotar los patrones de volatilidad que rodean las principales noticias económicas.
Antes de adentrarnos en la lógica y la funcionalidad completas del Asesor Experto NFP_Event_Replay.mq5, es importante comprender cómo empezar a programar una herramienta de este tipo. En MetaTrader 5, inicie MetaEditor, luego vaya a Archivo/Nuevo/Asesor experto... (plantilla) y proporcione un nombre como NFP_Event_Replay. Esto generará una estructura básica con las funciones OnInit(), OnDeinit() y OnTick(). A partir de ahí, puedes empezar a construir tu lógica, comenzando con comprobaciones de tiempo, identificación del día de las noticias y herramientas de dibujo, para luego ir transformando gradualmente el esqueleto en un resaltador de eventos históricos completamente funcional, como exploraremos en las secciones siguientes.
Este análisis explicará cada parte del EA, ayudando tanto a desarrolladores principiantes como intermedios de MQL5 a comprender cómo resaltar programáticamente eventos NFP pasados en gráficos históricos utilizando rectángulos, lógica temporal y cálculos que tienen en cuenta la zona horaria, una forma poderosa de estudiar visualmente y refinar las estrategias de trading posteriores a las noticias.
1. Metadatos y entradas del usuario
Al inicio del Asesor Experto, los metadatos describen el autor, la versión y el propósito del Asesor Experto. La característica principal de esta herramienta es ayudar a los traders a reproducir visualmente y estudiar el comportamiento del mercado de NFP (nóminas no agrícolas) en el probador de estrategias de MetaTrader 5. Dos campos de entrada —MinutesBefore y MinutesAfter— permiten al trader definir la duración de la ventana (en minutos) antes y después del evento en la que se resaltará la evolución del precio. Esto permite personalizar el análisis en función de la magnitud de la variación de precios en torno a la publicación de noticias que se desee estudiar.
input int MinutesBefore = 5; input int MinutesAfter = 5;
2. Variables globales e inicialización
Se declaran variables globales para gestionar el nombre del rectángulo, realizar un seguimiento del año y el mes en que se creó el dibujo por última vez y evitar alertas repetitivas. Estas funciones ayudan a controlar el flujo lógico, garantizando que los rectángulos no se dibujen repetidamente el mismo día y que la limpieza se gestione adecuadamente durante la inicialización y la desinicialización.
string rectName = "NFP_Event_Window"; int drawnYear = 0, drawnMonth = 0; bool alertShown = false;
3. Cálculo del primer viernes
Una de las claves de la lógica reside en determinar la fecha del primer viernes de cada mes. Esto es fundamental porque el informe NFP se publica el primer viernes de cada mes. El EA utiliza cálculos de calendario para encontrar esta fecha de forma dinámica, basándose en el año y el mes actuales, lo que permite reutilizar el EA en años futuros sin modificaciones.
//+------------------------------------------------------------------+ //| Calculate day of first Friday | //+------------------------------------------------------------------+ int GetFirstFriday(int year, int month) { MqlDateTime dt = {0}; dt.year = year; dt.mon = month; dt.day = 1; datetime first = StructToTime(dt); TimeToStruct(first, dt); // Calculate days to first Friday (5 = Friday) int daysToAdd = (5 - dt.day_of_week + 7) % 7; return 1 + daysToAdd; }
4. Comprobación de IsFirstFriday
Esta función evalúa si la fecha y hora que se está procesando corresponde al primer viernes del mes. Se basa en la lógica anterior para calcular el primer viernes del mes y compara el día actual con el día de la semana para determinar la elegibilidad. Esta verificación sirve como puerta de entrada para evitar cálculos innecesarios o dibujos de rectángulos en días que no son de nóminas no agrícolas.
//+------------------------------------------------------------------+ //| Check if date is first Friday | //+------------------------------------------------------------------+ bool IsFirstFriday(datetime time) { MqlDateTime dt; TimeToStruct(time, dt); int firstFriday = GetFirstFriday(dt.year, dt.mon); return (dt.day_of_week == 5 && dt.day == firstFriday); }
5. GetTimeGMTOffset
Esta función determina la diferencia horaria local del agente con respecto a GMT (UTC) en función de la hora del servidor. Dado que los eventos NFP se anuncian en la hora del Este de EE. UU. Hora del Este (que puede ser UTC-4 o UTC-5 dependiendo del horario de verano): este desfase es necesario para convertir correctamente la marca de tiempo del evento y que coincida con la zona horaria del corredor y la hora del gráfico.
//+------------------------------------------------------------------+ //| Get UTC offset for a specific time | //+------------------------------------------------------------------+ int GetTimeGMTOffset(datetime time) { MqlDateTime dt; TimeToStruct(time, dt); datetime timeUTC = StructToTime(dt); return (int)(time - timeUTC); }
6. Inicialización y limpieza de EA
Cuando se inicializa el EA (OnInit), se establece un temporizador de 1 segundo que actúa como un «latido» para comprobar continuamente si nos encontramos en una fecha relevante del método NFP. Al desinicializarse (OnDeinit), detiene el temporizador y elimina el objeto rectángulo si se había dibujado. Esto garantiza que las sesiones de prueba comiencen correctamente y no dejen elementos gráficos residuales en el gráfico.
//+------------------------------------------------------------------+ //| Program entry point | //+------------------------------------------------------------------+ int OnInit() { EventSetTimer(1); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Cleanup on exit | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); ObjectDelete(0, rectName); }
7. OnTimer: El corazón de EA
La función OnTimer es el bloque de ejecución principal, que el temporizador invoca cada segundo. Evita el procesamiento redundante al comprobar si hay cambios en la hora actual del gráfico. Si el día es un primer viernes válido, calcula la marca de tiempo de publicación del NFP para el año y mes actuales, aplica cualquier desfase horario necesario y luego comprueba si la hora actual se encuentra dentro de la ventana rectangular definida por el usuario. Si se cumplen las condiciones y si aún no se ha dibujado para el mes actual, se dibuja el rectángulo del evento. Además, se imprimen mensajes de depuración para una mejor visibilidad durante las pruebas. Fuera de los días de NFP, el EA restablece las variables de seguimiento y elimina cualquier dibujo existente.
//+------------------------------------------------------------------+ //| Timer handler - main logic | //+------------------------------------------------------------------+ void OnTimer() { static datetime lastBarTime = 0; datetime now = TimeCurrent(); if(now == lastBarTime) return; lastBarTime = now; MqlDateTime dtNow; TimeToStruct(now, dtNow); // Process only on first Fridays if(IsFirstFriday(now)) { // Show alert once per day if(!alertShown) { Alert("NFP Day: Set tester replay speed to 70%"); alertShown = true; } // Calculate exact NFP release time in UTC int releaseDay = GetFirstFriday(dtNow.year, dtNow.mon); datetime nfpUTC = GetNFPTimestamp(dtNow.year, dtNow.mon, releaseDay); // Convert to broker time (Zimbabwe CAT = UTC+2) int offset = GetTimeGMTOffset(now); datetime nfpBroker = nfpUTC + offset; // Calculate rectangle boundaries datetime startTime = nfpBroker - MinutesBefore*60; datetime endTime = nfpBroker + MinutesAfter*60; // Draw rectangle if in time window if(now >= startTime && now <= endTime) { if(drawnYear != dtNow.year || drawnMonth != dtNow.mon) { DrawEventWindow(startTime, endTime); drawnYear = dtNow.year; drawnMonth = dtNow.mon; // Debug output Print("NFP UTC Time: ", TimeToString(nfpUTC, TIME_MINUTES|TIME_SECONDS)); Print("Broker Time: ", TimeToString(now, TIME_MINUTES|TIME_SECONDS)); Print("NFP Broker Time: ", TimeToString(nfpBroker, TIME_MINUTES|TIME_SECONDS)); Print("Event Window: ", TimeToString(startTime), " to ", TimeToString(endTime)); } } } else { alertShown = false; if(drawnYear != 0 || drawnMonth != 0) { ObjectDelete(0, rectName); drawnYear = 0; drawnMonth = 0; } } }
8. GetNFPTimestamp: NFP a las 8:30 a. m. (hora del Este)
Esta función genera la marca de tiempo UTC exacta de la publicación del NFP. Incorpora la lógica del horario de verano de EE. UU. para determinar si la hora de publicación debe considerarse las 12:30 UTC (verano) o las 13:30 UTC (invierno) Esta marca de tiempo precisa es esencial para sincronizar la ventana del gráfico con el momento real del evento.
//+------------------------------------------------------------------+ //| Create precise UTC timestamp for NFP event | //+------------------------------------------------------------------+ datetime GetNFPTimestamp(int year, int month, int day) { MqlDateTime dt = {0}; dt.year = year; dt.mon = month; dt.day = day; // Determine correct UTC hour based on US daylight saving // US Eastern Time: EST = UTC-5 (winter), EDT = UTC-4 (summer) // NFP always releases at 8:30 AM US Eastern Time bool isDst = IsUSDST(StructToTime(dt)); dt.hour = isDst ? 12 : 13; // 12:30 UTC (summer) or 13:30 UTC (winter) dt.min = 30; return StructToTime(dt); }
9. Lógica del horario de verano
Para tener en cuenta los cambios en EE. UU. Horario de verano (DST): esta función calcula si una fecha determinada se encuentra dentro del período de horario de verano. Según Estados Unidos Por ley, el horario de verano comienza el segundo domingo de marzo y termina el primer domingo de noviembre. Al calcular los límites para cada año y comparar la fecha con ellos, el EA adapta dinámicamente su cálculo de marca de tiempo a lo largo del año.
//+------------------------------------------------------------------+ //| Check if US is in daylight saving time | //+------------------------------------------------------------------+ bool IsUSDST(datetime time) { MqlDateTime dt; TimeToStruct(time, dt); // US DST rules (since 2007): // Starts: Second Sunday in March at 2:00 AM // Ends: First Sunday in November at 2:00 AM // Calculate DST start datetime dstStart = GetNthDayOfMonth(dt.year, 3, 0, 2) + (2 * 3600); // Second Sunday in March at 2:00 AM // Calculate DST end datetime dstEnd = GetNthDayOfMonth(dt.year, 11, 0, 1) + (2 * 3600); // First Sunday in November at 2:00 AM return (time >= dstStart && time < dstEnd); }
10. GetNthDayOfMonth
Esta función de utilidad encuentra la enésima ocurrencia de un día de la semana específico en un mes determinado. Por ejemplo, puede devolver el segundo domingo de marzo o el primer domingo de noviembre, que se utiliza para determinar los puntos de cambio al horario de verano. Esta función hace que el EA sea robusto y compatible con versiones futuras, lo que le permite adaptarse automáticamente a lo largo de los años sin necesidad de actualizaciones.
//+------------------------------------------------------------------+ //| Get nth day of week in a month | //+------------------------------------------------------------------+ datetime GetNthDayOfMonth(int year, int month, int dayOfWeek, int nth) { MqlDateTime dtFirst = {0}; dtFirst.year = year; dtFirst.mon = month; dtFirst.day = 1; datetime first = StructToTime(dtFirst); MqlDateTime dt; TimeToStruct(first, dt); int firstDayOfWeek = dt.day_of_week; // Calculate days to the first occurrence int daysToAdd = (dayOfWeek - firstDayOfWeek + 7) % 7; datetime firstOccurrence = first + daysToAdd * 86400; // Add weeks for nth occurrence if(nth > 1) { firstOccurrence += (nth - 1) * 7 * 86400; } // Verify if still in same month TimeToStruct(firstOccurrence, dt); if(dt.mon != month) { // Adjust to last occurrence in month firstOccurrence -= 7 * 86400; } return firstOccurrence; }
11. Dibujar el rectángulo en el gráfico
Una vez determinado el intervalo de tiempo correcto para el NFP, el EA crea un rectángulo que abarca ese período de tiempo. El rectángulo abarca todo el rango de precios visible y presenta características visuales distintivas, como bordes discontinuos y un fondo azul claro. Si un rectángulo ya existe de una ejecución anterior, primero se elimina para evitar superposiciones o duplicaciones.
//+------------------------------------------------------------------+ //| Draw the NFP event window on chart | //+------------------------------------------------------------------+ void DrawEventWindow(datetime start, datetime end) { ObjectDelete(0, rectName); double high = ChartGetDouble(0, CHART_PRICE_MAX); double low = ChartGetDouble(0, CHART_PRICE_MIN); if(ObjectCreate(0, rectName, OBJ_RECTANGLE, 0, start, high, end, low)) { ObjectSetInteger(0, rectName, OBJPROP_COLOR, clrDodgerBlue); ObjectSetInteger(0, rectName, OBJPROP_STYLE, STYLE_DASHDOT); ObjectSetInteger(0, rectName, OBJPROP_WIDTH, 2); ObjectSetInteger(0, rectName, OBJPROP_BACK, true); ObjectSetInteger(0, rectName, OBJPROP_FILL, true); ObjectSetInteger(0, rectName, OBJPROP_BGCOLOR, C'240,248,255'); // AliceBlue } }
12. OnTick (Marcador de posición)
Aunque el EA está diseñado para funcionar utilizando eventos basados en el tiempo en lugar de fluctuaciones de precios, se define una función OnTick vacía para mayor completitud y compatibilidad. No tiene ninguna utilidad en esta implementación, pero es un requisito de la estructura del EA de MetaTrader.
Probando la reproducción del evento NFP
Tras compilar correctamente el EA completo a partir de las secciones de código anteriores, procedimos a probar su funcionalidad utilizando el modo de visualización del Probador de estrategias en MetaTrader 5. Los resultados fueron impresionantes: en cada día de publicación de NFP identificado, el EA resaltó con precisión la ventana del evento con un rectángulo de color clrAliceBlue. Este indicador visual nos permitió identificar fácilmente el comportamiento de los precios en torno al anuncio de las cifras de empleo no agrícola (NFP). En particular, el segmento de reproducción de junio de 2024 a diciembre de 2024 ilustra claramente el típico pico de volatilidad asociado con el NFP, lo que confirma que el EA identifica y marca correctamente el período del evento. A continuación de los resultados, he recopilado algunos fragmentos de los gráficos registrados, que ahora se analizarán para desarrollar una estrategia de trading sólida posterior al impacto, basada en el comportamiento de los precios tras la publicación de los datos de empleo no agrícola (NFP).

Probando la función NFP_Event_Replay
Registro del probador:
2025.07.17 19:20:59.343 USDJPY.0: symbol to be synchronized 2025.07.17 19:20:59.346 USDJPY.0: symbol synchronized, 3960 bytes of symbol info received 2025.07.17 19:20:59.347 USDJPY.0: history synchronization started 2025.07.17 19:20:59.514 USDJPY.0: load 31 bytes of history data to synchronize in 0:00:00.013 2025.07.17 19:20:59.514 USDJPY.0: history synchronized from 2024.05.26 to 2025.07.20 2025.07.17 19:20:59.547 USDJPY.0: start time changed to 2024.05.27 00:00 to provide data at beginning 2025.07.17 19:20:59.548 USDJPY.0,M1: history cache allocated for 224402 bars and contains 173 bars from 2024.05.26 21:05 to 2024.05.26 23:59 2025.07.17 19:20:59.548 USDJPY.0,M1: history begins from 2024.05.26 21:05 2025.07.17 19:20:59.563 USDJPY.0,M1 (Deriv-Demo): every tick generating 2025.07.17 19:20:59.563 USDJPY.0,M1: testing of Experts\NFP_Event_Replay.ex5 from 2024.01.01 00:00 to 2024.12.31 00:00 started with inputs: 2025.07.17 19:20:59.563 MinutesBefore=5 2025.07.17 19:20:59.563 MinutesAfter=5 2025.07.17 19:29:59.082 2024.06.07 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 19:30:02.995 2024.06.07 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 19:30:02.995 2024.06.07 12:25:00 Broker Time: 12:25:00 2025.07.17 19:30:02.995 2024.06.07 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 19:30:02.995 2024.06.07 12:25:00 Event Window: 2024.06.07 12:25 to 2024.06.07 12:35 2025.07.17 19:30:41.055 2024.07.05 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 19:30:41.717 2024.07.05 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 19:30:41.717 2024.07.05 12:25:00 Broker Time: 12:25:00 2025.07.17 19:30:41.717 2024.07.05 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 19:30:41.717 2024.07.05 12:25:00 Event Window: 2024.07.05 12:25 to 2024.07.05 12:35 2025.07.17 19:30:55.060 2024.08.02 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 19:30:55.551 2024.08.02 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 19:30:55.551 2024.08.02 12:25:00 Broker Time: 12:25:00 2025.07.17 19:30:55.551 2024.08.02 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 19:30:55.551 2024.08.02 12:25:00 Event Window: 2024.08.02 12:25 to 2024.08.02 12:35 2025.07.17 19:31:15.547 2024.09.06 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 19:31:16.250 2024.09.06 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 19:31:16.250 2024.09.06 12:25:00 Broker Time: 12:25:00 2025.07.17 19:31:16.250 2024.09.06 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 19:31:16.250 2024.09.06 12:25:00 Event Window: 2024.09.06 12:25 to 2024.09.06 12:35 2025.07.17 19:31:30.214 2024.10.04 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 19:31:30.699 2024.10.04 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 19:31:30.699 2024.10.04 12:25:00 Broker Time: 12:25:00 2025.07.17 19:31:30.699 2024.10.04 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 19:31:30.699 2024.10.04 12:25:00 Event Window: 2024.10.04 12:25 to 2024.10.04 12:35 2025.07.17 21:23:38.212 2024.11.01 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 21:23:38.448 2024.11.01 12:25:00 NFP UTC Time: 12:30:00 2025.07.17 21:23:38.448 2024.11.01 12:25:00 Broker Time: 12:25:00 2025.07.17 21:23:38.448 2024.11.01 12:25:00 NFP Broker Time: 12:30:00 2025.07.17 21:23:38.448 2024.11.01 12:25:00 Event Window: 2024.11.01 12:25 to 2024.11.01 12:35 2025.07.17 21:23:47.754 2024.12.06 00:00:00 Alert: NFP Day: Set tester replay speed to 70% 2025.07.17 21:23:47.940 2024.12.06 13:25:00 NFP UTC Time: 13:30:00 2025.07.17 21:23:47.940 2024.12.06 13:25:00 Broker Time: 13:25:00 2025.07.17 21:23:47.940 2024.12.06 13:25:00 NFP Broker Time: 13:30:00 2025.07.17 21:23:47.940 2024.12.06 13:25:00 Event Window: 2024.12.06 13:25 to 2024.12.06 13:35
Análisis de los eventos de NFP después del impacto
El sistema EA nos ayudó eficazmente a identificar los días de publicación de las nóminas no agrícolas (NFP, por sus siglas en inglés) basándose en nuestra lógica personalizada. Si bien la reproducción animada anterior ofrecía una visión general rápida, no era ideal para examinar de cerca los detalles de la acción del precio debido a la alta velocidad de reproducción. Para abordar esta cuestión, he recopilado una serie de imágenes fijas a continuación, que permiten un análisis más específico y detallado. Estas instantáneas ofrecen una visión más clara de la reacción del mercado en torno al período en que se publican los datos de empleos no agrícolas (NFP), lo que facilita la identificación de patrones recurrentes y la generación de ideas para estrategias viables que permitan aprovechar los movimientos posteriores al impacto. Revisa las imágenes y lee mis reflexiones justo debajo de cada una.

NFP junio de 2024

NFP julio de 2024

NFP agosto 2024

NFP septiembre 2024

NFP octubre 2024

NFP noviembre de 2024

NFP diciembre de 2024
La colección de imágenes anterior proporciona una representación visual clara de la acción del precio antes, durante y después de la publicación de las noticias sobre las nóminas no agrícolas (NFP). Estas instantáneas ponen de manifiesto cómo reaccionan los mercados ante acontecimientos de tan alto impacto. Creo que, con la integración del aprendizaje automático y un análisis más profundo de los datos históricos de noticias de gran impacto, se pueden descubrir muchos patrones ocultos y oportunidades de inversión. A partir de los resultados observados durante la segunda mitad de 2024, surge una conclusión clave: Cuando dos o más velas japonesas seguían al pico inicial en la misma dirección, el precio a menudo continuaba con ese impulso. Sin embargo, en los casos en que faltaba dicha confirmación, el mercado no lograba mantener el movimiento, y a menudo revertía su tendencia o se consolidaba.
Buenos ejemplos de este comportamiento se observan en las nóminas no agrícolas de junio, octubre y diciembre. En junio y octubre, el fuerte movimiento direccional continuó durante varios minutos después del pico, lo que confirmó el impulso y creó posibles oportunidades de entrada. En cambio, el evento de julio mostró una volatilidad inicial, pero careció de continuidad, lo que provocó una continuación irregular o fallida; una distinción importante a la hora de diseñar estrategias de trading posteriores al impacto.
Plan estratégico
Cuando se produce un acontecimiento noticioso de gran impacto, a menudo desencadena un fuerte repunte alcista o bajista en cuestión de segundos. En algunos casos, el mercado puede probar rápidamente ambas direcciones (al alza y a la baja) antes de estabilizarse, lo que puede provocar cierres de posiciones prematuros o la activación involuntaria de órdenes. Para evitar los riesgos asociados a esta volatilidad inicial, esta estrategia se centra en entrar en las operaciones poco después del repunte, una vez que el mercado muestra una intención más clara. La entrada se basa en condiciones de confirmación posteriores al evento, en lugar de anticipar el movimiento en sí. A continuación, describimos las estrategias alcistas y bajistas basadas en este enfoque posterior al impacto.
Configuración alcista
Tras un repunte alcista provocado por una noticia de gran impacto, nuestra estrategia requiere que aparezcan dos velas alcistas consecutivas como confirmación antes de abrir una posición larga. Una vez que aparecen estas velas de confirmación, iniciamos una operación de compra. El rango de precios que abarcan las dos velas define nuestra zona de riesgo; esto se convierte en la base para establecer el stop-loss. El nivel de toma de ganancias debe ofrecer una recompensa mayor que el riesgo, manteniendo una relación riesgo-recompensa favorable. En algunos casos, esta configuración también puede indicar el comienzo de un fuerte cambio de impulso, ofreciendo el potencial de obtener rendimientos excepcionalmente altos si se aprovecha a tiempo. Consulte la ilustración que aparece a continuación, capturada de la visualización del probador de estrategias durante la reproducción del evento NFP, que muestra la configuración en funcionamiento.

Estrategia posterior al impacto: configuración del impulso alcista
Configuración bajista
Una configuración bajista refleja el enfoque explicado en la configuración alcista anterior. A continuación se muestra una imagen que ilustra cómo se desarrolla normalmente este patrón.

Estrategia posterior al impacto: configuración del impulso bajista
Lo que hemos logrado hasta ahora es un ejercicio de desarrollo de estrategia basado en el análisis de la acción del precio. Aprovechando el potencial de MQL5, creamos un Asesor Experto único capaz de reproducir y marcar eventos de nóminas no agrícolas, algo que sería tedioso, lento e ineficiente si se realizara manualmente. Este enfoque nos ha proporcionado información valiosa e ideas prácticas que ahora se pueden traducir en lógica de trading. En el siguiente paso, nos centraremos en implementar la estrategia de trading, lo que permitirá al EA detectar estas configuraciones y ejecutar las operaciones automáticamente. Esta nueva lógica complementará la estrategia de órdenes pendientes que exploramos anteriormente, creando una herramienta de trading de noticias más robusta y versátil.
Implementación final: Integración de la estrategia post-impacto en el EA News Headline.
Para que nuestro Asesor Experto News Headline sea más adaptable y potente, el siguiente paso lógico es integrar ambas estrategias —el enfoque de órdenes pendientes y la estrategia de confirmación posterior al impacto— en un único sistema integrado. Mientras que la estrategia de órdenes pendientes busca capturar el pico inicial de volatilidad colocando operaciones justo antes de la publicación de noticias, la estrategia basada en confirmación permite que el EA responda de manera inteligente después de que el mercado revele su sesgo.
Al combinar ambas técnicas, el EA puede operar tanto con la ruptura inmediata como con el movimiento sostenido que suele seguirle. Este marco de doble enfoque aumenta la flexibilidad y mejora las posibilidades de encontrar oportunidades rentables, tanto si la noticia provoca una ruptura brusca y clara como si genera un movimiento de latigazo (whipsaw) seguida de una tendencia más definida. En esta fase de desarrollo, integraremos ambas estrategias en la lógica del EA, lo que le permitirá seleccionarlas, alternarlas o incluso combinarlas en función del perfil del evento o de la configuración definida por el usuario.
Pasemos a los siguientes pasos: dividiremos el código que aparece a continuación en secciones, explicando cada sección en detalle y mostrando exactamente cómo se integran las líneas recién añadidas con los módulos existentes y la estrategia general.
Paso 1: Configuración de entradas posteriores al impacto
En la parte superior del EA, introducimos un bloque específico de parámetros de entrada que permiten al usuario activar o desactivar la estrategia posterior al impacto y ajustar su comportamiento. En MQL5, una entrada define una constante en tiempo de compilación que los traders pueden ajustar en el cuadro de diálogo de propiedades del EA. Aquí, un indicador booleano activa o desactiva la función, mientras que las entradas numéricas especifican el intervalo de tiempo alrededor del evento (minutos antes y después), la magnitud mínima del pico en pips, el número de barras de confirmación necesarias, el margen más allá del máximo o mínimo de referencia y la relación recompensa-riesgo deseada. Este diseño permite que la estrategia sea altamente configurable sin necesidad de modificar el código.
//--- POST-IMPACT STRATEGY INPUTS ------------------------------------- input bool InpEnablePostImpact = false; // Enable post-impact market orders input int InpPostImpactBeforeMin = 0; // Minutes before event to start window input int InpPostImpactAfterMin = 5; // Minutes after event to end window input double InpSpikeThresholdPipsPI = 20.0; // Minimum pip spike magnitude input int InpConfirmBarsPI = 2; // Number of confirming bars input double InpBufferPipsPI = 5.0; // Buffer beyond reference high/low input double InpRR_PIP = 2.0; // Desired reward:risk ratio
Paso 2: Variables de estado y objetos globales
Para gestionar el ciclo de vida de la funcionalidad, declaramos varias variables globales. Los indicadores como postImpactPlaced y postRectDrawn garantizan que dibujemos nuestro resaltado en el gráfico y coloquemos una orden a mercado solo una vez por evento. Asignamos un identificador de cadena único al objeto rectángulo para poder crearlo, referenciarlo y eliminarlo de forma fiable. Además, instanciamos un único objeto CTrade, que proporciona al EA métodos de trading integrados (Buy(), Sell(), etc.) para ejecutar órdenes mediante programación.
// Trade object & post-impact state CTrade trade; bool postImpactPlaced = false; // Ensures only one post-impact trade string postRectName = "PostImpact_Window"; // Unique object name bool postRectDrawn = false; // Ensures rectangle drawn once
Paso 3: Restablecer el estado en ReloadEvents()
Cada vez que el EA actualiza su lista de próximos eventos económicos, llama a ReloadEvents(). Al final de esa rutina, restablecemos todos los indicadores de estado posteriores al impacto y eliminamos cualquier objeto rectángulo existente. Este enfoque de «borrón y cuenta nueva» garantiza que cada nuevo evento se trate de forma independiente, evitando que queden rastros o se repitan operaciones de eventos anteriores.
// Inside ReloadEvents(), after nextEventTime is computed: ordersPlaced = false; postImpactPlaced = false; postRectDrawn = false; ObjectDelete(0, postRectName); // Remove any old rectangle
Paso 4: Trazar la ventana posterior al impacto
Dentro del controlador principal del temporizador (OnTimer()), una vez que la hora actual del servidor entra en el intervalo definido por el usuario en torno a un evento de alto impacto, dibujamos un rectángulo semitransparente en el gráfico. Recuperamos los precios máximos y mínimos visibles del gráfico y, a continuación, utilizamos las funciones de gestión de objetos de MQL5 para crear y dar estilo a un OBJ_RECTANGLE. Un indicador booleano garantiza que este dibujo se realice solo una vez, para destacar visualmente el evento sin necesidad de redibujarlo en cada ciclo.
// In OnTimer(), when now ∈ [evt - BeforeMin, evt + AfterMin] if(!postRectDrawn && now >= winStart && now <= winEnd) { double hi = ChartGetDouble(0, CHART_PRICE_MAX); double lo = ChartGetDouble(0, CHART_PRICE_MIN); ObjectCreate(0, postRectName, OBJ_RECTANGLE, 0, winStart, hi, winEnd, lo); ObjectSetInteger(0, postRectName, OBJPROP_COLOR, clrOrange); ObjectSetInteger(0, postRectName, OBJPROP_STYLE, STYLE_DASH); ObjectSetInteger(0, postRectName, OBJPROP_BACK, true); ObjectSetInteger(0, postRectName, OBJPROP_FILL, true); postRectDrawn = true; }
Paso 5: Colocación de órdenes de mercado con detección de picos
Una vez que se cierra la ventana del evento, el EA localiza la barra exacta de un minuto en la marca de tiempo del evento. Calcula el pico de precio en pips comparando el precio de apertura y cierre de la barra, y comprueba si este pico supera el umbral establecido por el usuario. Si es así, el EA inspecciona un número configurable de barras subsiguientes para confirmar la dirección (todas alcistas o todas bajistas). Tras la confirmación exitosa, coloca una orden de mercado en la apertura de la siguiente barra, calculando los niveles de stop-loss y take-profit en función del margen de seguridad y la relación riesgo-beneficio configurados por el usuario. Una bandera global final impide que se realice más de una transacción por evento.
// In OnTimer(), once now > winEnd and !postImpactPlaced int barIdx = iBarShift(_Symbol, PERIOD_M1, evt, true); if(barIdx >= 0) { double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT), pip = point*10.0; double o = iOpen(_Symbol,PERIOD_M1,barIdx), c = iClose(_Symbol,PERIOD_M1,barIdx); double spike = (c - o)/pip; if(MathAbs(spike) >= InpSpikeThresholdPipsPI) { bool bullish = (c > o), ok = true; for(int i=1; i<=InpConfirmBarsPI; i++) { double oi = iOpen(_Symbol,PERIOD_M1,barIdx-i), ci = iClose(_Symbol,PERIOD_M1,barIdx-i); if(bullish ? (ci <= oi) : (ci >= oi)) { ok=false; break; } } if(ok) { int entryBar = barIdx - InpConfirmBarsPI - 1; double entry = iOpen(_Symbol,PERIOD_M1,entryBar); double refP = bullish ? iLow(_Symbol,PERIOD_M1,barIdx-1) : iHigh(_Symbol,PERIOD_M1,barIdx-1); double sl = bullish ? refP - InpBufferPipsPI*pip : refP + InpBufferPipsPI*pip; double rr = MathAbs(entry - sl); double tp = bullish ? entry + rr*InpRR_PIP : entry - rr*InpRR_PIP; postImpactPlaced = true; trade.SetExpertMagicNumber(888888); trade.SetDeviationInPoints(5); if(bullish) trade.Buy(InpOrderVolume, _Symbol, entry, sl, tp, "PostImpact Buy"); else trade.Sell(InpOrderVolume, _Symbol, entry, sl, tp, "PostImpact Sell"); } } }
El código fuente compacto y totalmente integrado, que incluye todas las funcionalidades, se proporciona al final de este artículo, listo para que lo compile. Ahora podemos pasar a la sección de pruebas.
Pruebas
La herramienta News Headline EA totalmente integrada no pudo validarse adecuadamente en el Probador de estrategias porque este no admite calendarios ni fuentes de noticias en tiempo real. El modo de reproducción con el EA combinado no produjo señales significativas, así que trasladé la lógica de órdenes posterior al impacto al EA dedicado NFP_Event_Replay. Mediante el uso del entorno de replay / marco de simulación, donde las publicaciones de nóminas no agrícolas se simulan con datos históricos, pude verificar rápidamente el comportamiento de entrada, stop-loss y take-profit de la estrategia sin tener que esperar a anuncios de alto impacto en tiempo real. La animación que aparece a continuación, capturada desde el Probador de Estrategia, demuestra que la lógica posterior al impacto funciona exactamente como se esperaba en condiciones controladas y repetibles. Adjunto encontrará la segunda versión de NFP_Event_Replay con la lógica de trading completa incluida al final del artículo.

Resultado de la prueba de estrategia posterior al impacto para el comunicado de prensa de NFP del primer viernes de julio de 2024.

Nuevo EA News Headline con ejecución de órdenes post-impacto.
Conclusión
Acabamos de concluir otro análisis exhaustivo y formativo: en esta ocasión, hemos integrado una estrategia de trading posterior al impacto en nuestro EA «News Headline» y, a continuación, la hemos validado mediante el marco NFP_Event_Replay. Al operar inmediatamente después de la publicación de noticias de gran relevancia, aprovechamos oportunidades con mayor probabilidad de éxito: el pico inicial de volatilidad ya ha pasado, el precio se ha «estabilizado» y las barras de confirmación nos permiten determinar con claridad la dirección y la fuerza del movimiento. Este enfoque encaja a la perfección con nuestras otras estrategias basadas en las noticias, lo que hace que el EA sea más versátil y sólido.
Además, los mismos métodos que hemos utilizado aquí —detección sistemática de eventos, filtros de picos basados en pip, confirmación de varias barras y gestión de la relación riesgo-recompensa— pueden mejorarse aún más mediante el aprendizaje automático o la inteligencia artificial. Imagina un modelo que adapte su umbral de picos o sus reglas de confirmación en función de las tasas de éxito históricas de diferentes divisas o tipos de noticias. Hay mucho margen para perfeccionar todas las funciones que hemos desarrollado, ya sea la visualización en gráficos, las alertas o la realización automática de órdenes. Y, por supuesto, aunque nuestro objetivo era el NFP para garantizar la precisión a lo largo del tiempo y la velocidad de las pruebas en el Probador de estrategias, la herramienta sigue siendo de gran utilidad también para operar NFP en condiciones reales.
¡Me encantaría conocer tu opinión! Comparte tus experiencias, ideas o preguntas en los comentarios a continuación. Juntos podemos seguir simplificando el desarrollo en MQL5 y crear herramientas algorítmicas cada vez más potentes y fáciles de usar para los traders.
Lecciones clave
| Lección | Descripción |
|---|---|
| 1. Negociación posterior al impacto | Operar un instante después de la publicación de noticias de alta importancia es factible y puede mejorar la tasa de éxito al esperar a que disminuya la volatilidad inicial. |
| 2. Detección de eventos basada en el tiempo | Utilizar las funciones de fecha y hora de MQL5 para localizar mediante programación eventos específicos del calendario, como el primer viernes de cada mes (nóminas no agrícolas), y alinear la lógica con los horarios del mundo real. |
| 3. Visualización del probador de estrategias | Crear elementos visuales como rectángulos y líneas para marcar ventanas históricas durante las pruebas retrospectivas, mejorando la evaluación manual de estrategias sin depender de herramientas externas. |
| 4. Dibujo de objetos dinámicos | Se emplean las funciones ObjectCreate() y ObjectSetInteger() para renderizar objetos de gráficos de forma dinámica en función de los tiempos y valores calculados, lo que permite el seguimiento de eventos y la retroalimentación visual. |
| 5. Modo en tiempo real frente a modo de prueba | El uso de MQLInfoInteger(MQL_TESTER) permite distinguir entre el Probador de estrategias y la ejecución en entorno real, lo que permite definir rutas lógicas personalizadas para los entornos de prueba y de producción. |
| 6. Gestión de operaciones a través de CTrade | Integración de la clase CTrade para la realización de órdenes de forma segura y estructurada, así como para el uso de órdenes stop-loss, take-profit y la cancelación de órdenes, tanto en estrategias previas al impacto como posteriores al mismo. |
| 7. Lógica de confirmación tras el impacto | Establecer entradas en el mercado diferidas basadas en confirmaciones de velas japonesas tras picos de gran impacto: una alternativa más segura y basada en reglas frente a la ejecución inmediata. |
| 8. Personalización de parámetros de entrada | Utilizar variables de entrada para permitir a los usuarios controlar qué estrategias están activas, cuántas velas de confirmación se requieren y qué niveles de impacto de eventos deben activar la lógica. |
| 9. Integración de la API del calendario | Utilizar las funciones de calendario integradas de MQL5 (CalendarValueHistory, CalendarEventById, etc.) para trabajar con eventos económicos próximos sin dependencias de API externas. |
| 10. Renderizado de interfaz de usuario basado en lienzo | Uso de la clase CCanvas para crear interfaces de desplazamiento personalizadas para noticias económicas, indicadores técnicos y análisis basados en inteligencia artificial, que se superponen directamente sobre el gráfico. |
| 11. Diseño de estrategia híbrida | Combina las órdenes pendientes previas al impacto y las operaciones reactivas posteriores al impacto en un único sistema EA con condiciones de ejecución, lo que promueve la flexibilidad y la adaptabilidad a diversas condiciones del mercado. |
Archivos adjuntos
| Nombre del archivo | Versión | Descripción |
|---|---|---|
| NFP_Event_Replay.mq5 | 1.0 | El Probador de estrategias es una herramienta visual que marca las ventanas de eventos del NFP mediante rectángulos, basándose en la lógica histórica del primer viernes del mes y el horario de verano estadounidense. Ayuda a analizar manualmente la reacción de los precios durante eventos noticiosos de gran impacto. |
| News_Headline_EA.mq5 | 1.11 | Asesor experto (EA) para calendarios económicos en tiempo real con desplazamiento de eventos, titulares de noticias de Alpha Vantage, análisis basados en IA y lógica de ejecución de estrategia dual tanto para órdenes pendientes como para operaciones de confirmación posteriores al impacto. Incluye compatibilidad con reproducción NFP durante las pruebas. |
| NFP_Event_Replay.mq5 | 1.01 | Segunda versión del EA de repetición de NFP, que ahora contiene la lógica completa de ejecución de órdenes posterior al impacto. |
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/18817
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.
Redes neuronales en el trading: Modelo multivariado de extremo a extremo para la predicción de series temporales (GinAR)
Introducción a MQL5 (Parte 19): Automatización de la detección de las ondas de Wolfe
Particularidades del trabajo con números del tipo double en MQL4
Simulación de mercado: Position View (VIII)
- 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