2016年も3月13日の3月第2日曜日で米国が、3月27日の3月最終日曜日でヨーロッパが夏時間になりました。トレードに関わるなら市場の取引時間が変わるので夏時間は気にせずにはいられません。しかしMT4の夏時間は本当に難しいと感じます。GMT、サーバー時間、ローカルPCと3つも時間を返す関数がある上に、夏時間なしの東京時間、夏時間ありだけど時期が違う欧州時間とNY時間を意識しないといけないからです。これに気をつけないと、いや、気をつけていても、「え~っと、この時間を基準にしてここのタイムゾーンの~日前の...NY時間では日をまたぐから.....▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ」なんてことがよくあります。下記に日時情報を得る関数について整理してみました。
- TimeCurrent : サーバー時間を返します。このサーバー時間というのがやっかいで、正確には「最後のTickを受信したサーバーの時間」です。なので市場がクローズしている土日は止まります。また、サーバーのタイムゾーンにも左右されます。
- TimeGMT : グリニッジ標準時を返します。
- TimeLocal : MT4を使っているPCの時間を返します。MT4を使用するPCのタイムゾーンによって夏時間になる場合もあります。
- TimeGMTOffset : GMTとローカルPCの時間の差分を秒単位で返します。これもMT4を使用するPCのタイムゾーンによって夏時間になる場合もあります。
- TimeDaylightSavings : ローカルPCの夏時間の補正を秒単位で返します。なので標準時間の時はいつも0を返します。
これらの関数がいつになるとどういう値を返すのか、下記のスクリプトを用いて、PCのタイムゾーンを東京、ロンドン、ニューヨークに変えて調べてみました。
void OnStart() { Print("TimeCurrent() : ", TimeToStr(TimeCurrent())); Print("TimeGMT() : ", TimeToStr(TimeGMT())); Print("TimeGMTOffset() : ", IntegerToString(TimeGMTOffset())); Print("TimeDaylightSavings() : ", IntegerToString(TimeDaylightSavings())); Print("TimeLocal() : ", TimeToStr(TimeLocal())); }
調べた時間帯は、標準時間、夏時間その1(米国が夏時間)、夏時間その2(ヨーロッパ、米国が夏時間)で市場がオープン、クローズの計6パターン。わざわざ夏時間を2パターン調べたのはロンドンの夏時間とGMTの時間を比較したかったからです。下記が結果です。
1-a. 標準時間で市場がオープンの時(2016/03/10 23:12 Thu. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.10 23:12 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.10 14:12 TimeCurrent() : 2016.03.10 16:12 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.10 14:15 TimeDaylightSavings() : 0 TimeGMTOffset() : 0 TimeGMT() : 2016.03.10 14:15 TimeCurrent() : 2016.03.10 16:15 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.10 09:17 TimeDaylightSavings() : 0 TimeGMTOffset() : 18000 TimeGMT() : 2016.03.10 14:17 TimeCurrent() : 2016.03.10 16:17
1-b. 標準時間で市場がクローズの時(2016/03/12 14:39 Sat. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.12 14:39 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.12 05:39 TimeCurrent() : 2016.03.11 23:59 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.12 05:37 TimeDaylightSavings() : 0 TimeGMTOffset() : 0 TimeGMT() : 2016.03.12 05:37 TimeCurrent() : 2016.03.11 23:59 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.12 00:38 TimeDaylightSavings() : 0 TimeGMTOffset() : 18000 TimeGMT() : 2016.03.12 05:38 TimeCurrent() : 2016.03.11 23:59
2-a. 夏時間その1(NYのみ夏時間)で市場がオープンの時(2016/03/14 20:43 Mon. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.14 20:42 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.14 11:42 TimeCurrent() : 2016.03.14 14:42 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.14 11:43 TimeDaylightSavings() : 0 TimeGMTOffset() : 0 TimeGMT() : 2016.03.14 11:43 TimeCurrent() : 2016.03.14 14:43 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.14 07:44 TimeDaylightSavings() : -3600 TimeGMTOffset() : 14400 TimeGMT() : 2016.03.14 11:44 TimeCurrent() : 2016.03.14 14:44
2-b. 夏時間その1(NYのみ夏時間)で市場がクローズ(2016/03/14 05:12 Mon. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.14 05:12 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.13 20:12 TimeCurrent() : 2016.03.11 23:59 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.13 20:14 TimeDaylightSavings() : 0 TimeGMTOffset() : 0 TimeGMT() : 2016.03.13 20:14 TimeCurrent() : 2016.03.11 23:59 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.13 16:16 TimeDaylightSavings() : -3600 TimeGMTOffset() : 14400 TimeGMT() : 2016.03.13 20:16 TimeCurrent() : 2016.03.11 23:593-a. 夏時間(その2 ロンドン、NYが夏時間)で市場がクローズの時(2016/03/27 14:10 Sun. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.27 14:11 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.27 05:11 TimeCurrent() : 2016.03.25 23:59 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.27 06:12 TimeDaylightSavings() : -3600 TimeGMTOffset() : -3600 TimeGMT() : 2016.03.27 05:12 TimeCurrent() : 2016.03.25 23:59 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.27 01:13 TimeDaylightSavings() : -3600 TimeGMTOffset() : 14400 TimeGMT() : 2016.03.27 05:13 TimeCurrent() : 2016.03.25 23:59
3-b. 夏時間(その2 ロンドン、NYが夏時間)で市場がオープンの時(2016/03/27 14:10 Sun. JST頃実行)
UTC+9:00 大阪、札幌、東京 TimeLocal() : 2016.03.28 08:03 TimeDaylightSavings() : 0 TimeGMTOffset() : -32400 TimeGMT() : 2016.03.27 23:03 TimeCurrent() : 2016.03.28 02:03 UTC ダブリン、エジンバラ、リスボン、ロンドン TimeLocal() : 2016.03.28 00:01 TimeDaylightSavings() : -3600 TimeGMTOffset() : -3600 TimeGMT() : 2016.03.27 23:01 TimeCurrent() : 2016.03.28 02:01 UTC-5:00 東部標準時(米国およびカナダ) TimeLocal() : 2016.03.27 19:02 TimeDaylightSavings() : -3600 TimeGMTOffset() : 14400 TimeGMT() : 2016.03.27 23:02 TimeCurrent() : 2016.03.28 02:02
市場がクローズのときは金曜日の23:59で時計が止まっているのがわかります。上記の結果だとわかりにくいので、ローカルPCの時間をGMTに修正するTimeDaylightSavingsとTimeGMTOffsetだけ表にまとめてみました。
TimeGMTOffset | TimeDaylightSavings |
||
---|---|---|---|
UTC+9:00 大阪、札幌、東京 | 標準時間 | -32400 | 0 |
夏時間その1 | -32400 | 0 |
|
夏時間その2 | -32400 | 0 |
|
UTC ダブリン、エジンバラ、リスボン、ロンドン | 標準時間 | 0 | 0 |
夏時間その1 | 0 | 0 |
|
夏時間その2 | -3600 | -3600 |
|
UTC-5:00 東部標準時(米国およびカナダ) | 標準時間 | 18000 | 0 |
夏時間その1 | 14400 | -3600 | |
夏時間その2 | 14400 | -3600 |
夏時間がない東京はどの時期でも、TimeDaylightSavingsの結果は0、TimeGMTOffsetは-32400 / (60 * 60) = -9時間となっているのがわかります。ニューヨークは3月第2日曜日の夏時間になると、オフセットが18000/(60*60)=5時間から14400/(60*60)=4時間になっ て、TimeDaylightSavingsの結果が0から-3600/(60*60)=-1時間になっているのがわかります。ロンドンは3月第2日曜日の夏時間になると、オフセットが-3600/(60*60)=1時間、TimeDaylightSavingsの結果が同じく1時間になっているのがわか ります。
以上、MT4の時間系のAPIについてどの時期にどのような結果が得られるのか実際に調べてみました。私も、チャート上に3つの時計を表示するだけのインジケータThreeClocksとそのMT5版、東京、ヨーロッパ、ニューヨークなど、3つの時間のセッションを枠で表示するインジケータThreeZonesとそのMT5版、と4つ夏時間が関係するインジケータをリリースしていますのでよかったらご使用ください。