recordイメージ

ここでは、一定時間毎にドローダウンをファイルに記録するEAの作り方を解説します。サンプルとして、ランダムエントリーするEAに、ドローダウンファイル記録機能を追加しました。

サンプルEA【FileWriteSample_New.mq4】をダウンロード

ランダムエントリーするEAの作り方は、過去記事【利益を出すランダムエントリーシステム!?】を参考にしてください。
過去記事【利益を出すランダムエントリーシステム!?】へ

記録ファイルを出力する方法

記録ファイルについて

今回のサンプルEAは、4時間足が更新されるたびに月、日、時間、残高、有効証拠金、現在のポジションのドローダウン、残高ピーク時からのドローダウンを記録します。

バックテストで実行した場合は、testerフォルダ→filesフォルダ内に記録ファイルが作成されます。
リアルタイムで実行した場合は、MQL4フォルダ→Filesフォルダ内に記録ファイルが作成されます。

Dr.EADr.EA

さっそく編集の流れを見ていくぞい!

パラメータ用の変数

次の3つのパラメーターを追加します。

extern string  FileName    = "writesample";
extern string  FileType    = "csv";
extern string  Separator   = ",";

FileNameにはファイル名を、FileTypeには拡張子を入力します。Separatorには、区切り文字を入力します。

グローバル変数

次に、グローバル変数3つを追加します。

int write_bar;
double ab_best;
string filename;
整数 ファイルに書き込んだ時の4時間足のローソク足の数
小数 過去最高残高の値
文字列 出力ファイル名

OnInit()関数内の処理

OnInit()関数内に次のコードを追加します。

   filename = FileName + "." + FileType;
   int handle = FileOpen(filename, FILE_WRITE, Separator);
   if (handle > 0)
   {
      FileWrite(handle, "Month", "Day", "Hour", "Balance", "Equity", "Pos DD", "AC DD");
      FileClose(handle);
   }

変数「filename」には、パラメータで設定したファイル名と拡張子を「.(ドット)」でつなげたものを格納するようにします。

そして、書き込みモードでそのファイルを開き、項目名を書き込んでファイルを閉じます。

FileWrite()関数の括弧内の最初やFileClose()関数の括弧内は、ファイル名ではなくファイルハンドルで指定しますので気をつけましょう!

残高の最高額を記録しておく

OnTick()関数内で、次のコードを追加します。

   double ab = AccountBalance(); // 口座残高
   // 残高の最高額更新
   if (ab_best < ab) ab_best = ab;

ティック毎に現在残高を取得して、記録しておいた残高最高額より大きければ上書き更新します。

ファイルに出力する

先ほどのコードの下に、次のコードを追加します。

   // ファイル書き込み
   if (iBars(NULL, PERIOD_H4) != write_bar)
   {
      double ae = AccountEquity();        // 有効証拠金
      double dd = (1 - ae / ab);          // 現在のドローダウン
      double dd_best = (1 - ae / ab_best);// 残高最高額からのドローダウン
      // 各ドローダウンの文字列
      string dd_str = "-";
      if (dd > 0) dd_str = DoubleToStr(dd * 100, 2) + "%";
      string dd_best_str = "-";
      if (dd_best > 0) dd_best_str = DoubleToStr(dd_best * 100, 2) + "%";
      int handle = FileOpen(filename, FILE_READ|FILE_WRITE, Separator);
      if (handle > 0)
      {
         FileSeek(handle, 0, SEEK_END);
         FileWrite(handle, Month(), Day(), Hour(), DoubleToStr(ab, 2),
                           DoubleToStr(ae, 2), dd_str, dd_best_str);
         FileClose(handle);
         write_bar = iBars(NULL, PERIOD_H4);
      }
   }

4時間足が更新されたら、必要な情報を取得してファイルに追記という流れです。

ここでのFileOpen()関数は記録を追記していきたいので、ファイルオープンモードを「FILE_READ|FILE_WRITE」(読み書きモード)にする必要があります。
正常にファイルが開いたら、FileSeek()関数でファイルの最後の段にポインタを移動させ、FileWrite()関数で各項目の値をファイルに書き込みます。

そしてファイルを閉じて、現在の4時間足のローソク足の数を write_bar に記録することで、その後の約4時間はファイル出力を実行しないような構造にしています。

書き込みのタイミングや、記録する内容など改造したりして試してみてくださいね。
では、このへんで(^0^)/