用于历史回测的经济日历监视器和缓存 - MetaTrader 5脚本

报价根据每个相应柱形形成时服务器上有效的时区标记有时间戳。
一旦条形形成,它们将保持不变,包括它们的时间戳。另一方面,财经日历提供与服务器当前时区相关的事件(过去、现在和未来)的信息。由于许多经纪商遵守特定的时区时间表,包括打开和关闭夏令时模式,因此历史事件的时间戳可能会相对于相关柱线移动 1 小时,大约每年有一半的时间。
此外,经纪商有时会更彻底地改变时区,而不仅仅是改变夏令时。历史报价可能会相对于最初发生的经济事件的时间向左或向右移动几个小时,但现在由服务器更新时区的日历报告。
考虑到新闻来自具有自己的夏令时时间表的不同国家,并且您的服务器可能位于具有其他时间表的地区,新闻发布的时间甚至可以以更特殊的方式在图表上来回“跳跃”(例如,春季和秋季的几周)。
所有这些在网上看起来并不那么重要,但是如果我们想测试基于新闻的策略怎么办?
是的,您可以说 MetaTrader 测试程序本身不支持日历,但许多交易者喜欢交易新闻,而其他不喜欢交易的人应该关注新闻,在新闻期间市场变得疯狂之前简单地退出市场。所以用日历进行回测很重要。这就是为什么将日历导出到外部存储(文件、数据库)然后将其导入到测试仪是非常合乎逻辑的。一种用于测试人员日历体验的归档工具在算法交易书。
这里我们遇到了历史引用与历史事件不同步的问题。为了简单起见,书中没有解决这个问题。
现在它已经解决了,感谢扩展版本日历缓存.mqh和展示指标CalendarMonitorCachedTZ.mq5。这只是一个稍微改变的版本CalendarMonitorCached.mq5从书中。
该指标监控新闻事件并动态更新图表上的几个过去和即将发生的事件。
所有与时间校正相关的工作都是在幕后完成的 - 在另一个公共图书馆时间服务器DST.mqh。 为了更好地理解时间校正是如何工作的,可以使用脚本 CalendarCSVForDates.mq5 并排比较经过校正和未经校正的 CSV 文件。
以下是如何将库嵌入到两个程序的源代码中 - 脚本和此指示器。
#包括<时间服务器DST.mqh>// 包括在日历缓存启用时区修复支持之前 #包括#包括
与原始指示器一样,有字符串输入日历缓存文件,您可以在其中提供用于写入或读取的 cal 文件名称。
当指标附加到空的在线图表时日历缓存文件,它可以与内置日历即时配合使用。
当指标以特定名称执行时日历缓存文件并且该文件不存在,指示器将日历记录导出到缓存文件(创建文件)并退出。这是时间戳应该/可以被纠正的阶段(参见按符号历史记录修复缓存时间以下)。
当使用现有缓存文件的名称执行指标时日历缓存文件, it loads the cache and works with this copy in the same way as with built-in calendar. This is specifically useful for the tester.

请不要忘记,测试人员需要在指令中指定其他文件,在我们的例子中 - 准备好的在线校准文件 #属性测试器_文件或者您应该将 cal 文件放入公共文件夹 C:/Users/
当然,缓存也可以在回测和优化期间加载到 EA 中。
输入字符串按符号历史记录修复缓存时间按以下方式处理。
如果为空,指标将保存缓存而不进行时间更正。
要在导出期间启用时间校正,您应该指定一个符号,该符号将用于服务器历史时区的经验检测。它基于 H1 报价历史记录,最好是“XAUUSD”或“EURUSD”。
借助此输入,新版本的指标中仅添加了几行内容:
如果(字符串长度(通过符号历史修复缓存时间)) 缓存[].调整TZonHistory(FixCachedTimesBySymbolHistory,真的);
方法调整TZon历史记录被专门引入日历缓存用于时间戳调整的类及其实现使用内部结构时间服务器DST.mqh。
该方法只能在线调用(而不是在测试器中)。
通常,应该在填充后立即对从内置日历填充的缓存对象调用该方法。否则,如果缓存是从 cal 文件加载的,或者如果之前已经调用过该方法,则缓存内容可能已经被调整。然后你将应用修复修复并得到错误的时间戳。
第二个参数(真的) 指示该方法将应用更改的边界写入日志。像这样的东西:
时间修正开始于2021.07.19 00:30:00 2021.07.19 00:30:00:148786-10800差异=-3600 2021.11.08 01:50:00:135918-7200好的2022.03.14 04:30:00:161085-10800差异=-3600 2022.11.07 04:00:00:165962-7200好的2023.03.13 01:50:00:168500-10800差异=-3600 2023.11.06 01:50:00:169270-7200好的2024.03.11 01:50:00:181258-10800差异=-3600 2024.11.04 02:30:00:208469-7200好的
每行包含检测到新差异的事件的时间和 ID、事件的服务器时间偏移,以及必须将什么差异应用于所有后续时间戳,以消除日历缓存时服务器时间的偏差。
附加的 mqh 文件(CalendarFilter.mqh、CalendarCache.mqh、QuickSortStructT(Ref).mqh)包含与本书中的原始版本相比的错误修复和改进。
2024 年 11 月 11 日 - CalendarFilter.mqh、CalendarCache.mqh 中的小错误修复和更新;
2024 年 11 月 22 日 - CalendarCache.mqh 中的小错误修复和改进。
附件下载
📎 autoptr.mqh (1.86 KB)
📎 calendardefines.mqh (4.66 KB)
📎 calendarfiltercached.mqh (2.38 KB)
📎 datetime.mqh (2.56 KB)
📎 defines.mqh (0.71 KB)
📎 is.mqh (0.98 KB)
📎 mqlerror.mqh (8.53 KB)
📎 quicksortstructtref.mqh (7.86 KB)
📎 stringutils.mqh (1.91 KB)
📎 tableau.mqh (8.79 KB)
📎 prtf.mqh (1.49 KB)
📎 calendarfilter.mqh (28.8 KB)
📎 timeserverdst.mqh (16.98 KB)
📎 calendarcache.mqh (28.54 KB)
📎 calendarmonitorcachedtz.mq5 (8.41 KB)
Source: MQL5 #53393
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
