经济日历结构
这部分描述了处理可在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()函数
事件值通过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_value、forecast_value、prev_value和revised_prev_value字段值的方法。如果没有指定任何值,则该字段存储LONG_MIN (-9223372036854775808)。
请注意,存储在这些字段中的值要乘以100万。这表示当您使用函数CalendarValueById、CalendarValueHistoryByEvent、CalendarValueHistory、CalendarValueLastByEvent、CalendarValueLast接收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
|
|
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
|
源发布了的是事件一整天而不是确切时间。时间根据事件发生时指定。
|
另见