2016年6月10日金曜日

【EA高速化】バックテスト時間を短くしよう 通貨ペア指定はSymbol() NULL "" "USDJPY-a01" どれが速いでしょうか?

通貨ペア指定は四つのうちどれが一番早いでしょうか?


Symbol()      シンボル関数 標準的なやり方。
NULL        NULLでも
""          ””ダブルコーテーション 半角二文字で短い!
"USDJPY-a01"   ←通貨ペア名指定 ※OANDAで実験しますので-a01が付いています。

私の予想ですと①”” ②NULL ③通貨ペア直接指定 ④Symbol()です。
理由ですが
Symbol()は関数呼び出しに時間がかかる
通貨ペア直接指定は指定文字を読み取り当てはめる行程がいる。
NULLは何もないから早い
NULLの中身は""と考えられる。NULLを””に変換する行程が不要

といってイメージです。いかがでしょうか?

//””
void OnTick()
  {
  int t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    double A=MarketInfo("",32);
    }
  Comment(GetMicrosecondCount()-t);
  }

//NULL
void OnTick()
  {
  int t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    double A=MarketInfo(NULL,32);
    }
  Comment(GetMicrosecondCount()-t);
  }

//Symbol()
void OnTick()
  {
  int t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    double A=MarketInfo(Symbol(),32);
    }
  Comment(GetMicrosecondCount()-t);
  }

//直接指定
void OnTick()
  {
  int t=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {  
    double A=MarketInfo("USDJPY-a01",32);
    }
  Comment(GetMicrosecondCount()-t);
  }

四つもあると見にくいですね。
インデントつけなければよかった・・・



結果発表です
こちらも見にくいので打ち直しました。
1st. Symbol1                  ""  3,114,741
2nd Symbol3         Symbol()  3,141,865
3rd Symbol2              NULL  3,141,865
4th Symbol4 "USDJPY-a01" 3,277,976

順位は安定していますが直接入力のみ2ndから4thをうろうろしています。
安定していたのは4thでしたので最下位の烙印を押しました。

””が速いのは予想的中なのですが、Symbol()が速いのは少し驚きですね。

複数通貨ペアを操るときには直接入力が必要ですが、
単一通貨ペアで縛りたいときにはOnInit で縛るのがよさそうです。





0 件のコメント:

コメントを投稿