Automatización·

Filtro de noticias en MT5: ¿calendario integrado o API?

MetaTrader 5 incluye un calendario económico que los Expert Advisors pueden leer sin descargar nada. Cuándo basta, cuándo no y cómo usar en su lugar una API de calendario gratuita, con código MQL5 para las dos opciones.

Si programas Expert Advisors para MetaTrader 5, tienes una opción que en MT4 no existe: el terminal trae un calendario económico y MQL5 lo lee con un puñado de funciones. Nada que descargar, ninguna URL que autorizar, nada que interpretar.

Entonces, ¿para qué usar una API externa? Porque el calendario integrado tiene sus límites, y tres de ellos pesan en un filtro de noticias. Esta guía muestra primero el código nativo, después el de la API y, al final, cuándo conviene cada uno.

⚖️ Las dos opciones, cara a cara

Calendario integrado de MQL5API del calendario de ShowMyTrades
ConfiguraciónNingunaAutorizar https://showmytrades.com en Herramientas → Opciones → Asesores Expertos (Tools → Options → Expert Advisors)
Fuente de los datosMetaQuotes, a través del servidor del brókerFuentes públicas de calendario combinadas por ShowMyTrades, con las fechas de las publicaciones principales contrastadas con los organismos que las publican y con los bancos centrales (confidence: official)
Disponible enLos brókeres que lo activan (la mayoría; algunos servidores de marca blanca no)Cualquier bróker y cualquier terminal con internet
Funciona también en MT4NoSí, con el mismo archivo
Funciona en el probador de estrategias (Strategy Tester)Sí, con historialNo (en el probador no hay red)
Zona horariaHora del servidor de trading, con un desfase respecto a UTC que tienes que averiguarUTC (ts en segundos Unix), y cada respuesta incluye la hora UTC actual del servidor, así que el EA nunca depende del reloj del bróker ni del VPS
ValoresPrevisión, anterior y actual, con revisionesPrevisión, anterior y actual
CostoGratisGratis, sin clave

🧱 Opción A: el calendario integrado

La función siguiente indica si hay una publicación de impacto alto de cualquiera de las dos divisas del símbolo del gráfico dentro de la ventana de pausa. Las horas van en hora del servidor de trading, que es lo que espera CalendarValueHistory().

NativeNewsFilter.mqh
//--- calendario integrado de MQL5: true mientras una publicación de impacto alto de las
//--- divisas del gráfico esté dentro de [-minutesBefore, +minutesAfter] desde ahora
bool NativeNewsTime(const int minutesBefore, const int minutesAfter, string &reason)
{
   reason = "";
   datetime now  = TimeTradeServer();
   datetime from = now - minutesAfter * 60;
   datetime to   = now + minutesBefore * 60;

   string currencies[2];
   currencies[0] = SymbolInfoString(_Symbol, SYMBOL_CURRENCY_BASE);
   currencies[1] = SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);

   for(int c = 0; c < 2; c++)
   {
      if(c == 1 && currencies[1] == currencies[0]) break;
      MqlCalendarValue values[];
      if(CalendarValueHistory(values, from, to, NULL, currencies[c]) <= 0) continue;
      for(int i = 0; i < ArraySize(values); i++)
      {
         MqlCalendarEvent ev;
         if(!CalendarEventById(values[i].event_id, ev)) continue;
         if(ev.importance != CALENDAR_IMPORTANCE_HIGH) continue;
         reason = currencies[c] + ": " + ev.name;
         return true;
      }
   }
   return false;
}

Llámala desde OnTick() igual que cualquier otro filtro:

string news;
if(NativeNewsTime(30, 30, news)) { Comment("News filter: ", news); return; }

Tres cosas que conviene saber antes de confiar en él:

  1. Depende del bróker. El calendario llega al terminal a través del servidor de trading. Si en tu bróker CalendarValueHistory() devuelve -1 con el error 5402, el calendario no está activado ahí, y ningún código lo va a arreglar.
  2. Va en hora del servidor, no en UTC. En un gráfico en vivo no da problemas. Se complica cuando lo comparas con cualquier otra cosa.
  3. Es solo para MT5. Un EA que también distribuyes para MT4 necesita una segunda implementación.

🌐 Opción B: la API del calendario

La alternativa es un endpoint HTTP gratuito que devuelve las noticias de los próximos días para las divisas y el impacto que elijas, en CSV o JSON:

https://showmytrades.com/api/public/calendar/v1?currency=EUR,USD&impact=high&days=2&format=csv

El archivo include SMT_NewsFilter.mqh que lee estos datos aparece completo en la guía de MT4 y en la referencia de la API. Compila tal cual en MQL5: guárdalo en MQL5\Include, autoriza https://showmytrades.com en Herramientas → Opciones → Asesores Expertos y llama a la función:

#include <SMT_NewsFilter.mqh>

void OnTick()
{
   string news;
   if(SMT_IsNewsTime(news)) { Comment("News filter active: ", news); return; }
   Comment("");
   // ... tu lógica de entrada ...
}

El archivo descarga los datos una vez cada 15 minutos, compara en UTC con TimeGMT() y deja los parámetros de entrada (SMT_Currencies, SMT_Impact, minutos antes y después) en la ventana de configuración del EA.

🎯 Cuál elegir

Tu situaciónElige
Solo MT5, tu bróker tiene el calendario y haces backtest del filtroIntegrado
El mismo EA para MT4 y MT5API: un solo archivo y un mismo comportamiento
Bróker sin calendario (5402)API
También usas cBots en cTraderAPI: los mismos datos en cTrader
Quieres registrar la noticia junto con la operación para revisarla despuésCualquiera de los dos; la API da marcas de tiempo en UTC que coinciden con el resto de tus registros

Nada te impide usar los dos: el calendario integrado cuando responde y la API cuando no. En la práctica, con uno basta.

🧪 Backtest de un filtro de noticias

El calendario integrado es el único de los dos que funciona en el probador de estrategias, porque el probador no tiene internet. Aun así, ten cuidado con lo que demuestra el backtest de un filtro de noticias: la prueba usa el calendario tal como se conoce hoy, con las horas ya revisadas y con eventos que se agregaron a posteriori. Un filtro en real solo sabe lo que estaba programado en ese momento.

❓ Preguntas frecuentes

¿El calendario integrado de MT5 es gratis? Sí. Forma parte del terminal, llega a través del servidor de tu bróker y no tienes que activar nada por tu parte.

¿Por qué CalendarValueHistory() no devuelve nada en mi bróker? Algunos servidores, a menudo los de marca blanca, no transmiten el calendario. Revisa GetLastError(): 5402 significa que el calendario no está disponible. En ese caso, usa la API.

¿Puedo filtrar por las divisas de otro símbolo? Sí. Pasa los códigos de divisa que quieras en lugar de leerlos de _Symbol. La versión con API los recibe como texto en un parámetro de entrada: EUR,USD,GBP.

¿La API necesita una cuenta? No. Ni clave ni inicio de sesión. El límite es de 600 solicitudes por minuto por dirección IP, muy por encima de lo que necesita cualquier cantidad de gráficos con una solicitud cada 15 minutos.

🔗 Artículos relacionados


Elijas el calendario que elijas, el resultado se nota en el historial: menos operaciones abiertas en pleno pico de volatilidad y un drawdown más suave. Haz seguimiento gratis de tu cuenta MT5 y compruébalo en el gráfico.