2018年8月2日木曜日

夏時間を冬時間に変更するソース。

猛暑です! 夏です!!

この暑い中、冬時間を検討したいと思います。
MT4を採用している多くのG証券会社はGMT+2 アメリカ夏時間はGMT+3を採用しています。

GMT+2いわえるロシア時間にするのはMT4がロシアのソフトだからではありません。
一週間の日足が6本になると月曜日と土曜日が24時間でなくなってしまいます。
日足をそろえるにはロシア時間がちょうどいいという事ですね。

ちなみにモスクワ時間はGMT+3 GMT+2はカリーニグランドです。

さて、日本には夏時間がありませんので日本の時間を指定しようとするとMT4サーバーの夏時間冬時間でずれが生じます。

夏は9時だったのに冬は8時といった感じになりますが、これは使えませんね。
そこで夏時間を冬時間に変更する関数を作成しました。
グローバルでJH(JapanHour)を宣言し関数内でJHを調整します。

毎回関数を呼び出すと時間がかかるのでこのような処理にします。

アメリカでは3月第2日曜から夏時間、11月第一日曜から冬時間です。
4-10月は夏時間です。
①時間を変数に代入します。
Month()やDay()などの関数を読み込む回数を減らし高速化する為です。
oid NatsuToFuyu()
{
JH = Hour();//JHは冬時間GMT+2
int mm = Month();
int dd = Day();
int yy = Year();


冬時間の場合JH=Hour();で完了です。
②4-10月は夏時間
if(mm >= 4 && mm <= 10){JH--;return;}

夏の時にはJHから1引いて冬時間にします。

③3月の処理
三月の第二週が日曜日になる日は8~14です。
この日以降の場合JHから1を引きます。
3月7日に着目します。
TimeDayOfWeek()関数は引数(date)の曜日を日曜日は0月曜日は1・・・と戻してくれます。

7日が日曜の時は14日から夏
月曜の時は13から
火曜の時は12から
となります。

先程の関数で日曜は0ですので

7日が日曜の時14-0(日曜)=14
月曜の時は14-1(月曜)=13
といった感じで計算します。
if(mm == 3 && dd >= 14 - TimeDayOfWeek(StrToTime(yy + ".03.07"))){JH--;return;}

StrToTimeで年月日をdatetimeに変換しTimeOfDate()に渡した数を14から引いています。

④11月の処理
こちらも三月と同様です。
if(mm == 11&& dd <= 7  - TimeDayOfWeek(StrToTime(yy + ".11.07"))) JH--;

これで処理は完了です。

出来上がった関数は
void NatsuToFuyu()
{
JH = Hour();//JHは冬時間GMT+2
int mm = Month();
int dd = Day();
int yy = Year();
if(mm >= 4 && mm <= 10){JH--;return;}
if(mm == 3 && dd >= 14 - TimeDayOfWeek(StrToTime(yy + ".03.07"))){JH--;return;}
if(mm == 11&& dd <= 7  - TimeDayOfWeek(StrToTime(yy + ".11.07"))) JH--;
}
OnTick()直下でこの関数を動かせば
JHには常に冬時間が入ります。
グローバルでJHの宣言もお忘れなく








0 件のコメント:

コメントを投稿