2009/03/07

バックテストの高速化


EA作りは、何度もバックテスト(検証)作業をしながら作り上げていくものです。
しかし、その検証に時間を費やされることは非常に苦痛です。
今回は、少しでも検証スピードを上げる方法(バックテストの高速化)を提案しておきます。
※なぜEAごとに検証スピードが異なるか?
簡単に言ってしまえば、処理容量が多いとスピードが落ちてしまうからです。
しかし、多くのEA(検証スピードのおそいEA)は、無駄な処理(必要のない処理)が含まれています。
処理作業を遅らせる要因は?
①大量のループ作業
例)100回ループがEA内にあり何も対策をしていない場合
データ分処理するとすれば、100回ループ×4回(1M[初値・高値・安値・終値])×検証時間軸(1Hなら×60)×検証期間となります。
②外部(EA外)の指標(インジケーター)の利用
※表示用に無駄な作業が含まれるため、処理スピード低下の要因となります。
※それらを回避するための対策は?
①大量のループ作業がある場合
A)時間軸の初値でオーダーの取引を検討するEAの場合
※【if(Volume[0]>1||!IsTradeAllowed())return(0);】をint start() { の後に追加しておく。(初値で処理をするという意味です。)
B)A以外のEA
※for(int i=0;i<Limit;i++)をfor(int i=0;i<Limit;i=i+10)のように変更してループ回数を減らしてみる。
※ただし、内容が粗悪になるため注意が必要です。(以外に使えます。)
②外部(EA外)の指標(インジケーター)の利用の場合
※簡単に言ってしまえば、必要な処理だけをEAの中に組み込んでしまえばそれが対策となります。
※しかし、フォワードテストやリアルで使用する際に、表示用として指標を表示させると2重処理していることになるのでPCへの負担は増えます。
例として、VQという指標をEA化したものを添付しておきますので確認してみてください。

まとめ
検討結果が、すぐにわかるのがEA作りの面白いところです。

5 件のコメント :

弱気なブルート さんのコメント...

初めまして、弱気なブルートと申します
いつも、とてもすばらしい記事ありがとうございます
今回は、インジケーターの高速化ということで、例としてのVQ_EAということで
高速化とは関係のない部分の質問で申し訳ありませんが
VQ_EAのマネージメント機能がどうも働かないようです
Lot_Management = trueでLeverage に10などの数字を入れることによって機能するものと思いますが
0.01ロットで固定されたままです

コードを自分なりに見直したり、変更してみたりしたのですが
まだまだ勉強不足で解決できません

お門違いな質問で申し訳ありませんが
教えていただけないでしょうか。

bighope さんのコメント...

はじめまして!
ホントですね。必要なコードも削除していました。
変更しておきましたので、確認してください。
それでは!

bighope

弱気なブルート さんのコメント...

早速の対応ありがとうございました
LOTサイズ計算 だったんですね
詳しく解説していただいているのに
まだまだ、MizuToriも理解できていない部分がいっぱいです(^_^;)

minato_trading さんのコメント...

kakaku FXが始めたECNはDukascopyのシステムを使っているそうですが、面白いのはMT4コンバーターです。
EAをJavaに書き換えてくれるので、それを使ってバックテストをしてみたら、ほぼ一瞬で終わってしまったので驚きました。
変換は一々面倒ですが期間や通貨を変えてのテストならこちらのほうが早いかなと思います。

それと余計なお世話かもしれませんが、
Expert adviserではなく、Expert advisorだと思います。

bighope さんのコメント...

minato_tradingさんへ
たしか、MQL5もコンバートできるような広告を見たような気がします。一度kakakuFXさんのサイトを確認したのですが入口がわからず、そのまま放置状態になっていました。各種のコンバーターができれば選択肢が増えて今後の開発が楽になっていいかもしれませんね。

『adviser』ほんとですね^^;
こっそり修正しておきます。