Структуры экономического календаря
В этом разделе описываются структуры для работы с Экономическим календарем, который доступен прямо в платформе MetaTrader. Экономический календарь является готовой энциклопедией с описанием макроэкономических индикаторов, даты их выхода и степени важности. Актуальные значения макроэкономических показателей поступают в платформу MetaTrader моментально прямо в момент публикации и отображаются на графике в виде меток – это позволяет визаульно отслеживать нужные показатели в разрезе стран, валют и важности.
Функции Экономического календаря позволяют проводить автоматический анализ поступающих событий по собственным критериям важности и в разрезе нужных стран/валютных пар.
Описания стран задаются структурой MqlCalendarCountry. Используется в функциях CalendarCountryById() и CalendarCountries()
struct MqlCalendarCountry
{
ulong id; // идентификатор страны по стандарту ISO 3166-1
string name; // текстовое имя страны (в текущей кодировке терминала)
string code; // кодовое имя страны ISO 3166-1 alpha-2
string currency; // код валюты страны
string currency_symbol; // символ/знак валюты страны
string url_name; // имя страны, используемое в URL на сайте mql5.com
};
|
Описания событий задаются структурой MqlCalendarEvent. Используется в функциях CalendarEventById(), CalendarEventByCountry() и CalendarEventByCurrency()
Значения событий задаются структурой MqlCalendarValue. Используется в функциях CalendarValueById(), CalendarValueHistoryByEvent(), CalendarValueHistory(), CalendarValueLastByEvent() и CalendarValueLast()
struct MqlCalendarValue
{
ulong id; // ID значения
ulong event_id; // ID события
datetime time; // время и дата события
datetime period; // отчетный период события
int revision; // ревизия публикуемого индикатора по отношению к отчетному периоду
long actual_value; // актуальное значение в миллионных долях или LONG_MIN, если значение не задано
long prev_value; // предыдущее значение в миллионных долях или LONG_MIN, если значение не задано
long revised_prev_value; // пересмотренное предыдущее значение в миллионных долях или LONG_MIN, если значение не задано
long forecast_value; // прогнозное значение в миллионных долях или LONG_MIN, если значение не задано
ENUM_CALENDAR_EVENT_IMPACT impact_type; // потенциальное влияние на курс валюты
//--- функции для проверки значений
bool HasActualValue(void) const; // возвращет true, если значение в поле actual_value задано
bool HasPreviousValue(void) const; // возвращет true, если значение в поле prev_value задано
bool HasRevisedValue(void) const; // возвращет true, если значение в поле revised_prev_value задано
bool HasForecastValue(void) const; // возвращет true, если значение в поле forecast_value задано
//--- функции для получение значений
double GetActualValue(void) const; // возвращает actual_value или nan, если значение не задано
double GetPreviousValue(void) const; // возвращает prev_value или nan, если значение не задано
double GetRevisedValue(void) const; // возвращает revised_prev_value или nan, если значение не задано
double GetForecastValue(void) const; // возвращает forecast_value или nan, если значение не задано
};
|
Структура MqlCalendarValue предоставляет методы для проверки и получения значений из полей actual_value, forecast_value, prev_value и revised_prev_value. Если значение поля не задано, то поле хранит значение LONG_MIN (-9223372036854775808).
При этом необходимо иметь в виду, что значения в этих полях хранятся увеличенными в миллион раз. Это означает, что при получении значений в MqlCalendarValue функциями CalendarValueById, CalendarValueHistoryByEvent, CalendarValueHistory, CalendarValueLastByEvent и CalendarValueLast, значения этих полей нужно проверять на равенство LONG_MIN, и если значение в поле задано, то для получения значения необходимо разделить значение поля на 1 000 000 (миллион). Другой способ получения значений – делать проверку и получать значения функциями самой структуры MqlCalendarValue.
Пример обработки событий календаря:
//--- создадим свою структуру под хранение событий календаря с вещественными значениям вместо целочисленных
struct AdjustedCalendarValue
{
ulong id; // ID значения
ulong event_id; // ID события
datetime time; // время и дата события
datetime period; // отчетный период события
int revision; // ревизия публикуемого индикатора по отношению к отчетному периоду
double actual_value; // актуальное значение показателя
double prev_value; // предыдущее значение показателя
double revised_prev_value; // пересмотренное предыдущее значение показателя
double forecast_value; // прогнозное значение показателя
ENUM_CALENDAR_EVENT_IMPACT impact_type; // потенциальное влияние на курс валюты
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
//--- код страны для Европейского союза по стандарту ISO 3166-1 Alpha-2
string EU_code="EU";
//--- получим все значения событий по Европейскому союзу
MqlCalendarValue values[];
//--- зададим границы диапазона, из которого берем события
datetime date_from=D'01.01.2021'; // берем все события с 2021 года
datetime date_to=0; // 0 означает все известные события, даже те, что не наступили еще
//--- запросим историю события по Европейскому союзу с 2021 года
if(!CalendarValueHistory(values, date_from, date_to, EU_code))
{
PrintFormat("Ошибка! Не удалось получить события по стране country_code=%s", EU_code);
PrintFormat("Код ошибки: %d", GetLastError());
return;
}
else
PrintFormat("Получены значения событий по country_code=%s: %d",
EU_code, ArraySize(values));
//--- уменьшим размер массива для вывода в Журнал
if(ArraySize(values)>5)
ArrayResize(values, 5);
//--- выведем значения событий в Журнал как есть, без проверок и приведения к актуальным значениям
Print("Выводим значения календаря как есть");
ArrayPrint(values);
//--- проверим значения полей и приведем к актуальным значениям
//--- первый вариант проверок и получения значений
AdjustedCalendarValue values_adjusted_1[];
int total=ArraySize(values);
ArrayResize(values_adjusted_1, total);
//--- копируем значения с проверками и корректировками
for(int i=0; i<total; i++)
{
values_adjusted_1[i].id=values[i].id;
values_adjusted_1[i].event_id=values[i].event_id;
values_adjusted_1[i].time=values[i].time;
values_adjusted_1[i].period=values[i].period;
values_adjusted_1[i].revision=values[i].revision;
values_adjusted_1[i].impact_type=values[i].impact_type;
//--- делаем проверки значений и делим на 1 000 000
if(values[i].actual_value==LONG_MIN)
values_adjusted_1[i].actual_value=double("nan");
else
values_adjusted_1[i].actual_value=values[i].actual_value/1000000.;
if(values[i].prev_value==LONG_MIN)
values_adjusted_1[i].prev_value=double("nan");
else
values_adjusted_1[i].prev_value=values[i].prev_value/1000000.;
if(values[i].revised_prev_value==LONG_MIN)
values_adjusted_1[i].revised_prev_value=double("nan");
else
values_adjusted_1[i].revised_prev_value=values[i].revised_prev_value/1000000.;
if(values[i].forecast_value==LONG_MIN)
values_adjusted_1[i].forecast_value=double("nan");
else
values_adjusted_1[i].forecast_value=values[i].forecast_value/1000000.;
}
Print("Первый способ проверки и получения значений календаря");
ArrayPrint(values_adjusted_1);
//--- второй вариант проверок и получения значений
AdjustedCalendarValue values_adjusted_2[];
ArrayResize(values_adjusted_2, total);
//--- копируем значения с проверками и корректировками
for(int i=0; i<total; i++)
{
values_adjusted_2[i].id=values[i].id;
values_adjusted_2[i].event_id=values[i].event_id;
values_adjusted_2[i].time=values[i].time;
values_adjusted_2[i].period=values[i].period;
values_adjusted_2[i].revision=values[i].revision;
values_adjusted_2[i].impact_type=values[i].impact_type;
//--- делаем проверки и получаем значения
if(values[i].HasActualValue())
values_adjusted_2[i].actual_value=values[i].GetActualValue();
else
values_adjusted_2[i].actual_value=double("nan");
if(values[i].HasPreviousValue())
values_adjusted_2[i].prev_value=values[i].GetPreviousValue();
else
values_adjusted_2[i].prev_value=double("nan");
if(values[i].HasRevisedValue())
values_adjusted_2[i].revised_prev_value=values[i].GetRevisedValue();
else
values_adjusted_2[i].revised_prev_value=double("nan");
if(values[i].HasForecastValue())
values_adjusted_2[i].forecast_value=values[i].GetForecastValue();
else
values_adjusted_2[i].forecast_value=double("nan");
}
Print("Второй способ проверки и получения значений календаря");
ArrayPrint(values_adjusted_2);
//--- третий вариант получения значений - без проверок
AdjustedCalendarValue values_adjusted_3[];
ArrayResize(values_adjusted_3, total);
//--- копируем значения с проверками и корректировками
for(int i=0; i<total; i++)
{
values_adjusted_3[i].id=values[i].id;
values_adjusted_3[i].event_id=values[i].event_id;
values_adjusted_3[i].time=values[i].time;
values_adjusted_3[i].period=values[i].period;
values_adjusted_3[i].revision=values[i].revision;
values_adjusted_3[i].impact_type=values[i].impact_type;
//--- получаем значения без проверок
values_adjusted_3[i].actual_value=values[i].GetActualValue();
values_adjusted_3[i].prev_value=values[i].GetPreviousValue();
values_adjusted_3[i].revised_prev_value=values[i].GetRevisedValue();
values_adjusted_3[i].forecast_value=values[i].GetForecastValue();
}
Print("Третий способ получения значений календаря - без проверок");
ArrayPrint(values_adjusted_3);
}
/*
Получены значения событий по country_code=EU: 1051
Выводим значения календаря как есть
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55200000 55500000 -9223372036854775808 55500000 2 ...
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143100000 143900000 -9223372036854775808 -9223372036854775808 0 ...
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808 0 ...
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11000000 10500000 -9223372036854775808 11000000 0 ...
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3100000 3100000 3200000 3100000 0 ...
Первый способ проверки и получения значений календаря
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
Второй способ проверки и получения значений календаря
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
Третий способ получения значений календаря - без проверок
[id] [event_id] [time] [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type]
[0] 144520 999500001 2021.01.04 12:00:00 2020.12.01 00:00:00 3 55.20000 55.50000 nan 55.50000 2
[1] 144338 999520001 2021.01.04 23:30:00 2020.12.29 00:00:00 0 143.10000 143.90000 nan nan 0
[2] 147462 999010020 2021.01.04 23:45:00 1970.01.01 00:00:00 0 nan nan nan nan 0
[3] 111618 999010018 2021.01.05 12:00:00 2020.11.01 00:00:00 0 11.00000 10.50000 nan 11.00000 0
[4] 111619 999010019 2021.01.05 12:00:00 2020.11.01 00:00:00 0 3.10000 3.10000 3.20000 3.10000 0
*/
|
Частота (периодичность) события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_FREQUENCY
|
|
CALENDAR_FREQUENCY_NONE
|
Частота публикации не задана
|
CALENDAR_FREQUENCY_WEEK
|
Публикация один раз в неделю
|
CALENDAR_FREQUENCY_MONTH
|
Публикация один раз в месяц
|
CALENDAR_FREQUENCY_QUARTER
|
Публикация один раз в квартал
|
CALENDAR_FREQUENCY_YEAR
|
Публикация один раз в год
|
CALENDAR_FREQUENCY_DAY
|
Публикация один раз в день
|
Тип события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_TYPE
|
|
CALENDAR_TYPE_EVENT
|
Событие (митинг, речь и так далее)
|
CALENDAR_TYPE_INDICATOR
|
Индикатор
|
CALENDAR_TYPE_HOLIDAY
|
Праздник
|
Сектор экономики, к которому относится событие, указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_SECTOR
|
|
CALENDAR_SECTOR_NONE
|
Сектор не задан
|
CALENDAR_SECTOR_MARKET
|
Рынок, биржа
|
CALENDAR_SECTOR_GDP
|
Валовый внутренний продукт (GDP)
|
CALENDAR_SECTOR_JOBS
|
Рынок труда
|
CALENDAR_SECTOR_PRICES
|
Цены
|
CALENDAR_SECTOR_MONEY
|
Деньги
|
CALENDAR_SECTOR_TRADE
|
Торговля
|
CALENDAR_SECTOR_GOVERNMENT
|
Правительство
|
CALENDAR_SECTOR_BUSINESS
|
Бизнес
|
CALENDAR_SECTOR_CONSUMER
|
Потребление
|
CALENDAR_SECTOR_HOUSING
|
Жилье
|
CALENDAR_SECTOR_TAXES
|
Налоги
|
CALENDAR_SECTOR_HOLIDAYS
|
Праздники
|
Важность события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_IMPORTANCE
|
|
CALENDAR_IMPORTANCE_NONE
|
Степень важности не задана
|
CALENDAR_IMPORTANCE_LOW
|
Низкая важность
|
CALENDAR_IMPORTANCE_MODERATE
|
Средняя важность
|
CALENDAR_IMPORTANCE_HIGH
|
Высокая важность
|
Тип единицы измерения, в которых даются значения события, указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_UNIT
|
|
CALENDAR_UNIT_NONE
|
Единица измерения не задана
|
CALENDAR_UNIT_PERCENT
|
Проценты
|
CALENDAR_UNIT_CURRENCY
|
Национальная валюта
|
CALENDAR_UNIT_HOUR
|
Количество часов
|
CALENDAR_UNIT_JOB
|
Количество рабочих мест
|
CALENDAR_UNIT_RIG
|
Буровые установки
|
CALENDAR_UNIT_USD
|
Доллары США
|
CALENDAR_UNIT_PEOPLE
|
Число людей
|
CALENDAR_UNIT_MORTGAGE
|
Количество ипотечных кредитов
|
CALENDAR_UNIT_VOTE
|
Число голосов
|
CALENDAR_UNIT_BARREL
|
Количество баррелях
|
CALENDAR_UNIT_CUBICFEET
|
Объем в кубических футах
|
CALENDAR_UNIT_POSITION
|
Чистый объем спекулятивных позиций в контрактах
|
CALENDAR_UNIT_BUILDING
|
Количество строений
|
В некоторых случаях значения экономического показателя требуют указания множителя, который указывается в структуре MqlCalendarEvent. Возможные значения множителей указаны в перечислении ENUM_CALENDAR_EVENT_MULTIPLIER
|
|
CALENDAR_MULTIPLIER_NONE
|
Множитель не задан
|
CALENDAR_MULTIPLIER_THOUSANDS
|
Тысячи
|
CALENDAR_MULTIPLIER_MILLIONS
|
Миллионы
|
CALENDAR_MULTIPLIER_BILLIONS
|
Миллиарды
|
CALENDAR_MULTIPLIER_TRILLIONS
|
Триллионы
|
Потенциальное влияние события на курс национальной валюты указывается в структуре MqlCalendarValue. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_IMPACT
|
|
CALENDAR_IMPACT_NA
|
Влияния не указано
|
CALENDAR_IMPACT_POSITIVE
|
Положительное влияние
|
CALENDAR_IMPACT_NEGATIVE
|
Отрицательное влияние
|
Время наступления события указывается в структуре MqlCalendarEvent. Возможные значения указаны в перечислении ENUM_CALENDAR_EVENT_TIMEMODE
|
|
CALENDAR_TIMEMODE_DATETIME
|
Источник публикует точное время наступления события
|
CALENDAR_TIMEMODE_DATE
|
Событие занимает весь день
|
CALENDAR_TIMEMODE_NOTIME
|
Источник не публикует время события
|
CALENDAR_TIMEMODE_TENTATIVE
|
Источник не публикует предварительно точное время события, только его день. Время уточняется по факту наступления события
|
Смотри также