- Основные понятия календаря
- Получение списка и описаний доступных стран
- Запрос видов событий по странам и валютам
- Получение описания вида события по идентификатору
- Получение записей о событиях по странам или валютам
- Получение записей о событиях конкретного вида
- Чтение записи о событии по идентификатору
- Отслеживание изменений событий по стране или валюте
- Отслеживание изменений событий по типу
- Фильтрация событий по множеству условий
- Перенос базы календаря в тестер
- Торговля по календарю
Получение записей о событиях конкретного вида
При необходимости MQL-программа имеет возможность запросить события конкретного вида: для этого достаточно заранее узнать идентификатор события, например, с помощью функций CalendarEventByCountry или CalendarEventByCurrency, которые были представлены в разделе Запрос видов событий по странам и валютам.
int CalendarValueHistoryByEvent(ulong id, MqlCalendarValue &values[], datetime from, datetime to = 0)
Функция CalendarValueHistoryByEvent заполняет переданный по ссылке массив записями о событиях конкретного вида, заданного идентификатором id. Параметры from и to позволяют ограничить диапазон дат, в которых ищутся события.
Если необязательный параметр to не указан, в массив будут помещены все записи календаря, начиная с времени from и далее, в будущее. Чтобы запросить все прошлые события, установите from в 0. Если оба параметра from и to равны 0, будет возвращена вся имеющая история и планируемые события. Во всех остальных случаях, когда to не равно 0, оно должно быть больше from.
Массив values может быть динамическим (тогда функция автоматически расширит или уменьшит его под объем данных) или фиксированного размера (тогда в массив будет скопировано только то, что уместилось).
Функция возвращает количество скопированных элементов.
В качестве примера рассмотрим скрипт CalendarStatsByEvent.mq5, который подсчитывает статистику (частоту встречаемости) событий разных видов для заданной страны или валюты, в заданном временном диапазоне.
Условия анализа задаются во входных переменных.
input string CountryOrCurrency = "EU";
|
В зависимости от длины строки CountryOrCurrency, она интерпретируется как код страны (2 символа) или валюты (3 символа).
Для сбора статистики объявим структуру, в полях которой сохраним идентификатор и название вида события, его важность и, собственно, счетчик таких событий.
struct CalendarEventStats
|
В функции OnStart сначала запросим все виды событий с помощью функции CalendarEventByCountry или CalendarEventByCurrency на указанную глубину истории и в будущее, а затем в цикле по полученным описаниям событий в массиве events вызовем CalendarValueHistoryByEvent для каждого идентификатора события. В данном применении нас не интересуют содержащиеся в массиве values записи, достаточно лишь знать их количество.
void OnStart()
|
При успешном вызове функции заполняем структуру CalendarEventStats и добавляем её в массив структур stats. Далее мы сортируем структуру уже известным нам способом (макрос SORT_STRUCT был описан в разделе Сравнение, сортировка и поиск в массивах).
Запуск скрипта с настройками по умолчанию генерирует примерно такие записи в журнале (приведено с сокращениями).
CalendarEventByCountry(CountryOrCurrency,events)=82 / ok
|
Обратите внимание, что всего было получено 82 вида событий, однако в массиве статистики у нас оказалось только 74. Дело в том, что функция CalendarValueHistoryByEvent возвращает false (неуспех) и нулевой код ошибки в _LastError, если событий какого-либо вида не оказалось в заданном диапазоне дат. В приведенном тесте таких теоретически существующих, но ни разу за год не встретившихся событий набралось 8.