用于策略测试器的 TimeGMT 库 - MetaTrader 5 库


TimeGMT() 函数
返回 GMT,该 GMT 是根据运行客户端的计算机上的本地时间考虑 DST 切换而计算得出的。 该函数有 2 个变体。
不带参数调用
日期时间 时间GMT();
使用 MqlDateTime 类型参数进行调用
日期时间 时间GMT( Mql日期时间& dt_struct // 结构体类型变量 );
然而, 在策略测试器中进行测试期间, 时间GMT() 始终等于 TimeTradeServer() 模拟服务器时间。
时间GMT 库
该库将修复 TimeGMT() 函数,以便在策略测试器中的测试期间提供真实的 GMT。该库将为两个版本的 TimeGMT 安装全局 API 挂钩(通过宏替换)。
班级C时间GMT {民众: 静止的 日期时间 时间GMT(空白); 静止的 日期时间 时间GMT(Mql日期时间&dt_结构); }
用法:
在测试使用新闻过滤器或策略测试器中的任何时间限制的 EA 交易之前,只需在代码开头包含此行,然后在 MetaEditor 中重新编译源代码。
#包括“时间GMT.mqh”
- (可选)要查看调试消息,请在 #include 指令之前添加此行:
#定义PRINT_GMT_DETAILS 专家顾问或指标不需要其他修改或任何函数调用。
经纪商抵消额的重新计算仅在 EA 交易启动时以及每周日和周一午夜进行。计算出的代理偏移量将缓存在内存中,并将用于后续对 TimeGMT 的调用。
默认情况下,该库将搜索并加载 XAUUSD 符号以估计服务器的时区偏移。 XAUUSD 可以提供更可靠的结果(特别是对于遵循以下规则的经纪商) 欧盟夏令时 日程) 美国 DST 期间的几周和欧盟 DST 时间表不同步(3 月和 10 月下旬)。或者,如果您的经纪商遵循美国 DST 时间表,或者根本没有时间表,那么使用图表符号也可以。 使用“false”调用 CTimeGMT::SetUsingGoldSymbol() 以使用当前图表的交易品种,而不是 XAUUSD。
要确定经纪商的夏令时 (DST) 时间表,您可以使用此脚本 https://www.mql5.com/en/code/48650
//+------------------------------------------------------------------+ //|设置使用 XAUUSD(黄金)符号来估算 | 的选项 //|通过分析 H1 报价历史记录来确定服务器的 TZ/DST。 | //| TRUE :搜索并加载黄金符号(默认行为)。 | //| FALSE:使用当前图表的交易品种。 | //+------------------------------------------------------------------+ 空白CTimeGMT::SetUsingGoldSymbol(常量 布尔值启用 =真的);
笔记:
作为 XAUUSD 在外汇交易后一小时开始的副作用,因此策略测试器中的 dst 切换将在一小时后发生。
要探索策略测试器中的库, 在策略测试器中测试演示智能交易系统
这些是在策略测试器中运行 EA 交易的结果:
澳元兑美元,M1(ICMarketsSC-演示):1分钟 OHLC 刻度生成 AUDUSD,M1:测试 Experts\TimeGMT_TestEA.ex5 来自2023.03。05 00:00到2023.05。01 00:00从输入开始: 计时器时间=24 2023.03。05 00:00:00 时间当前()=太阳,2023.03。05 00:00:00 |时间交易服务器()=太阳,2023.03。05 00:00:00 |时间GMT() = 星期六,2023.03。04 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。06 00:00:00 时间当前() = 周一,2023.03。06 00:00:00 |时间交易服务器() = 周一,2023.03。06 00:00:00 |时间GMT()=太阳,2023.03。05 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。07 00:00:00 时间当前() = 星期二,2023.03。07 00:00:00 |时间交易服务器() = 星期二,2023.03。07 00:00:00 |时间GMT() = 周一,2023.03。06 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。08 00:00:00 时间当前() = 星期三,2023.03。08 00:00:00 |时间交易服务器() = 星期三,2023.03。08 00:00:00 |时间GMT() = 星期二,2023.03。07 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。09 00:00:00 时间当前() = 星期四,2023.03。09 00:00:00 |时间交易服务器() = 星期四,2023.03。09 00:00:00 |时间GMT() = 星期三,2023.03。08 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。10 00:00:00 时间当前() = 周五,2023.03。10 00:00:00 |时间交易服务器() = 周五,2023.03。10 00:00:00 |时间GMT() = 星期四,2023.03。09 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。11 00:00:00 时间当前() = 周五,2023.03。10 23:56:59 |时间交易服务器() = 星期六,2023.03。11 00:00:00 |时间GMT() = 周五,2023.03。10 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。12 00:00:00 时间当前() = 周五,2023.03。10 23:56:59 |时间交易服务器()=太阳,2023.03。12 00:00:00 |时间GMT() = 星期六,2023.03。11 22:00:00|经纪商偏移量 =7200(格林威治标准时间+2)2023.03。13 00:00:00 时间当前() = 周一,2023.03。13 00:00:00 |时间交易服务器() = 周一,2023.03。13 00:00:00 |时间GMT()=太阳,2023.03。12 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。14 00:00:00 时间当前() = 星期二,2023.03。14 00:00:00 |时间交易服务器() = 星期二,2023.03。14 00:00:00 |时间GMT() = 周一,2023.03。13 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。15 00:00:00 时间当前() = 星期三,2023.03。15 00:00:00 |时间交易服务器() = 星期三,2023.03。15 00:00:00 |时间GMT() = 星期二,2023.03。14 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。16 00:00:00 时间当前() = 星期四,2023.03。16 00:00:00 |时间交易服务器() = 星期四,2023.03。16 00:00:00 |时间GMT() = 星期三,2023.03。15 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。17 号 00:00:00 时间当前() = 周五,2023.03。17 号 00:00:00 |时间交易服务器() = 周五,2023.03。17 号 00:00:00 |时间GMT() = 星期四,2023.03。16 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。18 00:00:00 时间当前() = 周五,2023.03。17 号 23:56:59 |时间交易服务器() = 星期六,2023.03。18 00:00:00 |时间GMT() = 周五,2023.03。17 号 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)2023.03。19 00:00:00 时间当前() = 周五,2023.03。17 号 23:56:59 |时间交易服务器()=太阳,2023.03。19 00:00:00 |时间GMT() = 星期六,2023.03。18 21:00:00|经纪商偏移量 =10800(格林威治标准时间+3)
2024.03.30 - v.1.25:修复经纪商 GMT 偏移。目前,该库仅扫描 GOLD 图表上的 H1 柱,因为它具有最准确的开始时间。
2024.04.09 - v.1.33:修复了圣诞节假期期间 GMT+0 经纪商计算经纪商 GMT 偏移量的潜在问题。
2024.04.12 - v.1.35:修复了少数不提供黄金交易的经纪商的经纪商 GMT 抵消计算中的问题。
2024.07.07 - v.1.36:修复了某些经纪商上正确检测黄金符号的问题。
2024.10.21 - v.1.40:改进了对 GOLD 符号的检测,并回退到 EURUSD 符号。
2024.10.26 - v.1.47:添加了更好的错误处理和调试代码。将 HistoryBrokerOffset() 方法重命名为 TimeServerGMTOffset()。
2024.10.28 - v.1.49:将所有处理时间的宏转换为函数,以避免宏体内参数的双重计算。其他行中的更多代码清理。
2024.10.30 - v.1.50:修复了某些经纪商的 XAUEUR 报价中 GMT 偏移估计错误的问题。
2024.11.23 - v.1.55:添加了一个选项来关闭默认加载黄金符号以估计服务器的 TZ/DST。使用“false”调用 CTimeGMT::SetUsingGoldSymbol() 以使用当前图表的交易品种。
2024.12.12 - v.1.60:改进了 HistoryServerGMTOffset() 函数的性能和其他较小的代码更改。
2024.12.14 - v.1.61:改进了 FindSymbol() 函数的性能。
2024.12.17 - v.1.62 : 进一步优化 HistoryServerGMTOffset() 函数。
2024.12.24 - v.1.63:修复了 HistoryServerGMTOffset() 函数中的潜在问题。
经纪商的时区和 DST 时间表
格林威治标准时间 (GMT),也称为协调世界时 (UTC),被用作世界官方时间参考。您经常会看到表示为 UTC - 3h 或 GMT - 3h 的时区。在此示例中,(-3h) 指的是比 UTC 或 GMT 晚三个小时的时区。 UTC+3h 或 GMT +3h 指的是该时区比 UTC 早 3 小时。我们当地时间与 GMT (UTC) 之间的时间差称为 GMT 偏移量。
外汇市场于纽约时间周日 17:00 开盘(冬季为 GMT-5:00,夏季为 GMT-4:00),并于周五同一时间关闭。外汇市场开始时间为纽约太阳时间 17:00,对应于世界标准时间 (UTC) 周日晚上 10:00冬季(夏季为 UTC 时间周日 09:00)。外汇收盘于周五晚上 10:00(世界标准时间)冬季(夏季 UTC 时间 09:00 PM)。黄金和白银现货市场通常在一小时后开始。 关联
每个外汇经纪商都有自己的时区和服务器时间。因此,交易周的开始(H1 蜡烛)在经纪商之间是可变的,并且可能会有所不同 服务器时间周日下午 02:00 对于旧金山 (GMT-8) 的经纪商,最高 服务器时间周一上午 09:00 适用于悉尼的经纪商(GMT+11)。交易周结束时间也有所不同 周五下午 02:00 服务器时间, 直至 服务器时间周六上午 09:00。
每个经纪商都可以自由选择夏令时 (DST)。并且 DST 不一定与该时区相同。有时他们会使用欧盟时区和美国夏令时而不是欧盟夏令时混合使用。对于不遵循美国时间表的经纪商,同一经纪商全年的每周开始(和结束)的服务器时间会有 +/- 1 小时的差异。到 处理这些变化, 经纪商抵消额的重新计算必须每周进行一次,以便能够及时检测到经纪商的 DST 变化。
因此,使用 +2 时区(在美国时间表中,夏季为 +3)意味着每周的蜡烛图从周一午夜开始,每周有 5 根 D1 蜡烛图,每日蜡烛图(和 H4)的开始是新的外汇日的开始。每周在周六午夜之前结束。周六和周日没有蜡烛。 简单地, 这些服务器上的时间始终比纽约早 7 小时,并表示为 NY+7。 到目前为止,这是最常见的设置,但还有许多不太常见的变化。
详情的计算 真正的格林威治标准时间
当对 TimeGMT() 的调用被库拦截时,它首先检查它是否没有在策略测试器中运行,然后返回原始函数。如果检测到策略测试器,代码开始计算经纪商偏移量(见下文),然后返回值只是客户端中交易服务器的当前时间减去该偏移量的结果。
真正的格林威治标准时间=时间交易服务器() - ServerGMTOffset(当前交易周的)
这 '服务器GMT偏移量' 本身可以通过分析 H1 报价历史来估计为两个已知时间之间的差异:
1) 交易周第一根柱线出现在图表上的时间金子图表 (FstBarWk),
2)纽约GOLD交易起始时间对应UTC时间周日18:00。
ServerGMTOffset = FstBarWk - UTC(纽约太阳,18:00)
BrokerOffset 的计算采用了 Carl Schreiber 在此发布的算法的优化修改 处理时间 (2) 函数
根据https://www.timeanddate.com/time/change/usa/new-york
例如,如果 GOLD 图表上的 FstBarWk 从星期一 01:00 开始,并且该柱在纽约是冬天, 那么 BrokerOffset 可以计算为:
ServerGMTOffset = (FstBarWK, 星期一,01:00) - (太阳,23:00 世界标准时间)=2小时(格林尼治标准时间+2)
而且,如果纽约是夏天, 然后 BrokerOffset:
ServerGMTOffset = (FstBarWK, 星期一,01:00) - (太阳,22:00世界标准时间) =3小时(格林尼治标准时间+3)
将会话时间转换为经纪商的服务器时间
交易者可以使用 TimeGMT() 将会话时间转换为相应的服务器时间,以确定特定市场的开市或收市时间。例如,如果交易者想要在亚洲(东京)交易时段进行交易,他们必须相应地调整交易时间
1]确定经纪商交易服务器的偏移量
整数服务器GMT偏移 =时间交易服务器()-时间GMT();
2]将特定市场的当地时间转换为相应经纪商的服务器时间
日期时间Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset 如果目的地时区当前处于夏令时,则等式中的第二项 (xxx_GMTOffset) 应增加 +1 小时。
在策略测试器中进行测试时,TimeGMT() 始终等于 TimeTradeServer() 模拟服务器时间,因此会话时间的转换出现错误。 该库将修复 TimeGMT() 函数,以提供真正的 GMT,从而在策略测试器中测试期间转换后的会话时间变得准确。
附件下载
📎 TimeGMT.mqh (40.52 KB)
📎 TimeGMT_TestEA.mq5 (18.97 KB)
Source: MQL5 #48291
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
