【開発の裏側⑥】MT4とMT5で、同じ名前の関数が違う結果を返す3つの例

【開発の裏側⑥】MT4とMT5で、同じ名前の関数が違う結果を返す3つの例

記事
IT・テクノロジー
どうも、FXトレーダー兼システムエンジニアのナオトです。

MQL4とMQL5は、関数の名前がかなり共通しています。
StringSubstr も StringTrimRight も、どちらでもそのまま使えます。コンパイルも通ります。

ところが、名前が同じでも結果が違うものがあるんです。
今回は、実際の開発で踏んだ3つを書きます。



1つ目は StringSubstr です。

文字列の途中を切り出す関数で、3つ目の引数に長さを渡します。
長さに0を渡すと、MQL5は空の文字列を返します。MQL4は、終わりまで全部を返します。

経済指標のインジケーターで、文字列からタグを取り除く処理を書いていたときのことです。
タグが先頭にあると長さが0になり、MT4だけ毎回、文字列が2倍に増えていきました。
開発の途中で、MT4がメモリを2GBまで使って落ちています。

MT5と開発機の模擬だけで確かめて、MT4の実機では測っていなかったんです。
それ以来、文字列を大きく切り刻む処理は、MT4の実機でメモリを測ってから出しています。長さが0以下なら空にする小さな関数を1つ挟んで、両方で同じ結果にしました。



2つ目は StringTrimRight です。

文字列の右の空白を取り除く関数です。
通信の応答を1行ずつ読むとき、行の終わりに復帰の文字が残ることがあります。MQL5はこれを取り除きますが、MQL4は残します。
応答を比べる処理で、MT4だけ一致せずに失敗しました。

さらに、手元のMT4のビルドでは、引数の文字列そのものが書き換わらないことも測っています。
両方で使う処理は、取り除きたい文字を自分で消すようにしました。



3つ目は SymbolSelect です。

銘柄を気配値の一覧に出す関数で、失敗したら銘柄が無いと判断する書き方がよくあります。
MT4のストラテジーテスターでは、これが失敗を返すんです。

テスターで回したEAが、取引0回で終わりました。チャートの銘柄まで、無い銘柄として弾いていました。
MT4のテスターはチャートの銘柄しか取引できないので、テスターのときは SymbolSelect を見ないようにしています。MT5ではこの問題は出ません。



どれも、コンパイルは通って、エラーも出ません。
MT4とMT5の両方で同じロジックを動かすときは、文字列の処理ほど、両方の実機で結果を並べて確かめるようにしています。

精査するときは、同じ設計なのに両版で違っている箇所を探すのが早いです。たいてい、どちらかが壊れています。



MT4とMT5の変換や、両版のインジケーター制作のご依頼は、こちらで受けています。


最後までお読みいただき、ありがとうございました。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す