Торговые инструменты для трейдеров

API экономического календаря для торговых роботов MQL4 и MQL5: интеграция, примеры и защита от перегрузки

,

На чтение потребуется

7 минут
Экономический календарь и торговые роботы MQL

Краткое описание: практическое руководство по подключению публичного API экономического календаря Trading-Shop к советникам MetaTrader 4 и MetaTrader 5. Разбираем маршруты, JSON, фильтры, WebRequest, OnTimer, кэширование, повторные попытки, HTTP 429 и ограничения тестирования.

Экономические новости могут резко изменить спред, ликвидность и волатильность. Поэтому советнику полезно не угадывать время публикации вручную, а периодически получать календарь и учитывать его в правилах входа, выхода и паузы. В этой статье показано, как подключить API экономического календаря к MQL4/MQL5 без API-ключа.

Что предоставляет API экономического календаря

Базовый адрес API: https://trading-shop.ru/wp-json/tc/v1. Методы доступны через публичный HTTP GET. API не требует передачи ключа в советнике.

  • GET /events — события за заданный диапазон;
  • GET /events/today — события текущего дня;
  • GET /events/week — события недели;
  • GET /meta — служебная информация и доступный диапазон данных.

Пример запроса:

https://trading-shop.ru/wp-json/tc/v1/events?from=2026-10-01&to=2026-10-07&impact=High,Medium&country=USD

Параметры и фильтрация событий

from и to

Параметры задаются в формате YYYY-MM-DD и ограничивают начало и конец запрашиваемого диапазона. Для советника лучше запрашивать небольшой диапазон: сегодня или сегодня плюс один-два дня. Не запрашивайте всю историю при каждом тике.

impact

Фильтр принимает уровни важности, например High, Medium или список High,Medium. Передавайте только уровни, которые реально участвуют в логике стратегии.

country

Фильтр задаётся кодом страны или валюты источника, например USD. Пустое значение означает отсутствие фильтра по стране. Если роботу важны новости нескольких валют, удобнее получить небольшой общий ответ и фильтровать его после разбора JSON.

Формат ответа JSON

Успешный ответ содержит флаг ok, число записей count, фактические границы запроса, доступный диапазон и массив events:

{
  "ok": true,
  "count": 1,
  "from": "2026-10-01",
  "to": "2026-10-01",
  "available": {"min": "2026-01-01", "max": "2026-10-15"},
  "events": [{
    "date": "2026-10-01T02:10:00.000Z",
    "title": "Fed Goolsbee Speech",
    "country": "USD",
    "impact": "Medium",
    "forecast": "",
    "previous": "",
    "actual": "",
    "period": ""
  }]
}

date — время события в ISO 8601 с суффиксом Z; title — название; country — код; impact — важность; forecast, previous, actual и period могут быть пустыми. Наличие пустого значения не означает ошибку API.

В рабочем коде проверяйте HTTP-код, ok, тип и размер events, а также корректность даты. Не считайте любой непустой HTTP-ответ валидным календарём.

Ошибки и корректная обработка ответа

Код 200 означает успешный HTTP-ответ, но всё равно нужно проверить JSON-поле ok. Код 429 Too Many Requests означает превышение ограничения частоты запросов: советник должен прекратить немедленные повторы и увеличить задержку. Коды 400 обычно указывают на некорректные параметры, а 500 и сетевые ошибки требуют временного перехода на последние успешные данные.

На production nginx сейчас действует ограничение 120 запросов в минуту на IP с burst 60. При превышении сервер отвечает HTTP 429. Несколько терминалов за одним VPS используют общий IP, поэтому лимит нужно считать на группу роботов, а не только на один экземпляр.

Кэш и часовые пояса

Кэш API рассчитан примерно на 60 секунд. Для HTTP-клиентов также используются заголовки Cache-Control: public, max-age=60, s-maxage=300. Это позволяет безопасно не обновлять одни и те же данные каждую секунду.

Дата в поле date передаётся в UTC (обозначение Z). Время терминала зависит от брокера и настроек сервера MetaTrader. Сравнивайте события и торговое время в одной шкале: либо переводите UTC в время сервера, либо храните все внутренние дедлайны в UTC. Не добавляйте фиксированные три часа без проверки конкретного смещения и переходов на летнее время.

Настройка WebRequest в MT4 и MT5

  1. Откройте Сервис → Настройки → Советники.
  2. Включите «Разрешить WebRequest для следующих URL».
  3. Добавьте только базовый адрес https://trading-shop.ru.
  4. Перезапустите советник и проверьте журнал Experts.

Без этого разрешения WebRequest() вернёт ошибку до отправки запроса. В Strategy Tester WebRequest также требует разрешённый URL, а сетевое окружение тестера может отличаться от реального терминала. Для воспроизводимого теста заранее сохраните JSON-снимок и предусмотрите режим «файл вместо сети»; не делайте результат оптимизации зависимым от текущего календаря.

Рабочий шаблон MQL4: OnTimer, кэш и backoff

Ниже приведён самодостаточный сетевой каркас. Для разбора полей JSON подключите проверенную библиотеку JSON, совместимую с вашей сборкой. Самостоятельный разбор строковыми функциями опасен: экранированные символы, вложенные объекты и изменение порядка полей легко ломают такой код.

#property strict

input int RefreshSeconds = 900;
input int TimeoutMs = 8000;
string g_json = "";
datetime g_last_ok = 0;
datetime g_next_try = 0;
int g_backoff = 10;

bool DownloadCalendar(string &body)
{
   string url = "https://trading-shop.ru/wp-json/tc/v1/events/today";
   char payload[], answer[];
   string headers;
   ResetLastError();
   int status = WebRequest("GET", url, "", "", TimeoutMs,
                           payload, 0, answer, headers);
   body = CharArrayToString(answer, 0, -1, CP_UTF8);
   if(status == -1) { Print("WebRequest error: ", GetLastError()); return false; }
   if(status == 429) { Print("HTTP 429; retry later"); return false; }
   if(status != 200) { Print("Calendar HTTP ", status); return false; }
   return StringLen(body) > 0;
}

void RefreshCalendar()
{
   datetime now = TimeCurrent();
   if(now < g_next_try) return;
   string body;
   if(DownloadCalendar(body))
   {
      g_json = body; g_last_ok = now; g_backoff = 10;
      g_next_try = now + RefreshSeconds;
      Print("Calendar updated: ", StringLen(g_json), " bytes");
   }
   else
   {
      g_next_try = now + g_backoff;
      g_backoff = MathMin(g_backoff * 2, 300);
   }
}

int OnInit() { EventSetTimer(1); return INIT_SUCCEEDED; }
void OnDeinit(const int reason) { EventKillTimer(); }
void OnTimer() { RefreshCalendar(); }

Каркас обновляет данные раз в 15 минут, а после ошибки использует интервалы 10, 20, 40 секунд и далее до пяти минут. В торговой логике сохраняйте g_json только после полного успешного ответа; при временной ошибке используйте последние корректные события с ограниченным сроком годности.

Рабочий шаблон MQL5: WebRequest и таймер

#property strict

input int RefreshSeconds = 900;
input int TimeoutMs = 8000;
string g_json = "";
datetime g_next_try = 0;
int g_backoff = 10;

bool DownloadCalendar(string &body)
{
   char payload[], answer[];
   string headers;
   ResetLastError();
   int status = WebRequest("GET",
      "https://trading-shop.ru/wp-json/tc/v1/events/today",
      "", TimeoutMs, payload, answer, headers);
   body = CharArrayToString(answer, 0, -1, CP_UTF8);
   if(status == -1) { Print("WebRequest error: ", GetLastError()); return false; }
   if(status == 429) { Print("HTTP 429; backoff required"); return false; }
   return status == 200 && StringLen(body) > 0;
}

void RefreshCalendar()
{
   datetime now = TimeCurrent();
   if(now < g_next_try) return;
   string body;
   if(DownloadCalendar(body))
   {
      g_json = body; g_backoff = 10;
      g_next_try = now + RefreshSeconds;
      PrintFormat("Calendar updated: %d bytes", StringLen(g_json));
   }
   else
   {
      g_next_try = now + g_backoff;
      g_backoff = MathMin(g_backoff * 2, 300);
   }
}

int OnInit() { EventSetTimer(1); return INIT_SUCCEEDED; }
void OnDeinit(const int reason) { EventKillTimer(); }
void OnTimer() { RefreshCalendar(); }

Сигнатура WebRequest в MQL4 и MQL5 различается, поэтому не переносите вызов механически между платформами. Компиляцию проверяйте в MetaEditor именно той версии терминала, где будет работать советник.

Как разобрать JSON и применить новости в стратегии

После сетевого слоя добавьте библиотеку JSON (например, совместимый вариант JAson.mqh или другой поддерживаемый проект) и распарсьте объект ответа. Не копируйте библиотеку без проверки лицензии и совместимости. Алгоритм обработки:

  1. проверить корневой ok;
  2. получить массив events и перебрать его;
  3. оставить нужные country и impact;
  4. перевести date в шкалу времени терминала;
  5. проверить окно до/после события, например 30 минут;
  6. не открывать сделку или уменьшить риск только согласно правилам конкретной стратегии.

Календарь — источник расписания, а не торговый сигнал и не гарантия поведения цены. Пустые actual или forecast нельзя превращать в ноль. Если JSON повреждён или устарел, безопаснее применить явную политику стратегии: продолжить с последним снимком, запретить новые сделки или перейти в ручной режим.

Нагрузка, кэширование и HTTP 429

Запросы нужно выполнять в OnTimer(), а не в OnTick(). Практический ориентир — один робот обновляет календарь раз в 10–30 минут. Для группы роботов на одном VPS лучше сделать один локальный загрузчик и раздавать его снимок советникам. Не увеличивайте частоту из-за каждого тика.

Контролируемый нагрузочный тест на production: 100 запросов, 10 workers — 100 ответов HTTP 200, около 1 rps, среднее время 9,9 секунды, максимум 15,5 секунды. Это результат конкретного теста в конкретных условиях, а не гарантия пропускной способности, доступности или устойчивости к DDoS. Кэш также не является DDoS-защитой.

При HTTP 429 соблюдайте backoff, не повторяйте запрос немедленно и учитывайте общий IP-лимит. Ограничивайте диапазон дат, используйте фильтры и локальный TTL. Не заявляйте в документации собственные гарантии SLA, которых API не предоставляет.

FAQ

Нужен ли API-ключ?

Для описанных публичных GET-маршрутов ключ не нужен. Это не означает, что разрешены частые или бесконтрольные запросы.

Почему советник получает ошибку WebRequest?

Проверьте разрешённый URL, HTTPS, журнал Experts, тайм-аут и доступ терминала в интернет. В тестере отдельно проверьте настройки WebRequest и режим сетевого снимка.

Как часто обновлять календарь?

Обычно достаточно 10–30 минут, а перед важными событиями можно использовать отдельный контролируемый интервал. Не опрашивайте API на каждом тике.

Можно ли торговать только по данным API?

API сообщает события. Решение о сделке, паузе и размере позиции остаётся частью вашей стратегии и риск-менеджмента.

Что делать при недоступности API?

Используйте последний валидный снимок только ограниченное время, логируйте возраст данных и предусмотрите безопасный fallback. Не выдавайте устаревший календарь за актуальный.

Итог

API экономического календаря Trading-Shop позволяет советнику MQL4/MQL5 получать события через обычный GET, фильтровать их по дате, важности и стране, а затем использовать в защитной логике стратегии. Надёжная интеграция состоит не только из вызова WebRequest: нужны таймер, локальный кэш, JSON-парсер, единая работа с UTC, backoff, обработка 429 и тестовый режим без зависимости от сети.

Полезные ссылки: календарь Trading-Shop, корень API, события сегодня, события недели, метаданные API.

: 0

Поделись или сохрани ссылку

Автор статьи

Комментарии

Добавить комментарий

0

Вы добавили товары в корзину?

Мы хотим вам предложить 3% скидку за сохранение вашей корзины. Прислать вам купон на скидку? Укажите рабочий email для отправки.