2008年8月の記事一覧

記録ファイルを作ってみよう!

※2019/10/10 この記事を更新しました。

今回は、弱気なブルートさんのコメントにありました一定時間毎のドローダウンを記録するファイルを作るEAを作ってみましょう!

サンプルとして、ランダムエントリーでATRの数倍のトレイリングストップするシステムとして紹介した記事「利益を出すランダムエントリーシステム!?」を使って、作ってみました。

→今回のmq4ファイル最新バージョンFileWriteSample_New.mq4をダウンロード

内容は、4時間足が更新されるたびに 月、日、時間、残高、有効証拠金、現在のポジションのドローダウン、残高ピーク時からのドローダウン を記録するという感じです。

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

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

では、さっそく編集の流れを見ていきましょうか(^-^)/

パラメータ用の変数

次の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^)/

2008年8月25日|コメント (6)

カテゴリー:EA作成・カスタマイズ(MT4)