どうも、FXトレーダー兼システムエンジニアのナオトです。
開発の裏側の6回目で、MT4とMT5で、同じ名前の関数が違う結果を返す例を書きました。
その1つが StringSubstr です。長さに0を渡すと、MT5は空の文字列を返し、MT4は最後まで全部を返します。
21回目では、通貨の強さのパネルで、この違いにはまった話を書きました。
実はその少し前にも、同じ違いではまっていました。そのときは、MT4のメモリが2GBまで増えて、落ちました。
起きたのは、経済指標の発表までを秒読みで出す、e-EconomicStopper のMT4版です。
動かしているうちにMT4のメモリが増え続け、2GBに届いたところで落ちました。開発用のパソコンのMT4でも、同じことが起きました。
このインジケーターは、指標の予定を、ウェブのページから取ってきます。
ページの文字には、表示のためのタグがたくさん入っているので、それを取り除いてから読みます。
原因は、そのタグを取り除く処理でした。
タグを見つけたら、タグの手前の部分と、タグの後ろの部分をつないで、タグを消す。
手前の部分は、StringSubstr で、先頭からタグの位置までの長さを指定して切り出していました。
タグが文字の先頭にあると、その長さは0になります。
MT5なら、手前の部分は空です。ところがMT4では、0は最後まで全部、の意味になるので、文字全体が返ってきます。
タグを1つ消すつもりが、文字全体をもう1つ前につないでいたわけです。
先頭にタグが来るたびに、文字の長さが2倍になっていきました。メモリが増え続けたのは、これでした。
直すとき、この1か所だけを直すのはやめました。
文字を切り出す処理を、全部、自分で作った関数に置き換えています。長さが0以下なら、MT4でもMT5でも空を返す関数です。
前後の空白を取る処理も、MT4では動きが違ったので、文字の置き換えの処理といっしょに、自分で作った関数にそろえました。
直した版を開発用のパソコンのMT4で動かし、本物のページを取って確かめました。メモリは85MBのままで、指標の一覧も正しく出ています。
ついでに、もう1つ見つかりました。
指標の名前を探すときに、段落を表す p のタグを探していたら、星の絵を描くタグの path の頭にも当たっていました。文字の先頭だけで探すと、こういう取り違えが起きます。
MT4とMT5で動きの違う関数にはまったら、その1か所を直すより、その関数を直接使うのをやめる。今回いちばんの学びです。
MT4とMT5の両方で動くインジケーターやEAの、移植と改修のご依頼も受けています。
最後までお読みいただき、ありがとうございました。