【MQL4】雇用統計日を自動判別!EAでNFPを回避する関数を解説【ソース付き】

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

🧭 はじめに|雇用統計と自動売買の相性は悪い?

アメリカの雇用統計(NFP)は、FX市場に大きな影響を与える重要な経済指標です。特にUSD/JPYなど米ドル関連通貨は、発表直後に大きく値が動くことも少なくありません。

裁量トレードなら意識的にポジションを取らない判断ができますが、自動売買(EA)はシグナルが出れば淡々と取引を行います。
その結果、雇用統計日に想定外の損失を出してしまうケースも…

そこで今回は、MT4のEAで雇用統計日を自動的に判定し、その日はトレードを止める方法を解説します。


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

雇用統計(NFP:Non-Farm Payrolls)は、アメリカの雇用者数を示す指標で、毎月第一金曜日(※例外あり)に発表されます。発表後は為替レートが急変動することが多く、EAでのエントリーが乱れやすくなります。

そのため、雇用統計を避けて稼働を停止させるEA設定が推奨されます。


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

以下は、筆者が実際に使っている**「雇用統計日判別関数」**です。
戻り値は true(雇用統計日) / false(それ以外)とシンプルで、初心者でも使いやすく設計しています。

//|【関数】雇用統計判定用関数
//|
//|【引数】 なし
//|
//|【戻値】True:雇用統計日 False:雇用統計日ではない

bool IsKoyouToukeiHantei(){
#define DAYTIME (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;
      }      
   }

   else 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)
   {
      return true;
   }
   // 7/4は独立記念日で、日が重なれば木曜日にずれる(7/3が金曜日の場合も振替休日のためずれる)
   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) * DAYTIME;

      if( current.day == TimeDay(emplymentDay) )
      {
         return true;
      }
   }
   return false;
}
スポンサーリンク

この関数を使う事により、雇用統計日を判別できます。基本は、月初め1週目の金曜日が雇用統計ですが厳密には前の月の12日を含む週から3番目なのでこの通りに計算をしています。その中でさらに7月の独立記念日を考慮したりしています。


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

以下のように、OnTick()の最初にこの関数を入れておけば、雇用統計日にはトレードを実行しないよう制御できます。

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

   //米雇用統計回避
   if(IsKoyouToukeiHantei()==true && Hour() >= 10 && Hour() <= 16){
       //雇用統計日の上記時間帯(開始3時間半前~発表後30分)は処理せず終わる
       return; 
   }

   //以降は普段の処理

}

💡 日本時間でのNFP発表は夏時間/冬時間ともに15:30前後です。上記の時間帯は調整可能です。


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

基本的にNFPは月初の第1金曜日ですが、下記のようなイレギュラーがあります:

発表日
2021年7月7月2日(金)
2022年7月7月8日(金)
2025年7月7月3日(木)←例外的に木曜!

このような年のズレ・独立記念日などの影響にも対応しています。2013年の10月と11月も(アメリカの予算承認の問題で)例外対応も含め、実戦レベルでの運用が可能です
※バックテストにも対応


🤖 ChatGPTで生成した雇用統計関数との違い

筆者もChatGPTに「雇用統計日を教えて」と聞いてみましたが、単純な「第一金曜日」のみでロジックが完結しており、独立記念日やズレ対応は含まれていませんでした。

このように、AI生成コードではまだ実務に耐えないケースもあるため、自分でチューニングしたロジックを持っておくと安心です。


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

以上、『雇用統計日を自動判別!EAでNFPを回避する関数を解説』でした。

  • 雇用統計日は市場が大きく動くため、EAでの自動回避が必須
  • 本記事の関数を使えば、NFP発表日にEAを止めることが可能
  • 独立記念日や例外年(2013年など)にも対応
  • ChatGPT生成コードよりも精度・信頼性が高い
  • MT4で簡単に組み込めるので、ぜひ活用を!

📎 次におすすめの記事:

【実用コード多数】FX自動売買EAサンプルソースまとめ
【指標発表対応】EAで経済指標日に取引を回避する方法とは?

コメント