Optimization 時の各PASSテストでの勝率を知る。
TAP 2010/03/20 21:16
一つ質問なのですが、MT4でOPTIMIZATIONのバックテストを行なった場合、
結果として勝率を表示させる(もしくは何らかの形でデータとして得る)方法ってないでしょうか?
現在、まずは勝率を重視した自作EAを作成中なのですが、PF、損益額はすぐ分かるものの
勝率を確認する手間が効率悪いなぁとおもいまして。
確かに、現状のOptimizationでは、損益やPF,DDなどは、Optimization Result で確認できますが、勝率を知りたかったらそのパラメータでバックテストを行うしかありませんよね。わざわざ同じバックテストを繰り返さないといけないのはかなり無駄です。こんな時、どうするかと言うと…
EAに出力させるしかありません...。^^;
出力のタイミングは、バックテスト終了時のサーバ時刻で良いので、まずバックテスト終了時のサーバ時刻を秒単位で求めます。
void start() { Comment(TimeCurrent()); }
↑こんなEAを用意して、VisualMode でテストすれば、テスト終了時刻が分かります。
次に勝率の算出ですが、EAのstart 関数の先頭に以下のように追加します。
int start() { if(TimeCurrent()==1269028784){//←テスト終了時刻を埋め込む //←必要ならこのあたりで全注文を決済するようにする。 int i,handle,hstTotal=OrdersHistoryTotal(); int win=0,lose=0; for(i=0;i < hstTotal;i++) { OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); if(OrderProfit()>=0){win++;}else{lose++;} } double WinPercent = win*100.0/(win+lose);//←このままではゼロ割が起きるので本当はNG...orz Comment(TimeCurrent()+" Total:"+OrdersHistoryTotal()+" Win%="+DoubleToStr(WinPercent,2)); handle=FileOpen("WinPercent.csv", FILE_CSV|FILE_READ|FILE_WRITE, ','); if(handle>0) { FileSeek(handle, 0, SEEK_END); FileWrite(handle, DoubleToStr(WinPercent,2), MovingPeriod, MovingShift);//←勝率とシミュレーション時のパラメータ FileClose(handle); } }else{ Comment(TimeCurrent()); }
こんな感じで、終了時刻に達した時に、そのテストでの売買履歴を参照して勝率を求めてCSV に出力します。
出力先は、\tester\files 以下になります。tester\caches 以下にデータがあると、Optimization 自体が省略される可能性があるので、MT4 を起動する前に消しておくのが無難です。また、Optimization 時に、Genetic algorithm のチェックを外すと、PASS番号とデータの関係が分かりやすくなります。
実際に試してみると、以下のようになり741PASS目のテストが、CSVの741行目に出力されています。
↓勝率、MovingPeriod、MovingShift の順に並んでいて741行目は(40,20)のセットです。
↑これが一致しない場合は、一部のPASSに計算済みキャッシュが使われたか、ゼロ割などのエラーでEAが止まってスキップされた可能性があります。
勝率以外にもテストレポートで表示される評価値は以下のサイトの計算式を参考に求める事ができます。
http://codebase.mql4.com/397
http://articles.mql4.com/127
Optimization 時に、Genetic algorithm のチェックを外せば、全てのパラメータの組合せでのテストが行われますから、出力されるCSVデータをExcel に読ませて、Absolute drawdown の小さなパラメータセットを選ぶとか、Average profit trade や Average loss trade の比を比べながら選ぶ..等の工夫されたパラメータ選びが可能となります。
EAは何に対してどう最適化するかが重要なので、この辺りのテクニックは..よくよく考えてみた方がよいかもしれません..。