文章 "处理时间(第二部分):函数" - 页 3

 

你好,我是@Carl Schreiber

你写的文章很棒,对我帮助很大。我只想告诉你我在使用你的代码后发现了什么。

我使用的是 eightcap 经纪商,我试着用一个简单的脚本来显示各个国家的实际时间,结果发现东京时间比实际时间晚了 1 个小时。下面是我使用的脚本、

void OnStart()
  {
   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }

   Alert("+++++++++++++++");
   checkTimeOffset(TimeCurrent());
   datetime tGMT  = TimeCurrent() + OffsetBroker.actOffset;    // GMT
   datetime tNY   = tGMT - (NYShift+DST_USD);                  // 纽约时间
   datetime tLon  = tGMT - (LondonShift+DST_EUR);              // 伦敦时间
   datetime tSyd  = tGMT - (SidneyShift+DST_AUD);              // 在悉尼的时间
   datetime tMosc = tGMT - (MoskwaShift+DST_RUS);              // 莫斯科时间
   datetime tTok  = tGMT - (TokyoShift);                       // 东京时间 - 无夏令时

   Alert("time NY: ", tNY);
   Alert("time Lon: ", tLon);
   Alert("time Syd: ", tSyd);
   Alert("time Tok: ", tTok);
  }

代码是从文章中复制粘贴过来的,我只是返回其中的值。我认为我使用代码的方式没有问题,因为其他会话是正确的。

Carl Schreiber
Carl Schreiber
  • 2023.03.22
  • www.mql5.com
Trader's profile
 
Luandre Ezra #:

你好,我是@卡尔-施赖伯

你写的文章很棒,对我帮助很大。我只想告诉你我在使用你的代码后的发现。

我使用的是 eightcap 经纪商,我试着用一个简单的脚本来显示各个国家的实际时间,结果发现东京时间比实际时间晚了 1 个小时。下面是我使用的脚本、

代码是从文章中复制粘贴过来的,我只是返回其中的值。我认为我使用代码的方式没有问题,因为其他会话是正确的。

从格林尼治标准时间(=UTC)算起,时间差为 0900 小时(从https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo 算起)

= 9*-3600=32400 秒:

这就是设置:

#define  TokyoShift   -32400                           // 始终为 9h
Current local time in Tokyo, Japan
  • www.worldtimeserver.com
Current local time and date in Tokyo, Japan from a trusted independent resource
 
Carl Schreiber #:

格林尼治标准时间(=UTC)的时差为 0900 小时(从https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo)

= 9*-3600=32400 秒:

这就是设定值:

我犯了个错误不是东京,而是悉尼。


 
可能是澳大利亚 DST 开关的计算有问题--我会查查的,谢谢。
Time Zones - WorldTimeServer.com
  • www.worldtimeserver.com
A list of all worldwide time zones with abbreviation and name. Click on a time zone to see more details.
 

Australian First Sunday of October at 02:00 to First Sunday of April at 02:00

澳大利亚 DST 2010 开始 2010.10.03 - 结束 2010.04.04
澳大利亚 DST 2011 开始 2011.10.02 - 结束 2011.04.03
澳大利亚 DST 2012 开始 2012.10.07 - 结束 2012.04.01
澳大利亚 DST 2013 开始 2013.10.06 - 结束 2013.04.07
澳大利亚 DST 2014 开始 2014.10.05 - 结束 2014.04.06
Australian DST 2015 start 2015.10.04 - end 2015.04.05
Australian DST 2016 start 2016.10.02 - end 2016.04.03
Australian DST 2017 start 2017.10.01 - end 2017.04.02
Australian DST 2018 start 2018.10.07 - end 2018.04.01
Australian DST 2019 start 2019.10.06 - end 2019.04.07
Australian DST 2020 start 2020.10.04 - end 2020.04.05
Australian DST 2021 start 2021.10.03 - end 2021.04.04
Australian DST 2022 start 2022.10.02 - end 2022.04.03
Australian DST 2023 start 2023.10.01 - end 2023.04.02
Australian DST 2024 start 2024.10.06 - end 2024.04.07
Australian DST 2025 start 2025.10.05 - end 2025.04.06
Australian DST 2026 start 2026.10.04 - end 2026.04.05
Australian DST 2027 start 2027.10.03 - end 2027.04.04
Australian DST 2028 start 2028.10.01 - end 2028.04.02
Australian DST 2029 start 2029.10.07 - end 2029.04.01

Australia & New Zealand End DST
Australia & New Zealand End DST
  • www.timeanddate.com
People in New Zealand and parts of Australia will get an additional hour to enjoy when Daylight Saving Time (DST) ends on Sunday, April 2, 2023.
 

我发现了问题所在:我漏掉了一项检查

void checkTimeOffset(datetime tB) 函数的开头,我做了一个检查:

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR)
      return;  

我不得不将其改为

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR && tB < nxtSwitch_AUD)
      return;  

我会更新的...

 
Carl Schreiber 支票:

void checkTimeOffset(datetime tB) 函数的开头,我做了一个检查:

我不得不将其改为

我将更新它...

卡尔,很遗憾,更改相应的代码并不能解决问题。我还发现莫斯科时间与世界时间不同。


 

文章 "处理时间(第 2 部分):函数" (https://www.mql5.com/en/articles/9929) 中的DealingWithTime.mqh 1.01 版不再工作,因为在这篇文章发表一段时间后,MQ 更改了CopyTime() 函数的行为。现在,如果未来时间值大于为 start_time 和/或 stop_time 参数指定的TimeCurrent(),该函数将不再返回未来时间值。取而代之的是,当前最后一栏的开盘时间将作为最大可能值返回。

由于外汇交易时段的结束时间是以这种方式确定的,以便除其他外确定经纪商时间的偏移量,因此现在会导致不正确的值!

2.03 版对这一计算方法进行了修改。这个新版本现在可以在代码库中找到 https://www.mql5.com/en/code/45287。

时间转换的计算方法也进行了全面修改,因此现在也涵盖了从悉尼(澳大利亚)到 20 世纪 70 年代的复杂时间转换。

随信还附有DST 1975 - 2030.xlsx 表的压缩文件,其中包含自 70 年代以来的所有时间变化,以便每个人都能检查公式的正确运作,以下是该表的一个示例系列:

1982 年 1 月 1 日是美国的冬令时(DST==0),下一次转换是 1982 年 4 月 25 日,即 4 月(4)日的最后一个星期日(每月 25 日)。表格已根据地理时区(A 列)排序,然后根据年份时区(L 列,spr= 春季,aut= 秋季)排序,最后根据查询日期(C 列)排序。如果在调试模式下运行 Test_DST 2.mq5, 并在调试器中复制日志行并将其粘贴到电子表格程序中,则表格可由内含的EA 自动创建(脚本无法在 调试模式下运行)。

此外,现在还有一个新的简单函数SecTillClose(),它能以秒(MQ 的时间货币)为单位显示外汇市场关闭前的剩余时间,而无需CopyTime()。这对那些想在周末前平仓或不想在周末前的规定时间内开新仓的人来说很有意义。

附带的DealingWithTime_TestIndi.mq5 指标不仅在图表上以注释形式显示欧洲、美国和澳大利亚(悉尼)的夏/冬令时,还显示当前时间和各城市的时差。您还可以在这里找到一个表格,其中包含各大城市的不同当地时间,例如可以与https://www.timeanddate.com/worldclock/ 进行 比较。因此,您可以随时查看这些数值。该指标还显示了这些值是如何确定和使用的(减去什么或加上什么),以便于您自己使用--复制和粘贴,这是最快捷的编程方式。

最后两行还显示了当前外汇时段的最后一秒,以及以小时(更容易判断)和秒为单位的剩余时间。如果纽约外汇交易时段在周五当地时间 17:00 关闭,则没有开盘时间为纽约时间 17:00 的有效条形图。因此,在此函数中要减去 1 秒钟,以获得最后一栏在经纪商时间内的最后有效开盘时间。不过,有些经纪商会提前几分钟结束其外汇交易时段,不再提供价格,也不再接受交易订单。


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

文章《处理时间(第 2 部分)》中的DealingWithTime.mqh v. 1.01 版本:函数 (https://www.mql5.com/zh/articles/9929) 停止工作是因为 MQ 在本文发表后的一段时间内更改了CopyTime() 函数的行为。现在,如果未来时间值大于为 start_time 和/或 stop_time 参数指定的TimeCurrent(),该函数将不再返回未来时间值。取而代之的是,当前最后一栏的开仓时间将作为最大可能值返回。

由于外汇交易时段的结束时间是以这种方式确定的,以便确定经纪商时间偏移量,因此现在会导致不正确的值!

这种计算方法在 2.03 版中进行了修改。这个版本现在可以在代码库中找到: https://www.mql5.com/zh/code/45287

此外,时间变化的计算方法也进行了彻底改变,现在已经涵盖了从悉尼(澳大利亚)回到 70 年代的复杂时间变化。

另外,我们还附上了DST 1975 - 2030.xlsx 表的压缩文件,其中包含自 70 年代以来的所有时间变化,以便每个人都能检查公式是否正确,下面是该表的一个示例系列:

1982 年 1 月 1 日是美国的标准时间(DST==0),下一次转换将在 1982 年 4 月 25 日,即 4 月(4)日的最后一个星期日(每月 25 日)。该表已按地理时区排序(A 列),然后按年份时区排序(L 列,spr= 春季,aut= 秋季),最后按查询日期排序(C 列)。如果在调试模式下运行 Test_DST 2.mq5, 并在调试器中复制日志行并将其粘贴到电子表格中,则该表可由随附的EA 自动创建(脚本无法在 调试模式下运行);单元格分隔符为空格。

此外,现在还有一个新的简单函数SecTillClose(),它以秒(MQ 的时间货币)为单位显示外汇市场关闭前的剩余时间--无需CopyTime()。这对那些想在周末前平仓或不想在周末前的规定时间内开新仓的人来说很有意义。

附带的指标DealingWithTime_TestIndi.mq5 作为图表注释,不仅显示欧洲、美国和澳大利亚(悉尼)的夏令时,还显示当前时间和不同城市的时差。在这里,您可以找到一张主要城市不同当地时间的比较表:https://www.timeanddate.com/worldclock/。因此,您可以随时查看这些数值。该指标还显示了这些值是如何确定和使用的(从什么中减去什么或加上什么),使您自己使用起来更方便--复制和粘贴,这是编程的最快形式。

最后两行还显示了当前外汇时段的最后一秒,以及以小时(更容易判断)和秒为单位的剩余时间。在纽约,当周五当地时间下午 5:00 外汇交易时段关闭时,纽约时间下午 5:00 没有有效的交易栏打开。因此,在该函数中,要减去 1 秒钟,才能得到经纪商时间内最后一栏的最后有效开仓时间。不过,有些经纪商会提前几分钟结束外汇交易时段,不再提供价格,也不再接受交易订单。


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

文章 "管理时间表(第 2 部分)"中的DealingWithTime.mqh v. 1.01 版本:函数" (https://www.mql5.com/zh/articles/9929 ) 中的 DealingWithTime. mqh v. 1. 01 版本不再工作,因为 MetaQuotes 更改了CopyTime() 的 行为,现在它们在本文发表一段时间后不再工作。现在,如果未来时间值大于为 start_time 和/或 stop_time 参数指定的TimeCurrent(),该函数将不再返回未来时间值。取而代之的是,当前最后一栏的开仓时间将作为最大可能值返回。

由于外汇交易时段的结束时间是通过这种方式来确定经纪商的时间偏移量的,因此现在会导致不正确的值!

这一计算方法在 2.03 版中进行了修改。该版本可在代码库中找到: https://www.mql5.com/en/code/45287

此外,时间变化的计算方法也进行了全面修改,因此从悉尼(澳大利亚)到 20 世纪 70 年代的复杂时间变化现在都包括在内了。

此外,还附上了DST 1975 - 2030.xlsx 表(压缩文件),其中包含自 20 世纪 70 年代以来的所有时间变化,以便每个人都能验证公式的正确性,下面是该表的一些示例:

1982 年 1 月 1 日是美国的标准时间(DST==0),下一次变化将是 1982 年 4 月 25 日,即 4 月份的最后一个(每月 25 日)星期日(4)。该表已按地理时区排序(A 列),然后按年份时区排序(L 列,spr= 春季,aut= 秋季),最后按查询日期排序(C 列)。如果在调试模式下运行 Test_DST 2.mq5, 并将日志行复制到调试器中,然后粘贴到电子表格中,则该表可由内含的EA 自动创建(脚本无法在 调试模式下运行);单元格分隔符为空格。

此外,现在还有一个简单的新函数SecTillClose( ),无需CopyTime(),就能以秒(MetaQuotes 时间货币)为单位显示外汇市场收盘前的剩余时间。这对于那些想在周末前平仓或不想在周末前的规定时间内开立新头寸的人来说很有意义。

附带的指标DealingWithTime_TestIndi.mq5 作为图表注释,不仅显示欧洲、美国和澳大利亚(悉尼)的夏令时,还显示当前时间和各城市的时差。在这里,您可以找到一份主要城市不同当地时间的比较表:https://www.timeanddate.com/worldclock/。因此,您可以随时查看这些数值。该指标还显示了如何确定和使用这些数值(减去或加上什么),因此使用起来非常方便:复制和粘贴,这是编程的最快方法。

最后两行还显示当前外汇交易时段的最后一秒,以及以小时(更容易判断)和秒为单位的剩余时间。在纽约,当周五当地时间下午 5:00 外汇交易时段关闭时,纽约时间下午 5:00 没有有效的交易栏打开。因此,在此函数中,要减去 1 秒钟,以获得经纪商时间内最后一栏的最后有效开仓时间。不过,有些经纪商会提前几分钟结束外汇交易时段,不再提供价格或接受交易订单。