English Русский 中文 Español Deutsch Português
preview
時間の取扱い(第2部): 関数

時間の取扱い(第2部): 関数

MetaTrader 5 | 20 1月 2022, 08:53
762 0
Carl Schreiber
Carl Schreiber

グローバル変数

おそらく不十分な答えしかくれない(欠如した時間について説明することはいとわないでしょうが)証券会社にサポートを求める代わりに、時間が変わる週に証券会社が価格をどのように計算するかを自分で見ます。結局のところ、私たちは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などの変数には米国、EUなどの実際の時刻のシフトが格納されます。これらは、関数によって更新および設定されます。通常時刻である冬時間では、それらはゼロです。時間はその期間にはシフトされません。

その後、次に時刻の切り替えが行われるときを示す変数があります。これらは主に、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;

関連する3つの期間に証券会社のオフセットと、これらの期間に外国為替市場が開いている時間を割り当てます。実際の値と、値が割り当てられている場合の簡単なチェックセットの両方を行います。グローバル変数の名前はOffsetBrokerで、何度か使用されます。


証券会社の時刻シフトを特定するための中心的な関数

EA、指標、スクリプトは、

setBokerOffset();

関数の呼び出しによって、証券会社が時刻の変更をいつどのように処理するかを独自に特定できます。この関数は、添付スクリプトのStart()の後でコードの先頭に配置されています。関連する期間(夏時間、冬時間、中間時間)の証券会社に関連する値を特定し、これを使用してGMTを使用した他のすべての必要な時間を特定できます。 他のすべてと同様に、これはインクルードされたインクルードファイル(DealingWithTime.mqh)にあります。これには、最初の記事の部分も含まれています。変数の宣言と初期化、および関連するグローバル変数のゼロ化の後:

   datetime dateEUR,dateUSD,dateAUD,dateNxt,                   // switch date for EU, AU, & US
            arrTme[];                                          // array to copy time
   int b;
   OffsetBroker.USsumEUwin =
      OffsetBroker.USsumEUsum =
         OffsetBroker.USwinEUwin = INT_MIN;
   nxtSwitch_USD = nxtSwitch_EUR = nxtSwitch_AUD = 0;          // reset variables

切り替えが起こる週末を見つけます。

//--- AU, EU & US switches to winter time in 2020
   if(IS_DEBUG_MODE)
      Print("\n2nd half-year 2020 for ",AccountInfoString(ACCOUNT_COMPANY), "DebugMode: ",IS_DEBUG_MODE);

   nextDST("EUR", D'2020.06.21 14:00');                        // EUR: get DST and set next change
   b = CopyTime("EURUSD",PERIOD_H1,nxtSwitch_EUR,1,arrTme);    // get time last 1h bar before switch in EU
   dateEUR = arrTme[0];                                        // last hour on Friday before the weekend

   nextDST("USD", D'2020.06.21 14:00');                        // USA: get DST and set next change
   b = CopyTime("EURUSD",PERIOD_H1,nxtSwitch_USD,1,arrTme);    // get time last 1h bar before switch in USA
   dateUSD = arrTme[0];                                        // last hour on Friday before the weekend

   nextDST("AUD", D'2020.06.21 14:00');                        // AUD: get DST and set next change
   b = CopyTime("EURUSD",PERIOD_H1,nxtSwitch_AUD,1,arrTme);    // get time last 1h bar before switch in AU
   dateAUD = arrTme[0];                                        // last hour on Friday before the weekend

   dateNxt = fmax(nxtSwitch_EUR,nxtSwitch_USD)+WeekInSec;      // get the next weekend
   b = CopyTime("EURUSD",PERIOD_H1,dateNxt,1,arrTme);          // get time last 1h bar before the weekend
   dateNxt = arrTme[0];                                        // last hour on Friday before the weekend

簡単にするために、デバッグモード(if(IS_DEBUG_MODE))ではほとんどの出力が自動的に実行されます。よって、添付されたスクリプトをデバッガー(F5)で起動するとすべての詳細が表示されますが、チャート上で同じスクリプトを開始すると、重要なものだけが表示されます。

3つのタイムゾーンすべてについて、まず、関数の呼び出し(nextDST("EUR", D'2020.06.21 14:00'))が、EUと次に次のスイッチに適用可能な時間差を計算するために使用されます。6月は夏時間で、次の週末の切り替えで冬時間になります。その直後の行では、その週末の前の金曜日の最後のh1バーの開始時刻を取得します。これが、計算のアンカーになるためです。最初の記事の終わりで仮定ポイント4を確認してください。

          4. 金曜日午後5時と日曜日午後5時の間に欠落した時間がある場合、金曜日に最後の相場を受け取った後ではなく、日曜日に最初の相場を受け取る前に相場が欠落します。

h1と「EURUSD」の時間を使用することにしました。この銘柄は、おそらくMQ以外でも、最も長い履歴を持つ銘柄です。しかし、これはまた、外国為替市場がニューヨーク時間の17:00に終了した場合、最後の1時間または最後の1時間のバーが16:00に開始することを意味します。 これは、私達が特に興味を持っている時間です。週末の後の最初の1時間は、ニューヨークで日曜日の17:00です。オーストラリアの切り替えも完全を期すために特定されますが、それ以上は使用されません(以下を参照)。その後、次の時刻シフト期間での証券会社の時刻シフトを計算するために、両方のタイムゾーンが切り替えられた後の最初の週末が特定されます。

次に、金曜日の3時間について、ニューヨークの16:00に基づいて、関数chckFriday(...)を使用してのそれぞれの期間に関連する時刻シフトが計算されます。この関数はインクルードファイルの一部であり、以下で説明します。

   chckFriday(dateEUR,"EUR");                                  // function to determine broker offset for the Friday given
   chckFriday(dateUSD,"USD");                                  // function to determine broker offset for the Friday given
   chckFriday(dateNxt,"NXT");                                  // function to determine broker offset for the Friday given

その後、同じ原則を使用して、その年の残りの半分のその他の時間の変化を計算します。これは(上記を参照)実際には必要なく、コメントアウトできます。

   if(IS_DEBUG_MODE)
      Print("\n1st half-year 2021 for ",AccountInfoString(ACCOUNT_COMPANY), "DebugMode: ",IS_DEBUG_MODE);
   nxtSwitch_USD = nxtSwitch_EUR = nxtSwitch_AUD = 0;

   nextDST("AUD", D'2021.01.21 14:00');                        // AUD: get DST and set next change
   b = CopyTime("EURUSD",PERIOD_H1,nxtSwitch_AUD,1,arrTme);    // get time last 1h bar before switch in EU
   dateAUD = arrTme[0];                                        // last hour on Friday before the weekend

...
   chckFriday(dateUSD,"USD");                                  // function to determine broker offset for the Friday given
   chckFriday(dateEUR,"EUR");                                  // function to determine broker offset for the Friday given
   chckFriday(dateNxt,"NXT");                                  // function to determine broker offset for the Friday given

最後に、証券会社のオフセットが検出され、対応するフィールドに割り当てられた後、決定的な切り替え時間(nxtSwitch_USD = nxtSwitch_EUR = nxtSwitch_AUD = 0)は、その後の使用のためにゼロにリセットされます。再計算は、履歴の過程で時間の切り替えを伴う週末が「過ぎた」場合にのみ行われるため、後で時間が正しい計算を妨げる可能性があります。したがって、リセットが少なすぎるより多すぎる方がましです。次に、すべての値が割り当てられているかどうかが確認され、結果がエキスパートジャーナルに出力され、チェックが返されます。

   nxtSwitch_USD = nxtSwitch_EUR = nxtSwitch_AUD = 0;          // reset variables for use by a user
   if(OffsetBroker.USsumEUwin != INT_MIN
      && OffsetBroker.USsumEUsum != INT_MIN
      && OffsetBroker.USwinEUwin != INT_MIN
     )
      OffsetBroker.set = true;
   else
      OffsetBroker.set = false;
   if(OffsetBroker.set)
      Print("\nTime Offset of ",AccountInfoString(ACCOUNT_COMPANY),": ",
            "\nUS=Winter & EU=Winter (USwinEUwin) = ",OffsetBroker.USwinEUwin,
            "\nUS=Summer & EU=Summer (USsumEUsum) = ",OffsetBroker.USsumEUsum,
            "\nUS=Summer & EU=Winter (USsumEUwin) = ",OffsetBroker.USsumEUwin,
            "\n");
   else
      Print(__FILE__,"[",__LINE__,"] Assigning the broker offset went wrong - somehow.");
   return(OffsetBroker.set);

If everything is ok one will see e.g these lines:

Time Offset of MetaQuotes Software Corp.:
US=Winter & EU=Winter (USwinEUwin)       =   -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin)    =   -7200

これにより、EAがストラテジーテスターで動作を開始する前、またはチャート上で動作を開始する前に実行される関数の代わりに、入力変数にこれらの値を使用できます。この記事の最後に例を示します。


証券会社の時刻シフトを特定および設定する

ここで、関数chckFriday(...)について考えてみましょう。さまざまな期間のそれぞれのの時刻オフセットが特定され、構造体_OffsetBrokerのタイプからグローバル変数OffsetBrokerのそれぞれのフィールドに割り当てられます。構造体では次の3つのフィールドを認識しています。

   int   USwinEUwin,                            // US=Winter & EU=Winter
         USsumEUsum,                            // US=Summer & EU=Summer
         USsumEUwin,                            // US=Summer & EU=Winter

対応する期間ののそれぞれの時刻シフトが割り当てられます。期間は次のとおりです。

  • 両方の地域が同じで、冬(標準時)または夏、または
  • USAはすでに(まだ)夏でEUはまだ(すでに)冬

USAはすでに(まだ)冬でEUはまだ(すでに)夏だという逆の状況は存在しません。ここで、4番目のカテゴリが存在しない理由だけでなく、オーストラリアやAUDについても疑問が生じます。ここで欠落しているのでしょうか?

切り替えのルールは次のとおりです。

  • EU: 10月の最終日曜日と3月の最終日曜日
  • US: 11月の第1日曜日と3月の第2日曜日
  • AU: 11月の第1日曜日と3月の最終日曜日


最初の質問に戻ります。EUはUSの1〜2週間前に冬時間に切り替えます。USはまだ夏ですがEUはすでに冬であるため、値はOffsetBroker変数のUSsumEUwinフィールドに割り当てられます。春には、USはEUの前に夏時間に切り替わります。その後1〜2週間、USでは夏になりますがEUではまだ冬です。この場合も、値はOffsetBroker 変数のUSsumEUwinフィールドに割り当てられます。EUがすでに(まだ)夏であるがUSがまだ(すでに)冬であるという逆のケースがまったく発生しないことは明確です。これにより、実際には、秋と春の両方の切り替え期間の証券会社の時刻オフセットを計算する必要がなくなります。それにもかかわらず、これは単に完全性と制御のために実行されます。

2番目の質問に移ります。オーストラリアはUSのように11月に切り替わります。そして春にはEUのように切り替わります。したがって、切り替えのための追加の週末はありません。ただし、オーストラリアの時計は、EUとUSの冬になると1時間進みます。これは、クリスマスと新年が夏になるためです。

ここで、特別な期間の時刻シフトをすでに計算すれば、FX市場がこれらの週に開いている現在の期間も計算できます。これらの値は、フィールドsecFxWiWisecFxSuSusecFxSuWiに格納され、現在有効な値はactSecFXに格納されます。記事の最後の「アプリケーション」の章で、これを処理する方法が示されています。

ただし、値を割り当てる前に、値を決定する必要があります。変数の宣言とグローバル変数のリセットの後、EUとUSの時刻シフトは、指定された時間tB(time Broker)に対して計算されます。

//+------------------------------------------------------------------+
//| auxiliary function to determine time offset of the broker        |
//+------------------------------------------------------------------+
int chckFriday(
   datetime tB,                                                // time Broker: the last hour on Friday
   string cmt=""                                               // text to start the line
)
  {

   int hNY, hGMT, hTC, hDiff;
   nxtSwitch_AUD = nxtSwitch_USD = nxtSwitch_EUR = 0;          // reset to be save
   nextDST("EUR",tB);                                          // get the offset for EUR of the time tB given
   nextDST("USD",tB);                                          // get the offset for USA of the time tB given

ここで、tBは金曜日の最後の時間の始まりです。つまり、ニューヨークでは16:00です。この仮定は以降の計算の基礎になります。この時刻のGMTを

tGMT = tNY + (NYShift + DST_USD)

として計算できるため、したがって、GMTへの証券会社オフセットを計算できるためです。このオフセットは次のように決定されます。証券会社の最後の金曜日の時間tBから、この日の過去の秒数SoB(tB)を減算します。その日の時刻00:00を取得し、16:00 (16*3600)までの秒を追加します。これでニューヨークタイムがわかるので、NYShift + DST_USDを加算してGMTを取得します。これで、GMTからのの証券会社の時刻オフセットを簡単に判別し、それをoffsetBrokerの適切なフィールドに割り当てることができます。
この関数では、これはすべて、マクロ置換HoD()(Hour of Day)を使用して、(秒ではなく)時間単位で実行されます。文書化と印刷出力での検証を容易にするためです。

   hNY   = HoD(tB - SoD(tB) + 16*3600);                        // get the hour of New York time
   hGMT  = HoD(tB - SoD(tB) + 16*3600 + NYShift + DST_USD);    // get the hour of GMT
   hTC   = HoD(tB);                                            // get the hour of the time given
   hDiff = hGMT - HoD(tB);                                     // get the difference between GMT and the broker

結局、それほど難しくはありません。;)

セキュリティ上の理由から、以下を挿入します。予期しない状況(USでは夏でEUでは冬)が発生しないかどうかを確認します。

   if(DST_USD==0 && DST_EUR!=0)                                // this should not occur
      Alert(__LINE__," ",TOSTR(DST_USD),TOSTR(DST_EUR),"  USwin && EUsum");

これで、見つかった差とFX市場の開放期間を割り当てることができます。

//--- set the broker offset for the various time situations:
   if(DST_USD+DST_EUR==0)                                      // both in winter (normal) time
     {
      OffsetBroker.actOffset = OffsetBroker.USwinEUwin = hDiff*3600;
      OffsetBroker.actSecFX  = OffsetBroker.secFxWiWi = SoW(tB);
     }
   else
      if(DST_USD == DST_EUR)                                   // else both in summer time
        {
         OffsetBroker.actOffset = OffsetBroker.USsumEUsum = hDiff*3600;
         OffsetBroker.actSecFX  = OffsetBroker.secFxSuSu = SoW(tB);
        }
      else
         if(DST_USD!=0 && DST_EUR==0)                          // US:summer EU:winter
           {
            OffsetBroker.actOffset = OffsetBroker.USsumEUwin = hDiff*3600;
            OffsetBroker.actSecFX  = OffsetBroker.secFxSuWi = SoW(tB);
           }

最後に、見つかったすべての値を出力し、最後の実際のオフセットを返します。

//--- calc the ring of times NY->GMT->Broker->GMT->NY <= the last NY must always be 16!!
   Print(cmt,": ",DoWs(tB),TimeToString(tB),": ",TOSTR(hNY),TOSTR(hGMT),TOSTR(hTC),TOSTR(hDiff),
         " BrokerTime => GMT: ",TimeToString(tB+OffsetBroker.actOffset),
         " => tNY: ",TimeToString((tB + OffsetBroker.actOffset)-(NYShift + DST_USD)),
         "  End-FX after: ",OffsetBroker.actSecFX/3600,"h"
        );
   return(OffsetBroker.actOffset);

これは次のようになります。

EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End FX in: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End FX in: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End FX in: 143h

ここには、議論する価値のある興味深いことがいくつか示されています。EUは10月25日に最初に切り替わります。1週間後、11月1日にUSが切り替わります。この間の期間では、MQでの金曜日の最後の1時間は23:00ではなく22:00に始まり、週は通常の143時間ではなく142時間後にこのバーで終わります。 143時間でしょうか142時間でしょうか。FX週は120時間(5*24=120)しかありません。週の秒(SoW())および他の同等の関数は、日曜日の00:00に始まる暦週を参照します。しかし、日曜の00:00から金曜の23:00までは6* 24-1 = 143になります。この値は、FX市場が開いたままである残りの週の任意の瞬間について計算するために、以下で使用されます。

これらの3行は、ロジックと計算を確認するため、およびユーザーがGMTから必要な現地時間を特定する方法の例としても使用されます。左から順に、証券会社のタイムスタンプの後に、ニューヨークでの想定時刻(hNY: 16)が続き、ニューヨーク時間に基づくGMTの時間、証券会社の時間とそのオフセット(-2 または-3)が続きます。 さらに右側の2番目の部分では、GMTは証券会社の時刻から計算(tB + ResetBroker.actOffset)され、次にGMTから再びニューヨークの時刻が計算((tB + OffsetBroker.actOffset)-(NYShift + DST_USD))されます。ここでtNYは常に16:00である必要があり、その通りです。履歴内の任意の時間および他のの2回目のチェックは以下で行われます。


時刻の切り替えが発生する週末の計算

ただし、「EURUSD」の時間履歴を確認する前に、計算の中心である関数nextDST(...)について説明する必要があります。
この関数は、タイムゾーン「USD」、「EUR」、または「AUD」(「AUD」は実際には必要ありません)を示すパラメータzoneおよび現在時刻を示すパラメータt(通常は現在の証券会社の時刻のパラメータTimeCurrent())を使用して呼び出されます。まず、再計算が必要かどうかが確認されます(ここでは「EUR」に対して)。

void nextDST(string zone, datetime t)
  {
   if((zone == "EUR") && t < nxtSwitch_EUR)
     {
      if(IS_DEBUG_MODE)
         Print("no change as time < nxtSwitch_EUR");
      return;
     }
...

これには、テストの開始時にnxtSwitch_EURの値をゼロにリセットすることが重要である理由も示されています。そうしないと、テスト期間全体にわたって再計算が行われない可能性があるということです。

次に、変数の宣言と初期化の後、関数の中心に到達しますが、これは私からのものではありません。かなり前に、ネットのどこかで、月の特定の日を特定するアルゴリズムを見つけました。これは、特定の時点の夏または冬の時間を決定するために使用されます。アルゴリズムはそれほど複雑ではありません。

  1. 切り替えが行われる日(日曜日)を特定します。
  2. それから日付を作成します。
  3. 最も近い将来の切り替え日曜日を見つけます。
  4. 時刻シフト(0hまたは-1hのいずれか)と次の切り替え日曜日を設定します。

このアルゴリズムの魔法は、時間変更の月の日を特定するコード行にあります。EUの場合、これは3月の最後の日曜日であり、次のように計算されます(言ったように、式のアイデアは私のものではありません)。

d = (int)(31 - MathMod((4 + MathFloor(5*y/4)), 7));         // determine the last Sunday in March for the EU switch
2021年3月の最後の日曜日の結果についてはd=25で、これがEXCEL式です。

31 - MOD(ROUNDDOWN(5*2021/4);7) = 25。


これからタイムスタンプが作成され、EUは夏時間に切り替わります(2021年3月25日、3月の最後の日曜日)。
spr = StringToTime(""+(string)y+".03."+(string)d+" 03:00"); // convert to datetime format

他のすべての日付の手順は同様であり、個別の説明は必要ありません。
ここで、コードのより大きなセクションが、現在の夏または冬の時間シフトと、特定の日付のEUでの次の切り替え日を決定します。1年間に3つのセクションが必要です。1回目前、1回目と2回目の間、2回目の切り替え後です。次の時間切り替えはすでに翌年に行われているため、これを考慮に入れる必要があります。

   if(zone == "EUR")
     {
      d = (int)(31 - MathMod((4 + MathFloor(5*y/4)), 7));         // determine the last Sunday in March for the EU switch
      spr = StringToTime(""+(string)y+".03."+(string)d+" 03:00"); // convert to datetime format
      if(t < spr)
        {
         DST_EUR = 0;                                             // no time offset
         nxtSwitch_EUR = spr;                                     // set the next time switch
         if(IS_DEBUG_MODE)
            Print(zone,"-DST for ",TimeToString(t)," DST: ",StringFormat("% 5i",DST_EUR),"  nxtSwitch: ",DoWs(nxtSwitch_EUR)," ",TimeToString(nxtSwitch_EUR));
         return;
        }
      d = (int)(31 - MathMod((1 + MathFloor(5*y/4)), 7));         // determine the last Sunday in October for the EU switch
      aut = StringToTime(""+(string)y+".10."+(string)d+" 03:00"); // convert to datetime format
      if(t < aut)
        {
         DST_EUR =-3600;                           // = +1h => 09:00 London time = GMT+05h+DST_EU = GMT+0+1 = GMT+1;
         nxtSwitch_EUR = aut;                                     // set the next time switch
         if(IS_DEBUG_MODE)
            Print(zone,"-DST for ",TimeToString(t)," DST: ",StringFormat("% 5i",DST_EUR),"  nxtSwitch: ",DoWs(nxtSwitch_EUR)," ",TimeToString(nxtSwitch_EUR));
         return;
        }
      y++;                                                        // re-calc the spring switch for the next year
      d = (int)(31 - MathMod((4 + MathFloor(5*y/4)), 7));         // determine the last Sunday in March for the EU switch
      spr = StringToTime(""+(string)y+".03."+(string)d+" 03:00"); // convert to datetime format
      if(t < spr)
        {
         DST_EUR = 0;                                             // no time offset
         nxtSwitch_EUR = spr;                                     // set the next time switch
         if(IS_DEBUG_MODE)
            Print(zone,"-DST for ",TimeToString(t)," DST: ",StringFormat("% 5i",DST_EUR),"  nxtSwitch: ",DoWs(nxtSwitch_EUR)," ",TimeToString(nxtSwitch_EUR));
         return;
        }
      Print("ERROR for ",zone," @ ",TimeToString(t)," DST: ",StringFormat("% 5i",DST_EUR),"  nxtSwitch: ",DoWs(nxtSwitch_EUR)," ",TimeToString(nxtSwitch_EUR),"  winter: ",TimeToString(aut),"  spring: ",TimeToString(spr));
      return;
     }

1年に3つのセクションがあります。

  1. 3月の夏時間への切り替え前
  2. 10月/11月の冬時間への切り替え前
  3. 次の年の冬時間から夏時間への切り替え

これは、EUR、USD、AUDに対して繰り返されます。

関数nextDST(..)のような単一の呼び出し

nextDST("EUR", D'2019.02.05 20:00');
nextDST("EUR", D'2019.06.05 20:00');
nextDST("EUR", D'2019.11.20 20:00');
        
nextDST("USD", D'2019.02.05 20:00');
nextDST("USD", D'2019.06.05 20:00');
nextDST("USD", D'2019.11.20 20:00');
        
nextDST("AUD", D'2019.02.05 20:00');
nextDST("AUD", D'2019.06.05 20:00');
nextDST("AUD", D'2019.11.20 20:00');

で、3つの地域について、その年の3つの関連するすべての時点をテストします。結果は次のとおりです。

EU: 3月の最終日曜日と10月の最終日曜日:    EUR-DST for 2019.02.05 20:00 DST:        0   nxtSwitch: Su. 2019.03.31 03:00
    EUR-DST for 2019.06.05 20:00 DST: -3600   nxtSwitch: Su. 2019.10.27 03:00
    EUR-DST for 2019.11.20 20:00 DST:        0   nxtSwitch: Su. 2020.03.29 03:00

US: 3月の第2日曜日と11月の第1日曜日:
    USD-DST for 2019.02.05 20:00 DST:        0   nxtSwitch: Su. 2019.03.10 03:00
    USD-DST for 2019.06.05 20:00 DST: -3600   nxtSwitch: Su. 2019.11.03 03:00
    USD-DST for 2019.11.20 20:00 DST:        0   nxtSwitch: Su. 2020.03.08 03:00

AU: 11月の第1日曜日と3月の最終日曜日    AUD-DST for 2019.02.05 20:00 DST: -3600   nxtSwitch: Su. 2019.03.31 03:00
    AUD-DST for 2019.06.05 20:00 DST:        0   nxtSwitch: Su. 2019.11.03 03:00
    AUD-DST for 2019.11.20 20:00 DST: -3600   nxtSwitch: Su. 2020.03.29 03:00

オーストラリアの時刻シフトは紛らわしいかもしれませんが、オーストラリアはアメリカやヨーロッパとは異なり、年の変わり目が夏の真ん中にある南半球に位置しているため、夏時間はヨーロッパの冬にあたります。


ロシアでの切り替え

MQにはロシアのルーツがあり、ロシアのユーザーが多いため、ロシアの時間変更も含まれています。しかし、ロシアでは時計がいつどのように回されるかという変更が多いため、時刻とそれぞれのシフトが入力され、この関数で照会できる2次元配列を使用することにしました。

long RussiaTimeSwitch[][2] =
  {
   D'1970.01.00 00:00', -10800,
   D'1980.01.00 00:00', -10800,
   D'1981.04.01 00:00', -14400,
...
   D'2012.01.00 00:00', -14400,
   D'2014.10.26 02:00', -10800,
   D'3000.12.31 23:59', -10800
  };
int SzRussiaTimeSwitch = 67;                    // ArraySize of RussiaTimeSwitch

//+------------------------------------------------------------------+
//| Russian Time Switches                                            |
//+------------------------------------------------------------------+
void offsetRubGMT(const datetime t)
  {
   int i = SzRussiaTimeSwitch; //ArrayRange(RussiaTimeSwitch,0); 66
   while(i-->0 && t < RussiaTimeSwitch[i][0])
      continue;
// t >= RussiaTimeSwitch[i][0]
   nxtSwitch_RUB  = (datetime)RussiaTimeSwitch[fmin(SzRussiaTimeSwitch-1,i+1)][0];
   DST_RUS        = (int)RussiaTimeSwitch[fmin(SzRussiaTimeSwitch-1,i+1)][1];
   return;
  }
//+------------------------------------------------------------------+


時刻を更新する関数

ここで、このプロジェクトの最後の関数である、重要な値を最新の状態に保つ関数について説明します。

//+------------------------------------------------------------------+
//| function to determine broker offset for the time tB given        |
//+------------------------------------------------------------------+
void checkTimeOffset(datetime tB)
  {
   if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR && tB < nxtSwitch_AUD)
      return;                                                  // nothing has changed, return

また、最初に、時刻オフセット(および次の切り替え日)を設定する必要があるかどうかを尋ねます。必要がない場合、関数はすぐに終了します。

それ以外の場合、「EUR」、「USD」、「AUD」、「RUB」の値が上記のnextDST()関数を使用して計算されます。

   if(tB>nxtSwitch_USD)
      nextDST("USD", tB);                                      // US has switched
   if(tB>nxtSwitch_EUR)
      nextDST("EUR", tB);                                      // EU has switched
   if(tB>nxtSwitch_AUD)
      nextDST("AUD", tB);                                      // AU has switched
   if(tB>nxtSwitch_RUB)
      nextDST("RUB", tB);                                      // RU has switched

証券会社のオフセットを決定するには、「USD」と「EUR」が必要です。「AUD」と「RUB」は、ユーザーが知りたい場合にのみ必要です。それ以外の場合は、//で非アクティブ化できます。

次に、期間に応じて、OffsetBroker.actOffsetフィールドに、その瞬間から有効なの時間オフセットと、現在の外国為替市場の開始期間であるOffsetBroker.actSecFXを割り当てる必要があります。

   if(DST_USD+DST_EUR==0)                                      // both in winter (normal) time
     {
      OffsetBroker.actOffset = OffsetBroker.USwinEUwin;
      OffsetBroker.actSecFX  = OffsetBroker.secFxWiWi;
     }
   else
      if(DST_USD == DST_EUR)                                   // else both in summer time
        {
         OffsetBroker.actOffset = OffsetBroker.USsumEUsum;
         OffsetBroker.actSecFX  = OffsetBroker.secFxSuSu;
        }
      else
         if(DST_USD != DST_EUR)                                // US:summer EU:winter
           {
            OffsetBroker.actOffset = OffsetBroker.USsumEUwin;
            OffsetBroker.actSecFX  = OffsetBroker.secFxSuWi;
           }

以上です。使用する必要のあるすべての関数は次のとおりです。相場から証券会社の時刻オフセットを決定し、現在の時刻オフセットを常に特定し、ストラテジーテスターでもGMTやその他の現地時間を簡単に特定できる関数です。

ここで、すべてを使用する2つの方法を示します。


設定と使用法を示すスクリプト

最初に、それを(添付された)スクリプト(DealingWithTimeScript.mq5)に追加します。

#include <DealingWithTime.mqh>
//+------------------------------------------------------------------+
//| Finding the broker offsets                                       |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- step 1: set the broker time offsets in winter, summer and in between
   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }

エキスパートログに次が出力されます。

EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of MetaQuotes Software Corp.: 
US=Winter & EU=Winter (USwinEUwin)      =  -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin)   =   -7200

すでにこれにより、見つかったオフセットを入力変数に割り当てることができます。これが次の章の例です。ここに表示される内容はすでに説明されているので、このスクリプトの次のステップに進みます。過去からの実際の時間までの経路をシミュレートし、GMTニューヨークの値とランダムに選択されたタイムスタンプに対して外国為替市場が開いたままでいる残り時間を計算して印刷します。

関数CopyTime("EURUSD",PERIOD_H1,datetime(0),TimeCurrent(),arr1h)を使用して、「EURUSD」の1時間のタイムスタンプの履歴全体を取得します。

ただし、この長期間にわたる大量のデータと長い表現に溺れないようにするために、ランダムに決定されたバーのデータのみを表示します。このために、必要なデータの数を選択します。ランダム平均ではジャンプ距離がsz/5の約半分であるため、与えられた5では約10になります。

//--- step 2: get the quotes (here only 1h time stamps)
   datetime arr1h[], tGMT, tNY, tLeft;
   CopyTime("EURUSD",PERIOD_H1,datetime(0),TimeCurrent(),arr1h);
   int b       = 0,
       sz      = ArraySize(arr1h)-1,                  // oldest time stamp
       nChecks = sz/5,                                // ~2*5+1 randomly chosen bars
       chckBar = MathRand()%nChecks;                  // index of the first bar to check

次に、ストラテジーテスターでのテストや最適化のように、古いものから現在のものまで、すべてのバーを調べます - while(++b<=sz)。最初に行うことは、新しい各バーの時間状況をチェックすることです - checkTimeOffset(arr1h [b])。この関数で最初に確認されるのは、再計算が必要かどうかであるため、この呼び出しは、その頻度にもかかわらず、それほどリソースを消費しません。

//---  step 3: simulate an EA or an indicator go through the time from the past to now
   while(++b<=sz)
     {
      //--- check the time situation, normally do it at the first bar after the weekend
      checkTimeOffset(arr1h[b]);

ここでは、ランダム値GMT (tGMT)、ニューヨーク時間(tNY)、およびfx-marketが終了するまでの残りの時間tLeftによって決定されるバー(のみ)を計算します。次に、これが出力され、次のバーのインデックスが計算されます。

      //--- for a randomly selected bar calc. the times of GMT, NY & tLeft and print them
      if(b>=chckBar || b==sz)
        {
         tGMT  = arr1h[b] + OffsetBroker.actOffset;         // GMT
         tNY   = tGMT - (NYShift+DST_USD);                  // time in New York
         tLeft = OffsetBroker.actSecFX - SoW(arr1h[b]);     // time till FX closes
         PrintFormat("DST_EUR:%+ 6i  DST_EUR:%+ 6i  t[%6i]  tBrk: %s%s  "+
                     "GMT: %s%s  NY: %s%s  End-FX: %2ih => left: %2ih ",
                     DST_EUR,DST_USD,b,
                     DoWs(arr1h[b]),TimeToString(arr1h[b],TIME_DATE|TIME_MINUTES),
                     DoWs(tGMT),TimeToString(tGMT,TIME_DATE|TIME_MINUTES),
                     DoWs(tNY),TimeToString(tNY,TIME_DATE|TIME_MINUTES),
                     OffsetBroker.actSecFX/3600,tLeft/3600
                    );
         chckBar += MathRand()%nChecks;               // calc. the index of the next bar to check
        }

以下が、Metaquotesデモ口座でのこのスクリプトの完全な出力です。

EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of MetaQuotes Software Corp.: 
US=Winter & EU=Winter (USwinEUwin)      =  -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin)   =   -7200

DST_EUR: -3600  DST_EUR: -3600  t[ 28194]  tBrk: Mo.2002.05.20 22:00  GMT: Mo.2002.05.20 19:00  NY: Mo.2002.05.20 15:00  End-FX: 143h => left: 97h 
DST_EUR: -3600  DST_EUR: -3600  t[ 40805]  tBrk: We.2004.05.26 06:00  GMT: We.2004.05.26 03:00  NY: Tu.2004.05.25 23:00  End-FX: 143h => left: 65h 
DST_EUR: -3600  DST_EUR: -3600  t[ 42882]  tBrk: Th.2004.09.23 19:00  GMT: Th.2004.09.23 16:00  NY: Th.2004.09.23 12:00  End-FX: 143h => left: 28h 
DST_EUR:      +0  DST_EUR:     +0  t[ 44752]  tBrk: Tu.2005.01.11 17:00  GMT: Tu.2005.01.11 15:00  NY: Tu.2005.01.11 10:00  End-FX: 143h => left: 78h 
DST_EUR:      +0  DST_EUR: -3600  t[ 64593]  tBrk: We.2008.03.26 03:00  GMT: We.2008.03.26 01:00  NY: Tu.2008.03.25 21:00  End-FX: 142h => left: 67h 
DST_EUR:      +0  DST_EUR:     +0  t[ 88533]  tBrk: Tu.2012.02.07 13:00  GMT: Tu.2012.02.07 11:00  NY: Tu.2012.02.07 06:00  End-FX: 143h => left: 82h 
DST_EUR:      +0  DST_EUR:     +0  t[118058]  tBrk: We.2016.11.16 06:00  GMT: We.2016.11.16 04:00  NY: Tu.2016.11.15 23:00  End-FX: 143h => left: 65h 
DST_EUR: -3600  DST_EUR: -3600  t[121841]  tBrk: Mo.2017.06.26 05:00  GMT: Mo.2017.06.26 02:00  NY: Su.2017.06.25 22:00  End-FX: 143h => left: 114h 
DST_EUR:      +0  DST_EUR: -3600  t[144995]  tBrk: Mo.2021.03.22 06:00  GMT: Mo.2021.03.22 04:00  NY: Mo.2021.03.22 00:00  End-FX: 142h => left: 112h 
DST_EUR: -3600  DST_EUR: -3600  t[148265]  tBrk: Tu.2021.09.28 15:00  GMT: Tu.2021.09.28 12:00  NY: Tu.2021.09.28 08:00  End-FX: 143h => left: 80h 

最初の2つのブロックについてはすでに説明しました。3番目と最後の部分は、ランダムに選択された時点について、EUとUSのそれぞれの時差、その時点のインデックス、、GMT、ニューヨーク時間、この時点とFX市場の開始時間と残りの時間を示しています。 明確にするために、これらは秒ではなく時間に変換されています。これはすぐに確認できます。2002年5月20日、証券会社の時刻(MQ)は22:00、夏時間適用、GMT =証券会社-3h = 19:00、NY = GMT-(5h-1h)= 15:00、FX市場は97時間で閉じます。97 = 4*24 (Mon.22:00-Fri.22:00 = 96h) +1h (Fri.22:00-23:00) - Q.E.D.

さまざまなオフセットが必要なEAは指標には、2つの関数の呼び出しのみが必要です。

   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }
..
   checkTimeOffset(TimeCurrent());


入力変数を介してそれを使用する代替案

最後に、EAが入力変数に対してこれをどのように使用できるかの例を示します。上からのスクリプトを使用すると、次の式が得られます。

Time Offset of MetaQuotes Software Corp.:
US=Winter & EU=Winter (USwinEUwin)      =  -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin)   =   -7200

これがわかると、EAは次のようになります(添付されていないので、ここからコピーしてください)。

#include <DealingWithTime.mqh>
// offsets of MetaQuotes demo account: DO NOT USE THEM FOR DIFFERENT BROKERS!!
input int   USwinEUwin=  -7200;    // US=Winter & EU=Winter
input int   USsumEUsum= -10800;    // US=Summer & EU=Summer
input int   USsumEUwin=  -7200;    // US=Summer & EU=Winter

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   OffsetBroker.USwinEUwin = USwinEUwin;
   OffsetBroker.USsumEUsum = USsumEUsum;
   OffsetBroker.USsumEUwin = USsumEUwin;
   OffsetBroker.actOffset  = WRONG_VALUE; 
   
   nxtSwitch_USD = nxtSwitch_EUR = nxtSwitch_AUD = 0;
   //--- Just a simple test if not ste or changed
   if(OffsetBroker.USwinEUwin+OffsetBroker.USsumEUsum+OffsetBroker.USsumEUwin==0)
      OffsetBroker.set     = false;
   else
      OffsetBroker.set     = true;
   //...
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   checkTimeOffset(TimeCurrent());
   tGMT  = TimeCurrent() + OffsetBroker.actOffset;    // GMT
   tNY   = tGMT - (NYShift+DST_USD);                  // time in New York
   tLon  = tGMT - (LondonShift+DST_EUR);              // time in London
   tSyd  = tGMT - (SidneyShift+DST_AUD);              // time in Sidney
   tMosc = tGMT - (MoskwaShift+DST_RUS);              // time in Moscow
   tTok  = tGMT - (TokyoShift);                       // time in Tokyo - no DST

   //...
   
  }

ここでは、Metaquotesのオフフェストを使用しました。ご自分の証券会社のオフセットを使用していることを確認してください。

OnTick()では、最初に時間オフセットが計算され、その直後にGMTとニューヨーク、ロンドン、シドニー、モスクワ、東京の現地時間が計算され、これが現在どれほど単純であるかが示されます。そして括弧に注意するこをお忘れなく。


終わりに

後わりの言葉の代わりに、いくつかの証券会社のデモ口座に適用されたsetBokerOffset()関数の結果(のみ)を示します。

EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of MetaQuotes Software Corp.: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -7200



EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of RoboForex Ltd: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -7200


EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of Alpari International: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -7200


EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 143h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 143h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of Pepperstone Group Limited: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -10800


EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 143h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 143h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of Eightcap Pty Ltd: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -10800

EUR: Fr.2020.10.23 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 143h
USD: Fr.2020.10.30 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 142h
NXT: Fr.2020.11.06 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 143h
USD: Fr.2021.03.12 23:00: hNY:16  hGMT:21  hTC:23  hDiff:-2   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 143h
EUR: Fr.2021.03.26 22:00: hNY:16  hGMT:20  hTC:22  hDiff:-2   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 142h
NXT: Fr.2021.04.02 23:00: hNY:16  hGMT:20  hTC:23  hDiff:-3   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 143h

Time Offset of InstaForex Companies Group: 
US=Winter & EU=Winter (USwinEUwin) = -7200
US=Summer & EU=Summer (USsumEUsum) = -10800
US=Summer & EU=Winter (USsumEUwin) = -7200


EUR: Fr.2020.10.23 21:00: hNY:16  hGMT:20  hTC:21  hDiff:-1   BrokerTime => GMT: 2020.10.23 20:00 => tNY: 2020.10.23 16:00  End-FX after: 141h
USD: Fr.2020.10.30 21:00: hNY:16  hGMT:20  hTC:21  hDiff:-1   BrokerTime => GMT: 2020.10.30 20:00 => tNY: 2020.10.30 16:00  End-FX after: 141h
NXT: Fr.2020.11.06 21:00: hNY:16  hGMT:21  hTC:21  hDiff: 0   BrokerTime => GMT: 2020.11.06 21:00 => tNY: 2020.11.06 16:00  End-FX after: 141h
USD: Fr.2021.03.12 21:00: hNY:16  hGMT:21  hTC:21  hDiff: 0   BrokerTime => GMT: 2021.03.12 21:00 => tNY: 2021.03.12 16:00  End-FX after: 141h
EUR: Fr.2021.03.26 21:00: hNY:16  hGMT:20  hTC:21  hDiff:-1   BrokerTime => GMT: 2021.03.26 20:00 => tNY: 2021.03.26 16:00  End-FX after: 141h
NXT: Fr.2021.04.02 21:00: hNY:16  hGMT:20  hTC:21  hDiff:-1   BrokerTime => GMT: 2021.04.02 20:00 => tNY: 2021.04.02 16:00  End-FX after: 141h

Time Offset of JFD Group Ltd: 
US=Winter & EU=Winter (USwinEUwin) = 0
US=Summer & EU=Summer (USsumEUsum) = -3600
US=Summer & EU=Winter (USsumEUwin) = -3600

取引があなたを豊かにしますように。:)



MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/9929

添付されたファイル |
DealingWithTime.mqh (52.89 KB)
MQL言語を使用したゼロからのディープニューラルネットワークプログラミング MQL言語を使用したゼロからのディープニューラルネットワークプログラミング
この記事は、MQL4/5言語を使用してディープニューラルネットワークを最初から作成する方法を読者に教えることを目的としています。
より優れたプログラマー(第06部): 効果的なコーディングにつながる9つの習慣 より優れたプログラマー(第06部): 効果的なコーディングにつながる9つの習慣
効果的なコーディングにつながるのはコードを書くことだけではありません。経験を通して見つけた、効果的なコーディングにつながる特定の習慣があります。この記事では、そのいくつかについて詳しく説明します。これは、複雑なアルゴリズムをより手間をかけずに作成する能力を向上させたいすべてのプログラマーにとって必読の記事です。
DoEasyライブラリのグラフィックス(第89部): 抽象標準グラフィカルオブジェクトのプログラミング基本機能 DoEasyライブラリのグラフィックス(第89部): 抽象標準グラフィカルオブジェクトのプログラミング基本機能
現在、ライブラリでは、一部のパラメータの削除や変更など、クライアントターミナルのチャート上の標準のグラフィカルオブジェクトを追跡できます。現時点では、カスタムプログラムから標準グラフィカルオブジェクトを作成する機能はありません。
手動のチャート作成および取引ツールキット(第III部)最適化と新しいツール 手動のチャート作成および取引ツールキット(第III部)最適化と新しいツール
この記事では、キーボードショートカットを使用してチャート上にグラフィカルオブジェクトを描画するというアイデアをさらに発展させます。ライブラリに新しいツールが追加されました。これには、任意の頂点を通る直線や、反転時間とレベルの評価を可能にする一連の長方形が含まれます。また、この記事では、パフォーマンス向上のためにコードを最適化する可能性を示しています。実装例が書き直され、他の取引プログラムと一緒にShortcutsを使用できるようになりました。初心者より少し上回るコード知識レベルが必要とされます。