- Основные понятия календаря
- Получение списка и описаний доступных стран
- Запрос видов событий по странам и валютам
- Получение описания вида события по идентификатору
- Получение записей о событиях по странам или валютам
- Получение записей о событиях конкретного вида
- Чтение записи о событии по идентификатору
- Отслеживание изменений событий по стране или валюте
- Отслеживание изменений событий по типу
- Фильтрация событий по множеству условий
- Перенос базы календаря в тестер
- Торговля по календарю
Чтение записи о событии по идентификатору
После того как трейдер изучит расписание событий на ближайшее будущее, он может настраивать соответствующим образом своих роботов. В API календаря нет функций или событий ("событий" — в смысле функций обработки новой финансовой информации вроде OnCalendar, по аналогии с OnTick) для автоматического отслеживания выхода новостей. Алгоритм должен это делать сам с любой выбранной периодичностью. В частности, достаточно загодя выяснить идентификатор интересующего вас события с помощью одной из рассмотренных ранее функций (например, CalendarValueHistoryByEvent, CalendarValueHistory) и затем вызывать CalendarValueById, чтобы получать актуальное состояние полей в структуре MqlCalendarValue.
bool CalendarValueById(ulong id, MqlCalendarValue &value)
Функция заполняет переданную по ссылке структуру текущей информаций о конкретном событии.
Результат функции обозначает признак успеха (true) или ошибки (false).
Создадим простой безбуферный индикатор CalendarRecordById.mq5, который найдет в будущем самое близкое событие с типом "финансового индикатора" (т.е. числового показателя) и будет по таймеру опрашивать его состояние. Когда новость опубликуют, данные изменятся (станет известно "актуальное" значение показателя), и индикатор выведет алерт.
Периодичность опроса календаря задается во входной переменной.
input uint TimerSeconds = 5; |
Таймер запустим в OnInit.
void OnInit()
|
Для удобного вывода в журнал описания события используется структура MqlCalendarRecord, знакомая нам по примеру скрипта CalendarForDates.mq5.
Для хранения исходного состояния информации о новости опишем структуру track.
MqlCalendarValue track; |
Когда структура пуста (и в поле id находится 0), программа должна запросить предстоящие события и найти среди них ближайшее с типом CALENDAR_TYPE_INDICATOR и у которого еще не известно актуальное значение.
void OnTimer()
|
Найденное событие копируется в track и выводится в журнал. После этого каждый вызов OnTimer сводится к получению обновленной информации о событии в структуру update — именно она передается в CalendarValueById, с указанием идентификатора track.id. Далее производится сравнение исходной и новой структур с помощью вспомогательной функции StructCompare (на основе StructToCharArray и ArrayCompare, см. полный исходный код). Любое различие приводит к печати нового состояния (может быть поменялся прогноз), а если появилось актуальное значение, таймер останавливается. Чтобы запустить ожидание следующей новости, этот индикатор нужно переинициализировать: он является демонстрационным, а для контроля обстановки по списку новостей мы позднее разработаем более практичный класс-фильтр.
else
|
Во время ожидания события индикатор выводит в комментарий ожидаемое время выхода новости, и сколько до неё осталось (или каково опоздание).
Комментарий об ожидании или опоздании ближайшей новости
Важно отметить, что новость может выйти как чуть раньше, так и чуть позже запланированного срока. Это создает некоторые проблемы при тестировании новостных стратегий на истории, так как время обновления записей календаря в терминале и через MQL5 API не предоставляется. Мы попробуем частично решить эту проблему в следующем разделе.
Вот фрагменты вывода в журнал, произведенного индикатором с некоторым промежутком:
CalendarValueHistory(values,TimeCurrent(),TimeCurrent()+(60*60*24)*3)=186 / ok Started monitoring 156045 [id] [event_id] [time] [period] [revision] » 156045 840020013 2022.06.27 15:30:00 2022.05.01 00:00:00 0 » » [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] » » -9223372036854775808 400000 -9223372036854775808 0 0 » » [importance] [name] [currency] [code] [actual] [previous] [revised] [forecast] » "Medium" "Durable Goods Orders m/m" "USD" "US" nan 0.40000 nan 0.00000 ... Alert: News 156045 changed New state of 156045 [id] [event_id] [time] [period] [revision] » 156045 840020013 2022.06.27 15:30:00 2022.05.01 00:00:00 0 » » [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] » » 700000 400000 -9223372036854775808 0 1 » » [importance] [name] [currency] [code] [actual] [previous] [revised] [forecast] » "Medium" "Durable Goods Orders m/m" "USD" "US" 0.70000 0.40000 nan 0.00000 Timer stopped
|
В обновленной новости появилось значение actual_value.
Чтобы не ждать во время теста слишком долго, данный индикатор желательно запускать в рабочие часы основных рынков, когда плотность выхода новостей высока.
Функция CalendarValueById — не единственная, и, вероятно, не самая гибкая, с помощью которой можно мониторить изменения в календаре. Пару других подходов мы рассмотрим в следующих разделах.