文章 "MQL5 酷宝书 – 财经日历"

 

新文章 MQL5 酷宝书 – 财经日历已发布:

本文着重于财经日历的编程特性,并研究创建一个类来简化访问日历属性和接收事件值。 运用 CFTC(商品期货交易委员会)的非商业净持仓规则来开发指标作为一个实际例子。

我们会在下面的示例中处理时间序列结构。 Test_TS.mq5 脚本接收自 2016 年 1 月 1 日到 2021 年 11 月 1 日之间的美国非农就业数据,并将其显示在特殊的图表上。 所以可令图表产生两条曲线 - 实际值和预测值。 我们将采用事件报告区间作为时间线。

脚本启动后,我们首先在日志里显示时间序列数值,然后在图表上绘制图表(图例 2)。


非农数据 (2016-2021)

图例 2. 美国非农就业 (2016-2021)

作者:Denis Kirichenko

 

的确,标准 Calendar 函数很难理解。好在作者已经想通了,并在文章中提供了示例。

然而,所建议的高级日历 API 的简单性似乎并不明显。这很困难。


也许,我们应该列出一些日历应用最需要的场景。并尝试实现它们。

 
fxsaber #:

的确,标准日历函数很难理解。好在作者想通了这一点,并提供了示例。

然而,所建议的高级日历 API 的简单性似乎并不明显。这很困难。


也许,我们应该列出 一些日历应用最需要的场景。并尝试实现它们。

我希望能有一种方法,在任何时刻都能百分之百地保证新闻与报价同步。

 
fxsaber #:

的确,标准日历函数很难理解。好在作者想通了这一点,并提供了示例。

然而,所建议的高级日历 API 的简单性似乎并不明显。这很困难。

也许,我们应该列出日历应用最需要的一些场景。并尝试实现它们。

感谢您的意见 :-)

在我看来,CiCalendarInfo 涉及三个实体:国家、事件和值,因此在 理解上存在一些困难 。如果我们将其与 SB 交易类 CAccountInfo、CSymbolInfo 等进行 比较 ,则每个类中都有一个对象--账户、符号等。也许应该建立一个类的层次结构,例如:基类 -CiCalendarBaseInfo,子类 -CiCalendarCountryInfoCiCalendarEventInfoCiCalendarValueInfo。但后三种都有类似的结构形式。所以我放弃了这个想法。

也许,我们需要定义一个列表,列出一些最常用的日历使用场景。并尝试实现它们。

在使用日历数据方面,有多少想法就会有多少应用场景。您可以制作一个简单的事件发布通知器、日历面板、交易或考虑新闻发布时间的专家顾问等等。您可以从宏观经济指标中获取数据,利用神经网络研究它们对利率的影响。一句话,大数据

方便之处在于,您不需要去其他来源。一切都可以在 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 是一个引用参数。也就是说,服务器会将其返回给我们。这是一个服务器常量。当值发生变化时,意味着日历数据库的状态发生了变化。文档中有一个 EA 示例。

是的,我们也可以发送change_id 的最后已知值。如果数据库状态发生变化,CalendarValueLast() 函数将返回新事件的数量,并用新值覆盖 我们发送的change_id。

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

迪米特里,这里有一个标准函数 的例子。

在这个例子中,你可以看到 change_id 是一个引用参数。也就是说,服务器会把它返回给我们。这是一个服务器常量。当值发生变化时,意味着日历数据库的状态发生了变化。文档中有一个 EA 示例。

这就说得通了。谢谢。

我在帮助中找到了它:

CalendarValueLast.

如果向 函数 传递 change_id = 0,函数将始终返回 0,但会在 change_id 中返回 Calendar base 的当前状态。

 
Dmitry Fedoseev #:

在帮助中找到的:

CalendarValueLast

如果向函数传递 change_id = 0,函数将始终返回 0,但会在 change_id 中返回 Calendar base 的当前状态

是的,有这种情况。

当 prev_calculated == 0 时,我在指标示例中就有这样的行:

//----只是为了得到一个更改 ID
MqlCalendarValue values[];
gPtrValuesInfo.ValueLastSelectByEvent(gChangeId, values);

在这里,gChangeId=0。它在初始化块中归零。不过更正确的做法可能是在 prev_calculated == 0 重置gChangeId 。并将此变量设为本地变量。

 
据我所知,日历功能在测试器中不起作用?它应该如何测试?初始化时下载事件列表,然后使用这些列表?或者保存到文件,然后从文件中读取。