🦁

MQL5で日本時間の取得(夏時間の計算も有り)

2023/10/20に公開
enum use_times {
   GMT9, //WindowsPCの時間を使って計算する
   GMT9_BACKTEST, // EAで計算された時間を使う(バックテスト用)
   GMT_KOTEI// サーバータイムがGMT+0で固定されている(バックテスト用)
};

input use_times set_time = GMT9;//時間取得方法
input int natu = 6;//夏加算時間(バックテスト用)
input int huyu = 7;//冬加算時間(バックテスト用)
datetime calculate_time() {

   if(set_time == GMT9) {
      return TimeGMT() + 60 * 60 * 9;
   }
   if(set_time == GMT9_BACKTEST) {
      return getJapanTime();
   }
   if(set_time == GMT_KOTEI) {
      return TimeCurrent() + 60 * 60 * 9;
   }

   return 0;

}
// 日本時間の取得
datetime getJapanTime()
  {
   datetime now = TimeCurrent();
   datetime summer = now + 60 * 60 * natu;
   datetime winter = now + 60 * 60 * huyu;

   if(is_summer())
     {
      return summer;
     }
   return winter;
  }


// サマータイムなら真を返す関数
bool is_summer()
  {
   datetime now = TimeCurrent();
   int month = TimeMonth(now);
   int day = TimeDay(now);
   int dayOfWeek = TimeDayOfWeek(now);
   int hours = TimeHour(now);

   if(month < 3 || month > 11)
     {
      return false;
     }
   if(month > 3 && month < 11)
     {
      return true;
     }

// アメリカのサマータイムは3月の第2日曜日から11月の第1日曜日まで
   if(month == 3)
     {
      int dstStart = 14 - dayOfWeek;
      if(day >= dstStart)
        {
         return true;
        }
      else
        {
         return false;
        }
     }

   if(month == 11)
     {
      int dstEnd = 7 - dayOfWeek;
      if(day < dstEnd)
        {
         return true;
        }
      else
        {
         return false;
        }
     }
   return false;
  }
int TimeMonth(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.mon);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeDay(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.day);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeHour(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.hour);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeMinute(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.min);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeDayOfWeek(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.day_of_week);
  }

Discussion