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

 
Nikita Chernyshov # :

1.因为支持人员并不总是能提供正确的信息。您自己也指出了 Alpari 经销商的问题。+ 从每个经销商那里了解过渡情况的成本很高。因为我不知道最终用户在与谁讨论,所以无法制定出好的解决方案。

2.是的,可以这么说,但如果经销商不从冬季转为夏季,那么计算结果就会变得有点奇怪。

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

  1. 你改了什么?
  2. 能告诉我哪家经纪商(链接)的代码无效吗?
  3. 我刚刚又用了一次:
     for (i=start; i<rates_total && ! IsStopped (); i++) {
          checkTimeOffset( time[i]);
          tGMT           = time[i] + OffsetBroker.actOffset; // GMT 
    
    }


     
    Carl Schreiber #:
    1. 你改了什么?
    2. 你能告诉我哪家中介(链接)不能用吗?
    3. 我刚刚又用了一次:


      1.

      - 我没有固定使用欧元兑美元,EA 放在哪里,我们就使用哪里的货币对。

      - 我也没有固定时间,只是将当前时间减去 1 年。

         datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
      
         nextDST("EUR", setDate);                        // 欧元:获取夏令时并设置下一个变化

      我将参数传递给 bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1) 以动态获取此块。

      input int   USwinEUwin=  -7200;    // 美国=冬季,欧盟=冬季
      input int   USsumEUsum= -10800;    // 美国=夏季,欧盟=夏季
      input int   USsumEUwin=  -7200;    // 美国=夏季,欧盟=冬季

      2. 阿尔法外汇。我可以提供模拟账户的数据,这样您就可以在不开立任何账户的情况下进行检查。问题是,交易员并没有从冬季切换到夏季,与格林尼治标准时间的差异仍然存在。

      有点不清楚如何以及在何处使用该设计。

       

      3. Немного не понял, как и где использована конструкция.

      在一个指标中,它是所有条形图 的循环顶端。

       
      一般来说,我改用格林威治时间。我将过渡到冬令时的时间定义为服务器时间与格林威治时间之间的差值。唯一的问题是,对于每个经纪商,这个差值都必须由我自己计算,并输入到 Expert Advisor 的常量中。如果用户的班次、经纪商、交易所不同,冬令时的过渡时间也不一样,那么格林威治时间对所有用户都是一样的。
       
      Valeriy Yastremskiy #:
      一般来说,我改用格林威治时间。我将过渡到冬令时的时间定义为服务器时间与格林威治时间之间的差值。唯一的问题是,对于每个经纪商,这个差值都必须由我自己计算,并输入到 Expert Advisor 的常量中。用户的班次、经纪商、交易所不同,过渡到冬令时的时间也不一样,但格林威治时间对所有人都是一样的。

      你们到底是怎么做的?常数是如何计算出来的?

       
      Nikita Chernyshov #:

      你是如何做到这一点的?常数是如何计算出来的?

      格林威治时间减去 timecarrent,过渡到冬令时将会改变一个小时。我写了一次工作开始和结束的时间,与客户的小时差+3和+2,经纪人+3,+2,-6格林威治时间)))))。而且必须在某个时间开始工作,所有人都一样。格林威治时间是一样的,但服务器和本地时间是不同的。我根据 Fedoseyev 的教科书重新编写了代码)。

      一般来说,问题在于服务器时间和格林威治时间之间的差值没有标准函数。但它被计算在内。还有一个问题是,本地时间也可以过渡到冬令时,而且时间与经纪人的过渡时间不同。

      // TimeGMT()-TimeCurrent();夏季一个值,冬季另一个值。
      // TimeGMTOffset() =  TimeGMT() - TimeLocal(); серверным временем нет штатной функции
      
      
      
      
      #property strict
      //+------------------------------------------------------------------+ class CTradeTimeGMT{ protected: int StartTime; int EndTime; int GMTShiftTest; int GMTShiftCur; public: void Init(int StartHour, int StartMinute, int EndHour, int EndMinute, int GMTshift){ StartTime=3600*StartHour+60*StartMinute; EndTime=3600*EndHour+60*EndMinute; GMTShiftCur=GMTshift; GMTShiftTest=GMTshift+int((TimeGMTOffset())/3600); //Alert(TimeGMTOffset()); if(MQLInfoInteger( MQL_TESTER))GMTShiftCur=GMTShiftTest; } bool Check(int GMTshift){ int CurTime=(int)((TimeGMT()+(GMTShiftCur*3600))%86400); if(StartTime<EndTime){ return(CurTime>=StartTime && CurTime<EndTime); } else{ return(CurTime>=StartTime || CurTime<EndTime); } } };
       
      Valeriy Yastremskiy #:

      格林威治时间减去 timecarrent 时间,过渡到冬令时将会改变一个小时。我曾经写过一次工作开始和结束的时间,与客户的时间差是 +3 和 +2,经纪人 +3, +2, -6 格林威治时间))))。而且必须在某个时间开始工作,所有人都一样。格林威治时间是相同的,但服务器时间和当地时间是不同的。对 Fedoseyev 教科书中的代码进行了修改)。

      一般来说,问题在于服务器时间和格林威治时间之间的差值没有标准函数。但它被计算在内。还有一个问题是,本地时间也可以过渡到冬令时,而且时间与经纪人的过渡时间不同。

      谢谢,是的,这个解决方案就在我的脑海里,而且已经实现了。但您在最后一段指出了问题所在)。

       

      Hi@Carl Schreiber 新年快乐。

      我知道这篇文章已经发表了一段时间,但我也是刚刚才发现的。 感谢您分享这项工作,这需要我做一些测试才能真正理解它。 不过,我现在有一个简单的问题,我看到您有不同的星期计算方法,而不是依赖 MqlDateTime 结构 .day_of_week:

      我看到您有一种不同的星期计算方法,而不是依赖MqlDateTime 结构 .day_of_week。 您为什么要使用这种其他计算方法,是否对准确性有好处? 还是只是为了避免转换到结构?

       
      我开始编写一些基本的时间代码,如 HoD(),然后我又挑战自己编写其他代码,因为编写 DoW(...)比将时间赋值给结构体和请求其他值看起来更容易--请随意使用您喜欢的代码。
       

      此代码可自动计算欧洲和美国经纪人的 DST:

      https://www.mql5.com/zh/code/27860

      //+------------------------------------------------------------------+
      //| 计算英国伦敦的夏令时变化
      //| Validated to https://www.timeanddate.com/time/change/uk/london   |
      //+------------------------------------------------------------------+
      void DST_Europe(int iYear, datetime &dst_start, datetime &dst_end)
        {
         datetime dt1,dt2;
         MqlDateTime st1,st2;
         /* 英国夏令时从 3 月最后一个星期日当地时间 01:00 开始,
       ,到 10 月最后一个星期日当地时间 02:00 结束 */
         dt1=StringToTime((string)iYear+".03.31 01:00");
         dt2=StringToTime((string)iYear+".10.31 02:00");
         TimeToStruct(dt1,st1);
         TimeToStruct(dt2,st2);
         dst_start=dt1-(st1.day_of_week*86400);
         dst_end  =dt2-(st2.day_of_week*86400);
        }
      //+------------------------------------------------------------------+
      //| 计算美国纽约的夏令时变化
      //| 验证至https://www.timeanddate.com/time/change/usa/new-york|
      //+------------------------------------------------------------------+
      void DST_USA(int iYear, datetime &dst_start, datetime &dst_end)
        {
         datetime dt1,dt2;
         MqlDateTime st1,st2;
         /* 美国夏令时从每年 3 月第二个星期日当地时间 02:00 开始
       ,到每年 11 月第一个星期日当地时间 02:00 结束 */
         dt1=StringToTime((string)iYear+".03.14 02:00");
         dt2=StringToTime((string)iYear+".11.07 02:00");
         TimeToStruct(dt1,st1);
         TimeToStruct(dt2,st2);
         dst_start=dt1-(st1.day_of_week*86400);
         dst_end  =dt2-(st2.day_of_week*86400);
        }
      //+------------------------------------------------------------------+
      //||
      //+------------------------------------------------------------------+
      void OnStart()
        {
         datetime dst_start,dst_end;
         dst_start=dst_end=0;
      
      //----------------在欧盟,夏令时从每年秋季的最后一个星期日开始。
      //--- 三月,十月的最后一个星期日结束。
      
         Print("========= European Summer Time (DST) =========");
         for(int year=2010; year<=2029; year++)
           {
            DST_Europe(year,dst_start,dst_end);
            Print("DST starts on ",dst_start," and ends on ",dst_end);
           }
      
      //--- 在美国,夏令时从夏令时开始的第二个星期日开始。
      //--- 3月至11月的第一个星期日结束。
      
         Print("========= American Summer Time (DST) =========");
         for(int year=2010; year<=2029; year++)
           {
            DST_USA(year,dst_start,dst_end);
            Print("DST starts on ",dst_start," and ends on ",dst_end);
           }
        }
      //+------------------------------------------------------------------+
      
      /*
      output:
      ========= European Summer Time (DST) =========
      DST starts on 2010.03.28 01:00:00 and ends on 2010.10.31 02:00:00
      DST starts on 2011.03.27 01:00:00 and ends on 2011.10.30 02:00:00
      DST 从 2012.03.25 01:00:00 开始,到 2012.10.28 02:00:00 结束
      DST 从 2013.03.31 01:00:00 开始,到 2013.10.27 02:00:00 结束
      DST 从 2014.03.30 01:00:00 和 2014.10.26 02:00:00
      DST 开始于 2015.03.29 01:00:00 和 2015.10.25 02:00:00
      DST 开始于 2016.03.27 01:00:00 和 2016.10.30 02:00:00
      DST 于 2017.03.26 01:00:00 开始,于 2017.10.29 02:00:00
      DST 于 2018.03.25 01:00:00 开始,于 2018.10.28 02:00:00
      DST 于 2019.03.31 01:00:00 和结束于 2019.10.27 02:00:00
      DST 开始于 2020.03.29 01:00:00 和结束于 2020.10.25 02:00:00
      DST 开始于 2021.03.28 01:00:00 和结束于 2021.10.31 02:00:00
      DST 于 2022.03.27 01:00:00 开始,于 2022.10.30 02:00:00
      DST 于 2023.03.26 01:00:00 开始,于 2023.10.29 02:00:00
      DST 于 2024.03.31 01:00:00 开始,于 2024.10.27 02:00:00 结束。10.27 02:00:00
      夏令时从 2025.03.30 01:00:00 开始,到 2025.10.26 02:00:00
      夏令时从 2026.03.29 01:00:00 开始,到 2026.10.25 02:00:00
      夏令时从 2027.03.28 01:00:00 开始,到 2027.10.25 02:00:00 03.28 01:00:00 开始,2027.10.31 02:00:00 结束
      2028.03.26 01:00:00 开始,2028.10.29 02:00:00 结束
      2029.03.25 01:00:00 开始,2029.10.31 02:00:00 结束28 02:00:00
      ========= 美国夏令时(DST) =========
      DST 于 2010.03.14 02:00:00 开始,于 2010.11.07 02:00:00 结束
      DST 于 2011.03.13 02:00:00 开始,于 2011.11.06 02:00:00
      DST 于 2012.03.11 02:00:00 开始,于 2012.11.04 02:00:00 结束
      DST 于 2013.03.10 02:00:00 开始,于 2013.11.03 02:00:00 结束
      DST 于 2014.03.09 02:00:00 和 2014.11.02 结束 02:00:00
      DST 从 2015.03.08 02:00:00 和 2015.11.01 结束 02:00:00
      DST 从 2016.03.13 02:00:00 和 2016.11.06 02:00:00
      DST 从 2017.03.12 02:00:00 开始,到 2017.11.05 02:00:00
      DST 从 2018.03.11 02:00:00 开始,到 2018.11.04 02:00:00
      DST 从 2019.03.10 02:00:00 开始,到 2019.11.03 02:00:00
      DST 从 2020.03.08 02:00:00 开始,到 2020.11.01 02:00:00
      DST 从 2021.03.14 02:00:00 开始,到 2021.11.07 02:00:00
      DST 从 2022.03.13 02:00:00 和 2022.11.06 结束 02:00:00
      DST 从 2023.03.12 02:00:00 和 2023.11.05 结束 02:00:00
      DST 从 2024.03.10 02:00:00 和 2024.11.03 02:00:00
      DST 于 2025.03.09 02:00:00 开始,于 2025.11.02 02:00:00
      DST 于 2026.03.08 02:00:00 开始,于 2026.11.01 02:00:00
      DST 于 2027.03.14 02:00:00 开始,2027.11.07 02:00:00 结束
      DST 于 2028.03.12 02:00:00 开始,2028.11.05 02:00:00 结束
      DST 于 2029.03.11 02:00:00 开始,2029.11.04 02:00:00 结束
      */
      

      上述代码在外汇市场时间https://www.mql5.com/zh/code/27771 中用于计算夏令时的变化。

      可为世界不同地区构建类似函数。

      Daylight changes (summer time)
      Daylight changes (summer time)
      • www.mql5.com
      Compute the daylight saving time changes (start/end of the summer time).