Обсуждение статьи "Рецепты MQL5 – Экономический календарь"

 

Опубликована статья Рецепты MQL5 – Экономический календарь:

В статье освещаются программные возможности по работе с Экономическим календарём. Для этих целей создаётся класс для упрощенного доступа к свойствам календаря и получения значений событий. В качестве практического примера предлагается запрограммировать индикатор, использующий данные по чистому объёму спекулятивных позиций от CFTC.

Поработаем со структурой временного ряда в следующем примере. Скрипт Test_TS.mq5 получает данные по нон-фармам США с 1 января 2016 по 1 ноября 2021 и отображает их на научном графике. Сделаем так, чтобы на графике было две кривые - фактические и прогнозные значения. В качестве временной шкалы возьмём отчётный период события.

После запуска скрипта получим, во-первых, вывод значений временного ряда в журнал, а во-вторых — отрисовку диаграммы на графике (Рис.2).


Nonfarm data (2016-2021)

Рис.2 Данные по американским нон-фармам (2016-2021)

Автор: Denis Kirichenko

 

В самом деле, штатные Calendar-функции тяжелы для понимания. Отлично, что автор разобрался и снабдил статью примерами.

Правда, простота предложенного высокоуровневого календарного API не кажется очевидной. Трудно.


Наверное, нужно обозначить список каких-то наиболее востребованных сценариев применения Календаря. И попробовать их реализовать.

 
fxsaber #:

В самом деле, штатные Calendar-функции тяжелы для понимания. Отлично, что автор разобрался и снабдил статью примерами.

Правда, простота предложенного высокоуровневого календарного API не кажется очевидной. Трудно.


Наверное, нужно обозначить список каких-то наиболее востребованных сценариев применения Календаря. И попробовать их реализовать.

Хотелось бы иметь способ обеспечить стопроцентную гарантию синхронизации новостей с котировками в произвольный момент времени.

 
fxsaber #:

В самом деле, штатные Calendar-функции тяжелы для понимания. Отлично, что автор разобрался и снабдил статью примерами.

Правда, простота предложенного высокоуровневого календарного API не кажется очевидной. Трудно.

Наверное, нужно обозначить список каких-то наиболее востребованных сценариев применения Календаря. И попробовать их реализовать.

Спасибо за мнение :-)

На мой взгляд некоторая трудность восприятия связана с тем, что класс CiCalendarInfo имеет дело с тремя сущностями: странами, событиями и значениями. Если сравнивать его например с торговыми классами СБ CAccountInfo, CSymbolInfo и т.п., то там в каждом классе 1 объект - счёт, символ и т.п. Может стоило бы сделать иерархию классов, к примеру такую: базовый класс - CiCalendarBaseInfo, потомки - CiCalendarCountryInfoCiCalendarEventInfo и CiCalendarValueInfo. Но для последних трёх есть свои аналоги в виде структур. Поэтому от идеи отказался.

Наверное, нужно обозначить список каких-то наиболее востребованных сценариев применения Календаря. И попробовать их реализовать.

Так их может быть ровно столько, сколько идей в плане использования данных календаря. Можно сделать простой информер о выходе события, календарную панель, советник, которые торгует или учитывает время выхода новостей и пр. Можно брать данные макроэкономических индикаторов и изучать их влияние на курсы, привлекая нейросети. Big data одним словом...

Удобство в том, что не нужно куда-то обращаться в другой источник. Всё можно делать в среде MQL5. 

 
Denis Kirichenko #:

Удобство в том, что не нужно куда-то обращаться в другой источник. Всё можно делать в среде MQL5. 

Наверное, большое искусство написать интуитивно понятную обертку. Календарь трудно поддается такому. Сам когда-то выкладывал свой вариант.

 
fxsaber #:

Наверное, большое искусство написать интуитивно понятную обертку...

100%.

 
Вот что непонятно по календарю - запросы по change_id. Где его взять?
 
Dmitry Fedoseev #:
Вот что непонятно по календарю - запросы по change_id. Где его взять?

Дмитрий, вот например штатная функция.

int  CalendarValueLast(
   ulong&               change_id,             // идентификатор изменения 
   MqlCalendarValue&    values[],              // массив для получения описаний значений 
   const string         country_code=NULL,     // кодовое имя страны по ISO 3166-1 alpha-2
   const string         currency=NULL          // кодовое наименование валюты страны 
   );

В ней видно, что change_id - это параметр по ссылке. Т.е. сервер нам его возвращает. Это серверная константа. Когда значение меняется, значит, что изменилось состояние базы данных календаря. В документации есть пример советника.

Да, мы также можем отправить последнее известное значение change_id. Если состояние базы поменяется, то функция  CalendarValueLast() вернёт нам кол-во новых событий, а наш отправленный  change_id перепишет на новый.

Документация по MQL5: Экономический календарь / CalendarValueLast
Документация по MQL5: Экономический календарь / CalendarValueLast
  • www.mql5.com
CalendarValueLast - Экономический календарь - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

Дмитрий, вот например штатная функция.

В ней видно, что change_id - это параметр по ссылке. Т.е. сервер нам его возвращает. Это серверная константа. Когда значение меняется, значит, что изменилось состояние базы данных календаря. В документации есть пример советника.

Тогда понятно. Спасибо.

Нашел в справке:

CalendarValueLast

Если в функцию передан change_id = 0, то функция всегда возвращает ноль, но при этом в change_id возвращается текущее состояние базы Календаря.

 
Dmitry Fedoseev #:

Нашел в справке:

CalendarValueLast

Если в функцию передан change_id = 0, то функция всегда возвращает ноль, но при этом в change_id возвращается текущее состояние базы Календаря.

Да, есть такое.

У меня в примере индикатора есть такие строчки, когда prev_calculated == 0:

//--- just to get a change id
MqlCalendarValue values[];
gPtrValuesInfo.ValueLastSelectByEvent(gChangeId, values);

И тут gChangeId=0. Обнуляется в блоке инициализации. Хотя наверное правильнее обнулять gChangeId всякий раз когда prev_calculated == 0. И сделать эту переменную локальной. 

 
Насколько понимаю, функции календаря в тестере не работают? Как предполагается тестировать? При инициализации скачивать список событий и уже далее работать с этими списками? Или сохранять в файл и читать из файла.
Причина обращения: