今回は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のサンプルソース一覧表へ
コメント