【2025.07.01】 ★22:45 アメリカ・PMI(購買担当者景気指数・確報値)06月 ★23:00 アメリカ・ISM製造業景気指数06月 アメリカ・JOLTS求人件数05月

【完全保存版】MQL4で夏時間・GMT変換を正しく処理する方法とサンプルコード

記事内に商品プロモーションを含む場合があります
スポンサーリンク

今回はMT4の自動売買用EAサンプルソース(FX用)を、プログラミング初心者の方向けに解説しています。

はじめに

MQL4で自動売買を運用していると「時間設定」に悩むことはありませんか?
FX取引は世界中の市場が絡み合うため、サマータイム(夏時間)の切り替えに合わせて正しく時間を扱わないと、思わぬ誤発注やバックテストのズレが起きることがあります。

特に、日本時間とGMT(グリニッジ標準時)を変換する処理は、自動売買プログラムの精度に大きな影響を与えます。しかし、サマータイムの適用期間は年ごとに少しずつ異なるため、単純に「時差」だけで処理すると間違いが発生しがちです。

この記事では、MQL4でサマータイムを考慮したGMT変換の仕組みについて、初心者の方でもわかりやすく解説します。さらに、すぐに使えるコード例もご紹介するので、自分のEAに組み込んでミスの少ない自動売買を目指しましょう。

サマータイム(夏時間)について

本の多くの国内FX業者では、MT4サーバーの標準時を「GMT+2」、夏時間(サマータイム)を「GMT+3」として設定しています。
これは、米国市場の営業時間に合わせて最適化されたタイムゾーンであり、日本時間よりも6〜7時間遅れたサーバー時間で管理される形です。

夏時間(サマータイム)は、3月第2日曜日から11月第1日曜日まで適用され、この期間中はMT4サーバー時間が「GMT+3」になります。一方、冬時間(標準時)の期間は「GMT+2」で運用されます。

この仕組みを正しく理解しておかないと、EA(自動売買ソフト)の動作タイミングにずれが生じ、意図しないトレードが行われるリスクがあります。
特にエントリーや決済の時間を条件に組み込むEAを利用する場合は、夏時間と標準時のGMT差をしっかり意識しておくことが大切です。

関数サンプル(MQL4)

以下サンプルソース(MQL4)の関数になります。そのままコピペでお使いください。正しく時間を変換するには、サマータイムを判定する処理も必須なので合わせてご紹介します。
※標準時は「GMT+2」、夏時間は「GMT+3」とする

サマータイム判定するサンプルソース


//+------------------------------------------------------------------+
//| 【関数】サマータイム判定(米国ルール)                             |
//| 3月第2日曜~11月第1日曜までをサマータイムとする                   |
//+------------------------------------------------------------------+
bool IsSummerTime()
{
   int year = TimeYear(TimeCurrent());
   
   // 3月第2日曜
   datetime marchFirst = StringToTime(StringFormat("%04d.%02d.01 00:00", year, 3));
   int marchWeekday = TimeDayOfWeek(marchFirst); // 0=日曜
   int marchDaysToFirstSunday = (7 - marchWeekday) % 7;
   datetime summerStart = marchFirst + (marchDaysToFirstSunday + (2 - 1) * 7) * 86400;
   
   // 11月第1日曜
   datetime novFirst = StringToTime(StringFormat("%04d.%02d.01 00:00", year, 11));
   int novWeekday = TimeDayOfWeek(novFirst);
   int novDaysToFirstSunday = (7 - novWeekday) % 7;
   datetime summerEnd = novFirst + (novDaysToFirstSunday + (1 - 1) * 7) * 86400;
   
   return (TimeCurrent() >= summerStart && TimeCurrent() < summerEnd);
}

この関数は引数はなく、呼び出すことで現在がサマータイムであれば「true」そうでなければ「false」が返ってきます。3月第2日曜と11月第1日曜を算出しサマータイムを判定している感じですね。

以降の「GMTから日本時間に変換する」「日本時間からGMT時間に変換する関数でも使っていますのでセットでお使いください。

GMT時間を日本時間に変換するサンプルソース

//+------------------------------------------------------------------+
//|【関数】GMTを日本時間(JST)に変換                                   |
//|                                                                  |
//|【引数】GMT_HOUR: GMT時間(基本はGMT+3)                                     |
//|【戻値】cTime: 日本時間                                           |
//+------------------------------------------------------------------+
int ChangeGMTtoJP(int GMT_HOUR)
{
   int diff = IsSummerTime() ? +6 : +7;
   int cTime = (GMT_HOUR + diff) % 24;
   return cTime;
}

GMT時間をこの関数に渡すことで、日本時間が返ってくるという関数です。サマータイム状況により時間は変わりますので9行目にはサマータイムを判定する関数「IsSummerTime()」を使っています。この関数は前述しているのでセットでお使いください。

日本時間をGMT時間に変換するサンプルソース

//+------------------------------------------------------------------+
//|【関数】日本時間(JST)をGMTに変換                                   |
//|                                                                  |
//|【引数】JP_HOUR: 日本時間                                           |
//|【戻値】cTime: GMT時間(基本はGMT+3)                                    |
//+------------------------------------------------------------------+
int ChangeJPtoGMT(int JP_HOUR)
{
   int diff = IsSummerTime() ? -6 : -7;  
   int cTime = (JP_HOUR + diff + 24) % 24;  // マイナスを防ぐため+24
   return cTime;
}

日本時間をこの関数に渡すことで、GMT時間が返ってくるという関数です。サマータイム状況により時間は変わりますので9行目にはサマータイムを判定する関数「IsSummerTime()」を使っています。この関数は前述しているのでセットでお使いください。

スポンサーリンク

EA内での使用方法(OnTickへの実装例)

具体的な使用例を記載します。

void OnTick() {

   string daysv = StringSubstr(TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES), 0, 10); 
   
   Print(daysv,"はサマータイム:",IsSummerTime());

   int GMT_h = Hour();
   int JST_h = ChangeGMTtoJP(GMT_h);
   
   Print("日本時間:",JST_h,"時");
   Print("GMT時間:",ChangeJPtoGMT(JST_h),"時");
 

}
//上記3つの関数は↓に貼り付けてください

こんな感じで日付を変換できるので、用途に応じてお使いください。

サマータイム判定や、切り替わりでしっかり時間も変換されていますね!

注意事項とまとめ

以上、『MQL4で夏時間・GMT変換を正しく処理する方法とサンプルコード』でした。本関数をご使用の際は、動作確認等を行い自己責任でお使いください。

今回の記事では、MQL4でサマータイムを考慮したGMTと日本時間の変換方法について解説しました。EA開発では時間のズレが取引ロジックに影響を及ぼすケースが多いため、正確なタイムゾーン管理が重要です。今回紹介したコードを参考に、より安定した自動売買の構築に役立ててください。



※ EAのサンプルソース一覧表へ

コメント