经济日历结构

这部分描述了处理可在MetaTrader平台直接使用的经济日历的结构。经济日历是一个即时可用的百科全书,描述了宏观经济指标、指标发布日期以及重要程度。宏观经济指标的相关值会在发布时立即发送至MetaTrader平台,并以标签的形式显示在图表上,使您可以根据国家、货币和重要性直观地跟踪所需的指标。

经济日历函数 可以根据自定义重要性标准,从必要的国家/货币对的角度对传入事件进行自动分析。

国家描述通过MqlCalendarCountry结构进行设置。它被用于CalendarCountryById()CalendarCountries()函数

struct MqlCalendarCountry
  {
   ulong                               id;                    // 国家ID (ISO 3166-1)
   string                              name;                  // 国家文本名称(在当前程序端的编码)
   string                              code;                  // 国家代码名称(ISO 3166-1 alpha-2)
   string                              currency;              // 国家货币代码
   string                              currency_symbol;       // 国家货币符号
   string                              url_name;              // 在mql5.com网站URL中使用的国家名称
  };

 

事件描述通过MqlCalendarEvent结构进行设置。它被用于CalendarEventById()CalendarEventByCountry()CalendarEventByCurrency()函数

struct MqlCalendarEvent
  {
   ulong                               id;                    // 事件ID
   ENUM_CALENDAR_EVENT_TYPE            type;                  // 来自ENUM_CALENDAR_EVENT_TYPE枚举的事件类型
   ENUM_CALENDAR_EVENT_SECTOR          sector;                // 与事件相关的版块
   ENUM_CALENDAR_EVENT_FREQUENCY       frequency;             //事件频率
   ENUM_CALENDAR_EVENT_TIMEMODE        time_mode;             //事件时间模式
   ulong                               country_id;            // 国家ID
   ENUM_CALENDAR_EVENT_UNIT            unit;                  // 经济指标价值的度量单位
   ENUM_CALENDAR_EVENT_IMPORTANCE      importance;            // 事件重要性
   ENUM_CALENDAR_EVENT_MULTIPLIER      multiplier;            // 事件指标值乘数
   uint                                digits;                // 小数位数
   string                              source_url;            // 事件发布的源URL
   string                              event_code;            // 事件代码
   string                              name;                  // 程序端语言中的事件文本名称(在当前程序端的编码)
  };

 

事件值通过MqlCalendarValue结构进行设置。它被用于CalendarValueById()CalendarValueHistoryByEvent()CalendarValueHistory()CalendarValueLastByEvent()CalendarValueLast()函数

struct MqlCalendarValue
  {
   ulong                               id;                    // 值ID
   ulong                               event_id;              // 事件ID
   datetime                            time;                  // 事件日期和时间
   datetime                            period;                // 事件报告时段
   int                                 revision;              // 相对于报告时段的已发布指标修正
   long                                actual_value;          // 如果未设置该值,则返回ppm或LONG_MIN的实际值
   long                                prev_value;            // 如果未设置该值,则返回ppm或LONG_MIN的过去值
   long                                revised_prev_value;    // 如果未设置该值,则返回ppm或LONG_MIN的修正后的过去值
   long                                forecast_value;        //如果未设置该值,则返回ppm或LONG_MIN的预测值
   ENUM_CALENDAR_EVENT_IMPACT          impact_type;           // 对汇率的潜在影响
  //--- 检查该值的函数
   bool                         HasActualValue(voidconst;   // 如果设置了actual_value,则返回true
   bool                         HasPreviousValue(voidconst; // 如果设置了prev_value,则返回true
   bool                         HasRevisedValue(voidconst;  // 如果设置了revised_prev_value,则返回true
   bool                         HasForecastValue(voidconst; // 如果设置了forecast_value,则返回true
  //--- 接收该值的函数
   double                       GetActualValue(voidconst;   // 如果未设置该值,则返回actual_value或nan
   double                       GetPreviousValue(voidconst; // 如果未设置该值,则返回prev_value或nan
   double                       GetRevisedValue(voidconst;  // 如果未设置该值,则返回revised_prev_value或nan
   double                       GetForecastValue(voidconst; // 如果未设置该值,则返回forecast_value或nan
  };

MqlCalendarValue结构提供了检查和设置actual_valueforecast_valueprev_valuerevised_prev_value字段值的方法。如果没有指定任何值,则该字段存储LONG_MIN (-9223372036854775808)。

请注意,存储在这些字段中的值要乘以100万。这表示当您使用函数CalendarValueByIdCalendarValueHistoryByEventCalendarValueHistoryCalendarValueLastByEventCalendarValueLast接收MqlCalendarValue中的值时,您应该检查该字段值是否等于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;           // 对汇率的潜在影响
  };
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
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(valuesdate_fromdate_toEU_code))
     {
      PrintFormat("Error! Failed to get events for country_code=%s"EU_code);
      PrintFormat("Error code: %d"GetLastError());
      return;
     }
   else
      PrintFormat("Received event values for country_code=%s: %d",
                  EU_codeArraySize(values));
//--- 减少输出到“日志”的数组大小
   if(ArraySize(values)>5)
      ArrayResize(values5);
//--- 将事件值原样输出到日志,无需检查或转换为实际值
   Print("Output calendar values as they are");
   ArrayPrint(values);
 
//--- 检查字段值并转换到实际值
//--- 选项1,检查并获取该值
   AdjustedCalendarValue values_adjusted_1[];
   int total=ArraySize(values);
   ArrayResize(values_adjusted_1total);
//--- 复制检查并调整后的值
   for(int i=0i<totali++)
     {
      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("The first method to check and get calendar values");
   ArrayPrint(values_adjusted_1);
 
//--- 选项2,检查并获取该值
   AdjustedCalendarValue values_adjusted_2[];
   ArrayResize(values_adjusted_2total);
//--- 复制检查并调整后的值
   for(int i=0i<totali++)
     {
      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("The second method to check and get calendar values");
   ArrayPrint(values_adjusted_2);
 
//--- 选项3,获取值 - 无需检查
   AdjustedCalendarValue values_adjusted_3[];
   ArrayResize(values_adjusted_3total);
//--- 复制检查并调整后的值
   for(int i=0i<totali++)
     {
      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("The third method to get calendar values - without checks");
   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]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3             55200000             55500000 -9223372036854775808             55500000             2        ...
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0            143100000            143900000 -9223372036854775808 -9223372036854775808             0        ...
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0 -9223372036854775808 -9223372036854775808 -9223372036854775808 -9223372036854775808             0        ...
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0             11000000             10500000 -9223372036854775808             11000000             0        ...
   [4111619  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]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  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]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  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]
   [0144520  999500001 2021.01.04 12:00:00 2020.12.01 00:00:00          3       55.20000     55.50000                  nan         55.50000             2
   [1144338  999520001 2021.01.04 23:30:00 2020.12.29 00:00:00          0      143.10000    143.90000                  nan              nan             0
   [2147462  999010020 2021.01.04 23:45:00 1970.01.01 00:00:00          0            nan          nan                  nan              nan             0
   [3111618  999010018 2021.01.05 12:00:00 2020.11.01 00:00:00          0       11.00000     10.50000                  nan         11.00000             0
   [4111619  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

ID

描述

CALENDAR_FREQUENCY_NONE

发布频率未设置

CALENDAR_FREQUENCY_WEEK

每周发布一次

CALENDAR_FREQUENCY_MONTH

每月发布一次

CALENDAR_FREQUENCY_QUARTER

每季度发布一次

CALENDAR_FREQUENCY_YEAR

每年发布一次

CALENDAR_FREQUENCY_DAY

每天发布一次

 

事件类型在MqlCalendarEvent结构中指定。列表中设置了可能的值ENUM_CALENDAR_EVENT_TYPE

ID

描述

CALENDAR_TYPE_EVENT

事件(会议,讲话等)

CALENDAR_TYPE_INDICATOR

指标

CALENDAR_TYPE_HOLIDAY

假期

 

事件相关的经济版块在MqlCalendarEvent结构中指定。列表中设置了可能的值ENUM_CALENDAR_EVENT_SECTOR

ID

描述

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

ID

描述

CALENDAR_IMPORTANCE_NONE

重要性未设置

CALENDAR_IMPORTANCE_LOW

低重要性

CALENDAR_IMPORTANCE_MODERATE

中级重要性

CALENDAR_IMPORTANCE_HIGH

高级重要性

 

用于显示事件值计量单位类型在MqlCalendarEvent结构中指定。列表中设置了可能的值ENUM_CALENDAR_EVENT_UNIT

ID

描述

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

ID

描述

CALENDAR_MULTIPLIER_NONE

乘数未设置

CALENDAR_MULTIPLIER_THOUSANDS

数千

CALENDAR_MULTIPLIER_MILLIONS

数百万

CALENDAR_MULTIPLIER_BILLIONS

数十亿

CALENDAR_MULTIPLIER_TRILLIONS

数万亿

 

事件对本国汇率的潜在影响在MqlCalendarValue结构中显示。列表中设置了可能的值ENUM_CALENDAR_EVENT_IMPACT

ID

描述

CALENDAR_IMPACT_NA

影响未设置

CALENDAR_IMPACT_POSITIVE

积极的影响

CALENDAR_IMPACT_NEGATIVE

消极的影响

 

事件时间在MqlCalendarEvent结构中指定。列表中设置了可能的值ENUM_CALENDAR_EVENT_TIMEMODE

ID

描述

CALENDAR_TIMEMODE_DATETIME

源发布事件的确切时间

CALENDAR_TIMEMODE_DATE

事件需要一整天

CALENDAR_TIMEMODE_NOTIME

源不发布事件时间

CALENDAR_TIMEMODE_TENTATIVE

源发布了的是事件一整天而不是确切时间。时间根据事件发生时指定。

 

另见

经济日历