经济日历结构

这部分描述了处理可在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(void) const;   // 如果设置了actual_value,则返回true

   bool                         HasPreviousValue(void) const; // 如果设置了prev_value,则返回true

   bool                         HasRevisedValue(void) const;  // 如果设置了revised_prev_value,则返回true

   bool                         HasForecastValue(void) const; // 如果设置了forecast_value,则返回true

  //--- 接收该值的函数

   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_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(values, date_from, date_to, EU_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_code, ArraySize(values));

//--- 减少输出到“日志”的数组大小

   if(ArraySize(values)>5)

      ArrayResize(values, 5);

//--- 将事件值原样输出到日志,无需检查或转换为实际值

   Print("Output calendar values as they are");

   ArrayPrint(values);



//--- 检查字段值并转换到实际值

//--- 选项1,检查并获取该值

   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("The first method to check and get calendar values");

   ArrayPrint(values_adjusted_1);



//--- 选项2,检查并获取该值

   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("The second method to check and get calendar values");

   ArrayPrint(values_adjusted_2);



//--- 选项3,获取值 - 无需检查

   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("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]

   [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

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 源发布了的是事件一整天而不是确切时间。时间根据事件发生时指定。

另见

经济日历