新MQL4のカスタム指標をMQL5に移植する

皆さん、こんにちは。

最近、MT5に関してちょっとした動きがありました。こちらのMetaQuotes社の記事です。

MetaTrader 5にポジション計算のヘッジシステムが追加されました

MT5はもともと同じ通貨ペアのポジションを合算して一つのポジションとして扱う方法を取っていました。これがMT4からの移行が進まない要因の一つでしたが、これを改め、MT4と同じようにオーダー毎にポジションが建てられるようにするオプションが追加されるそうです。

まだベータ版で、正式な対応にはもう少し時間がかかるでしょうが、動向を注視したいと思います。これを早くやってくれれば、あの七面倒くさいライブラリ作らなくて済んだのに・・・

ところで、今回の記事は上記のMT5の動きとは直接は関係ありません。新MQL4のプログラムをMQL5に移植する際の注意点についてお話しします。

まず、『新MT4対応 FXメタトレーダープログラミング入門』に掲載しているカスタム指標のサンプルプログラムの簡単なものを見てみます。

これは、各バーにおける4本値の平均をプロットするカスタム指標です。特に意味はありません。

これをMQL5に移植してみましょう。まずは、ファイルの拡張子を「mq4」から「mq5」に変えてMT5のデータフォルダの「MQL5\Indicators」の下にコピーします。すると、MT5のメタエディターで開くことができるので、そのままコンパイルしてみましょう。

すると、こんなエラーが出ます。

‘Open’ – undeclared identifier
‘High’ – undeclared identifier
‘Low’ – undeclared identifier
‘Close’ – undeclared identifier

MQL4では、4本値の配列が「Open[]」「High[]」「Low[]」「Close[]」という配列としてあらかじめ定義してあるので、それをそのまま使えばよかったのですが、MQL5ではそれがありません。

ここでは、OnCalculate()関数の引数となっている「open[]」「high[]」「low[]」「close[]」という配列が4本値の配列に対応しているので、「Open→open」「High→high」「Low→low」「Close→close」のように変えます。

これをコンパイルすると、エラーはなくなりました。実行ファイルはできているので、適当なチャートに挿入して実行してみましょう。でも、何も表示されません。そこでコンパイルの画面に警告メッセージが出ているところに注意してください。

no indicator plot defined for indicator

指標プロットが定義されていないということのようです。実は「#property」命令がMQL4とMQL5でちょっと異なっていて、MQL5ではプロットする指標の数を「indicator_plots」で指定しなくてはなりません。またもう一つ、指標の種類も「indicator_type1」で指定する必要があります。ラインの場合、「DRAW_LINE」を使います。これらを追加すると、次のようになります。

これをコンパイルすると、エラーも警告も出ません。そこで、これをチャートに挿入すると、ラインが表示されます。これで移植完成かと思いきや、しばらくチャートを見ていると新しいバーのラインが更新されません。

USDJPY.mM1
これは、指標バッファ用の配列がMQL4とMQL5で異なっているためです。MQL4では指標バッファ用配列は最初から「時系列配列」になっていますが、MQL5ではそうではなく、時系列配列にするためにArraySetAsSeries()関数を実行しなくてはなりません。これを「Buf」だけでなく、4本値配列の「open」「high」「low」「close」に適用すると、次のようになります。

これで移植完成です。どうでしょうか?MT4からMT5への移行の道のりはまだまだ長そうな気がします。

なお、新MQL4の詳しいことは、こちらの書籍をご参照ください。

『新MT4対応 FXメタトレーダープログラミング入門』



コメントは受け付けていません