本地时区和本地会话时间 - MetaTrader 5 库








你好,交易者。
该库具有获取特定或所有外汇市场当前当地时间的所有功能。您可以将时区之间的本地时间转换为经纪商的服务器时间。您还可以通过分别设置每个会话的会话开始和结束时间来在特定会话中进行交易。该库将处理经纪商和这些市场的不同时间偏移和夏令时变化。这减轻了您每次编写必须处理时区和本地会话时间的智能交易系统或技术指标时重新发明轮子的负担。
时区定义为标准时间,具体取决于该地点的地理代表性。换句话说,时区是指基于地球自转的特定地区的当地时间。它是在 UTC(协调世界时)中定义的,该标准是协调世界各区域时间的标准。
例如 - 纽约时间比格林威治时间晚 5 小时,根据日光表示为 UTC-5 或 UTC-4。悉尼时间比格林威治时间早 10 小时,根据日光(夏季或冬季)表示为 UTC+10 或 UTC+11。术语 UTC 和 GMT 通常可以互换使用来表示偏移量,因此 UTC+2 和 经常 GMT+2 具有相同的含义。
如果时区在 GMT 以东,则 UTC 偏移量为正;如果时区在 GMT 以西,则 UTC 偏移量为负。
//+------------------------------------------------------------------+ //|时区标识符 | //+------------------------------------------------------------------+ 枚举ENUM_ZONE_ID { ZONE_ID_SYDNEY, // 悉尼 ZONE_ID_TOKYO, // 东京 ZONE_ID_FRANKFURT, // 法兰克福 ZONE_ID_LONDON, // 伦敦 ZONE_ID_NEWYORK, // 纽约 ZONE_ID_UTC, // 世界标准时间 ZONE_ID_LOCAL, // 当地的 ZONE_ID_BROKER, // 经纪人 ZONE_ID_CUSTOM // 风俗 };
//+------------------------------------------------------------------+ //| CTimeZoneInfo 类。 | //|目的:类获取指定的当地时间 | | //| 位置以及时区信息、时间 | //| 本年度的变化。 | //| | //|库中使用的偏移表示法: | //| 请注意,图书馆表示正时间 | //| 正偏移量区域和负时区 | //| 通过负偏移量。 | //| 相反,MQL5 的内置 TimeGMTOffset() | //| 函数表示正时区,例如 GMT+3, | //| 负偏移量,例如-10800,反之亦然。 | //+------------------------------------------------------------------+ 班级C时区信息 {民众: CTimeZoneInfo( ENUM_ZONE_ID placeId,日期时间pLocalTime = TIME_NOW ); ~CTimeZoneInfo(空白); 细绳 姓名(空白); // 返回时区名称 细绳 转字符串(布尔值秒=真的,布尔值兹名称 =真的); // 返回用 TZ/DST 偏移量和 tzname 格式化的本地时间字符串 布尔值 刷新时间(空白); // 刷新当前本地时间并填充时区信息 布尔值 设置本地时间(日期时间pLocalTime = TIME_NOW ); // 设置该位置的当地时间为指定时间 日期时间 时间本地(空白); // 返回时区中的本地时间 日期时间 时间UTC(空白); // 返回UTC时间(所有时区相同) 整数 时间GMT偏移(空白); // 正时区(例如,GMT+3)为正值,否则为负值。 (包括夏令时) 整数 时间夏令时(空白); // 返回设置本地时间时区的 DST 校正(以秒为单位)。 日期时间 ConvertLocalTime( ENUM_ZONE_ID 目的地Id ); // 将该时区的本地时间转换为其他时区的本地时间 布尔值 获取日光切换时间(日期时间&dst_开始,日期时间&dst_结束); // 获取当年夏令时的开始和结束时间 日期时间 获取日光下一个开关(空白); // 获取下次夏令时切换的当地时间 空白 打印对象(空白); //--- 不需要创建对象的静态方法。 静止的 日期时间 GetCurrentTimeForPlace ( ENUM_ZONE_ID 地点Id ); // 获取指定时区的当前本地时间 静止的 细绳 地点格式时间 (日期时间时间,ENUM_ZONE_ID 地点Id,布尔值秒=真的,布尔值兹名称 =真的); 静止的 日期时间 转换时间为地点 (日期时间时间、ENUM_ZONE_ID 地点Id、ENUM_ZONE_ID 目的地Id ); 静止的 整数 时间GMT偏移 ( ENUM_ZONE_ID 地点 ID,日期时间时间= TIME_NOW ); // 返回给定当地时间的时区相对于 GMT 的总 tz 偏移量 (UTC+DST) 静止的 整数 时间夏令时 ( ENUM_ZONE_ID 地点 ID,日期时间时间= TIME_NOW ); // 返回给定当地时间的时区的夏令时校正(以秒为单位) 静止的 布尔值 IsDaylightSavingTime (ENUM_ZONE_ID placeId,日期时间时间= TIME_NOW ); // 检查指定时间是否属于夏令时 静止的 布尔值 GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId,整数我年,日期时间&dst_开始,日期时间&dst_结束); 静止的 布尔值 GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId,整数我年,整数&delta_start,整数&delta_end); 静止的 布尔值 设置自定义时区(细绳姓名,整数基本 GMT 偏移量 =0, // 定义库中未找到的时区。 ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC ); 静止的 空白 设置使用GoldSymbol(布尔值启用 =真的); // 设置使用黄金符号来估计服务器 TZ/DST 的选项 };
//+------------------------------------------------------------------+ //| CSessionHours 类。 | //|目的:访问本地交易时段的类 | //| 指定位置。 | //| 派生自类 CTimeZoneInfo。 | //|注意: 默认会话时间设置为上午 8:00 至下午 5:00 | //| 新 CSessionHours 对象的当地时间。 | //+------------------------------------------------------------------+ 班级CSessionHours :民众C时区信息 {民众: CSessionHours( ENUM_ZONE_ID placeId ); ~CSessionHours(空白); //--- 访问本地会话时间的方法 布尔值 刷新时间(空白); // 刷新当前当地时间和当天的会话时间 布尔值 设置本地时间(日期时间p本地时间); //--- 覆盖默认本地会话时间的方法 布尔值 开始本地时间(整数小时,整数p 分钟 ); // 使用开始小时和分钟设置本地会话开始时间 布尔值 结束本地时间(整数小时,整数p 分钟 ); // 使用结束小时和分钟设置本地会话结束时间 //--- 访问本地会话时间的方法 日期时间 开始本地时间(空白); 日期时间 结束本地时间(空白); 布尔值 检查本地会话(空白); // 检查本地交易时段当前是否活跃。 整数 秒剩余会话(空白); // 距离当天本地会话关闭的剩余时间(以秒为单位)。 //--- 不需要创建对象的静态方法。 静止的 日期时间 外汇收盘时间(空白); // 本周外汇市场休市的经纪商时间。 静止的 整数 剩余外汇秒数(空白); // 本周外汇市场收盘剩余时间(以秒为单位)。 };
请注意,该库表示 正时区 正偏移量,负时区和负偏移量。
这与 MQL5 的内置 TimeGMTOffset() 函数相反,该函数用负偏移量(例如 -10800)表示正时区(例如 GMT+3),反之亦然。
默认情况下,该库将搜索并加载 XAUUSD 符号以估计服务器的时区偏移。在美国 DST 和欧盟 DST 时间表不同步期间(3 月和 10 月下旬),XAUUSD 可以提供更可靠的结果(尤其是对于遵循欧盟 DST 时间表的经纪商)。或者,如果您的经纪商遵循美国 DST 时间表,或者根本没有时间表,那么使用图表符号也可以。使用“false”调用 CTimeZoneInfo::SetUsingGoldSymbol() 以使用当前图表的交易品种,而不是 XAUUSD。
要确定经纪商的夏令时 (DST) 时间表,您可以使用此脚本 https://www.mql5.com/en/code/48650
//+------------------------------------------------------------------+ //|设置使用 XAUUSD(黄金)符号来估算 | 的选项 //|通过分析 H1 报价历史记录来确定服务器的 TZ/DST。 | //| TRUE :搜索并加载黄金符号(默认行为)。 | //| FALSE:使用当前图表的交易品种。 | //+------------------------------------------------------------------+ 空白CTimeZoneInfo::SetUsingGoldSymbol(常量 布尔值启用 =真的);
笔记:
作为 XAUUSD 在外汇交易后一小时开始的副作用,夏令时切换将在一小时后发生(仅在策略测试器中,而不是在正常模式下)。
在策略测试器中进行测试期间, 时间GMT() 总是等于 时间交易服务器() 模拟服务器时间。
TimeZoneInfo 库通过分析 H1 报价历史记录,根据“真实”GMT 来估计时区的正确时间,而不是根据调用内置 TimeGMT 函数返回的时间。
如果使用 XAUUSD 交易品种来估计服务器的 TZ/DST,则策略测试器中将在一小时后发生 dst 切换。
这 刷新时间() 方法将更新当前当地时间的时区。 让我们看一个例子来展示如何获取当前时间。
打印("\n========== 获取时区的当前时间 ==========="); CTimeZoneInfo tz(ZONE_ID_TOKYO); tz.RefreshTime();// 填充当前时区信息 打印(“姓名() : ”, tz.Name()); 打印(“时间本地():”, 兹。时间本地()); 打印(“ToString() :”, tz.ToString());
输出:
// ========== 获取时区的当前时间 ========== // Name() :东京 // TimeLocal() : 2024.02.28 19:58:50 // ToString() :星期三,2024 年 2 月 28 日 19:58:50 GMT+9 [东京]
您需要更多信息吗?
打印("\n========== 有关时区的更多信息 ==========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); tz.RefreshTime(); 打印("Name() : ", tz.Name()); 打印("TimeUTC() : ", tz.TimeUTC()); 打印(“时间本地() :“,兹。时间本地()); 打印(“时间GMT偏移() :“,兹。时间GMT偏移()); 打印(“时间夏令时() :“,兹。时间夏令时()); 打印("ToString() : ", tz.ToString()); 日期时间目标开始,目标结束; tz.GetDaylightSwitchTimes(dst_start, dst_end); 打印("dst_start : ", dst_start); 打印("dst_end : ", dst_end); 打印("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());
输出:
// ========== 有关时区的更多信息 ========== // Name() : 纽约 // TimeUTC() : 2024.03.17 16:50:38 // TimeLocal() : 2024.03.17 12:50:38 // TimeGMTOffset() : -14400 // TimeDaylightSavings() : 3600 // ToString() : 星期日,2024 年 3 月 17 日 12:50:38 GMT-4 [纽约](夏令时) // dst_start : 2024.03.10 02:00:00 // dst_end : 2024.11.03 02:00:00 // 获取DaylightNextSwitch() : 2024.11.03 02:00:00
笔记:
- 时间UTC()方法返回 UTC 时间,相当于 GMT 时间。
- 时间本地()方法返回该时区的本地时间(可能因调用而改变)刷新时间或者设置本地时间方法)。
- 时间GMT偏移()方法返回该时区的本地时间和 GMT 时间之间的当前差异(以秒为单位),并考虑到切换到冬季或夏季时间。返回的偏移量包括当前时区的 DST 调整。如果时区位于 GMT 以东(早于),则 GMT 偏移量为正;如果时区位于 GMT 以西(晚于),则 GMT 偏移量为负。
-时间夏令时()如果已在 DST 生效的区域切换到夏令时,则方法会返回夏令时 (DST) 调整(以秒为单位)。如果已切换到冬季(标准)时间(或者,如果时区不支持 DST),则返回 0。 dst 调整已经是 TimeGMTOffset 的一部分。
CTimeZoneInfo 类包括设置自定义时区方法,您可以使用该方法来配置内置的自定义时区。稍后,可以通过 ZONE_ID_CUSTOM 标识符使用自定义时区。 让我们看一个示例,展示如何将内置自定义时区配置为指定名称、格林威治标准时间 (GMT) 的偏移量和夏令时标识符。
打印("\n========== 配置内置自定义时区 =========="); 细绳 名称 =“自定义+3”; // 自定义时区名称 整数 基本GMT偏移=10800; // 自定义时区的基本 GMT 偏移量(以秒为单位) ENUM_ZONE_ID daylightRuleId = ZONE_ID_LONDON; // 自定义时区的 DST 时间表 布尔值成功 = CTimeZoneInfo::SetCustomTimeZone(名称, baseGMTOffset, daylightRuleId); 打印(“参数‘名称’ :”, 姓名); 打印(“参数‘baseGMTOffset’:”, 基本 GMT 偏移); 打印(“参数‘daylightRuleId’:”,枚举转字符串(日光规则ID)); 打印(“SetCustomTimeZone() 返回:”, 成功);
输出:
// ========== 配置内置自定义时区 ========== // 参数'名称' : Custom+3 // 参数“baseGMTOffset”:10800 // 参数“daylightRuleId”:ZONE_ID_LONDON // SetCustomTimeZone() 返回:true
让我们看一个例子来展示如何获取所有时区的当前当地时间。
打印("\n========== 获取所有时区的当前时间 ==========="); 为了(ENUM_ZONE_ID ID=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); 打印格式(“%-12s: %s | %s”, tz.Name(),字符串时间(兹。时间本地()), tz.ToString()); }
输出:
// ========== 获取所有时区的当前时间 ========== // 悉尼 : 2024.02.28 21:58 |星期三,2024年2月28日 21:58:50 GMT+11 [悉尼](夏令时) // 东京 : 2024.02.28 19:58 | 2024 年 2 月 28 日星期三 19:58:50 GMT+9 [东京] // 法兰克福 : 2024.02.28 11:58 | 2024 年 2 月 28 日星期三 11:58:50 GMT+1 [法兰克福] // 伦敦 : 2024.02.28 10:58 | 2024 年 2 月 28 日星期三 10:58:50 GMT+0 [伦敦] // 纽约 : 2024.02.28 05:58 |星期三,2024 年 2 月 28 日 05:58:50 GMT-5 [纽约] // 世界标准时间 : 2024.02.28 10:58 | 2024 年 2 月 28 日星期三 10:58:50 GMT+0 [UTC] // 首页 : 2024.02.28 12:58 | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [主页] // FXOpen-MT5 : 2024.02.28 12:58 | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]
这可以使用静态方法以其他方式完成获取当前地点时间()。另外,请注意还有另一个静态方法格式化时间为地点()可用于格式化纯 mql日期时间变量到字符串 (类似于 字符串时间) 但包含工作日、日期、时间、时区名称和偏移量。这些静态方法不需要创建对象来调用它们。
打印("\n========== GetCurrentTimeForPlace() ============"); 为了(ENUM_ZONE_ID ID =0; id <= MAX_ZONE_ID; id++) { 日期时间时间 = CTimeZoneInfo::GetCurrentTimeForPlace(id); 打印格式(“时间 : %s | %s”,字符串时间(时间), CTimeZoneInfo::FormatTimeForPlace(时间, id)); }
输出:
// ========== GetCurrentTimeForPlace() ========== // 时间 : 2024.02.28 21:58 |星期三,2024年2月28日 21:58:50 GMT+11 [悉尼](夏令时) // 时间 : 2024.02.28 19:58 | 2024 年 2 月 28 日星期三 19:58:50 GMT+9 [东京] // 时间 : 2024.02.28 11:58 | 2024 年 2 月 28 日星期三 11:58:50 GMT+1 [法兰克福] // 时间 : 2024.02.28 10:58 | 2024 年 2 月 28 日星期三 10:58:50 GMT+0 [伦敦] // 时间 : 2024.02.28 05:58 |星期三,2024 年 2 月 28 日 05:58:50 GMT-5 [纽约] // 时间 : 2024.02.28 10:58 | 2024 年 2 月 28 日星期三 10:58:50 GMT+0 [UTC] // 时间 : 2024.02.28 12:58 | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [主页] // 时间 : 2024.02.28 12:58 | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]
这 设置本地时间() 方法将设置 指定当地时间。让我们看一个示例来展示如何设置时区的本地时间。
打印("\n========== 设置时区的本地时间 ==========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); 如果(tz.设置本地时间(D'2021.07.15 09:31')) 打印格式(“%-12s: %s | %s”, tz.Name(),字符串时间(兹。时间本地()), tz.ToString()); 如果(tz.设置本地时间(D'2022.01.23 17:04')) 打印格式(“%-12s: %s | %s”, tz.Name(),字符串时间(兹。时间本地()), tz.ToString()); 如果(tz.设置本地时间(D'2023.03.12 02:21')) 打印格式(“%-12s: %s | %s”, tz.Name(),字符串时间(兹。时间本地()), tz.ToString());
