😆

MQL5 ②取引時間を制限したい

2024/12/25に公開

前回はXMのサーバー時間と日本時間が夏時間では+6時間(冬時間は+7時間)違うことが分かりました。

今回は入力した時間の文字列から取引時間で取引可否を決める関数を作りました。

/*
IsTradingTime() 指定した時間内であるかを返す関数
*/
bool IsTradingTime() {
   // サーバー時間を取得
   datetime serverTime = TimeCurrent();
   Print(__FUNCTION__, " サーバー時間(XMサーバー): ", TimeToString(serverTime));
   if(IsSummerTime){
      Print("XMサーバーは夏時間です。サーバー時間に6時間追加します");
   }else{
      Print("XMサーバーは冬時間です。サーバー時間に7時間追加します");      
   }
   // サーバー時間に夏時間または冬時間を考慮した補正を適用
   int serverOffset = IsSummerTime ? 6 : 7; // 夏時間 +6時間、冬時間 +7時間
   datetime currentTime = serverTime + serverOffset * 3600; // 日本時間へ変換
   Print(__FUNCTION__, " 日本時間に補正しました: ", TimeToString(currentTime));

   // 時刻文字列を日本時間基準で秒に変換
   datetime tradingStart = TimeFromString(TradingStartTime);
   datetime tradingEnd = TimeFromString(TradingEndTime);

   // 日付をまたぐ場合の終了時刻調整
   if (tradingEnd < tradingStart) {
      tradingEnd += 86400;  // 翌日として終了時刻を調整
     Print(__FUNCTION__, " 日付をまたぐため終了時間を翌日に調整しました。開始: ", 
            TimeToString(tradingStart), "、終了: ", TimeToString(tradingEnd));
   }

   // 時間範囲をチェック
   if ((currentTime >= tradingStart && currentTime <= tradingEnd)) {
      Print(__FUNCTION__, " 取引時間内です。");
      return true;
   }

   Print(__FUNCTION__, " 取引時間外です。現在時刻: ", 
         TimeToString(currentTime), "、取引時間: ", TradingStartTime, " - ", TradingEndTime, "(日本時間)");
   return false;
}
/*
TimeFromString 引数で与えられた文字列の時間をdatetime型で返す関数
*/
datetime TimeFromString(string timeStr) {

   // サーバー時間を取得
   datetime serverTime = TimeCurrent();

   // サーバー時間のオフセット(UTC+2 または UTC+3)
   int serverOffset = IsSummerTime ? 6 : 7; // 夏時間: 6時間、冬時間: 7時間

   // サーバー時間を日本時間に変換
   datetime japanTime = serverTime + serverOffset * 3600;

   // 日本時間の0時0分を計算
   datetime todayStart = japanTime - (japanTime % 86400); // 今日の0時0分
   Print(__FUNCTION__, " 今日の開始時間(日本時間): ", TimeToString(todayStart));

   // 時間と分を抽出して計算
   long hour = StringToInteger(StringSubstr(timeStr, 0, 2));
   long minute = StringToInteger(StringSubstr(timeStr, 3, 2));

   // 結果を計算
   datetime result = (datetime)(todayStart + hour * 3600 + minute * 60);
   Print(__FUNCTION__, " 計算された日時: ", TimeToString(result));

   return result;
}

これで文字列で入力した時間内での取引が可能になります。

Discussion