TimeServerDaylightSavings - MetaTrader 5 脚本

这个脚本介绍了这个函数时间服务器夏令时()内置的中缺少这一点,它只提供时间夏令时()对于本地计算机。此外,附加的标头 mqh 文件还包括一些其他有用的服务器绑定时间相关函数,特别是允许您了解您的经纪商通常是否使用 DST 开关。
所有这些都是基于对经纪人报价历史的实证分析。整个想法在算法交易书中的有关部分进行了描述夏令时 (夏令时)。 简而言之,该方法分析每周开放时间的统计数据并推断经纪商的 GMT 偏移量。偏移统计中的两个不同的最大值,如果它们映射到相邻时间,很可能对应于标准(“冬季”)和夏令时(“夏季”)时间。
实际上这个脚本是书中脚本的精炼和扩展版本。具体来说,2024年10月以来的版本包括一个重要的错误修复:每周交易的开盘时间是由美国市场检测的,而美国市场本身就受到美国时区夏令时切换的影响(EST、UTC-5、标准冬令时<--> EDT、UTC-4、夏令时),这就是为什么消除美国夏令时的影响以获得全年连续的自然时间流很重要——这就是修复中所做的。所有的功劳都归于阿姆拉利。

请注意,在北半球和南半球,时区调整方向相反:在北半球,“春季”(三月或四月)增加 1 小时,“秋季”(十月或 11 月)减去 1 小时,而在南半球则相反(因为所有季节都互换了)。
由于分析的特殊性,建议运行最具流动性的外汇代码(通常是 EURUSD)的代码。
这是 API:
// 服务器时区和 DST 当前信息 结构体服务器时区 // 根据一周开放时间历史分析{ 整数偏移GMT; // 本周相对于 UTC/GMT 的时区偏移(以秒为单位) 整数偏移夏令时; // 以秒为单位的 DST 修正(根据 MQL5,包含在 offsetGMT 中) 布尔值支持夏令时; // 在引号中检测 DST 更改};// 根据 H1 报价历史估算服务器时区和 DST 模式服务器时区 TimeServerZone( 常量 日期时间服务时间=0, // 默认情况下,当前时间,但可以指定过去的某个时刻 常量 整数阈值=阈值, 常量 双倍的查找年份 =0.0,// 默认情况下,所有可用的柱,否则 3 年似乎就足够了 常量 细绳符号=无效的) // 默认情况下,当前图表的交易品种 // 估计服务器时间 DST 模式修正(以秒为单位) 整数时间服务器夏令时(常量 日期时间服务时间=0, 常量 整数阈值=阈值,常量 双倍的查找年份 =0.0,常量 细绳符号=无效的);// 估计服务器时区偏移(以秒为单位) 整数时间服务器GMT偏移历史记录(常量 日期时间服务时间=0, 常量 整数阈值=阈值,常量 双倍的查找年份 =0.0,常量 细绳符号=无效的);// 估计服务器是否启用 DST(true/false) 布尔值支持时间服务器夏令时(常量 日期时间服务时间=0, 常量 整数阈值=阈值,常量 双倍的查找年份 =0.0,常量 细绳符号=无效的);// 交易服务器的 TimeGMTOffset() 函数的模拟,以秒为单位的差异 整数时间服务器GMTOffset();// TimeGMT() - TimeTradeServer()
功能 时间服务器夏令时(), 时间服务器GMT偏移历史记录(), TimeServerDaylightSavingsSupported()只是包装 时间服务器区域(),因此,如果您需要多个特征,最好使用后一个特征并从结构中读取值 服务器时区。
所有这些函数都将服务器时间作为您想要获取相应特征(当前或过去)的第一个参数。如果服务器时间留为0(默认),则返回当前时刻的结果。
第二个参数阈值允许您调整算法的灵敏度。默认情况下,它是 52/4,即做出决策所需统计数据的四分之一(检测时区,而不会受到假期前后几周的可能干扰)。另一方面,此设置会阻止及时检测临时时区更改(如果您的经纪商决定在某个时候这样做)。您可能需要将阈值设置为 0,以便算法尽快检测到任何更改。
功能 时间服务器GMT偏移()不使用历史分析,而是直接通过 MQL5 函数计算偏移量(如 TimeGMT() - TimeTradeServer())。
请注意,该函数使用与 MQL5 内置函数相同的偏移表示法时间 GMT 偏移()函数,即正时区(例如 GMT+3)用负偏移量(例如 -10800)表示,反之亦然。这种表示法被其他一些编程语言使用,例如 JaveScript,但也有其他语言,它们用正偏移量表示正时区,用负偏移量表示负时区。仔细检查你的算法。
测试脚本将所有获取的数据输出到日志中,例如:
1 ~ 内置功能 ~时间本地()=2024.10。05 00:39:01/ 好的时间当前()=2024.10。05 00:38:59/ 好的时间交易服务器()=2024.10。05 00:39:01/ 好的时间GMT()=2024.10。04 21:39:01/ 好的时间GMT偏移()=-10800/ 好的时间夏令时()=0/ 好的 2 ~ 内置功能的附加 ~ 时间服务器GMTOffset()=-10800/ 好的 3 ~ 根据历史上一周的开放时间利用 DST 估算服务器 TZ ~ TimeServerDaylightSavings()=-3600/ 好的 [偏移GMT] [偏移夏令时] [支持夏令时] [0] -10800 -3600 真的
在这种情况下,检测到服务器当前处于 DST 模式,而本地计算机则不是。
请记住,本地计算机和服务器的系统时钟通常会显示略有不同的时间(秒甚至分钟),即使它们位于同一时区。另请注意,内置时间交易服务器()函数返回一个合成的日期时间:这是服务器的时间,具有每小时的精度,但它继承了本地时钟的小时内分数。在 MQL5 中这样做是为了简化时区之间的转换 -时间本地(),时间GMT()也以“本地格式”返回,以及交易服务器时间。
您可以启用预处理器指令分析的数据的详细打印:
#定义PRINT_DST_DETAILS 应将其放在代码中之前,包括:
#包括“时间服务器DST.mqh”
以下是日志中详细信息的示例:
得到20023H1 酒吧,~第834章天 每周开放时间统计:30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 54 0时区变化(UTC±X 周开始之前/之后): [周开始] [之前] [DSTb] [之后] [DSTa] [0]2021.07。25 00:00:00-2147483648 错误的 -1 错误的[1]2021.11。08 00:00:00 0 真的 0 错误的[2]2022.03。14 00:00:00 0 错误的 0 真的[3]2022.11。07 00:00:00 0 真的 0 错误的[4]2023.03。13 00:00:00 0 错误的 0 真的[5]2023.11。06 00:00:00 0 真的 0 错误的[6]2024.03。11 00:00:00 0 错误的 2 错误的 3检测到不同时区在引号,1夏令时候选人 服务器时间偏移:UTC+2性病 TimeServerDaylightSavings()=-3600/ 好的
请随意在您的环境中运行该脚本并在讨论中发布生成的日志。
2024.10.10 - 错误修复:在主要分析之前,美国 DST 开关(干扰营业时间统计)已从时间线中删除。
2024.10.27 - 添加感兴趣的服务器时间和每周最低统计阈值作为所有函数的参数;时间服务器GMTOffsetEmpiric()被重命名为时间服务器GMT偏移历史记录()。
2024.10.29 - 小错误修正,将请求的时间纳入查找周期。
2024.10.30 - 修复了 TimeZoneChange 数组中的夏令时;现在从 srvtime 参数执行查找(如果已指定)。
2024.11.01 - 添加了应用于贵金属时的计算自动调整,这可以在美国 DST 和欧盟 DST 时间表不同步期间提供更可靠的结果。
2024.11.04 - 完善夏令时开关开启/关闭的在线检测。
2024.11.07 - 添加了对指标或经济事件回测历史记录的批量请求的时区/DST 更改的缓存。
2024.11.08 - 通过小型代码重构优化缓存性能。
2024.11.16 - 对 amrali 从金属推导的时间戳进行 1 小时调整。
2024.11.17 - amrali 进行的重构和修复:消除了周末期间在线请求的缓存重建,添加了 48 小时前瞻以检测周末期间的 TZ 更改(可能存在 DST 转换),周日 00:00 用作时区的边界(而不是一周的第一条)。
2024.11.20 - 默认阈值更改为 1(及时检测时区变化与消除非标准周(例如假期后)误报之间的平衡);添加了一组新的时间格式化函数,包括时区偏移和 DST(查看 TimeZoneFmt.mqh);其他小的改进。
附件下载
📎 prtf.mqh (1.49 KB)
📎 mqlerror.mqh (8.53 KB)
📎 datetime.mqh (2.56 KB)
📎 timeserverdst.mqh (15.66 KB)
📎 timezonefmt.mqh (3.35 KB)
📎 timezoneshistory.mq5 (4.56 KB)
Source: MQL5 #52557
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
