2011/05/09

MQL5のBarに注意 ■■■

再再追記しました。2011/5/10 22:48
思わず嵌ってしまったのでご報告します。

【MQL4の場合】

例えば、MQL4で5分足を使用しインジケーター若しくは、EAを作動させた場合、ヒストリーセンターに格納されている5分足と1分足のデータを用いて処理されます。Bar数は、ヒストリカルセンターの5分足のデーター数(ただし、オプションにて制限を加えない場合)となり、5分ごと以下に区切られたデータで処理されることになります。

【MQL5の場合】

以下のコードをUSDJPY M5で走らせてみました。
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   Print("Open[0] =",open[0]," Open[1] = ",open[1]," Open[2] = ",open[2]);
   Print("Time[0] =",time[0]," Time[1] = ",time[1]," Time[2] = ",time[2]);
//--- return value of prev_calculated for next call
   return(rates_total);
}
結果は以下の様に表示されます。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Time[0] =1971.01.04 00:00:00 Time[1] = 1971.01.05 00:00:00 Time[2] = 1971.01.06 00:00:00
Open[0] =357.73 Open[1] = 357.81 Open[2] = 357.86
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
USDJPYのM5で稼働させたにもかかわらず、日足のデータが格納されています。
チャートを最も左側(最古)にスライドさせてみると以下の様になっています。
1
仕様なのかバグなのかわかりませんが、指定した時間足のデータがなくなった場合、日足データで補完するようになっているようです。また、日足より上位の時間足に関しては、補完処理はされていませんでした。

《あるBarから突然、時間足の異なるデータを使うことになるなんて、恐ろしすぎる…orz》

【まとめ】

≪CopyOpen・・・・・CopyTime≫などでデータを取得した際も同様の事例となりました。
どこまで、時間足通りのデータが格納されているか調べる必要があるなんて….
バグであることを祈りたいものです。
バックテストをする際は、MQL4以上に注意が必要になりますね・・・・orz

【追記】※再追記

天狗さんから頂いたコメントによると,FXDDのヒストリカルデータでも同じような現象が現れたそうです。ただし、現在FXDDのMT5デモ申請ページが閉鎖?されているようで確認ができませんでした。ちなみに、再度MetaQuotes-Demoのヒストリカルデータを読み込んでも問題は解消されませんでした。
また、アルパリ(US)[208.122.38.200:443]のヒストリカルデータをUSDJPY M5で確認した結果以下の通りとなりました。
現在~2010/04/18までがM5データ
2010/04/19~2007/10/15の間がH1データ
2007/10/15以降は、D1データ
なんと2段階です。・・・orz

【再再追記】

この問題の記事がありましたのでご覧ください。

Strange history data in Strategy test: old data becomes H1 during M5 test

『バグではなく仕様だ!』って感じでしょうか?
対応策は、 MT5→【Tools】→【Options】→【Charts】を選択後【Max bars in chart:】を適正なbar数に変更し終了です。この値がUnlimitedに設定されているとこのような現象が発生するようです。

【データの抜けを確認するインジケーター】

視覚的にデータの抜けを確認できるインジケーターを作成してみました。
方法は、Barのtimeの差を対数値で表示するものです。
どの程度の抜けがあるか?もしくは取引がされていなかったのか?がわかります。
checkbars.mq5
chec