请观看如何免费下载自动交易
请在Telegram上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
指标

Economic Calendar Monitor and Cache for Backtesting on History - MetaTrader 5脚本

显示:
34
等级:
(9)
已发布:
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
长话短说:MetaTrader 5 的内置经济日历与历史报价不(完全)同步。

报价根据每个相应条形图形成时服务器上有效的时区标记时间戳。

条形图一旦形成,包括其时间戳在内都将保持不变。另一方面,经济日历提供与服务器当前时区相关的事件信息(过去、现在和未来)。由于许多经纪商遵守特定的时区时间表,包括夏令时模式的开启和关闭,历史事件的时间戳可能会相对于相关条形图偏移 1 小时,每年大约有一半的时间会出现这种情况。

更有甚者,经纪商有时会改变时区,而不仅仅是切换夏令时。这时,历史报价可能会相对于最初发生的经济事件的时间向左或向右偏移几个小时,但现在是由服务器更新时区的日历报告的。

考虑到新闻来自不同的国家,这些国家都有自己的夏令时间表,而您的服务器可能位于另一个时区,因此新闻发布的时间可能会在图表上来回 "跳跃",甚至以更加奇特的方式(例如,在春季和秋季的几个星期内)。

所有这些在网上似乎并不重要,但如果我们想测试基于新闻的策略呢?

是的,您可以说 MetaTrader 测试程序本身不支持日历,但许多交易者都喜欢交易新闻,而其他不喜欢新闻的人则应该关注新闻,在新闻期间市场疯狂之前远离市场。因此,使用日历进行回测非常重要。因此,将日历导出到外部存储器(文件、数据库),然后导入到测试器中是非常合理的。算法交易》 一书中就介绍了这样一种将日历导入测试仪的归档工具。

在这里,我们遇到了历史报价与历史事件不同步的问题。为了简单起见,书中没有解决这个问题。

现在,由于CalendarCache.mqh 的扩展版本和展示指标CalendarMonitorCachedTZ.mq5,这个问题已经解决。这只是对书中的CalendarMonitorCached.mq5 稍作修改后的版本。

该指标监控新闻事件,并动态更新图表上的表格,其中包含多个过去和即将发生的事件。

所有与时间校正相关的工作都是在幕后完成的--在另一个公共库TimeServerDST.mqh 中。为了更好地理解时间校正是如何工作的,可以使用脚本CalendarCSVForDates.mq5 并比较有校正和无校正的 CSV 文件

以下是如何将该库嵌入两个程序的源代码中--脚本和该指标。

#include <TimeServerDST.mqh> // 在日历缓存前加入时区固定支持功能
#include <MQL5Book/CalendarFilterCached.mqh>
#include <MQL5Book/CalendarCache.mqh>

在原始指示器中,有一个输入CalendarCacheFile 的字符串,您可以在其中提供用于写入或读取的日历 文件名。

当该指标连接到在线图表时,如果CalendarCacheFile 为空,它将使用内置日历即时运行。

当指标以CalendarCacheFile 中的特定名称执行时,如果文件不存在,指标会将日历记录导出到缓存文件(创建文件)并退出。此时应该/可以更正时间戳(见下文的 "FixCachedTimesBySymbolHistory")。

CalendarCacheFile 中使用现有缓存文件名执行指示器时,它将加载缓存,并以与内置日历相同的方式使用该副本。这对测试人员特别有用。

测试仪中的日历监控器从缓存中读取事件

请不要忘记,测试人员需要在#property tester_file 指令中指定额外的文件,在我们的例子中,就是准备好的在线日历文件,或者将日历文件放入常用文件夹 C:/Users/<User>/AppData/Roaming/MetaQuotes/Terminal/Common/。

当然,在回溯测试和优化过程中,缓存也可以加载到 EA 中。

输入字符串FixCachedTimesBySymbolHistory 的处理方式如下。

如果为空,则指标保存的缓存不带时间校正。

要在导出过程中启用时间校正,必须指定一个符号,用于根据经验检测服务器的历史时区。它基于 H1 历史报价,最好是 "XAUUSD "或 "EURUSD"。

在此输入的帮助下,新版指标中只增加了几行:

         if(StringLen(FixCachedTimesBySymbolHistory))
            cache[].adjustTZonHistory(FixCachedTimesBySymbolHistory, true);

CalendarCache 类中专门引入了adjustTZonHistory 方法,用于调整时间戳,其实现使用TimeServerDST.mqh 的内部函数。

该方法只能在线调用(不能在测试器中调用)。

通常情况下,应在从内置日历填充缓存对象后立即调用该方法。否则,如果缓存是从日历文件中加载的,或者该方法之前已被调用,缓存内容可能已被调整。这样就会在固定时应用固定,从而得到错误的时间戳。

第二个参数(true)指示该方法将应用更改的边界写入日志。类似于这样:

Time fix-up started at 2021.07.19 00:30:00
2021.07.19 00:30:00: 148786 -10800 diff=-3600
2021.11.08 01:50:00: 135918 -7200 OK
2022.03.14 04:30:00: 161085 -10800 diff=-3600
2022.11.07 04:00:00: 165962 -7200 OK
2023.03.13 01:50:00: 168500 -10800 diff=-3600
2023.11.06 01:50:00: 169270 -7200 OK
2024.03.11 01:50:00: 181258 -10800 diff=-3600
2024.11.04 02:30:00: 208469 -7200 OK

每一行都包含检测到新差异的事件的时间和 ID、事件发生时的服务器时间偏移量,以及必须应用于所有后续时间戳的差值,以消除日历缓存时服务器时间的偏差。

所附的 mqh 文件(CalendarFilter.mqh、CalendarCache.mqh、QuickSortStructT(Ref).mqh)包含与书中原始版本相比的错误修正和改进。


更新内容

11.11.2024 - CalendarFilter.mqh, CalendarCache.mqh 中的小错误修复和更新;

22.11.2024 - CalendarCache.mqh 中的小错误修复和改进。



由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/53393

simple mt5 trade copier simple mt5 trade copier

这是一个复印机模板

Bull Bear Volume Bull Bear Volume

可清晰显示市场两侧成交量压力的指标

Extreme highs and lows with tick prices Extreme highs and lows with tick prices

标记极端最高价和最低价 (OHLC) 以及极端买入价和卖出价

自适应 CCI 自适应 CCI

自适应 CCI - 商品通道指数,可根据市场波动动态调整上限和下限。通过使用 EMA 平滑波峰和波谷,消除了固定阈值(如 100/-100),根据每种资产当前的波动性提供更可靠的超买/超卖信号。通过自适应确认水平,完美识别高概率反转点。