欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

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

author emer | 823 人阅读 | 0 人评论 |

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

Local Timezones and Local Session Hours - library for MetaTrader 5

你好,交易者。

该库具有获取特定或所有外汇市场当前当地时间的所有功能。您可以将时区之间的本地时间转换为经纪商的服务器时间。您还可以通过分别设置每个会话的会话开始和结束时间来在特定会话中进行交易。该库将处理经纪商和这些市场的不同时间偏移和夏令时变化。这减轻了您每次编写必须处理时区和本地会话时间的智能交易系统或技术指标时重新发明轮子的负担。

时区定义为标准时间,具体取决于该地点的地理代表性。换句话说,时区是指基于地球自转的特定地区的当地时间。它是在 UTC(协调世界时)中定义的,该标准是协调世界各区域时间的标准。

例如 - 纽约时间比格林威治时间晚 5 小时,根据日光表示为 UTC-5 或 UTC-4。悉尼时间比格林威治时间早 10 小时,根据日光(夏季或冬季)表示为 UTC+10 或 UTC+11。术语 UTC 和 GMT 通常可以互换使用来表示偏移量,因此 UTC+2 和 经常 GMT+2 具有相同的含义。 

如果时区在 GMT 以东,则 UTC 偏移量为正;如果时区在 GMT 以西,则 UTC 偏移量为负。

Local Timezones and Local Session Hours - library for MetaTrader 5

//+------------------------------------------------------------------+
//|时区标识符                                           |
//+------------------------------------------------------------------+
枚举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());

输出:

  // ========== 设置时区的本地时间 ==========  // 纽约    :  2021.07.15 09:31 |星期四,2021 年 7 月 15 日 09:31:00 GMT-4 [纽约](夏令时)  // 纽约    :  2022.01.23 17:04 | 2022 年 1 月 23 日,星期日 17:04:00 GMT-5 [纽约]  // >>错误:纽约不存在时间 2023.03.12 02:21。这是因为夏令时跳过了一小时。

我们收到的最后一条错误消息的原因将在下一段中解释。

DST 是一种季节性时间变化措施,其中时钟在一年中的部分时间设置得比标准时间早。

看 https://www.timeanddate.com/time/dst/transition.html

(《夏天的跳过》、《冬天的回风》)

当春季夏令时开始时,我们的时钟会提前一定的时间,通常是一小时。这意味着时钟上跳过了一小时。在秋季,夏令时通常结束,我们的时钟再次调回标准时间。

(不存在的时间)

在美国,DST 始终从当地时间 02:00(凌晨 2 点)开始。当时间首次达到标准时间 1:59:59 时,时钟将向前跳至 3:00:00 夏令时。所以2:00:00到2:59:59这段时间在切换当晚不存在。

Local Timezones and Local Session Hours - library for MetaTrader 5

让我们看一个示例,展示如何获取时区名称、UTC 偏移量和当前 DST 偏移量(如果 DST 生效)。

  打印"\n========== UTC 偏移量和当前 DST 偏移量 ===========");

  为了(ENUM_ZONE_ID ID =0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();// 填充当前时区信息      打印格式“%-12s:GMT%+g | DST%+g”, tz.Name(), tz.时间GMT偏移()/3600., 兹.时间夏令时()/3600.);
     }

输出:

  // ========== UTC 偏移量和当前 DST 偏移量 ==========  // 悉尼      :GMT+11 |夏令时+1  // 东京       : GMT+9 |夏令时+0  // 法兰克福:GMT+1 |夏令时+0  // 伦敦      :GMT+0 |夏令时+0  // 纽约    :GMT-4 |夏令时+1  // UTC         : GMT+0 |夏令时+0  // 主页        : GMT+2 |夏令时+0  // FXOpen-MT5  : GMT+2 |夏令时+0

笔记:

- 时间GMT偏移() 方法返回该时区的本地时间和 GMT 时间之间的当前差异(以秒为单位),并考虑到切换到冬季或夏季时间。返回的偏移量包括当前时区的 DST 调整。如果时区位于 GMT 以东(早于),则 GMT 偏移量为正;如果时区位于 GMT 以西(晚于),则 GMT 偏移量为负。

- 时间夏令时() 如果已在 DST 生效的区域切换到夏令时,则方法会返回夏令时 (DST) 调整(以秒为单位)。如果已切换到冬季(标准)时间(或者,如果时区不支持 DST),则返回 0。 dst 调整已经是 TimeGMTOffset 的一部分。

让我们看一个例子来展示如何获取 DST 信息。

  打印"\n========== 当年夏令时切换时间 ===========");

  日期时间目标开始,目标结束;

  为了(ENUM_ZONE_ID ID =0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();// 填充当前时区信息      //--- 仅适用于遵守夏令时的时区。      如果(tz.GetDaylightSwitchTimes(dst_start, dst_end))
        {
        打印格式“%-12s:夏令时于 %s 开始 | 夏令时于 %s 结束”, tz.Name(),字符串时间(目标开始),字符串时间(dst_结束));
        }
     }

输出:

  // ========== 当年夏令时切换时间 ==========  // 悉尼      :  夏令时于 2024 年 4 月 7 日 03:00 开始 |  夏令时于 2024.10.06 02:00 结束  // 法兰克福   :  夏令时于 2024 年 3 月 31 日 02:00 开始 |  夏令时于 2024.10.27 03:00 结束  // 伦敦      :  夏令时于 2024 年 3 月 31 日 01:00 开始 |  夏令时于 2024.10.27 02:00 结束  // 纽约    :  夏令时于 2024 年 3 月 10 日 02:00 开始 |  夏令时于 2024.11.03 02:00 结束

3. 下次夏令时切换时间

让我们看一个例子来展示如何获取下一次夏令时切换的时间。

  打印"\n========== 下一次夏令时切换时间 ==========");

  为了(ENUM_ZONE_ID ID=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      日期时间nxswitch = tz.GetDaylightNextSwitch();

      //--- 仅适用于遵守夏令时的时区。      如果(nx开关)
        {
        打印格式“%-12s:时间:%s | dstNextSwitch:%s”, tz.Name(),字符串时间(兹。时间本地()),字符串时间(nx开关));
        }
     }

输出:

  // ========== 下一次夏令时切换时间 ==========  // 悉尼      :  时间: 2024.02.28 21:58 |  dstNextSwitch: 2024.04.07 03:00  // 法兰克福   :  时间: 2024.02.28 11:58 |  dstNextSwitch: 2024.03.31 02:00  // 伦敦      :  时间: 2024.02.28 10:58 |  dstNextSwitch: 2024.03.31 01:00  // 纽约    :  时间: 2024.02.28 05:58 |  dstNextSwitch: 2024.03.10 02:00


让我们看一个示例,展示如何获取该库中所有时区多年来的 DST 信息。

  打印"\n========== 夏令时列表 ==========");

  日期时间目标开始,目标结束;
  整数增量开始,增量结束;  // 时钟变化(以秒为单位)  为了(ENUM_ZONE_ID ID =0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo 时区(id);

      打印格式“========= %s 夏令时 (DST) ==========, timezone.Name());
      为了整数年=2008年;年<=2030年;年++)
        {
        //--- 仅适用于遵守夏令时的时区。        如果(CTimeZoneInfo::GetDaylightSwitchTimes(id, 年, dst_start, dst_end))
           {
            CTimeZoneInfo::GetDaylightSwitchDeltas(id, 年, delta_start, delta_end);

            打印格式“夏令时于 %s (%+d) 开始,于 %s (%+d) 结束”,字符串时间(dst_start), delta_start/3600,字符串时间(dst_end), delta_end/3600);
           }
        }

     }

输出:

  // ========== 夏令时列表 ==========  // ========= 悉尼夏令时间 (DST) =========  // DST 开始于 2008.04.06 03:00 (-1) 结束于 2008.10.05 02:00 (+1)  // DST 开始于 2009.04.05 03:00 (-1) 结束于 2009.10.04 02:00 (+1)  // 夏令时开始于 2010.04.04 03:00 (-1) 结束于 2010.10.03 02:00 (+1)  // DST 开始于 2011.04.03 03:00 (-1) 结束于 2011.10.02 02:00 (+1)  // DST 开始于 2012.04.01 03:00 (-1) 结束于 2012.10.07 02:00 (+1)  // ...  // ...  // ...

5. 服务器 GMT 偏移量(当前)

经纪商的 GMT 偏移量表示经纪商时间比 GMT 早多少秒,经纪商偏移量 = TimeTradeServer() - TimeGMT()。正值表示服务器时间早于 GMT。 让我们看一个例子来展示如何获取经纪商当前的 GMT 偏移量。

  打印"\n========== 经纪商当前 GMT 偏移量 ========== ");

   CTimeZoneInfo 经纪人(ZONE_ID_BROKER);
   经纪人.RefreshTime();

  打印“姓名()          : ”, 经纪人.Name());
  打印“时间本地()    :”,经纪人。时间本地());  // 经纪人时间  打印“ToString()      :”, 经纪人.ToString());
  打印“时间 GMT 偏移():”,经纪人。时间GMT偏移());

输出:

  // ========== 经纪商当前 GMT 偏移量 ==========  // 名称()          : ICMarketsSC-Demo  // TimeLocal()     : 2024.03.08 06:33:06  // ToString()      :星期五,2024 年 3 月 08 日 06:33:06 GMT+2 [ICMarketsSC-演示]  // 格林威治标准时间偏移() : 7200

笔记:重要说明 时间 GMT 偏移() 就是它 将返回 utc 偏移量,包括夏令时校正 (UTC+DST)。 正值表示服务器时间早于 GMT(以东)。

服务器过去的 GMT 偏移量可以计算为图表上服务器周第一个柱的出现时间与周日下午 5 点对应的 UTC 时间之间的差值,纽约时间。 让我们看一个例子来展示如何获取经纪商过去的 GMT 偏移量。在此示例中,我们将使用图表蜡烛的时间作为经纪商的过去时间。

  打印"\n========== 经纪商过去的 GMT 偏移量(蜡烛图)============);

  日期时间酒吧时代[];
  整数复制=复制时间象征(),PERIOD_D1,D'2022.03.18',9,酒吧时间);
  如果(已复制<=0)
      打印“CopyTime() 失败。”);

  为了整数我=0;我<复制;我++)
     {
      日期时间t = bartimes[i];

      CTimeZoneInfo 经纪人(ZONE_ID_BROKER);
      经纪人.SetLocalTime(t);

      打印格式“栏 #%i 时间:%s | 偏移量:%5d (GMT%+g) | %s”,
                  我+1,
                  字符串时间(经纪人。时间本地()),
                  经纪人。时间GMT偏移(),
                  经纪人。时间GMT偏移()/3600.0,
                  经纪人.ToString());
     }

输出:

  // ========== 经纪商过去的 GMT 偏移量(蜡烛图)==========  // 柱 #1 时间: 2022.03.08 00:00 |  偏移量:7200 (GMT+2) |  2022 年 3 月 08 日星期二 00:00:00 GMT+2 [ICMarketsSC-演示]  // 柱 #2 时间: 2022.03.09 00:00 |  偏移量:7200 (GMT+2) |  2022 年 3 月 09 日星期三 00:00:00 GMT+2 [ICMarketsSC-演示]  // #3 栏 时间: 2022.03.10 00:00 |  偏移量:7200 (GMT+2) |  2022 年 3 月 10 日星期四 00:00:00 GMT+2 [ICMarketsSC-演示]  // #4 栏 时间: 2022.03.11 00:00 |  偏移量:7200 (GMT+2) |  2022 年 3 月 11 日星期五 00:00:00 GMT+2 [ICMarketsSC-演示]  // 栏 #5 时间: 2022.03.14 00:00 |  偏移量:10800 (GMT+3) |  2022 年 3 月 14 日星期一 00:00:00 GMT+3 [ICMarketsSC-演示]  // #6 栏 时间: 2022.03.15 00:00 |  偏移量:10800 (GMT+3) |  2022 年 3 月 15 日星期二 00:00:00 GMT+3 [ICMarketsSC-演示]  // #7 栏 时间: 2022.03.16 00:00 |  偏移量:10800 (GMT+3) |  2022 年 3 月 16 日星期三 00:00:00 GMT+3 [ICMarketsSC-演示]  // #8 栏时间: 2022.03.17 00:00 |  偏移量:10800 (GMT+3) |  2022 年 3 月 17 日星期四 00:00:00 GMT+3 [ICMarketsSC-演示]  // #9 时间: 2022.03.18 00:00 |  偏移量:10800 (GMT+3) |  2022 年 3 月 18 日星期五 00:00:00 GMT+3 [ICMarketsSC-演示]

正如,你看到的 酒吧#5, 服务器已从+2冬令时切换为+3夏令时,切换时间遵循美国夏令时时间表(3月第二个星期日)。 每周有五根 D1 蜡烛,周六和周日不点蜡烛。 这 这些服务器上的时间全年始终比纽约早 7 小时,并表示为 NY+7。注意 纽约冬季为-5,夏季为-4

这是代码库上第一个能够确定服务器过去的 GMT 偏移量(历史 GMT 偏移量)的库。计算中实现的算法非常快速和准确,并且尽可能与不同的经纪商兼容(在具有不同 GMT 偏移量或 DST 时间表的大量经纪商上进行了测试)。

使用转换本地时间()方法将此时区实例的设置本地时间转换为特定时区。此方法返回给定时区的新时间。

让我们看一个例子来展示如何转换“当前的" 本地时间到特定时区。

  打印"\n========== 将悉尼当前当地时间转换为纽约 ===========");

   CTimeZoneInfo 悉尼(ZONE_ID_SYDNEY);
   悉尼.RefreshTime();

  日期时间当地时间=悉尼。时间本地();
  日期时间转换 = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

  打印格式“%s | %s”,字符串时间(当地时间), sydney.ToString());
  打印格式“%s | %s”,字符串时间(转换), CTimeZoneInfo::FormatTimeForPlace(转换, ZONE_ID_NEWYORK));

输出:

  // ========== 将悉尼当前当地时间转换为纽约 ==========  // 2024.02.28 21:58 |星期三,2024年2月28日 21:58:50 GMT+11 [悉尼](夏令时)  // 2024.02.28 05:58 |星期三,2024 年 2 月 28 日 05:58:50 GMT-5 [纽约]


让我们看一个例子来展示如何将特定的本地时间转换为特定的时区。

  打印"\n========== 将悉尼具体当地时间转换为纽约 ===========");

   CTimeZoneInfo 悉尼(ZONE_ID_SYDNEY);
   悉尼.SetLocalTime(D'2016.05.21 14:47:08');

  日期时间当地时间=悉尼。时间本地();
  日期时间转换 = sydney.ConvertLocalTime(ZONE_ID_NEWYORK);

  打印格式“%s | %s”,字符串时间(当地时间), sydney.ToString());
  打印格式“%s | %s”,字符串时间(转换), CTimeZoneInfo::FormatTimeForPlace(转换, ZONE_ID_NEWYORK));

输出:

  // ========== 将悉尼特定当地时间转换为纽约 ==========  // 2016.05.21 14:47 | 2016年5月21日星期六 14:47:08 GMT+10 [悉尼]  // 2016.05.21 00:47 | 2016 年 5 月 21 日星期六 00:47:08 GMT-4 [纽约](夏令时)


让我们看一个例子来展示如何将所有时区的当前本地时间转换为代理时间。

  打印"\n========== 将所有时区的当前本地时间转换为经纪商时间==========");

  为了(ENUM_ZONE_ID ID =0; id <= MAX_ZONE_ID; id++)
     {
      日期时间本地时间 = CTimeZoneInfo::GetCurrentTimeForPlace(id);
      日期时间转换 = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER);

      打印格式“%-49s | %s”, CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER));
     }

输出:

  // ========== 将所有时区的当前本地时间转换为代理时间==========  // 星期三,2024 年 2 月 28 日 21:58:50 GMT+11 [悉尼](夏令时)    | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 星期三,2024 年 2 月 28 日 19:58:50 GMT+9 [东京]            | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 星期三,2024 年 2 月 28 日 11:58:50 GMT+1 [法兰克福]        | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 星期三,2024 年 2 月 28 日 10:58:50 GMT+0 [伦敦]           | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 星期三,2024 年 2 月 28 日 05:58:50 GMT-5 [纽约]         | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 2024 年 2 月 28 日星期三 10:58:50 GMT+0 [UTC]              | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 星期三,2024 年 2 月 28 日 12:58:50 GMT+2 [主页]             | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]  // 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]       | 2024 年 2 月 28 日星期三 12:58:50 GMT+2 [FXOpen-MT5]


请注意,使用父级C时区信息类,而不是C会话时间类,不是首选,因为它需要更多编码,因此容易出错。让我们看一个示例来展示如何获取所有时区的外汇交易时间,并将其转换为经纪商的时间。

  打印"\n======= 本地会话时间(CTimeZoneInfo 类)=======");

  常量ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY、ZONE_ID_TOKYO、ZONE_ID_FRANKFURT、ZONE_ID_LONDON、ZONE_ID_NEWYORK};

  为了整数我=0;我 <数组大小(ID);我++)
     {
      ENUM_ZONE_ID id = ids[i];

      CTimeZoneInfo tz(id);
      tz.RefreshTime();

      日期时间当地时间 = tz.时间本地();

      //--- 将会话时间设置为当地时间上午 8:00 - 下午 5:00      日期时间开始本地 =字符串转时间字符串时间(当地时间,TIME_DATE) +” “+“08:00”);
      日期时间终端本地 =字符串转时间字符串时间(当地时间,TIME_DATE) +” “+“17:00”);

      //--- 转换为经纪人时间      tz.SetLocalTime(beginlocal);
      日期时间beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      tz.SetLocalTime(endlocal);
      日期时间endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      //--- 时区中的本地星期几      Mql日期时间英石;
      构建时间(当地时间,st);
      整数道指 = st.day_of_week;

      //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? “打开”:“关闭”;      细绳state_str = ((道!=周六&& 道!=星期日) && (时间交易服务器() >= 开始经纪人 &&时间交易服务器() < 终端经纪人)) ?“打开”“关闭”;

      打印格式“%-12s:  %s |  %s  [会话 %s]”, tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

  打印“———————————”);
  打印“经纪人时间:  ”,时间交易服务器());
  打印“经纪人时间:  ”, CTimeZoneInfo::FormatTimeForPlace(时间交易服务器(), ZONE_ID_BROKER));

输出:

  // ======= 本地会话时间(CTimeZoneInfo 类) =======  // 悉尼      :  周三,2024 年 2 月 28 日 23:00:00 GMT+2 [FXOpen-MT5] |  星期四,2024 年 2 月 29 日 08:00:00 GMT+2 [FXOpen-MT5]  [会话已结束]  // 东京       :  周三,2024 年 2 月 28 日 01:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 10:00:00 GMT+2 [FXOpen-MT5] [会议已结束]  // 法兰克福   :  星期三,2024 年 2 月 28 日 09:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 18:00:00 GMT+2 [FXOpen-MT5]  [会话开放]  // 伦敦      :  周三,2024 年 2 月 28 日 10:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 19:00:00 GMT+2 [FXOpen-MT5]  [会话开放]  // 纽约    :  周三,2024 年 2 月 28 日 15:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 29 日星期四 00:00:00 GMT+2 [FXOpen-MT5]  [会话开放]  // -----------------------------------  // 经纪商时间 :  2024.02.28 15:32:30  // 经纪商时间 :  星期三, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]


   目的:访问指定地点的本地交易时段的类。

    源自类C时区信息

   笔记:新的默认会话时间设置为当地时间上午 8:00 至下午 5:00C会话时间对象。可以根据需要覆盖这些默认值。

让我们看一个如何使用该对象的示例。

  打印“\n========== 使用 CSessionHours 对象  ==========”);

   CSessionHours tz(ZONE_ID_SYDNEY);
   tz.RefreshTime();// 填充时区和会话信息  //--- 来自父级  打印“姓名()                : ”, tz.Name());
  打印“TimeUTC()             :”, tz.TimeUTC());
  打印“TimeLocal()           :”, 兹。时间本地());
  打印“ToString()            :”, tz.ToString());
  //--- 来自课堂  打印“开始本地时间()      :”, tz.BeginLocalTime());
  打印“EndLocalTime()        :”, tz.EndLocalTime());
  打印“检查本地会话()  :”, tz.CheckLocalSession());
  打印“SecRemainingSession():”, tz.SecRemainingSession());
  打印“SecondsToString()    :”, CSessionHours::SecondsToString(tz.SecRemainingSession()));

输出:

  // ========== 使用 CSessionHours 对象  ==========  // 名称()                : 悉尼  // TimeUTC()             : 2024.02.28 10:58:50  // TimeLocal()           : 2024.02.28 21:58:50  // ToString()            :星期三,2024 年 2 月 28 日 21:58:50 GMT+11 [悉尼](夏令时)  // BeginLocalTime()      : 2024.02.28 08:00:00  // EndLocalTime()        : 2024.02.28 17:00:00  // CheckLocalSession()   : false  // SecRemainingSession() : 0  // SecondsToString()     : 00:00:00


这 C会话时间用更少的代码提供更多的功能。让我们看一个例子来展示如何使用以下方法获取所有时区的外汇交易时间C会话时间类,并将它们转换为经纪人的时间。请注意,转换为经纪商时间是可选步骤,而不是必需的 用于检查每个会话的开始和结束时间。 

  打印"\n======= 本地会话时间(CSessionHours 类)=======");

  常量ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY、ZONE_ID_TOKYO、ZONE_ID_FRANKFURT、ZONE_ID_LONDON、ZONE_ID_NEWYORK};

  为了整数我=0;我 <数组大小(ID);我++)
     {
      ENUM_ZONE_ID id = ids[i];

      CSessionHours tz(id);
      tz.RefreshTime();

      //--- 默认会话时间设置为当地时间上午 8:00 - 下午 5:00      日期时间beginlocal = tz.BeginLocalTime();
      日期时间endlocal = tz.EndLocalTime();

      //--- 转换为经纪人时间      日期时间beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER);
      日期时间endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER);

      细绳state_str = tz.CheckLocalSession() ?“开放,结束于”+ CSessionHours::SecondsToString(tz.SecRemainingSession()) :“关闭”;

      打印格式“%-12s:  %s |  %s  [会话 %s]”, tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str);
     }

  打印“———————————”);
  打印“经纪人时间:  ”,时间交易服务器());
  打印“经纪人时间:  ”, CTimeZoneInfo::FormatTimeForPlace(时间交易服务器(), ZONE_ID_BROKER));
  打印“外汇收盘价:  ”, CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER));
  整数sec = CSessionHours::SecRemainingForex();
  打印“结束于:  ”, 秒,“秒=”, CSessionHours::SecondsToString(sec));

输出:

  // ======= 本地会话时间(CSessionHours 类)=======  // 悉尼      :  周三,2024 年 2 月 28 日 23:00:00 GMT+2 [FXOpen-MT5] |  星期四,2024 年 2 月 29 日 08:00:00 GMT+2 [FXOpen-MT5]  [会话已结束]  // 东京       :  周三,2024 年 2 月 28 日 01:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 10:00:00 GMT+2 [FXOpen-MT5] [会议已结束]  // 法兰克福   :  星期三,2024 年 2 月 28 日 09:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 18:00:00 GMT+2 [FXOpen-MT5] [会议开始,于 02:27:29 结束]  // 伦敦      :  周三,2024 年 2 月 28 日 10:00:00 GMT+2 [FXOpen-MT5] |  2024 年 2 月 28 日星期三 19:00:00 GMT+2 [FXOpen-MT5] [会议开始,于 03:27:29 结束]  // 纽约    :  周三,2024 年 2 月 28 日 15:00:00 GMT+2 [FXOpen-MT5] |  星期四,2024 年 2 月 29 日 00:00:00 GMT+2 [FXOpen-MT5] [会话开始,于 08:27:29 结束]  // -----------------------------------  // 经纪商时间 :  2024.02.28 15:32:30  // 经纪商时间 :  星期三, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]  // 外汇收盘价    :  星期六, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5]  // 结束时间:  203249 秒 = 2d 08:27:29


让我们看一个示例来展示如何覆盖默认会话时间C会话时间班级。

  打印"\n============ 覆盖默认会话时间============");

   CSessionHours 法兰克福(ZONE_ID_FRANKFURT);

  // 更改默认会话时间   法兰克福.BeginLocalTime(9,0);
   法兰克福.EndLocalTime(19,0);

   法兰克福.RefreshTime();// 填充新的会话时间  日期时间beginlocal = 法兰克福.BeginLocalTime();
  日期时间endlocal = 法兰克福.EndLocalTime();

  打印格式“新的会话时间:  %s | %s”, CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT));
  打印格式“当前当地时间:  %s”, 法兰克福.ToString());

输出:

  // =========== 覆盖默认会话时间 ===========  // 新的会议时间  :  星期三,2024 年 2 月 28 日 09:00:00 GMT+1 [法兰克福] | 2024 年 2 月 28 日星期三 19:00:00 GMT+1 [法兰克福]  // 当前当地时间 :  星期三, 2024.02.28 11:58:50 GMT+1 [法兰克福]


SecRemainingForex()静态方法将返回本周外汇市场收盘前的剩余时间(以秒为单位)。该方法应该从OnTick() 事件处理程序(或更好地从 定时器() 如果周末之前没有蜱虫出现) 反复检查关闭情况。让我们看一个例子来说明如何检查周末的平仓情况。

  打印"\n======== 检查周末平仓情况========);

  整数InpH小时 =2;  // 周末前几个小时  整数Inp分钟 =30;  // 周末前几分钟  整数sec = CSessionHours::SecRemainingForex();
  打印格式“距离周末还剩时间:%s”, CSessionHours::SecondsToString(sec));
  打印格式“如果剩余时间变为 %s 或更少,则关闭全部。”, CSessionHours::SecondsToString(InpHours *3600+ Inp分钟 *60));

  // 检查剩余时间是否达到目标  如果(秒 <= InpH 小时 *3600+ Inp分钟 *60)
     {
      // 关闭全部();     }

或者,可以使用绝对时间检查先前的条件:

  // 检查经纪人的时间是否达到目标  如果时间交易服务器() >= CSessionHours::ForexCloseTime() - (InpHours *3600+ Inp分钟 *60))
     {
      // 关闭全部();     }

输出:

  // ======= 检查周末平仓情况 =======  // 距离周末还有时间 : 3d 03:32:27  // 如果剩余时间变为 02:30:00 或更短,则关闭所有。


外汇市场于纽约时间周日 17:00 开市(冬季为 GMT-5,夏季为 GMT-4),并于周五同一时间关闭。 纽约市的开放时间对应于 世界标准时间 (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 小时的差异。 这 外汇平仓时间() 方法通过将纽约周五 17:00 的收盘时间转换为经纪商的时间来处理这些经纪商之间和经纪商内部的变化,考虑到 时间偏移和夏令时,从而提供准确的结果。

因此,使用 +2 时区(美国时间表中夏季为 +3)意味着每周有 5 个 D1 蜡烛。全年周六、周日不点蜡烛。简单地, 这些服务器上的时间始终比纽约早 7 小时,并表示为 NY+7。到目前为止,这是最常见的设置,但还有许多不太常见的变化。

示例指标 TestIndi.mq5

Local Timezones and Local Session Hours - library for MetaTrader 5

iForexSessions - MetaTrader 5脚本

外汇市场交易亮点

在这里获取 https://www.mql5.com/en/code/48842

世界时钟: https://www.timeanddate.com/worldclock/

时区转换器: https://www.timeanddate.com/worldclock/converter-classic.html

2024.03.01 - v.1.40:删除了 CTimeZoneInfo 类中的冗余代码(在测试期间使用),向 CSessionHours 类添加了更多方法,更新了 TestIndi.mq5 以反映新的更改。

2024.03.03 - v.1.45:更新了“使用本地会话时间 - CTimeZoneInfo 类”的示例代码。

2024.03.08 - v.1.50 :添加了两个内部方法历史经纪商抵消 和周第一柱 到 CTimeZoneInfo 类。处理过去的服务器时间(UTC 偏移、文本格式、转换等)。

2024.03.15 - v.1.56:添加了脚本“SydneySession_Script.mq5”以显示悉尼的会话时间全年如何波动。

2024.03.30 - v.1.65:修复了经纪商 GMT 偏移。目前,该库仅扫描 GOLD 图表上的 H1 柱,因为它在我测试过的所有经纪商中具有最准确的开始时间。

2024.04.01 - v.1.67:修复了交易周第一个小时内经纪商 GMT 偏移量计算中的潜在问题。

2024.04.03 - v.1.70:将经纪商 GMT 偏移量缓存到哈希映射中,以便更快地检索(例如,从指标)。经纪商抵消缓存每个交易周将包含一个条目。

2024.04.08 - v.1.72:将库的性能提高了至少 2-3 倍。现在在内部使用 StructToTime 而不是 StringToTime获得第N个周日 方法。

2024.04.09 - v.1.75:修复了圣诞节假期期间 GMT+0 经纪商计算经纪商 GMT 偏移量的潜在问题。

2024.04.11 - v.1.77:加速获取日光切换时间 方法。现在使用静态数组来记住当年的切换时间。

2024.04.12 - v.1.80:修复了不提供黄金交易的经纪商 GMT 抵消计算中的问题。

2024.04.15 - v.1.82:添加设置自定义时区CTimeZoneInfo 类的方法,您可以使用它来配置具有指定名称、GMT 偏移量和 DST 标识符的内置自定义时区。可以通过 ZONE_ID_CUSTOM 访问自定义时区。

2024.04.16 - v.1.85:将 GetNthSunday 内部方法替换为更优化的 GetMonthTime 方法。

2024.04.17 - v.1.87 :用更优化的方法替换了 TimeYear 内部方法获取年份 方法。

2024.04.18 - v.1.88 :添加了创建日期时间 从日期组件(年、月和日)构造日期时间值的内部方法。这比调用 StructToTime 函数快 100-120 倍。

2024.10.22 - v.1.93:在周末实时交易中更快地确定服务器的 GMT 偏移量。

2024.10.26 - v.1.95 :添加了两个新的静态方法:时间 GMT 偏移()时间夏令时()。重命名为历史经纪商抵消() 方法时间服务器GMT偏移()。

2024.10.28 - v.1.97:将所有处理时间的宏转换为函数,以避免宏体内参数的双重计算。其他行中的更多代码清理。

2024.10.30 - v.1.98:修复了某些经纪商的 XAUEUR 报价中 GMT 偏移估计错误的问题。

2024.11.01 - v.1.99:添加了一个选项来关闭默认加载黄金符号以估计服务器的 TZ/DST。称呼C时区信息::设置使用GoldSymbol()与“false”一起使用当前图表的符号。

2024.11.13 - v.2.00:改进了在线服务器 tz/dst 和策略策略中的估计(不再需要 TimeGMT 库)。构造函数接受地点和时间参数。用于处理日期时间类型数据的新公共方法。改进的错误处理和调试支持。

2024.11.14 - v.2.02:修复了尝试通过服务器时区对象访问 XAUUSD、H1 报价历史记录时出现的错误 ERR_HISTORY_NOT_FOUND (4401)。

2024.11.17 - v.2.03:小错误修复。

2024.11.23 - v.2.04:小改进和错误修复。

2024.12.05 - v.2.05 :添加了新的静态方法 DaylightSavingsSupported(placeId)。

2024.12.12 - v.2.10:改进了 HistoryServerGMTOffset() 和 HistoryServerDaylightSavings() 函数的性能,以及其他细微的代码更改。

2024.12.14 - v.2.11:改进了 FindSymbol() 函数的性能。

2024.12.17 - v.2.12:进一步优化 HistoryServerGMTOffset() 和 HistoryServerDaylightSavings() 函数。

2024.12.24 - v.2.13:修复了 HistoryServerGMTOffset() 和 HistoryServerDaylightSavings() 函数中的潜在问题。

2025.01.12 - v.2.15:修复了 HistoryServerDaylightSavings() 中搜索早于策略测试器中加载历史记录的报价历史记录的问题。

2025.10.13 - v.2.17:小改进和错误修复。


附件下载

📎 TimeZoneInfo.mqh (121.12 KB)

📎 SessionHours.mqh (17.48 KB)

📎 print_times.mq5 (1.7 KB)

📎 examples.mq5 (67.07 KB)

📎 TestIndi.mq5 (14.95 KB)

📎 server_tz_changes.mq5 (7.85 KB)

Source: MQL5 #48419

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录