🧭 はじめに|雇用統計(NFP)を“自動で避ける”という発想
アメリカの雇用統計(NFP)は、FX市場で最も注目される経済指標のひとつです。
発表直後はUSD/JPYなど米ドル関連通貨でスプレッドが急拡大し、EAが想定外の取引を行うリスクがあります。
裁量トレードなら「今日はやめておこう」と判断できますが、EAはロジック通りに動きます。
そこで有効なのが――
EAが自動で「雇用統計日を判定して停止」する仕組みです。
本記事では、MT4上で動作する**雇用統計判別関数(MQL4)**をソース付きで解説します。
📌 雇用統計(NFP)とは?なぜEAで避けるべきか
NFP(Non-Farm Payrolls)は、アメリカの非農業部門の雇用者数を示す統計で、
**原則として毎月第1金曜日(※例外あり)**に発表されます。
発表直後は価格が乱高下し、EAのエントリー/決済が予期せぬ損失につながることがあります。
そのため、雇用統計発表日にEAを自動停止またはスキップさせる設定が推奨されます。
🧩 関連:
👉 【無料配布】米雇用統計の日にEAを自動停止!取引ミスを防ぐMT4用インジケータ
┗ MT4上で自動停止を実現するインジケータを無料で配布中。
💻 雇用統計日を自動で判定する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月の独立記念日を考慮したりしています。
🔍 関数のポイント
- 単純な「第1金曜」判定ではない
- 7月の独立記念日ズレ(木曜・金曜)に対応
- 2013年など過去の例外年も網羅
- バックテスト時にも動作
🛠 使用例:EAに組み込む方法
以下のようにOnTick()
関数の冒頭に組み込むことで、雇用統計日にEAを一時停止させることが可能です。
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 雇用統計日の判定(日本時間10〜16時はスキップ)
if(IsKoyouToukeiHantei()==true && Hour() >= 10 && Hour() <= 16){
return; // トレードを実行しない
}
// 通常ロジック
// ...
}
💡 日本時間でのNFP発表は夏時間/冬時間ともに15:30です。上記の時間帯は調整可能です。
📈 判定ロジックの解説(独立記念日や例外年にも対応)
基本的にNFPは月初の第1金曜日ですが、下記のようなイレギュラーがあります:
年 | 月 | 発表日 |
---|---|---|
2021年 | 7月 | 7月2日(金) |
2022年 | 7月 | 7月8日(金) |
2025年 | 7月 | 7月3日(木)←例外的に木曜! |
このような年のズレ・独立記念日などの影響にも対応しています。2013年の10月と11月も(アメリカの予算承認の問題で)例外対応も含め、実戦レベルでの運用が可能です。
※バックテストにも対応
🤖 ChatGPT生成コードとの違い
ChatGPTに「雇用統計日を判定する関数を作って」と指示すると、
多くは「毎月第1金曜日」だけを判定する単純ロジックが出力されます。
しかし、実際の雇用統計には
- 7月の独立記念日前倒し
- 2013年のような例外年
などが存在するため、単純ロジックでは誤検出してしまう場合があります。
自作コードを理解し、自分でメンテナンスできることがEA開発者としての強みになります。
✅ まとめ|雇用統計対策はEA運用の基本!
以上、『雇用統計日を自動判別!EAでNFPを回避する関数を解説』でした。
- 雇用統計発表時は相場変動が激しく、EA運用のリスクが高い
- 自動判別関数を使えば「NFP日だけ稼働を止める」ことが可能
- 独立記念日や例外発表にも対応済み
- 自作EAの安定性・信頼性が大きく向上
関数化したことにより、簡単に組み込むことが可能になりましたので是非ご活用ください。
🧩 次に学ぶべきステップ
ステップ | 内容 | 関連記事 |
---|---|---|
STEP1 | 雇用統計日にEAを停止するインジケータ | 【無料配布】米雇用統計の日にEAを自動停止! |
STEP2 | EA内で雇用統計日を自動判定する関数 | 本記事 |
STEP3 | 経済指標全般を自動回避する関数を作る | EAで経済指標日に取引しない関数とサンプルソース |
STEP4 | 実際の発表日リストでバックテスト | (米)雇用統計 過去発表日一覧 |
🧠 さらにステップアップしたい方へ
ChatGPTを活用すれば、こうした関数をベースに
「自動停止+再開」「経済指標フィルター」「連続トレード制御」など、
より高度なEAロジック開発にも発展できます。
コメント