
時間の取扱い(第2部): 関数
グローバル変数
おそらく不十分な答えしかくれない(欠如した時間について説明することはいとわないでしょうが)証券会社にサポートを求める代わりに、時間が変わる週に証券会社が価格をどのように計算するかを自分で見ます。結局のところ、私たちは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:
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市場がこれらの週に開いている現在の期間も計算できます。これらの値は、フィールドsecFxWiWi、secFxSuSu、secFxSuWiに格納され、現在有効な値は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の値をゼロにリセットすることが重要である理由も示されています。そうしないと、テスト期間全体にわたって再計算が行われない可能性があるということです。
次に、変数の宣言と初期化の後、関数の中心に到達しますが、これは私からのものではありません。かなり前に、ネットのどこかで、月の特定の日を特定するアルゴリズムを見つけました。これは、特定の時点の夏または冬の時間を決定するために使用されます。アルゴリズムはそれほど複雑ではありません。
- 切り替えが行われる日(日曜日)を特定します。
- それから日付を作成します。
- 最も近い将来の切り替え日曜日を見つけます。
- 時刻シフト(0hまたは-1hのいずれか)と次の切り替え日曜日を設定します。
このアルゴリズムの魔法は、時間変更の月の日を特定するコード行にあります。EUの場合、これは3月の最後の日曜日であり、次のように計算されます(言ったように、式のアイデアは私のものではありません)。
d = (int)(31 - MathMod((4 + MathFloor(5*y/4)), 7)); // determine the last Sunday in March for the EU switch2021年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つのセクションがあります。
- 3月の夏時間への切り替え前
- 10月/11月の冬時間への切り替え前
- 次の年の冬時間から夏時間への切り替え
これは、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; }
エキスパートログに次が出力されます。
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デモ口座でのこのスクリプトの完全な出力です。
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が入力変数に対してこれをどのように使用できるかの例を示します。上からのスクリプトを使用すると、次の式が得られます。
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





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索