MQL4、MQL5でのカスタム指標プログラムの書き方色々

皆さん、こんにちは。

MT4 build610どうですか?
やはり混乱を招いているからか、今回のアップデートに関するブログ記事を色々なところで見かけました。
私個人としては、これまで使っていたプログラムがそのまま動いたので、build610にアップデートしました。
ただ、これまで使っていたプログラムが動作しないとか、動作が不安定であれば、アップデートすべきではありません。
デモ口座などで十分にテストした方がいいでしょう。
ところで、build600になってからMQL4の仕様が変わったため、カスタム指標やEAも色々な書き方ができるようになってしまいました。
今回は、一例として簡単なカスタム指標プログラムについてみてみます。
MT4 build509以前のいわゆる「old MQL4」では、終値を線で結ぶだけのカスタム指標プログラムは次のように書けました。

build600以降でも、このプログラムはコンパイル、実行できます。
ただし、メタエディタの新規作成からプログラムを作ると、OnInit()とか、OnCalculate()に変わってしまいます。
これらの関数はMQL5での特別な関数なのですが、MQL4でもそれを使わせたいということでしょう。
ここで、単に init()→OnInit()start()→OnCalculate()に変えると、コードは次のようになります。

このプログラムもbuild600以降であれば、コンパイル、実行できます。
でも、OnCalculate()関数を使うのであれば、MQL5ライクな書き方をすることもできます。

Bars→rates_total
IndicatorCounted()→prev_calculated
Close[i]→close[i]

と置き換えてみます。
あと、

if(limit == 0) limit = 1;

を追加します。すると、次のようなプログラムになります。
なお、この文を追加する理由については「FXメタトレーダー4&5一挙両得プログラミング」の93ページ以降をご参照ください。

これでMQL5にも近づいたので、MT5でも使えるでしょうか?
そこで、mq5ファイルにコピーしてMT5のメタエディタでコンパイルしてみると、一つwarningが出るものの一応、実行ファイルができます。
しかし、これをチャートに挿入しても何も表示されません。やっぱりダメなんです。
MT5で動作させるためには、さらに#propertyを追加、ArraySetAsSeries()でBuf[]、close[]を時系列配列にしなくてはいけません。
これらの修正を加えると、MT5で動作するプログラムは次のようになります。
この修正の説明についても、「FXメタトレーダー4&5一挙両得プログラミング」の93ページ以降をご参照ください。

やはり、簡単なカスタム指標プログラムでも、New MQL4とMQL5との間には互換性はないということです。
このようにMQL4では色々な書き方ができるようになったのですが、実のところ、MT4のままならOld MQL4で十分でしょうし、MT5に移行するのなら、最初からMQL5でプログラムを作ればいいと、個人的には思います。



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