MQL5で米国祝日であるかいなかを返す関数

MQL5で米国祝日であるかいなかを返す関数を作った。

環境

  • OANDA MetaTrader 5: 5.00 build 4040
  • MetaEditor: 5.00 build 4040

米国祝日であるかいなかを返す関数

//+------------------------------------------------------------------+
//| 米国祝日であるかいなか(2023/11/22動作確認)                               |
//+------------------------------------------------------------------+
bool isUSAHoliday(int day=0 // 日(1単位24時間の意味)
                 )
 {
  MqlDateTime mdt;
  TimeToStruct(TimeCurrent()+day*24*60*60,mdt);
  //--- 元日
  bool holiday1=mdt.mon==1 && mdt.day==1 && mdt.day_of_week>=1 && mdt.day_of_week<=5; // 元日
  holiday1|=mdt.mon==1 && mdt.day==2 && DayOfWeek()==1;
  //--- キング牧師記念日
  bool holiday2=mdt.mon==1 && mdt.day>=15 && mdt.day<=21 && mdt.day_of_week==1; // キング牧師記念日
  //--- 大統領の日
  bool holiday3=mdt.mon==2 && mdt.day>=15 && mdt.day<=21 && mdt.day_of_week==1; // 大統領の日
  //--- 戦没者記念日
  bool holiday4=mdt.mon==5 && mdt.day>=25 && mdt.day<=31 && mdt.day_of_week==1; // 戦没者記念日
  //--- 奴隷解放日
  bool holiday5=mdt.mon==6 && mdt.day==19 && mdt.day_of_week>=1 && mdt.day_of_week<=5; // 奴隷解放日
  holiday5|=mdt.mon==6 && mdt.day==18 && mdt.day_of_week==5;
  holiday5|=mdt.mon==6 && mdt.day==20 && mdt.day_of_week==1;
  holiday5&=mdt.year>=2021; // 2021年から始まったのでそれ以前は存在しない
  //--- 独立記念日
  bool holiday6=mdt.mon==7 && mdt.day==4 && mdt.day_of_week>=1 && mdt.day_of_week<=5; // 独立記念日
  holiday6|=mdt.mon==7 && mdt.day==3 && mdt.day_of_week==5;
  holiday6|=mdt.mon==7 && mdt.day==5 && mdt.day_of_week==1;
  //--- 労働者の日
  bool holiday7=mdt.mon==9 && mdt.day>=1 && mdt.day<=7 && mdt.day_of_week==1; // 労働者の日
  //--- コロンブス記念日
  bool holiday8=mdt.mon==10 && mdt.day>=8 && mdt.day<=14 && mdt.day_of_week==1; // コロンブス記念日
  //--- 退役軍人の日
  bool holiday9=mdt.mon==11 && mdt.day==11 && mdt.day_of_week>=1 && mdt.day_of_week<=5; // 退役軍人の日
  holiday9|=mdt.mon==11 && mdt.day==10 && mdt.day_of_week==5;
  holiday9|=mdt.mon==11 && mdt.day==12 && mdt.day_of_week==1;
  //--- 感謝祭
  bool holiday10=mdt.mon==11 && mdt.day>=22 && mdt.day<=28 && mdt.day_of_week==4; // 感謝祭
  //--- クリスマス
  bool holiday11=mdt.mon==12 && mdt.day==25 && mdt.day_of_week>=1 && mdt.day_of_week<=5; // クリスマス
  holiday11|=mdt.mon==12 && mdt.day==24 && mdt.day_of_week==5;
  holiday11|=mdt.mon==12 && mdt.day==26 && mdt.day_of_week==1;
  //---
  bool res=holiday1 || holiday2 || holiday3 || holiday4 || holiday5 || holiday6 || holiday7 || holiday8 ||
           holiday9 || holiday10 || holiday11; // 戻り値
  return(res);
 }

使用例

米国祝日の当日、および米国祝日の前日に新規注文を出すときは以下のようにする。

//--- 米国祝日の当日に新規注文を出す場合
if(isUSAHoliday() && 他のエントリー条件)
  新規注文;
//--- 米国祝日の前日に新規注文を出す場合
if(isUSAHoliday(1) && 他のエントリー条件)
  新規注文;