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

 

新文章 处理时间(第二部分):函数已发布:

自动判定经纪商时移和 GMT。 与其请求您的经纪商的支持,您可能会从他们那里得到一个不充分的答案(他们很愿意解释时间错位),我们只需自行查看在时间变化的几周内他们如何计算价格 — 但手工操作极其繁琐,我们让程序来做这件事 — 毕竟这就是为什么我们要有一台 PC。

在包含文件 DealingWithTime.mqh 的函数声明之前,且在宏替换之后,声明所需变量为全局变量:

//--- global variables for time switches
int      DST_USD=0,                             // act time shift USA
         DST_EUR=0,                             // act time shift EU
         DST_AUD=0,                             // act time shift Australia
         DST_RUS=0;                             // D'2014.10.26 02:00', -10800,

这些变量 DST_USD, DST_EUR,.. 将含有美国、欧盟、等地区的实际时移。 它们将由我们的函数进行更新和设置。 在冬季,采用正常时间,它们的值是零:在此阶段没有时移。

之后,我们的变量含有下一次时间变更时的时移。 它们主要需要知道何时需要执行新的计算,从而节省 CPU 资源:

datetime nxtSwitch_USD,                         // date of next switch
         nxtSwitch_EUR,                         // date of next switch
         nxtSwitch_AUD,                         // date of next switch
         nxtSwitch_RUB = D'2014.10.26 02:00';   // Russia s different :(

我们稍后将研究俄罗斯的情形。

这种结构及其全局变量是一切的核心。 :)

struct _OffsetBroker
  {
   int   USwinEUwin,                            // US=Winter & EU=Winter
         USsumEUsum,                            // US=Summer & EU=Summer
         USsumEUwin,                            // US=Summer & EU=Winter
         actOffset,                             // actual time offset of the broker
         secFxWiWi,                             // duration of FX in sec
         secFxSuSu,                             // duration of FX in sec
         secFxSuWi,                             // duration of FX in sec
         actSecFX;                              // actual duration of FX in sec
   bool  set;                                   // are all set?
  };
_OffsetBroker OffsetBroker;

我们将为三个相关时段分配经纪商时移,且外汇市场在这三个持续时段是开放的,包括实际值和易于检查的设置(如果已经分配了数值)。 全局变量名为 OffsetBroker,我们将多次遇到它。

作者:Carl Schreiber

 

文章处理时间(第 2 部分):函数 ( https://www.mql5.com/en/articles/9929 ) 的DealingWithTime.mqh v. 1.01 版本停止工作,因为 MQ 更改了CopyTime( )在本文发表后一段时间发挥作用。现在,如果未来时间值大于为 start_time 和/或 stop_time 参数指定的TimeCurrent(),则该函数不再返回未来时间值。相反,最后一个当前柱的开盘时间将作为最大可能值返回。

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

此计算在 2.03 版本中已更改。该版本现已在代码库中提供:https: //www.mql5.com/en/code/45287

而且时间变化的计算也完全改变了,这样现在就涵盖了从悉尼(澳大利亚)到 70 年代的时间变化的复杂时间。

还附上表格DST 1975 - 2030.xlsx作为 zip 文件,其中包含自 70 年代以来的所有时间变化,以便每个人都可以检查公式的正确工作,以下是表格的示例系列:

1982 年 1 月 1 日是美国标准时间 (DST==0),下一次更改时间为 1982 年 4 月 25 日,即 4 月的最后一个(每月 25 日)星期日 (4)。该表已按地理时区(A 列)排序,然后按年份时区(L 列,spr=spring,aut=autumn)排序,最后按查询日期(C 列)排序。该表可以由包含的EA自动创建(脚本不能在调试模式下运行)。 Test_DST 2.mq5如果您在调试模式下运行它并复制调试器中日志日志的行并将其粘贴到电子表格中;细胞分隔物就是空间。

此外,现在还有一个新的简单函数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.