MQL4からMQL5への移植は割と面倒

 Meta QuatesがMT4のサポートを打ち切りそうだとの話を聞き、まぁMT4はまだまだ残るだろうけど、この際だからMQL5へ自分の使っているインジ等を移植してみるか、と思いやってみた。
 その結果、MQL4からMQL5への移植は、MT5ににおける仕様変更に、思いの外手こずらされた。

 移植はそこまで大幅に変更することなく行えるが、ネットで検索すると最初に出てくるようなコンバーターはまず使えないと思って良い。
 なぜなら、タイムシリーズの配列要素番号の扱いからして、デフォルトではMQL4と逆になっているからである。これは非常に厄介で、MQL4の感覚で配列を操作していると思いの結果が出ずに戸惑う。
 また、インデックスバッファの作り方と扱い方も、MQL5から推奨されている方法はMQL4で行っていたようなやり方と互換性がないので、MQL5方式を採用する場合は相当手を加える必要が出てくるだろう。
 インディケーター用のバッファだけではなく、中間計算用のバッファも、タイプを指定することで作れるようになっているのだが、中間計算用バッファとインディケーターバッファの配列要素番号の扱いは逆である。こういうの、ほんとやめてほしい・・・orz。MQL4でもあったが、MQL5ではさらに別の場所で、この逆の要素番号の扱いが増えている。開発者のセンスどうなってんの。まぁ、中間計算用なので、格納方向がどうであれ、インデックスの扱い自体は変わらないからいいだろということなのだろうが・・・ねぇ・・・。
 だが、決定的に良い点として、MQL4では値によってインディケーターの色を変えたい場合、インデックスバッファを複数用意して、それぞれに色を設定し、条件分けしてバッファに値を入れて表示・・・などということをやっていたところが、MQL5ではカラーバッファというものが用意されており、インデックスバッファに紐つけることができ、インデックスバッファに値を格納する際、カラーバッファの同じ要素番号に、予め指定しておいた色番号を代入するだけで色を決めることができる。これは、MQL4のときから、なぜこう出来ないのかと全てのユーザーに思われていたところだろうから、改善されたことは喜ばしい。
 そして最も注意すべき改変が、iCustomのものだろう。MQL4までは返り値がインディケーターの値だったものが、インディケーターの「ハンドル」になっている。このハンドルを取得した後に、CopyBufferで任意の範囲の値を配列に取得する。また、インディケーターの計算に必要なデータがない場合、それらをダウンロードする処理に移行する等、慎重な(?)設計になっている。iCustomは以前のように無頓着に何度も呼ぶ関数ではなくなり、大体の場合、一度だけハンドルを取得し、CopyBufferで適宜データを引っ張ってくるという様に変更されている。

 MQL5の作法のほうが確かに便利、シンプル、慎重になっているものの、MQL4での実装をそのまま持ってきたい場合、MQLライブラリの変更自体でエラーが出まくって、それらを修正する手間がかかるだろう。
 なぜエラーが出まくるかといえば、MQL5から廃止された関数等がかなりあるからだ。そして、それらを用いたい場合、移植ガイド等の情報を参考にしつつ自作することによって置き換える必要がある。
 たとえそれらを修正したとしても、MQL4での実装ですんなり成功する保証はないし、調べてもいない。また、調べたくもない。

 MQL4からMQL5へのポーティングは面倒なので、それらの作業を回避しつつ、MQL5の作法でいくつか移植してみたが、同じ計算を行い同じように表示することは可能(あたりまえかもしれないが)。
 ソース自体は多少洗練されるので、やる価値はあるだろう。また、シングルスレッドのMT4と違い、処理速度もMT5のほうがずっと速いのだろうし、GPGPUを扱うような関数まであった。なので、早めに慣れておくことが得策であろう。