- 显示:
- 88
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
TimeGMT() 函数
返回格林尼治标准时间,格林尼治标准时间的计算考虑了客户终端运行所在计算机的本地时间 DST 开关。该函数有两种变体。
不带参数的调用
datetime TimeGMT();
使用 MqlDateTime 类型参数调用
datetime TimeGMT( MqlDateTime& dt_struct // 结构类型变量 );
不过, 在策略测试器中进行测试 时 ,TimeGMT() 总是 等于 TimeTradeServer() 模拟的服务器时间。
TimeGMT 库
该库将修复 TimeGMT() 函数,以便在策略测试器测试期间提供真正的 GMT 时间。该库将为两个版本的 TimeGMT 安装全局 API 钩子(通过宏替换)。
class CTimeGMT { public: static datetime TimeGMT(void); static datetime TimeGMT(MqlDateTime &dt_struct); }
使用方法
在策略测试器中测试使用新闻过滤器或任何时间限制的专家顾问之前,只需在代码开头加入此行,然后在 MetaEditor 中重新编译源代码。
#include "TimeGMT.mqh"
- 若要查看调试信息,可在 #include 指令之前添加此行:
#define PRINT_GMT_DETAILS 专家顾问或指标无需其他修改或任何函数调用。
- 只有检测到策略测试器时,TimeGMT 才会被修复。
- 修复对策略测试器中选择的符号有效。
- 周末或圣诞假期期间不会出现计算错误。
- 策略测试器开销低,计算时间短
经纪商偏移量的重新计算仅在专家顾问启动时以及每周日和周一午夜进行。计算出的经纪商偏移量将缓存在内存中,并在随后调用 TimeGMT 时使用。
选择用于估算服务器 TZ/DST 的符号
默认情况下,程序库将搜索并加载 XAUUSD 符号,用于估算服务器的时区偏移。 在 美国夏令时和欧盟夏令时不同步的几周(三月和十月下旬),XAUUSD 可以提供更可靠的结果(特别是对于遵循欧盟 夏令时时间表的经纪商)。另外,如果您的经纪商遵循美国夏令时时间表,或根本不遵循时间表,那么使用图表符号也是可以的。 调用 CTimeGMT::SetUsingGoldSymbol(),设置 "false "以使用当前图表符号,而不是 XAUUSD。
要确定经纪商的夏令时(DST)时间表,可以使用以下脚本 https://www.mql5.com/zh/code/48650
//+------------------------------------------------------------------+ //| 设置是否使用 XAUUSD(黄金)符号来估算"|"。 //| 服务器的 TZ/DST 由 H1 引用历史分析得出。 //| TRUE:搜索并加载 Gold 符号(默认行为)。 //| FALSE :使用当前图表的符号。 //+------------------------------------------------------------------+ void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);
注意:
XAUUSD 比 Forex 晚开始一小时,因此策略测试器中的 DST 切换将晚一小时。
TimeGMT_TestEA
为了探索策略测试器中的库,在策略测试器中测试了一个演示专家顾问
这些是在策略测试器中运行专家顾问的结果:
AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs: timer_hours=24 2023.03.05 00:00:00 TimeCurrent() = Sun, 2023.03.05 00:00:00 | TimeTradeServer() = Sun, 2023.03.05 00:00:00 | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.06 00:00:00 TimeCurrent() = Mon, 2023.03.06 00:00:00 | TimeTradeServer() = Mon, 2023.03.06 00:00:00 | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.07 00:00:00 TimeCurrent() = Tue, 2023.03.07 00:00:00 | TimeTradeServer() = Tue, 2023.03.07 00:00:00 | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.08 00:00:00 TimeCurrent() = Wed, 2023.03.08 00:00:00 | TimeTradeServer() = Wed, 2023.03.08 00:00:00 | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.09 00:00:00 TimeCurrent() = Thu, 2023.03.09 00:00:00 | TimeTradeServer() = Thu, 2023.03.09 00:00:00 | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.10 00:00:00 TimeCurrent() = Fri, 2023.03.10 00:00:00 | TimeTradeServer() = Fri, 2023.03.10 00:00:00 | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.11 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sat, 2023.03.11 00:00:00 | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.12 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sun, 2023.03.12 00:00:00 | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.13 00:00:00 TimeCurrent() = Mon, 2023.03.13 00:00:00 | TimeTradeServer() = Mon, 2023.03.13 00:00:00 | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.14 00:00:00 TimeCurrent() = Tue, 2023.03.14 00:00:00 | TimeTradeServer() = Tue, 2023.03.14 00:00:00 | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.15 00:00:00 TimeCurrent() = Wed, 2023.03.15 00:00:00 | TimeTradeServer() = Wed, 2023.03.15 00:00:00 | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.16 00:00:00 TimeCurrent() = Thu, 2023.03.16 00:00:00 | TimeTradeServer() = Thu, 2023.03.16 00:00:00 | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.17 00:00:00 TimeCurrent() = Fri, 2023.03.17 00:00:00 | TimeTradeServer() = Fri, 2023.03.17 00:00:00 | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.18 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sat, 2023.03.18 00:00:00 | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.19 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sun, 2023.03.19 00:00:00 | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)
更新:
2024.03.30 - v.1.25 : 固定经纪商 GMT 偏移量。目前,库仅扫描黄金图表上的 H1 条,因为它的开始时间最准确。
2024.04.09 - v.1.33 : 修正了圣诞节期间 GMT+0 经纪商在计算经纪商 GMT 偏移时可能出现的问题。
2024.04.12 - v.1.35 :修正了少数不提供黄金交易的经纪商的格林尼治标准时间偏移计算问题。
2024.07.07 - v.1.36 :修正了某些经纪商对黄金符号的正确检测问题。
2024.10.21 - v.1.40 : 改进了黄金符号的检测,回退到欧元兑美元符号。
2024.10.26 - v.1.47 :添加了更好的错误处理和调试代码。将 HistoryBrokerOffset() 方法更名为 TimeServerGMTOffset()。
2024.10.28 - v.1.49 :将所有处理时间的宏转换为函数,以避免在宏体中重复评估参数。在其他行中清理了更多代码。
2024.10.30 - v.1.50 : 修正了某些经纪商对 XAUEUR 报价的格林尼治标准时间偏移估算错误的问题。
2024.11.23 - v.1.55 : 增加了一个选项,用于关闭默认加载黄金符号以估算服务器的分时/夏令时。使用 "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() 函数中的潜在问题。
经纪商时区和夏令时时间表
格林威治标准时间(GMT),又称协调世界时(UTC),是世界时间的官方参考标准。您经常会看到 UTC - 3h 或 GMT - 3h 这样的时区表示法。在这个例子中,(-3h) 表示该时区比 UTC 或 GMT 晚三小时。UTC+3h 或 GMT +3h 表示该时区比 UTC 或 GMT 提前三小时。当地时间与格林尼治标准时间(UTC)之间的时间差称为格林尼治标准时间偏移。
外汇市场于纽约时间周日 17:00 开市(冬季为 GMT-5:00,夏季为 GMT-4:00),周五同一时间闭市。 纽约时间星期日 17:00 的外汇市场开始时间与冬季的世界协调时星期日 10:00(夏季的世界协调时星期日 09:00)相对应。外汇市场的收盘时间为冬季的星期五 10:00(世界协调时)和夏季的星期五 09:00(世界协调时)。黄金和白银现货市场通常在一小时后开始。链接
每个外汇经纪商都有自己的时区和服务器时间。因此,不同经纪商的交易周开始时间(H1蜡烛图)也不尽相同,旧金山经纪商的服务器时间为周日下午 02:00(GMT-8),悉尼经纪商的服务器时间为周一上午 09:00(GMT+11)。交易周的结束时间也各不相同,从服务器时间周五下午 02:00 到服务器时间周六上午 09:00。
各经纪商可自由选择夏令时间 (DST)。该时区的夏令时不一定相同。有时,他们会混合使用欧盟时区和美国夏令时,而不是欧盟夏令时。对于不遵循美国时间表的经纪商,同一经纪商的服务器时间在一周的开始(和结束)时间上全年会有 +/- 个小时的差异。为了 处理这些变化, 必须每周重新计算经纪商偏移量,以便及时发现经纪商的夏令时变化。
因此,使用+2时区(美国夏季+3时区)意味着每周的蜡烛线从周一午夜开始,每周有五根D1蜡烛线,日蜡烛线(和H4)的开始是新的外汇交易日的开始。每周在周六午夜前结束。简单地说, 这些服务器上的时间总是比纽约时间早 7 个小时,用 NY+7 表示。 到 目前为止,这是最常见的设置,但也有很多不太常见的变化。
真实 GMT 计算细节
当对 TimeGMT() 的调用被函数库拦截时,它会首先检查是否在策略测试器中运行,然后返回原始函数。如果检测到在策略测试器中运行,代码就会开始计算经纪人偏移量(见后文),然后返回值就是从客户端交易服务器的当前时间减去该偏移量的结果。
true GMT = TimeTradeServer() - ServerGMTOffset (of the current trading week)
通过分析 H1 报价历史,可以将"ServerGMTOffset"本身估算为两个已知时间之间的差值:
1)黄金 图表上出现交易周第一个条形图的时间 (FstBarWk)、
2) 纽约黄金交易开始的相应 UTC 时间(星期日 18:00) 。
ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)
BrokerOffset 的计算采用了 Carl Schreiber 在《Dealing with time》(2) 中发表的算法的优化修改。
根据https://www.timeanddate.com/time/change/usa/new-york
- 在纽约,夏令时从三月第二个星期日当地时间凌晨 02:00 开始。时钟将向前移动一小时至 GMT-4,因此纽约太阳 18:00 对应的 UTC 时间为(太阳 22:00 UTC)。
- 由于纽约当地时间 11 月的第一个星期日 02:00 时 DST 结束(冬令时),时钟将向后移动一小时至 GMT-5,因此纽约太阳 18:00 对应的 UTC 时间为(太阳,23:00 UTC)。
例如,如果黄金图表上的 FstBarWk 开始于周一 01:00,而此时纽约是冬季, 那么经纪商偏移可以计算如下:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)
如果纽约是夏季, 则经纪商偏移:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)
将时段时间转换为经纪商服务器时间
交易者可以使用 TimeGMT() 将时段时间转换为相应的服务器时间,以确定特定市场的开盘或收盘时间。例如,如果交易者想在亚洲(东京)时段交易,就必须相应调整交易时间
1]确定经纪商交易服务器的偏移量
int ServerGMTOffset = TimeTradeServer() - TimeGMT();
2]将特定市场的当地时间转换为相应经纪商的服务器时间
datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset 如果目的地时区目前处于夏令时,则等式中的第二项(xxx_GMTOffset)应增加 +1 小时。
在策略测试器中进行测试时,TimeGMT() 总是等于 TimeTradeServer() 模拟的服务器时间,因此会话时间的转换 会出错。 该库将修正 TimeGMT() 函数,以提供真正的格林尼治标准时间,从而在策略测试器中进行测试时,转换后的会话时间会变得准确。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/48291
Simple Bar Timer
这是一个脚本,用于显示下一个条形图到达前的剩余时间。
从 X 到时间、从 Y 到价格的函数,反之亦然
用于替代 ChartXYToTimePrice 和 ChartTimePriceToXY 的函数,可在整个输入参数范围内正确快速地运行
Statistical Zigzag
它是一个 "之 "字形,根据通过波动阈值的情况创建新的 "之 "字形转折点
Historex: export the history of rates and ticks to CSV-files
该脚本用于将当前图表符号的汇率和刻度值导出为与 MT5 导出/导入格式兼容的 CSV 文件。
