【MQL4】雇用統計日にEAを自動停止する関数|経済指標回避フィルターの作り方

スーツ姿のデグーマウスがMT4 EAのコードを指しながら解説しているイラスト。ぷろぐらむFXのデフォルトアイキャッチ。
EAサンプル・ノウハウ

※本記事は、自作EA・既存EAの改良を行う方向けに、雇用統計(NFP)を日付判定で自動回避する方法を実運用ベースで解説しています。

📘 この記事でできること
  • MQL4で雇用統計日を自動判定する関数をEAに組み込める
  • 雇用統計日に新規エントリー処理をスキップできる
  • 独立記念日前倒し、2013年・2025年・2026年の例外日を考慮できる
  • EA制作で重要な日付・曜日判定ロジックの考え方を学べる

🧭 はじめに|雇用統計(NFP)を“自動で避ける”という発想

雇用統計(NFP)などの経済指標発表日は、EA(自動売買)運用で最もトラブルが起きやすい日です。

アメリカの雇用統計(NFP)は、FX市場で最も注目される経済指標のひとつです。
発表直後はUSD/JPYなど米ドル関連通貨でスプレッドが急拡大し、EAが想定外のエントリーや決済を行うリスクがあります。

裁量トレードなら「今日はやめておこう」と判断できますが、EAは条件を満たせば通常どおり動きます。
そこで有効なのが、EA側で雇用統計日を自動判定し、その日の売買ロジックを止める仕組みです。

本記事では、MT4上で動作する雇用統計判別関数(MQL4)をソース付きで解説します。
単なる「第1金曜日」判定ではなく、独立記念日前倒しや過去の例外発表日も考慮した実用向けのサンプルです。


📌 雇用統計(NFP)とは?なぜEAで避けるべきか

NFP(Non-Farm Payrolls)は、アメリカの非農業部門雇用者数を示す統計で、原則として毎月第1金曜日に発表されます。

ただし実際には、年末年始、独立記念日、政府機関閉鎖などの影響で、通常日から前倒し・延期されることがあります。
そのため、EAに組み込む場合は「毎月第1金曜日なら停止」という単純判定だけでは不十分です。

  • 発表直後にスプレッドが急拡大する
  • 成行注文や決済で大きく滑ることがある
  • 短時間の急変動で誤エントリー・誤決済が起きやすい
  • ナンピン・マーチン系EAでは短時間でポジションが増える可能性がある

そのため、EA制作では経済指標を回避するフィルターを入れることが、実運用に近づくための重要な一歩になります。

🧩 関連:
👉 米雇用統計の過去発表日一覧と実際の値動き
┗ 2026年の発表日・実績・USD/JPYの値動きも掲載しています。

👉 【無料配布】米雇用統計の日にEAを自動停止!取引ミスを防ぐMT4用インジケータ
┗ 関数をEAへ組み込まず、MT4上で自動停止したい方向けです。


💻 雇用統計日を自動で判定するMQL4関数

以下は、雇用統計日を判定するMQL4関数です。
戻り値は true(雇用統計日) / false(雇用統計日ではない)なので、EAのエントリー処理前に呼び出しやすい形になっています。

補足:
この関数は「EAの自動売買ボタンをOFFにする関数」ではありません。
OnTick()内で呼び出し、雇用統計日に新規エントリー処理をスキップするための判定関数です。
//+------------------------------------------------------------------+
//|【関数】雇用統計判定用関数
//|
//|【引数】 なし
//|
//|【戻値】True:雇用統計日 False:雇用統計日ではない

bool IsKoyouToukeiHantei(){
#define ONEDAY (3600 * 24)
// 曜日
#define SUNDAY 0
#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6

MqlDateTime current;
current.year = Year();
current.mon = Month();
current.day = Day();
current.hour = 12;
current.min = 0 ;
current.sec = 0;
   TimeToStruct(StructToTime(current), current);

   //2013年10月と11月は例外
   if(current.year == 2013 && (current.mon == 10 || current.mon == 11)){
      // 2013年10月は22日に発表
      if( current.mon == 10 && current.day == 22 )
      {
         return true;
      }
      // 2013年11月は8日に発表
      if( current.mon == 11 && current.day == 8 )
      {
         return true;
      }
      return false;
   }

   //2025年10月〜12月は例外
   if(current.year == 2025 && (current.mon == 10 || current.mon == 11 || current.mon == 12)){
      // 2025年10月は発表されず
      if( current.mon == 10)
      {
         return false;
      }
      // 2025年11月は20日に発表
      if( current.mon == 11 && current.day == 20 )
      {
         return true;
      }
      // 2025年12月は16日に発表
      if( current.mon == 12 && current.day == 16 )
      {
         return true;
      }  
      
      
      return false;         
   }


   //2026年2月は例外
   if(current.year == 2026 && (current.mon == 2)){
      // 2026年2月は11に発表
      if(current.day == 11 )
      {
         return true;
      }  
      return false;
           
   }

   if( current.mon == 1 )
   {
      // 1月は4~10日の金曜日が雇用統計で確定。
      if( 4 <= current.day && current.day <= 10 && current.day_of_week == FRIDAY )
      {
         return true;
      }
   }
   else if( current.mon == 7 && (current.day == 2 || current.day == 3) && current.day_of_week == THURSDAY)
   {
      // 7/4は独立記念日の為、重なった場合は木曜日にずれる。
      // 7/3が金曜日の場合も振替休日のためずれる。
      return true;
   }
   else if( current.mon == 7 && (current.day == 3 || current.day == 4) && current.day_of_week == FRIDAY)
   {
      return false;
   }
   else if(  1 <= current.day && current.day <= 10 && (current.day_of_week == THURSDAY || current.day_of_week == FRIDAY ))
   {
      //前の月の12日を含む週から3番目
      MqlDateTime beforeMonth;
      beforeMonth.year = current.year;
      beforeMonth.mon = current.mon - 1;
      beforeMonth.day = 12;
      beforeMonth.hour = 12;
      beforeMonth.min = 0;
      beforeMonth.sec = 0;

      datetime beforeMonthTime = StructToTime(beforeMonth);
      TimeToStruct( beforeMonthTime, beforeMonth);

      datetime emplymentDay = beforeMonthTime + (5 - TimeDayOfWeek(beforeMonthTime) + 21) * ONEDAY;

      if( current.day == TimeDay(emplymentDay) )
      {
         return true;
      }
   }
   return false;
}

🔍 関数のポイント

  • 単純な「毎月第1金曜日」判定ではない
  • 前月12日を含む週から3番目の金曜日という考え方で通常月を判定
  • 7月の独立記念日前倒しに対応
  • 2013年・2025年・2026年の例外発表日を個別に考慮
  • 例外月は return false; で閉じるため、通常日との二重判定を防止
  • バックテスト時にも日付ベースで判定可能

基本は、月初め1週目の金曜日が雇用統計になりやすいですが、厳密には毎年のカレンダーや祝日・政府機関停止の影響でズレることがあります。
そのため、本関数では通常ルールに加えて、例外月を先に判定する形にしています。


🛠 使用例:EAに組み込む方法

以下のように OnTick() 関数の冒頭に組み込むことで、雇用統計日にEAの新規売買処理をスキップできます。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

   // 雇用統計日の判定
   // Hour() はMT4サーバー時間です。利用業者のサーバー時間に合わせて調整してください。
   if(IsKoyouToukeiHantei() == true && Hour() >= 10 && Hour() <= 16){
      return; // 雇用統計日の指定時間帯は新規売買ロジックを実行しない
   }

   // 通常ロジック
   // ...
}
時間指定の注意点
Hour() は日本時間ではなく、MT4のサーバー時間を返します。
米雇用統計の発表は日本時間では夏時間21:30/冬時間22:30です。EAに組み込む場合は、利用しているFX会社のMT4サーバー時間に合わせて停止時間を調整してください。

この例では、雇用統計日に Hour() >= 10 && Hour() <= 16 の時間帯だけ処理を止めています。
発表前後だけ止めたい場合は時間幅を短くし、1日まるごと新規エントリーを止めたい場合は日付判定だけで return; する形でも構いません。


📈 判定ロジックの解説|独立記念日や例外年にも対応

米雇用統計は原則として毎月第1金曜日に発表されますが、実際には以下のような例外があります。

発表日内容
2013年10月10月22日(火)政府機関閉鎖による延期
2013年11月11月8日(金)通常日からズレ
2025年10月発表なし政府機関閉鎖の影響
2025年11月11月20日(木)延期後に発表
2025年12月12月16日(火)閉鎖影響によるズレ
2026年2月2月11日(水)通常予定から延期
2026年7月7月2日(木)独立記念日前倒し

特に重要なのは、例外月を通常ルールに流さないことです。
たとえば2025年11月のように発表日が20日に延期された月で、通常カレンダー上の第1金曜日も true になってしまうと、1か月で2回「雇用統計日」と判定されてしまいます。

そのため、本関数では2013年・2025年・2026年2月のような例外月を先に判定し、該当日以外はその場で return false; する構成にしています。

👉 実際の発表日を確認したい場合は、米雇用統計の過去発表日一覧もあわせて確認してください。


✅ 実運用で使う前に確認したいポイント

雇用統計日は毎年のカレンダーや米国の事情によって変更されることがあります。
そのため、関数をEAに組み込んだ後も、年1回程度は発表日一覧と照合しておくと安心です。

  • 翌年の雇用統計スケジュールが発表されたら、例外日がないか確認する
  • 7月は独立記念日による前倒しがないか確認する
  • 政府機関閉鎖などで発表延期が起きた場合は、例外処理を追加する
  • 停止時間はMT4サーバー時間に合わせて調整する

最新の発表日や過去の値動きは、米雇用統計の過去発表日一覧で確認できます。


❓ よくある質問

この関数でMT4の自動売買ボタンをOFFにできますか?

いいえ。この関数は雇用統計日かどうかを判定する関数です。EA内で呼び出し、該当日に新規エントリー処理をスキップする用途で使います。

雇用統計以外のCPIやFOMCも回避できますか?

この関数は雇用統計専用です。CPIやFOMCなど複数の経済指標を回避したい場合は、CSVなどで指標日を管理する方式が向いています。

Hour() の時間は日本時間ですか?

いいえ。MQL4の Hour() はMT4サーバー時間です。日本時間での発表時刻とは異なるため、利用しているFX会社のサーバー時間に合わせて停止時間を調整してください。


✅ まとめ|雇用統計対策はEA制作の基本

以上、MQL4で雇用統計日を自動判定し、EAでNFPを回避する関数を解説しました。

  • 雇用統計発表時は相場変動が激しく、EA運用のリスクが高い
  • 日付判定関数を使えば、NFP日だけ新規売買を止められる
  • 第1金曜日だけでなく、独立記念日や例外発表日も考慮する必要がある
  • 2025年・2026年のような例外月は、通常ルールに流さない設計が重要
  • EA制作では、経済指標回避フィルターを理解しておくと実運用の安定性が上がる

雇用統計対策は、EA制作の中でも実運用に直結する重要なテーマです。
まずは本記事の関数をベースに、日付・曜日判定や指標回避ロジックの考え方を理解していきましょう。

🧩 次に学ぶべきステップ

ステップ内容関連記事
STEP1雇用統計日にEAを停止するインジケータ【無料配布】米雇用統計の日にEAを自動停止!
STEP2EA内で雇用統計日を自動判定する関数本記事
STEP3雇用統計の過去発表日と実際の値動きを確認する米雇用統計の過去発表日一覧
STEP4経済指標全般を自動回避する関数を作るEAで経済指標日に取引しない関数とサンプルソース

🧠 さらにステップアップしたい方へ

ChatGPTを活用すれば、こうした関数をベースに「自動停止+再開」「経済指標フィルター」「連続トレード制御」など、より高度なEAロジック開発にも発展できます。

👉 ChatGPTでEAを改良・最適化する方法はこちら

コメント

タイトルとURLをコピーしました