- 显示:
- 390
- 等级:
- 已发布:
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
本脚本介绍了内置函数中缺少的TimeServerDaylightSavings() 函数,这些内置函数只为本地计算机提供TimeDaylightSavings ()。此外,所附的 mqh 文件头还包含其他一些有用的服务器绑定时间相关函数,特别是允许您了解您的经纪商是否使用 DST 开关。
所有这些都基于对经纪商历史报价的经验分析。整个思路在算法交易书中有关夏令时(DST)的章节中有所描述。 简而言之,该方法分析一周开放时间的统计数据,并推断出经纪商的格林尼治标准时间偏移。如果偏移量统计中的两个明显最大值映射到相邻的小时数,那么这两个最大值很可能分别对应标准时间("冬令时")和夏令时("夏令时")。
实际上,这个脚本是书中介绍的脚本的改进和扩展版本。具体来说,2024 年 10 月以后的版本包含一个重要的错误修复:每周交易的开盘时间由美国市场检测,而美国市场本身受美国时区 DST 切换的影响(EST,UTC-5,标准冬令时 <-->EDT,UTC-4,夏令时),这就是为什么必须消除美国 DST 的影响,以获得全年连续的自然时间流--这就是修复中所做的。这一切都归功于amrali。

请注意,南北半球的时区调整方向是相反的:北半球在 "春季"(3 月或 4 月)增加 1 小时,在 "秋季"(10 月或 11 月)减少 1 小时,而南半球则相反(因为所有季节都对调了)。
由于分析的特殊性,建议运行流动性最强的外汇交易代码,通常是欧元兑美元。
下面是应用程序接口:
// 服务器时区和 DST 当前信息 struct ServerTimeZone //根据每周开放时间的历史分析 { int offsetGMT; // 时区偏移量(以秒为单位)与当前周的 UTC/GMT 相比 int offsetDST; // 以秒为单位的 DST 校正(根据 MQL5,包含在 offsetGMT 中) bool supportDST; // 在引号中检测到夏令时变化 }; // 根据 H1 报价历史记录估算服务器时区和 DST 模式 ServerTimeZone TimeServerZone( const datetime srvtime = 0, // 默认为当前时间,但也可指定过去某一时刻 const int threshold = THRESHOLD, const double lookupYears = 0.0, // 默认情况下,所有可用的条形图,否则 3 年似乎就足够了 const string symbol = NULL) // 默认情况下,当前图表的符号 // 估计服务器时间 DST 模式校正(以秒为单位) int TimeServerDaylightSavings(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 估计服务器时区偏移(以秒为单位) int TimeServerGMTOffsetHistory(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 估计服务器是否启用了 DST(真/假) bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0, const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL); // 类似于贸易服务器的 TimeGMTOffset() 函数,差值以秒为单位 int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()
函数TimeServerDaylightSavings()、TimeServerGMTOffsetHistory ()、TimeServerDaylightSavingsSupported () 只是 TimeServerZone() 的封装器,因此如果需要多个特性,最好使用后一个特性,并从结构ServerTimeZone 中读取值。
所有这些函数的第一个参数都是服务器时间,在这个时间点上可以获取相应的特征值(现在或过去)。如果服务器时间为 0(默认值),则返回当前时刻的结果。
2-nd 参数阈值可以调整算法的灵敏度。默认情况下,阈值为 52/4,即做出决定所需的统计量的四分之一(在检测时区时不会受到节假日前后短周的干扰)。另一方面,这种设置也会阻碍对临时时区变化的及时检测(如果您的经纪商在某些时候决定这样做)。您可能希望将阈值设为 0,以便让算法尽快检测到任何变化。
函数TimeServerGMTOffset() 不使用历史分析,而是直接通过 MQL5 函数(如TimeGMT() - TimeTradeServer())计算偏移量。
请注意,此函数使用与 MQL5 内置TimeGMTOffset() 函数相同的偏移量符号,即正时区(如 GMT+3) 用负偏移量(如 -10800)表示,反之亦然。其他一些编程语言(如 JaveScript)也使用这种符号,但也有其他语言用正偏移量表示正时区,用负偏移量表示负时区。请仔细检查您的算法。
例如,测试脚本会将获取的所有数据输出到日志中:
1 ~ Built-in functions ~ TimeLocal()=2024.10.05 00:39:01 / ok TimeCurrent()=2024.10.05 00:38:59 / ok TimeTradeServer()=2024.10.05 00:39:01 / ok TimeGMT()=2024.10.04 21:39:01 / ok TimeGMTOffset()=-10800 / ok TimeDaylightSavings()=0 / ok 2 ~ Add-on over built-in functions ~ TimeServerGMTOffset()=-10800 / ok 3 ~ Estimation of server TZ with DST based on week opening hours in history ~ TimeServerDaylightSavings()=-3600 / ok [offsetGMT] [offsetDST] [supportDST] [0] -10800 -3600 true
在这种情况下,检测到服务器当前处于 DST 模式,而本地计算机不是。
请记住,本地计算机和服务器的系统时钟显示的时间通常会略有不同(秒甚至分钟),即使它们位于同一时区。还请注意,内置TimeTradeServer() 函数会返回一个合成日期时间:它是服务器的时间,精确到小时,但它继承了本地时钟的小时内分数。在 MQL5 中这样做是为了简化时区之间的转换 -TimeLocal()、TimeGMT( ) 返回的也是 "本地格式",以及交易服务器时间。
您可以通过预处理器指令启用详细的分析数据打印功能:
#define PRINT_DST_DETAILS 该指令应放在代码中的 include 之前:
#include "TimeServerDST.mqh"
以下是日志中详细内容的示例:
Got 20023 H1 bars, ~834 days Week opening hours stats: 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 54 0 Time Zone changes (UTC±X before/after weekstart): [weekstart] [before] [DSTb] [after] [DSTa] [0] 2021.07.25 00:00:00 -2147483648 false -1 false [1] 2021.11.08 00:00:00 0 true 0 false [2] 2022.03.14 00:00:00 0 false 0 true [3] 2022.11.07 00:00:00 0 true 0 false [4] 2023.03.13 00:00:00 0 false 0 true [5] 2023.11.06 00:00:00 0 true 0 false [6] 2024.03.11 00:00:00 0 false 2 false 3 different timezones detected in quotes, 1 DST candidates Server time offset: UTC+2 STD TimeServerDaylightSavings()=-3600 / ok
请在您的环境中运行脚本,并在讨论中发布结果日志。
更新内容
2024.10.10 - 错误修复:美国夏令时开关(干扰营业时间统计)在主要分析前从时间轴中删除。
2024.10.27 - 为所有函数添加了感兴趣的服务器时间和最小每周统计阈值作为参数;TimeServerGMTOffsetEmpiric() 更名为TimeServerGMTOffsetHistory()。
2024.10.29 - 小 bug 修复,将请求时间纳入查询周期。
2024.10.30 - 修复了 TimeZoneChange 数组中的 DST;如果指定了 srvtime 参数,现在将根据该参数进行查找。
2024.11.01 - 在应用于贵金属时添加了计算自动调整功能,在美国夏令时和欧盟夏令时不同步的几周内可提供更可靠的结果。
2024.11.04 - 改进了 DST 开关的在线检测。
2024.11.07 - 为指标或经济事件回溯测试历史上的批量请求添加时区/DST 变更缓存。
2024.11.08 - 通过小型代码重构优化缓存性能。
2024.11.16 - 对 amrali 从金属推导出的时间戳进行 1 小时调整。
2024.11.17 - 由 amrali 进行的重构和修复:消除了周末期间在线请求的缓存重建,增加了 48 小时前瞻以检测周末期间的时区变化(可能的 DST 转换),使用周日 00:00 作为时区边界(而非一周的第一小节)。
2024.11.20 - 默认阈值改为 1(在及时发现时区变化和消除非标准周(如节假日后)的误报之间取得平衡);新增一组用于时间格式化的函数,包括时区偏移和 DST(查看 TimeZoneFmt.mqh);其他小的改进。
由MetaQuotes Ltd译自英文
原代码: https://www.mql5.com/en/code/52557
Simplest Logger class for MetaTrader 5
MetaTrader 5 中最简单的日志类,支持级别、信息格式、包含和排除子串过滤器。
Ascending Sort A Struct Array By A Field Example
这是一个按字段对结构列表升序排序的示例。你可以根据使用目的找出并定制上述算法,这是最基本的示例,也是解决结构数组中排列问题的一个方向。 本例中使用的算法是快速排序和合并排序。
Custom crosshair cursor with synchronization
同步自定义十字线指标,显示价格和(服务器/本地)时间。
Perfect Seconds Chart
Perfect Seconds(完美秒数)图表指标允许您将实时数据的分钟蜡烛图转换成秒数。1. 可选择任意秒数,以准确的时间收盘。2. 这是基于实时 OHLC 汇率的数据,即使没有 ticks 也能正常工作。无需外部 DLL,可在 VPS 上顺利运行 4.代码快速优化 5.支持加密货币对,如 BInance、Kucoin 和所有其他交易所的期货实时图表,可轻松转换为秒数。6. 支持所有类型的符号,如黄金和外汇货币对。删除符号和汇率的选项。