日付イメージ

ここでは、前回記事【EAの休止日時をcsvファイルで指定する方法】で紹介したサンプルEAのコードについて解説します。

前回記事をまだ見ていない方やサンプルファイルをダウンロードしていない方は、まずはそちらからご覧ください。

前回記事【EAの休止日時をcsvファイルで指定する方法】へ

サンプルEAのコード

Dr.EADr.EA

サンプルEA【NoTrade_ReadFile_EA.mq4】のコードがこちら

#property strict

extern int     NoTradeBeforeMin  = 20;
extern int     NoTradeAfterMin   = 30;
extern string  NoTradeFileName   = "NoTradeTime.csv";

int data_cnt;
datetime no_trade_datetime[];

//+------------------------------------------------------------------+
int OnInit()
{
   // EA休止日時データ読み込み
   int handle = FileOpen(NoTradeFileName, FILE_READ|FILE_CSV, ",");
   
   if (handle < 0)
   {
      Alert("FileOpen error: " + NoTradeFileName);
      return(INIT_FAILED);
   }
   
   data_cnt = 0;
   while(FileIsEnding(handle) == false)
   {
      data_cnt++;
      ArrayResize(no_trade_datetime, data_cnt);
      no_trade_datetime[data_cnt-1] = StrToTime(FileReadString(handle));
   }
   
   FileClose(handle);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick()
{
   int i;
   datetime now = TimeCurrent();
   // EA休止時間判定
   bool ea_sleep = false;
   
   for (i=0; i<data_cnt; i++)
   {
      if (no_trade_datetime[i] - NoTradeBeforeMin * 60 > now) continue;
      if (no_trade_datetime[i] + NoTradeAfterMin * 60 <= now) continue;
      
      ea_sleep = true;
      break;
   }
   
   // EA休止中の処理
   if (ea_sleep == true)
   {
      Comment("No Trade Time Now.");
      return;
   }
   
   // 以降、EA休止中ではない場合の処理
   Comment("Trade OK.");
}

パラメーター

前回記事にも書きましたがサンプルEAには、次の3つのパラメーターを設置しています。

extern int     NoTradeBeforeMin  = 20;
extern int     NoTradeAfterMin   = 30;
extern string  NoTradeFileName   = "NoTradeTime.csv";
NoTradeBeforeMin 指定日時から設定(分)前からEA休止開始
NoTradeAfterMin 指定日時から設定(分)後にEA休止終了
NoTradeFileName 指定日時データcsvファイル名

グローバル変数

グローバル変数には、日時データ個数格納用変数と日時データ格納用配列を宣言しています。

int data_cnt;
datetime no_trade_datetime[];

日時データcsvファイル読み込み

OnInit()関数内で、次のように日時データcsvファイル読み込みをしています。

   int handle = FileOpen(NoTradeFileName, FILE_READ|FILE_CSV, ",");

   if (handle < 0)
   {
      Alert("FileOpen error: " + NoTradeFileName);
      return(INIT_FAILED);
   }
   
   data_cnt = 0;
   while(FileIsEnding(handle) == false)
   {
      data_cnt++;
      ArrayResize(no_trade_datetime, data_cnt);
      no_trade_datetime[data_cnt-1] = StrToTime(FileReadString(handle));
   }
   
   FileClose(handle);
NoTradeFileNameで指定したcsvファイルを「読み込みモード」「csvモード」で開く

FileOpen()関数でファイルオープンに失敗したら
  エラーアラートを出して
  EA実行を終了する

データ数を0にしておいて
ファイルの最後まで繰り返す
  データ数に1を足す
  配列no_trade_datetime[]の要素数をdata_cnt個にする
  配列no_trade_datetime[]のインデックスdata_cnt-1 に日時データをdatetime型に変換した値を格納する

ファイルを閉じる

EA休止時間判定

OnTick()関数内で、次のようにEA休止時間を判定して、EA休止中時間内に当てはまる場合にはbool型変数ea_sleepをtrueにするようにしています。

   int i;
   datetime now = TimeCurrent();
   bool ea_sleep = false;
   
   for (i=0; i<data_cnt; i++)
   {
      if (no_trade_datetime[i] - NoTradeBeforeMin * 60 > now) continue;
      if (no_trade_datetime[i] + NoTradeAfterMin * 60 <= now) continue;
      
      ea_sleep = true;
      break;
   }

あとがき

経済指標発表前後にEAを休止させたりするのに役立ちそうですね。逆に、指定時間前後のみEAを稼働させるようにカスタマイズしても面白そうですね^^