【開発の裏側㉚】MT4のメモリが2GBまで増えて落ちた。原因は、長さ0の文字の切り出しでした

【開発の裏側㉚】MT4のメモリが2GBまで増えて落ちた。原因は、長さ0の文字の切り出しでした

記事
IT・テクノロジー
どうも、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の、移植と改修のご依頼も受けています。


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