記事「時間の取扱い(第2部): 関数」についてのディスカッション - ページ 2

 
Nikita Chernyshov # :

1.サポートが必ずしも正しい情報を提供するとは限らないからです。あなた自身がアルパリのディーラーについて指摘したことです。+ 各ディーラーから変遷を聞き出すのはコストがかかる。エンドユーザーが誰と議論しているのかが分からない。

2.しかし、もしディーラーが冬から夏への切り替えをしないのであれば、計算が少しおかしくなる。

私はあなたのライブラリを少し修正しようとしましたが、どうやら何かが間違っていたようです。このコードは、Expert Advisorが自動的にGMT時間を検出し、ブローカーのサーバーではなくGMT時間に従って取引することにつながるはずだと思いました。コードが最適かどうかはわかりませんが、解決策はうまくいったようです。しかし、時間を変更しないディーラーでは、不正確な計算が行われています。

  1. 何を変更したのですか?
  2. うまくいかないブローカー(リンク)を教えてください。

  3.  for (i=start; i<rates_total && ! IsStopped (); i++) {
          checkTimeOffset( time[i]);
          tGMT           = time[i] + OffsetBroker.actOffset; // グリニッジ標準時 
    
    }


     
    Carl Schreiber #:
    1. 何を変更しましたか?
    2. それが機能しないブローカー(リンク)を挙げてもらえますか?
    3. 私はちょうどそれを再び使用しました:


      1.

      - EURUSDに固定せず、EAが配置されているペアを使用します。

      - 時間も固定せず、現在の時間から1年を引いただけです。

         datetime setDate = StringToTime(IntegerToString(NowYear()-1)+".06.21 14:00");
      
         nextDST("EUR", setDate);                        // EUR: 夏時間を取得し、次の変更を設定する。

      そして、このブロックを動的に取得するために、bool setBokerOffset(string symbol, int &USwinEUwin1, int &USsumEUsum1, int &USsumEUwin1)にパラメータを渡しています。

      input int   USwinEUwin=  -7200;    // US=冬 & EU=冬
      input int   USsumEUsum= -10800;    // US=夏 & EU=夏
      input int   USsumEUwin=  -7200;    // US=夏、EU=冬

      2. アルファFX。私はデモ口座からのデータを提供することができますので、何も開かずに確認することができます。ディーラーが冬から夏に切り替わることはなく、GMTとの差はまだ発生しているということです。

      3.デザインがどこでどのように使われているのかが少し不明。

       

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

      インジケータでは、すべてのバーを ループする。

       
      一般的に、私はグリニッジに切り替えた。私は、冬時間に移行する時間をサーバー時間とグリニッジ標準時の差と定義している。ただ、ブローカーごとにこの差を自分で計算し、Expert Advisorの定数に入力する必要があります。ユーザーが異なるシフト、ブローカー、取引所を持っており、冬への移行の時間が同じでないときだけ、グリニッジはすべて同じです。
       
      Valeriy Yastremskiy #:
      一般的に、私はグリニッジに切り替えた。私は、冬時間に移行する時間をサーバー時間とグリニッジ標準時の差と定義している。ただ、ブローカーごとにこの差を自分で計算し、Expert Advisorの定数に入力する必要があります。ユーザーが異なるシフト、ブローカー、取引所を持ち、冬時間に移行する時間が同じでないときに、グリニッジはすべて同じです。

      具体的にはどうやったのですか?定数はどのように計算されていますか?

       
      Nikita Chernyshov #:

      具体的にはどうやったのですか?定数はどのように計算されているのですか?

      グリニッジ時間マイナスtimecarrent、冬時間への移行で、それは時間によって変更されます。私は仕事の開始と終了の時刻を一度書き、クライアントと1時間の差+3と+2、ブローカー+3、+2、-6グリニッジ時間)))。そして、それはすべてのために同じ、特定の時間に仕事を開始する必要がありました。グリニッジ標準時は同じですが、サーバーとローカル時間は異なります。私はFedoseyevの教科書からコードを作り直した)。

      一般的に問題は、サーバー時間とグリニッジ標準時の差を表す標準関数がないことだ。しかし、それはカウントされる。また、ローカルタイムも冬時間に移行することがあり、ブローカーの移行とは異なる時刻に移行するという問題もある。

      // 夏には1つの値、冬には別の値。
      // 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); //アラート(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グリニッジ時間の違い)))。そして、それはすべてのために同じ、特定の時間に仕事を開始する必要がありました。グリニッジ標準時は同じですが、サーバーとローカル時間は異なります。フェドセーエフの教科書のコードを手直しした)。

      一般的に問題は、サーバー時間とグリニッジ標準時の差を表す標準関数がないことだ。しかし、それはカウントされる。また、ローカルタイムも冬時間に移行することがあり、ブローカーの移行時間とは異なる時間に移行するという問題もある。

      この解決策は私の頭の中にあります。しかし、あなたは最後の段落で痛みを指摘した)

       

      こんにちは、カール・シュライバー です。

      この記事がしばらく前にアップされていたことは知っていますが、今見つけました。 この作業を共有していただきありがとうございます。 本当に理解するためには、実際にテストする必要がありますが、今のところ簡単な質問があります:

      MqlDateTime 構造体.day_of_weekに依存するのではなく、別の曜日計算を行っているようですが、なぜこのような別の計算方法を使用しているのでしょうか? 精度に利点があるのでしょうか? それとも単に構造体への変換を避けるためでしょうか?

       
      HoD()のような時間の基本的なコードを書き始めたのですが、時間を構造体に代入して他の値も要求するよりも、DoW(...)を書いた方が簡単そうなので、他のコードにも挑戦してみました。
       

      このコードは、ヨーロッパと米国のブローカーのために自動的に夏時間を計算します:

      https://www.mql5.com/ja/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月の第2日曜日(
       )の現地時間02:00に開始し、11月の第1日曜日の現地時間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;
      
      //--- 欧州連合(EU)では、夏時間は1月1日の最終日曜日から始まる。
      //--- 3月から10月の最終日曜日まで。
      
         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);
           }
      
      //--- アメリカでは、夏時間は第2日曜日から始まる。
      //--- 3月から11月の第1日曜日まで。
      
         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:
      ============== 欧州夏時間 (DST) ====================
      夏時間は2010.03.28 01:00:00に開始し、2010.10.31 02:00:00に終了する
      夏時間は2011.03.27 01:00:00に開始し、2011.10.30 02:00:00に終了する。10.30 02:00:00
      夏時間開始:2012.03.25 01:00:00、終了:2012.10.28 02:00:00
      夏時間開始:2013.03.31 01:00:00、終了:2013.10.27 02:00:00
      夏時間開始:2014.03.30 01:00:00に開始し、2014.10.26 02:00:00に終了
      DST starts on 2015.03.29 01:00:00に開始し、2015.10.25 02:00:00に終了
      DST starts on 2016.03.27 01:00:00に開始し、2016.10.30 02:00:00
      DST starts on 2017.03.26 01:00:00 and end on 2017.10.29 02:00:00
      DST starts on 2018.03.25 01:00:00 and end on 2018.10.28 02:00:00
      DST starts on 2019.03.31 01:00:00 and end on 2019.10.27 02:00:00
      DST starts on 2020.03.29 01:00:00 and end on 2020.10.25 02:00:00
      DST starts on 2021.03.28 01:00:00 and end on 2021.10.31 02:00:00
      DST starts on 2022.03.27 01:00:00 and end on 2022.10.30 02:00:00
      DST starts on 2023.03.26 01:00:00 and end on 2023.10.29 02:00:00
      DST starts on 2024.03.31 01:00:00 and end on 2024.10.27 02:00:00
      DST starts on 2025.03.30 01:00:00 and end on 2025.10.26 02:00:00
      DST starts on 2026.03.29 01:00:00 and end on 2026.10.25 02:00:00
      DST starts on 2027.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.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 starts on 2017.03.12 02:00:00 and end on 2017.11.05 02:00:00
      DST starts on 2018.03.11 02:00:00 and end on 2018.11.04 02:00:00
      DST starts on 2019.03.10 02:00:00 and end on 2019.11.03 02:00:00
      DST starts on 2020.03.08 02:00:00 and end on 2020.11.01 02:00:00
      DST starts on 2021.03.14 02:00:00 and end on 2021.11.07 02:00:00
      DST starts on 2022.03.13 02:00:00、2022.11.06 02:00:00
      夏時間開始 2023.03.12 02:00:00、2023.11.05 02:00:00
      夏時間開始 2024.03.10 02:00:00、2024.11.03 02:00:00
      夏時間開始:2025.03.09 02:00:00、終了:2025.11.02 02:00:00
      夏時間開始:2026.03.08 02:00:00、終了:2026.11.01 02:00:00
      夏時間開始: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に終了
      */
      

      上記のコードは、Forex Market Hourshttps://www.mql5.com/ja/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).