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

2011/03/31

MQL4で使用していたDLLをMQL5で使用する方法 ■■■

※追記2011/4/3しました。
MQL4で使用していたDLL(ANSI版DLL)は、そのままでは、MQL5で使用できません。原因は、MQL4とMQL5の、文字コードが異なるからです。MQL5は、より高速処理を実現させるために、WINDOWSの内部処理文字コードであるUNICODEを採用しています。そのため、引数をDLLに渡す時や、DLLから戻り値を受け取る際に文字コードエラーが発生します。

MQL5用のUNICODE版DLLの作り方

以下のサイトに簡単な作り方が紹介されている。
How to Exchange Data: A DLL for MQL5 in 10 Minutes

ANSI版DLLをMQL5で使用する方法

先に記述の通り文字コードの互換問題をクリアすればANSI型DLLを使用することが可能です。
方法は、以下のサイトにまとめられていますので参照してくだい。
MQLmagazine.com DLL Hell, MQL5 edition : UNICODE vs ANSI
変換方法は、上記サイトにある【stringlib.mqh】をインクルードし 、
UNICODE2ANSI関数でUNICODEからANSICODEに変換
ANSI2UNICODE関数でANSICODEからUNICODEに変換
します。
実際にテストしてみると、
kodee
前々回紹介したSQLite3のデーターベースを接続することができました。

まとめ

ANSI型DLLの場合でも内部的にはUNICODEに変換して処理しているので、ANSI型DLLを使用した場合、文字変換を4回行う結果となり、処理能力を下げる結果となります。

※追記事項
MQL5からSQLite3への接続には、ラッパーが必要ありません。
新しいプロジェクトが誕生したようです。
sqlite-class-for-metatrader5