どうも、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の変換や、両版のインジケーター制作のご依頼は、こちらで受けています。
最後までお読みいただき、ありがとうございました。