Краткое описание: практическое руководство по подключению публичного 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. Несколько терминалов за одним используют общий IP, поэтому лимит нужно считать на группу роботов, а не только на один экземпляр.
Кэш и часовые пояса
Кэш API рассчитан примерно на 60 секунд. Для HTTP-клиентов также используются заголовки Cache-Control: public, max-age=60, s-maxage=300. Это позволяет безопасно не обновлять одни и те же данные каждую секунду.
Дата в поле date передаётся в UTC (обозначение Z). Время терминала зависит от брокера и настроек сервера MetaTrader. Сравнивайте события и торговое время в одной шкале: либо переводите UTC в время сервера, либо храните все внутренние дедлайны в UTC. Не добавляйте фиксированные три часа без проверки конкретного смещения и переходов на летнее время.
Настройка WebRequest в MT4 и MT5
- Откройте Сервис → Настройки → Советники.
- Включите «Разрешить WebRequest для следующих URL».
- Добавьте только базовый адрес
https://trading-shop.ru. - Перезапустите советник и проверьте журнал 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 или другой поддерживаемый проект) и распарсьте объект ответа. Не копируйте библиотеку без проверки лицензии и совместимости. Алгоритм обработки:
- проверить корневой
ok; - получить массив
eventsи перебрать его; - оставить нужные
countryиimpact; - перевести
dateв шкалу времени терминала; - проверить окно до/после события, например 30 минут;
- не открывать сделку или уменьшить риск только согласно правилам конкретной стратегии.
Календарь — источник расписания, а не торговый сигнал и не гарантия поведения цены. Пустые actual или forecast нельзя превращать в ноль. Если JSON повреждён или устарел, безопаснее применить явную политику стратегии: продолжить с последним снимком, запретить новые сделки или перейти в ручной режим.
Нагрузка, кэширование и HTTP 429
Запросы нужно выполнять в OnTimer(), а не в OnTick(). Практический ориентир — один робот обновляет календарь раз в 10–30 минут. Для группы роботов на одном лучше сделать один локальный загрузчик и раздавать его снимок советникам. Не увеличивайте частоту из-за каждого тика.
Контролируемый нагрузочный тест на 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.


Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.