雇用統計日を知らせてくれる関数(サンプルソース)

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

はじめに

今回は、MT4のEA(MQL4)に関する知識でアメリカの雇用統計日を判別する方法についてです。

雇用統計については、過去色々記事にしていますが今回は実際に雇用統計日を計算する方法について解説していきます。

雇用統計日とは

まず、簡単に雇用統計日について。

雇用統計(NFP: Non-Farm Payrolls)とは、アメリカの労働市場の状況を示す最も重要な経済指標の一つです。FXトレーダーにとっては市場が大きく動く可能性が高い日であり、特に米ドル(USD)関連の通貨ペアに強い影響を与えます。

米ドル関連通貨はもちろん、株やゴールドにも影響が出てきますので雇用統計日を意識されているトレーダーの方はかなり多いです。

この影響が大きい雇用統計日には、トレードを避けたいという方も多いのではないかと思います。

雇用統計日にトレードしないようにする

では、雇用統計日にトレードしないようにする方法についてです。

まず、裁量トレードでは意識してトレードしないようにできますが、自動売買では雇用統計日だろうがエントリーシグナルが出ればエントリーしてしまいます。

ですので、雇用統計日を判別してその日はシグナルを出さないようにする修正が必要になってきます。

ソースコード

以下は普段私が利用している雇用統計日の判別関数です。

//|【関数】雇用統計判定用関数
//|
//|【引数】 なし
//|
//|【戻値】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;
}
スポンサーリンク

引数は無く、戻り値が『true:雇用統計日』で『false:雇用統計日でない』なので扱いも簡単です。

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

直近の例だとこんな感じですので、月初め1週目が曖昧だというのが分かりますね!

発表日
2021年7月7月2日(金)
2022年7月7月8日(金)
2023年7月7月7日(金)
2024年7月7月5日(金)
2025年7月7月3日(木)

あと、2013年の10月と11月も(アメリカの予算承認の問題で)日がズレているので対応しています。
※バックテストにも対応

使用例

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

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

   //以降は普段の処理

}

こんな感じにしましょう。OnTicckの先頭に雇用統計の判別関数を入れて雇用統計だったら以降処理をしないように return;で抜けちゃいます。こうする事で今まで使っていた普段の処理に影響することなく雇用統計判別を行う事ができます。

あと、日本のMT4を使っていると雇用統計発表時間は夏時間・冬時間共に15時30分に発表です。時間の部分は各々アレンジしてください。

さいごに

以上、『雇用統計日を知らせてくれる関数(サンプルソース)』でした。

雇用統計関連は自動売買を使っていくうえでも常に考える項目になってくるので是非有効活用してみてください。

あと、余談になるのですがChatGPTにも『雇用統計日を知らせてくれる関数を教えてください』って尋ねてみたのですが月初めの第一金曜日の計算をしていたり『独立記念日』等を考慮していない簡易版っていう感じでした。

コメント