ПРОБЛЕМА
Большинство новостных фильтров используют экономический календарь MQL5 (CalendarValueHistory). Этот календарь отсутствует в Тестере стратегий, поэтому во время бэктестов эти фильтры незаметно не выполняют никаких действий: советник торгует непосредственно во время публикации данных по NFP, CPI или решений по ставкам, и результаты бэктеста перестают соответствовать поведению в реальном времени. В одном из моих тестов отложенный ордер по XAUUSD был исполнен за 5 минут до публикации данных по CPI в США, а стоп-лосс сработал со слиппеджем в 45 долларов США — в результате одной сделки потери превысили запланированный риск в 6,5 раз.
Вторая, менее известная проблема: терминал преобразует исторические временные отметки календаря с учётом ТЕКУЩЕГО сдвига сервера. При экспорте летом у брокера с часовым поясом GMT+2 / GMT+3 каждое зимнее событие отображается с опозданием на один час (NFP в 16:30 вместо 15:30 по серверному времени). Фильтр, построенный на основе этих временных значений, блокирует неверное время в течение половины года.
РЕШЕНИЕ — ТРИ ФАЙЛА
NewsCalendarExport.mq5 (скрипт) — экспортирует события в папку Terminal\Common\Files\NewsCalendar.csv и пересчитывает каждое событие с учётом серверного смещения для соответствующей даты. В конце скрипт выводит результат самопроверки: наиболее частое время событий, связанных с долларом США, должно совпадать как зимой, так и летом.
NewsFilter.mqh (класс CNewsFilter) — один фильтр как для реальной торговли, так и для бэктестов. В режиме реального времени он считывает экономический календарь (запрос выполняется не чаще одного раза в минуту); в Тестере стратегий — файл CSV. Используются только валюты, входящие в состав символа (EURUSD: EUR + USD, XAUUSD: USD, CFD на индексы, котируемые в USD: USD).
NewsFilter_Example.mq5 — минималистичный советник, который выводит сообщения о начале и окончании новостного окна, а также выделяет заблокированные окна на графике, чтобы вы могли увидеть работу фильтра в визуальном режиме тестера.
КАК ИСПОЛЬЗОВАТЬ
Скопируйте файл NewsFilter.mqh в папку MQL5\Include, файл NewsCalendarExport.mq5 — в папку MQL5\Scripts, а файл NewsFilter_Example.mq5 — в папку MQL5\Experts. Скомпилируйте скрипт и пример (файл .mqh компилируется вместе с ними).
Запустите NewsCalendarExport один раз на любом графике подключенного терминала. На вкладке «Эксперты» должно появиться сообщение: «OK: одинаковое время зимой и летом».
В свой советник добавьте следующий код:
C++
#include <NewsFilter.mqh>
CNewsFilter news;
int OnInit()
{
news.Init(_Symbol, 30, 30); // блокировать 30 минут до и после каждого события
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(news.IsBlocked())
return; // новых записей во время новостей нет
// ... ваша логика ввода данных ...
}
Проведите бэктест, как обычно. В журнале отображается количество событий, загруженных для данного символа.
ПАРАМЕТРЫ СКРИПТА
Экспорт событий с: даты начала экспорта.
Также экспортируются запланированные события на N дней вперёд: включая предстоящие события.
Валюты: список, разделенный запятыми (по умолчанию: USD, EUR, GBP, JPY, CAD, AUD, NZD, CHF).
Важность: только события с высоким влиянием или события со средним и высоким влиянием.
Правило перехода на летнее время на сервере брокера: правило США (по умолчанию, сервер = Нью-Йорк + 7 ч, большинство брокеров в часовых поясах GMT+2/+3), правило ЕС или отсутствие перехода на летнее время.
Имя файла: сохраняется в папке Terminal\Common\Files.
CNewsFilter::Init(symbol, minutesBefore, minutesAfter, mediumToo = false, csvFile = "NewsCalendar.csv")
ПРИМЕЧАНИЯ И ОГРАНИЧЕНИЯ
Протестировано на FTMO (GMT+2 / GMT+3, правило перехода на летнее время США) и на IC Markets EU. Пример вывода: экспортировано 5645 событий, 1897 из них сдвинуты на один час; до коррекции наиболее частое время для USD было 16:30 зимой и 15:30 летом, после коррекции — 15:30 в оба сезона.
Если при самопроверке по-прежнему отображаются разные зимнее и летнее время, попробуйте другое «Правило перехода на летнее время сервера брокера».
История календаря MQL5 ограничена и зависит от терминала; на моём терминале она начинается с 2020 года, поэтому более ранние бэктесты не будут содержать событий.
Используются только валюты символа, поэтому для индексов и сырьевых товаров применимость событий определяется валютой котировки.
Удаленные и облачные агенты не могут читать папку Common\Files — оптимизируйте работу с помощью локальных агентов.
Для некоторых валют в календаре MQL5 очень мало событий с высоким уровнем влияния (например, AUD). Для них используйте «Среднее + высокое влияние».
Фильтр лишь сообщает вашему советнику, когда НЕ следует открывать новые сделки. Управление уже открытыми позициями остается на усмотрение вашего советника.
Время от времени запускайте скрипт заново, чтобы включить новые события.
НУЖНА ПОМОЩЬ В ИНТЕГРАЦИИ?
Если вы не программист и хотите интегрировать этот новостной фильтр в свой существующий советник, или если вам нужны индивидуальные правила управления рисками, адаптированные к требованиям вашей проп-компании, свяжитесь со мной напрямую через мой профиль на MQL5 Freelance. Я с удовольствием напишу код для вас!