2010年5月13日木曜日

★テスター/ビジュアルモード上のMTFインジケーター
MTF Indicators On The Tester


さて、MetaTrader4 ではテスターのビジュアルモードを使うと、市場が休みの土日でも値動きのあるチャート上でインジケーターの 動作確認を行うことができる(テスターをビジュアルモードで動作させ、チャート上にインジケーターをドラッグ&ドロップする)が、 ここで1つ問題がある。

通常のインジケーターであればチャートと同じ時間足のみを使うので問題ない のであるが、MTF対応などで別の時間足を使おうと思ってもテスター上からは正しい 足が参照できないのである。
例えば、ビジュアルモードをM5のチャートで実行中、以下のようなコー ドでH1のその時点での最新の足を参照しようと思ってもうまくいかない。
datetime tM5 = Time[0];
datetime tH1 = iTime(NULL, PERIOD_H1, 0);
Print("Time[0]= ", TimeToStr(tM5),
      ", iTime(NULL, PERIOD_H1, 0)= ", TimeToSTr(tH1));
これを実行させると、以下のような出力となる。(Open price onlyモデル)
 USDJPY,M5: Time[0]= 2010.05.03 05:15,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 05:10,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 05:05,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 05:00,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 04:55,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 04:50,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
 USDJPY,M5: Time[0]= 2010.05.03 04:45,
         iTime(NULL, PERIOD_H1, 0)= 2010.05.12 22:00
Time[0](=tM5)は随時更新されているが、 iTime(NULL, PERIOD_H1, 0)(=tH1)の方はずっと同じ値(2010.05.12 22:00)のままで変化していない。
また、tM5は日付けが5月3日なのに対し、tH1の方はテスター開始時の最新足の日時(5月12日)となってしまっている。

また、以下のコードを実行させると、
datetime tM5 = Time[0];
int shift = iBarShift(NULL, PERIOD_H1, tM5);
Print("Time[0]= ", TimeToStr(tM5), ", shift= ", shift);
 USDJPY,M5: Time[0]= 2010.05.03 05:15, shift= 185
 USDJPY,M5: Time[0]= 2010.05.03 05:10, shift= 185
 USDJPY,M5: Time[0]= 2010.05.03 05:05, shift= 185
 USDJPY,M5: Time[0]= 2010.05.03 05:00, shift= 185
 USDJPY,M5: Time[0]= 2010.05.03 04:55, shift= 186
 USDJPY,M5: Time[0]= 2010.05.03 04:50, shift= 186
 USDJPY,M5: Time[0]= 2010.05.03 04:45, shift= 186
となり、H1の対応する足の位置は185~186本目(最新(0)の足からそれだけ前の時間足)となっていることがわかる。
これが何を意味するかというと、M5のチャートでテスターを実行中、M5の足のデータはtickが くるたびに更新されていくのに対し、他の時間足はテスターではない通常のチャート上で参照するのと 同じ状態となっているのである。
つまり、以下のようにすることで対応する位置の1時間足のデータを参照することは可能であるのだが、 足としては既にできあがってしまっているため、テスターで実行中には未来を参照することになってしまう。 (05:00ちょうどに参照すると、H1の足のデータは既にできあがっているので、 05:00~05:59までの動きの結果を見ることになってしまう)
datetime tM5 = Time[0];
int x = iBarShift(NULL, PERIOD_H1, tM5);
double openH1  = iOpen(NULL, PERIOD_H1, x);
double highH1  = iHigh(NULL, PERIOD_H1, x);
double lowH1   = iLow(NULL, PERIOD_H1, x);
double closeH1 = iClose(NULL, PERIOD_H1, x);
これを解決するためには、 とあるブログの「バックテスト時に 異なる時間足のチャートを観る。」のようにテスター実行時に他の時間足 を作っていくようにすると解決できるかもしれない。

6 件のコメント:

  1. 00さん、こんにちは。

    これってMT4のBuild いくつで検証されています?
    私の環境(226)では再現しないような・・・。
    検証方法が間違ってるのかな^^;;;

    返信削除
  2. faiさん、
    まじですかw そんな修正履歴ないのになぁ。
    一時期アップデートするといくつかのbuidで
    コネクションがまったく安定しないとか問題が
    あって信用できないのでまともに動いてたbuild
    220に戻したきり。
    最近は問題ないんすかね、何仕込まれてるかもわ
    かったもんでもないしなとw

    返信削除
  3. すんまそん・・orz
    文章を読み間違えていました。
    226 でも状況は変わらずでした。

    返信削除
  4. おぉ、そうでしたか。ちょっとわかりづらい文章で
    すんまsんw
    じゃぁやっぱりオフラインのMT5コ入れ換えるのは
    面倒だからこのままでいこうかなとw

    返信削除
  5. 私もデバッグ中に同じこと見つけて、このページにたどり着きました。
    テスターでiTimeが機能しないとか致命的ですね

    どうしても他の時間足でのdateTime が知りたい場合、
    Time[] と iBarShift を使って、自作で関数作るしかないか・・ 
    作れそうな気がするけど、どうなんだろ、、めんどくさ

    返信削除
  6. 同じ問題に遭遇しました・・・
    ちなみに、どのように解決しましたか?

    返信削除