【開発の裏側㉙】MT4はタイマーを断ることがあります。断られたまま黙って止まっていた話

【開発の裏側㉙】MT4はタイマーを断ることがあります。断られたまま黙って止まっていた話

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

MQLでは、決まった間隔で処理を呼んでもらうために、タイマーを使います。
EventSetMillisecondTimer で、500ミリ秒ごとに呼んでください、と頼むような使い方です。

今回は、MT4がそのタイマーを断ってきて、プログラムが黙って止まっていた話です。



見つけたのは、新しいインジケーターを、開発用のパソコンの実際のチャートで確かめていたときです。
認証のある私のインジケーターは、認証の通信を、横で動く小さな補助のEAに任せています。その補助のEAが、何もしていませんでした。

ログには、cannot set millisecond timer、ミリ秒のタイマーを作れない、というエラーが出ていました。



原因は、タイマーを頼んだ結果を見ていなかったことです。

EventSetMillisecondTimer は、成功したかどうかを返します。MT4では、起動の直後などに、これが失敗することがあります。
ところが、プログラムは失敗を受け取っても、そのまま次へ進んでいました。

タイマーが無いので、処理は一度も呼ばれません。
エラーで止まるわけでもないので、チャートの上では、ただ何も起きないだけでした。



直し方は、断られたときの逃げ道を2段にしたことです。

まず、500ミリ秒のタイマーを頼む。
断られたら、1秒のタイマーで代わりを頼む。こちらが通れば、1秒の周期で動いていることをログに残します。
それも断られたら、ティックが来るたびに処理を呼びつつ、タイマーをもう一度頼み直します。

これで、タイマーが取れなくても、少なくともティックごとには動くようになりました。
直した版を入れて、2回目の確かめでは、認証まで通っています。



タイマーに限らず、MQLの関数には、成功したかどうかを返すものが多くあります。
普段の環境では毎回成功するので、結果を見ない書き方でも困りません。困るのは、別の環境で一度だけ失敗したときです。

そのときに黙って止まらないよう、断られたらどうするかまで書いておく。それが、使う人の画面で起きる不具合を減らす近道だと考えています。

MT4やMT5のインジケーターやEAの不具合の調べと改修のご依頼も受けています。


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