ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード Twitter

忙しいです。ネタもないし・・・

2010-03-22

Optimization 時の各PASSテストでの勝率を知る。

TAP 2010/03/20 21:16

一つ質問なのですが、MT4でOPTIMIZATIONのバックテストを行なった場合、

結果として勝率を表示させる(もしくは何らかの形でデータとして得る)方法ってないでしょうか?

現在、まずは勝率を重視した自作EAを作成中なのですが、PF、損益額はすぐ分かるものの

勝率を確認する手間が効率悪いなぁとおもいまして。


確かに、現状のOptimizationでは、損益やPF,DDなどは、Optimization Result で確認できますが、勝率を知りたかったらそのパラメータでバックテストを行うしかありませんよね。わざわざ同じバックテストを繰り返さないといけないのはかなり無駄です。こんな時、どうするかと言うと…




EAに出力させるしかありません...。^^;

出力のタイミングは、バックテスト終了時のサーバ時刻で良いので、まずバックテスト終了時のサーバ時刻を秒単位で求めます。

void start()
{
Comment(TimeCurrent());
}

↑こんなEAを用意して、VisualMode でテストすれば、テスト終了時刻が分かります。

f:id:fai_fx:20100321071523p:image


次に勝率の算出ですが、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行目に出力されています。

f:id:fai_fx:20100321071601p:image

↓勝率、MovingPeriod、MovingShift の順に並んでいて741行目は(40,20)のセットです。

f:id:fai_fx:20100321071600p:image

↑これが一致しない場合は、一部の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は何に対してどう最適化するかが重要なので、この辺りのテクニックは..よくよく考えてみた方がよいかもしれません..。

GG 2010/03/22 06:47 どうしたら、こんなこと思いつくのでしょうね。

alohafxalohafx 2010/03/22 08:51 やはりEAから出力させるしかないということですね。
すっきりしました。
MT5のストラテジーテスター機能は改善されるといいですね。

TAPTAP 2010/03/22 09:58 ありがとうございました!
こんな方法があったとは・・・
頭の柔軟性のさることながらMQL自体
もっともっと勉強しなければ、と思いました。

これからも毎日楽しみに拝読させていただきます。

修行修行 2010/03/22 19:57 あれ?
タイトルロゴの隣の絵変わりました?

linolino 2010/03/22 20:52 teminal.exeを7-zipで解凍出来てしまうのですが、中にstring.txtというのがありました。
こんな感じで、以前ロシア人さんが調べてくれたメッセージIDと、ほとんど合致しています。
33017 Scroll the chart to the end on tick incoming\nAuto Scroll
33018 Bar charts\nBar Chart
33019 Candlesticks\nCandlesticks
33020 Enable experts for running\nExpert Advisors
使えそうなものがあったら、また便利ツールお願いします。。

名無し名無し 2010/03/22 22:24 誰もが一度は悩むネタ。

インジの後出しジャンケンについて…


faiさんにお願いしたいことは1ピピ動いたら常に更新するという夢のようなソースをお願いしたいです。

例をあげればスネークフォース。

リアルと更新後は全く結果が違う。
1ピピずつ更新してくれればローソク足が確定したときに確定した時点でのインジは後出しにならない。
そして1ピピずつの更新で次々に足が更新されていくという「夢」のような依頼。

こんな願いをかなえてくれるのはfaiさんしかいないと思ってコメを残した。。。


faiさん、僕らの夢をかなえてください。。。

fai &gt;名無しfai >名無し 2010/03/22 22:39 意味が良く分かりません^^;
スネークフォースが、夢のようなソースの例ですか??

L 2010/03/22 22:56 名無しさんのいうのは、、、

なんとなくわかるなー。。。
テクニカルによっては更新をクリックすると
表示させていた指標が変化するんですよね。

あの現象は一体なんなんだろうか。。。
ループから外れた場合、そのまま描写されたままなんだろうなー。。。

faifai 2010/03/23 00:08 それって limit =Bars -1; 辺りで上書きしちゃえば解決する問題とか・・・

名無し名無し 2010/03/23 00:16 えっとわかりやすくいうとたとえばスネークフォースをインジで出してリアルで見てるのと(時間足や編集をしないで)10分くらいたったら時間足や編集をして更新します。

そうすると…

リアルはイマイチ(むしろイマニ?)のサインだったが更新後にインジをみると絶好のサインを出している
ということです。


つまり1ピピ動く毎に更新できれば後出しがなくなるのではないかと思ってます。


Lさん共感してくれますか?


faiさんよろしくです!
ちなみにデコンパイルできるフリーソフトしりませんか?

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fai_fx/20100322/1269184155