2016年6月8日水曜日

【EA高速化】バックテスト時間を短くしよう Close[0] を呼び出す時間

ソースコードでOpen,Close,High,Low,Ask,Bidなどは呼び出すのに時間がかかるので、複数回使用する時にはほかの定数に代入してから使用するほうが速いという話をよく聞きます。

理に適っているし、そうだと思います。

しかし、一度しっかりと検証してみたいところです。
二つ作りました。
上は Close1 下は Close2 です。
Close1はaにClose[0]を1,000回入れています。

Close2はcにClose[0]を一回入れて、aにcを1,000回入れています。

時間に差は出るのでしょうか?


double a,t;
void OnTick()
  {
  t=GetMicrosecondCount();
  for(int i=0;i<1000;i++){a=Close[0];}
  Comment(GetMicrosecondCount()-t);
  }

double a,t,c;
void OnTick()
  {
  t=GetMicrosecondCount();c=Close[0];
  for(int i=0;i<1000;i++){a=c;}
  Comment(GetMicrosecondCount()-t);
  }


結果です
コメント欄をご覧ください。
Close1は92マイクロ秒かかっていますが、Close2は10マイクロ秒です。
一分に一回のClose[0]を減らす事ができると
一日で1,440回、一年(260日計算)で374,400回、十年で3,744,000回減らせます。
下のテストは1,000回で差は82マイクロ秒です。
3,774 × 82 は 307,008マイクロ秒=0.3秒
全ティックだと50回/分として15秒早くなります(汗)

10年のバックテストで関数一つ当たり15秒は微妙ですが、
普段から価格関係やPOINTなど定義済み関数を定数に入れる習慣をつけると、
人生少しは得するという事ですねw 作る時間も考えると・・・



0 件のコメント:

コメントを投稿