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

 

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

素晴らしい記事を作ってくれた。あなたのコードを使ってみてわかったことがあります。

私はeightcapブローカーを使っているのですが、それぞれの国の実際の時刻を表示する簡単なスクリプトを使ってみたところ、東京の時刻が実際の時刻より1時間遅れていることがわかりました。これが私が使っているスクリプトです、

void OnStart()
  {
   bool isTimeSet = setBokerOffset();
   if(!isTimeSet)
     {
      Alert("setBokerOffset failed");
      return;
     }

   Alert("+++++++++++++++");
   checkTimeOffset(TimeCurrent());
   datetime tGMT  = TimeCurrent() + OffsetBroker.actOffset;    // グリニッジ標準時
   datetime tNY   = tGMT - (NYShift+DST_USD);                  // ニューヨークでの時間
   datetime tLon  = tGMT - (LondonShift+DST_EUR);              // ロンドンでの時間
   datetime tSyd  = tGMT - (SidneyShift+DST_AUD);              // シドニーでの時間
   datetime tMosc = tGMT - (MoskwaShift+DST_RUS);              // モスクワでの時間
   datetime tTok  = tGMT - (TokyoShift);                       // 東京の時間 - 夏時間なし

   Alert("time NY: ", tNY);
   Alert("time Lon: ", tLon);
   Alert("time Syd: ", tSyd);
   Alert("time Tok: ", tTok);
  }

コードは記事からコピペしたもので、値を返すだけです。他のセッションは正しいので、コードの使い方に問題はないと思います。

Carl Schreiber
Carl Schreiber
  • 2023.03.22
  • www.mql5.com
Trader's profile
 
Luandre Ezra #:

カール・シュライバー

素晴らしい記事を作ってくれた。あなたのコードを使ってみてわかったことをお伝えしたいと思います。

私はeightcapブローカーを使っているのですが、それぞれの国の実際の時刻を表示する簡単なスクリプトを使ってみたところ、東京の時刻が実際の時刻より1時間遅れていることがわかりました。これが私が使っているスクリプトです、

コードは記事からコピペしたもので、値を返すだけです。他のセッションは正しいので、コードの使い方に問題はないと思います。

GMT(=UTC)からの時間差は0900時間(https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo)

= 9*-3600=32400秒です:

と設定されている:

#define  TokyoShift   -32400                           // 常に9h
Current local time in Tokyo, Japan
  • www.worldtimeserver.com
Current local time and date in Tokyo, Japan from a trusted independent resource
 
Carl Schreiber #:

GMT(=UTC)からの時差は0900時間(https://www.worldtimeserver.com/current_time_in_JP.aspx?city=Tokyo)

= 9*-3600=32400秒となる:

と設定されている:

間違えた。東京ではなくシドニーです。


 
オーストラリアのサマータイムの計算が間違っているのかもしれない。
Time Zones - WorldTimeServer.com
  • www.worldtimeserver.com
A list of all worldwide time zones with abbreviation and name. Click on a time zone to see more details.
 

Australian First Sunday of October at 02:00 to First Sunday of April at 02:00

Australian DST 2010 start 2010.10.03 - end 2010.04.04
Australian DST 2011 start 2011.10.02 - end 2011.04.03
Australian DST 2012 start 2012.10.07 - end 2012.04.01
Australian DST 2013 start 2013.10.06 - end 2013.04.07
Australian DST 2014 start 2014.10.05 - end 2014.04.06
Australian DST 2015 start 2015.10.04 - end 2015.04.05
Australian DST 2016 start 2016.10.02 - end 2016.04.03
Australian DST 2017 start 2017.10.01 - end 2017.04.02
Australian DST 2018 start 2018.10.07 - end 2018.04.01
Australian DST 2019 start 2019.10.06 - end 2019.04.07
オーストラリア DST 2020 start 2020.10.04 - end 2020.04.05
オーストラリア DST 2021 start 2021.10.03 - end 2021.04.04
オーストラリア DST 2022 start 2022.10.02 - end 2022.04.03
オーストラリア DST 2023 start 2023.10.01 - end 2023.04.02
オーストラリア DST 2024 start 2024.10.06 - end 2024.04.07
オーストラリア夏時間 2025 開始 2025.10.05 - 終了 2025.04.06
オーストラリア夏時間 2026 開始 2026.10.04 - 終了 2026.04.05
オーストラリア夏時間 2027 開始 2027.10.03 -終了 2027.04.04
オーストラリア夏時間 2028 開始 2028.10.01 -終了 2028.04.02
オーストラリア夏時間 2029 開始 2029.10.07 -終了 2029.04.01

Australia & New Zealand End DST
Australia & New Zealand End DST
  • www.timeanddate.com
People in New Zealand and parts of Australia will get an additional hour to enjoy when Daylight Saving Time (DST) ends on Sunday, April 2, 2023.
 

問題を見つけました:

関数void checkTimeOffset(datetime tB) の最初にチェックを入れました:

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR)
      return;  

そして、これは私が変更しなければならなかった:

if(tB < nxtSwitch_USD && tB < nxtSwitch_EUR && tB < nxtSwitch_AUD)
      return;  

私はそれを更新します...

 
Carl Schreiber #:

問題を発見した:

関数void checkTimeOffset(datetime tB) の最初にチェックを入れました:

そして、これを次のように変更しなければならなかった:

私はそれを更新します...

残念ながら、対応するコードを変更しても問題は解決しません。また、モスクワの時間が世界標準時と異なることもわかりました。


 

DealingWithTime.mqhの バージョン1.01は、記事「Dealing with Time (Part 2):関数"(https://www.mql5.com/en/articles/9929)が動作しなくなったのは、この記事の公開後しばらくしてMQがCopyTime() 関数の動作を変更したためです。この関数は、start_timeおよび/またはstop_timeパラメータに指定されたTimeCurrent() よりも大きい場合、将来の時間値を返さなくなりました。その代わりに、最後の、現在のバーの始値が、可能な限り大きな値として返されます。

FXセッションの終了時刻は、ブローカー時刻のオフセットを決定するためにこの方法で決定されたため、特に、現在、これは正しくない値につながります!

この計算はバージョン2.03で変更されました。この新しいバージョンはコードベース https://www.mql5.com/en/code/45287 にあります

また、シドニー(オーストラリア)から1970年代までの複雑な時刻変更もカバーできるように、時刻変更の計算も完全に変更されました。

また、70年代以降のすべての時間変更を記載した表DST 1975 - 2030.xlsxを zipファイルとして同封していますので、計算式が正しく機能するかどうかご確認ください:

1982年1月1日はアメリカの冬時間(DST=0)であり、次の切り替えは1982年4月25日、4月(4)の最終(25日)日曜日です。この表は、地理的なタイムゾーン(A列)、その年のタイムゾーン(L列、spr=春、aut=秋、)、そして最後にクエリー日(C列)に従ってソートされています。 Test_DST 2.mq5を デバッグモードで実行し、デバッガでジャーナルログの行をコピーしてスプレッドシートプログラムに貼り付けると、テーブルが自動的に作成されます

また、新しいシンプルな関数SecTillClose() が追加され、CopyTime()を使わなくても、外為市場がクローズするまでの残り時間(MQの時間通貨)を秒単位で知ることができます。これは、週末前にポジションをクローズしたい人や、週末前の定義された期間に新しいポジションをオープンしたくない人にとって興味深いものです。

付属のインジケータDealingWithTime_TestIndi.mq5 は、ヨーロッパ、アメリカ、オーストラリア (シドニー) の夏時間/冬時間だけでなく、現在時刻や各都市の時差もチャートにコメントとして表示します。また、https://www.timeanddate.com/worldclock/ との比較のために、主要都市の現地時間の表も表示されます このため、いつでも値を確認することができます。このインジケーターは、これらの値がどのように決定され、どのように使用されるのか(何から何が引かれ、何に何が加えられるのか)も示しているため、自分で簡単に使用することができます。

最後の2行には、現在のFXセッションの最後の1秒と、残り時間が時間(判断しやすい)と秒単位で表示されています。ニューヨークのFXセッションが金曜日の現地時間17:00に終了する場合、ニューヨーク時間17:00に開始する有効なバーは存在しません。したがって、この関数では、ブローカー時間における最後のバーの有効な開始時刻を得るために、1 秒が差し引かれます。ただし、ブローカーによっては、数分前にFXセッションを終了し、価格の提供や取引注文の受付を終了する場合があります。


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

DealingWithTime.mqhの バージョンは、Dealing with Time (Part 2)の記事のDealingWithTime.mqh v.1.01です:関数(https://www.mql5.com/ja/articles/9929)が動作しなくなったのは、この記事の公開後しばらくしてMQがCopyTime() 関数の動作を変更したためです。この関数は、start_timeやstop_timeパラメータに指定されたTimeCurrent() よりも大きい場合、将来の時間値を返さなくなりました。その代わりに、最後の現在のバーのオープン時間が可能な限り大きな値として返されます。

FXセッションの終了時刻は、ブローカーの時間オフセットを決定するためにこの方法で決定されたため、現在、これは正しくない値につながります!

この計算はバージョン2.03で変更されました。このバージョンはCodeBaseのhttps://www.mql5.com/ja/code/45287。

シドニー(オーストラリア)から70年代までの複雑な時間変更もカバーできるようになりました。

また、70年代以降のすべての時間変更を記載した表DST 1975 - 2030.xlsxを zipファイルとして添付していますので、どなたでも計算式の正しい動作を確認することができます:

1982年1月1日がアメリカの標準時(DST=0)で、次の切り替えは1982年4月25日、4月(4)の最終(25日)日曜日です。この表は、すでに地理的なタイムゾーンでソートされ(A列)、次にその年のタイムゾーンでソートされ(L列、spr=春、aut=秋、)、最後にクエリの日付でソートされます(C列)。 Test_DST 2.mq5を デバッグモードで実行し、デバッガでジャーナルログの行をコピーしてスプレッドシートに貼り付けると、表が自動的に作成されます(スクリプトをデバッグモードで実行することはできません)。 セルの区切りはスペースになります。

また、新しいシンプルな関数SecTillClose() が追加され、CopyTime()を使わなくても、外為市場がクローズするまでの残り時間(MQの時間通貨)を秒単位で表示できるようになりました。これは、週末前にポジションをクローズしたい人や、週末前の定義された期間に新しいポジションをオープンしたくない人にとって興味深いものです。

チャート上のコメントとして、付属のインジケータDealingWithTime_TestIndi.mq5 は、ヨーロッパ、米国、オーストラリア (シドニー) のサマータイムだけでなく、現在時刻と各都市の時差も表示します。ここでは、比較のために、主要都市の現地時間の異なる表を見つけることができます: https://www.timeanddate.com/worldclock/。このため、いつでも値を確認することができる。このインジケーターは、これらの値がどのように決定され、どのように使用されるのか(何から何が引かれ、何から何が加えられるのか)も示しているため、自分でも簡単に使用することができます。

また、最後の2行には、現在のFXセッションの最後の1秒と、残り時間を時間単位(判断しやすい)と秒単位で表示しています。ニューヨークでは、金曜日の現地時間午後5時にFXセッションが終了すると、ニューヨーク時間の午後5時には有効なバーが開いていません。したがって、この関数では、ブローカー時間における最後のバーの有効なオープン時間を得るために、1秒が差し引かれます。ただし、一部のブローカーは、価格の提供や取引注文の受付を終了することで、FX セッションを数分早く終了します。


Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

DealingWithTime.mqhの v.1.01は「タイムテーブルの管理(パート2)」の記事で使用しました:MetaQuotesがCopyTime()の 動作を変更したため、この記事の公開後しばらくして、この関数は動作しなくなりました。この関数は、start_timeパラメータやstop_timeパラメータに指定されたTimeCurrent() よりも大きい場合、将来の時間値を返さなくなりました。その代わりに、最後の現在のバーのオープン時間が可能な限り大きな値として返されます。

FXセッションの終了時刻は、ブローカーの時間オフセットを決定するためにこの方法で決定されたため、現在、これは正しくない値につながります!

この計算はバージョン2.03で変更されました。このバージョンは現在、CodeBaseのhttps://www.mql5.com/en/code/45287。

シドニー(オーストラリア)から1970年代までの複雑な時間変更もカバーできるようになりました。

また、1970年代以降のすべての時刻変更に対応した表DST 1975 - 2030.xlsx をzipファイルとして添付しましたので、計算式の正しい動作をご確認ください:

1982年1月1日はアメリカの標準時(DST==0)であり、次の変更は1982年4月25日、4月の最終(25日)日曜日(4)である。この表は、地理的なタイムゾーンでソートされ(A列)、その年のタイムゾーンでソートされ(L列、spr=春、aut=秋)、最後にクエリの日付でソートされます(C列)。 Test_DST 2.mq5を デバッグモードで実行し、ジャーナル行をデバッガにコピーしてスプレッドシートに貼り付けると、表が自動的に作成されます(スクリプトをデバッグモードで実行することはできません)。 セル区切りはスペースになります。

さらに、CopyTime()を使用 せずに、外為市場がクローズするまでの残り時間(MetaQuotesの時間通貨)を秒単位で表示するシンプルな新関数SecTillClose() が追加されました。これは、週末前にポジションをクローズしたい人や、週末前の定義された期間に新しいポジションをオープンしたくない人にとって興味深いものです。

付属のインジケータDealingWithTime_TestIndi.mq5は、チャート上のコメントとして、ヨーロッパ、米国、オーストラリア(シドニー)のサマータイムだけでなく、現在時刻と各都市の時差も表示します。ここでは、比較のために、主な都市の現地時間の異なる表を見つけることができます: https://www.timeanddate.com/worldclock/。このため、いつでも値を確認することができる。このインジケーターは、これらの値がどのように決定され、どのように使用されるのか(何を差し引いたり、足したりするのか)も示しているため、簡単に使用することができます:コピー&ペースト、プログラミングの最速の方法です。

最後の2行には、現在のFXセッションの最後の1秒と、残り時間が時間(判断しやすい)と秒単位で表示されています。ニューヨークでは、現地時間の金曜日午後5時にFXセッションが終了すると、ニューヨーク時間の午後5時には有効なバーが開いていません。したがって、この関数では、ブローカーの時間における最後のバーの有効なオープン時間を得るために、1 秒が差し引かれます。ただし、ブローカーによっては、FX セッションを数分早く終了し、価格の提供や取引注文の受付を終了している場合があります。