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

 

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

自动判定经纪商时移和 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

 
我们愿意向所有狐狸交易商介绍实际数值,以显示
 
我们愿意将实际价值介绍给我们所有的狐狸贸易,以展示
 

您好、

根据我在文章中的理解,函数 "setBokerOffset ()" 在策略测试器中 也应该起作用,但却不起作用。

void OnTick()
  {
//---
   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }
  }
array out of range in 'DealingWithTime.mqh' (201,21)


通过输入变量使用的替代方法 "是在策略测试器中获得正确时间的唯一方法吗?

 
Nauris Zukas 策略测试器中 也应该起作用,但却不起作用。


通过输入变量使用的替代方法 "是在策略测试器中获得正确时间的唯一方法吗?

我猜是策略测试器没有得到报价,然后 prev.CopyTime() 失败了。检查请求的所需数据是否已在本地可用。
 
Carl Schreiber #:
我猜 Strategy Tester 没有得到报价,然后 prev.CopyTime() 失败了。检查请求的所需数据是否已在本地可用。

好的,我会仔细观察 CopyTime(),并尝试解决这个问题。

,谢谢您,这篇文章非常有用!

 
好文章。但有一个问题:如何在不联系技术支持的情况下确定经纪商/交易商正在从冬季/夏季转换?
 
Nikita Chernyshov # :
好文章。但有一个问题:如何在不联系技术支持的情况下确定经纪商/交易商正在从冬季/夏季转换?
  1. 为什么不问呢?
  2. 软件知道美国和欧盟的夏/冬令时,并以此计算经纪商的偏移量。
 
Nikita Chernyshov #:
好文章。但有一个问题:如何在不联系技术支持的情况下确定经纪商/交易商正在从冬季/夏季转换?


.
Документация по MQL5: Дата и время / TimeDaylightSavings
Документация по MQL5: Дата и время / TimeDaylightSavings
  • www.mql5.com
TimeDaylightSavings - Дата и время - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:


.

是的,但这取决于用户的时间设置,效果并不好。此外,它还需要在测试器中建模。

 
Carl Schreiber #:
  1. 为什么不问?
  2. 软件知道美国和欧盟的夏季/冬季时间,并以此计算经纪人的偏移量。

1.因为支持人员并不总是提供正确的信息。您自己也指出了 Alpari 经销商的问题。+ 这是开销:从每个交易商处了解过渡时间。因为我不知道最终用户在与谁讨论,这样就无法制定出好的解决方案。

2.是的,可以这么说,但如果经销商没有从冬季过渡到夏季,那么计算结果就会很奇怪。

我试着修改了一下您的库,但显然出了点问题。我认为代码应该导致 Expert Advisor 自动检测格林尼治标准时间,并根据格林尼治标准时间进行交易,而不是根据经纪人的服务器进行交易。我不确定代码是否最优,但解决方案似乎有效。但是,在那些不改变时间的交易商中,会出现一些不正确的计算。

附加的文件: