EAでリアルタイム時計を作り、回線切断を警告する。

Lさんから、「Labelをクリックしたら、数字が変わるなどしたいのですがどうしたらできるのでしょうか。」との質問を頂きましたので、その説明をする前段として、今日は、「EAでリアルタイム時計を作り、回線切断を警告する。」方法を考えます。
(え…脈絡が意味不明ですか?^^;;;;



ExpertAdvisor( EA )や、indicator は、Tickが更新される度に start() 関数が呼ばれるので、普通に時刻表示するEAやインジケータを作ってもリアルタイム..とはよべない ( 少なくとも、秒単位でリアルタイムには更新されない ) 時計になってしまいます。
ただ、MetaTrader4 では、EA とscript のみ、start() 関数内での無限ループが許容されているので、これを利用することで、リアルタイム性のある処理が可能となります。


無限ループするコードの基本的な書き方は、

int start(){
   while(!IsStopped() && IsExpertEnabled()){ //script なら IsStopped() のみ。
     //ここに必要な処理を書く
      WindowRedraw();
      Sleep(100);
   }
   return(0);
}

です。
これで、一度 start() 関数が呼ばれたら、100 ミリ秒毎に必要な処理が実行されます。*1
script を止めたり、EAを止めるとループから抜けて終了します。
ループ中は、チャートにオブジェクトを置いた場合には WindowRedraw(); で更新しないと反映されません。
売買処理をする為には、 RefreshRates(); 等を呼ばないとAsk/Bid に最新の価格が取得できません。
それから、、このコードをインジケータに書くのはNGです。( 何が起きるか想像つかない人はお試しください...逃 )



次は、リアルタイムな時計の表示です。
時刻の取得と言えば、TimeCurrent() , TimeLocal() の2種類の関数をご存知かと思いますが、リアルタイム時計の作成に使えるのは、TimeLocal() のみです。
TimeCurrent() は、あくまでも、最後にTickが更新されてMT4 に届いたサーバの時刻 ( 気配値表示している通貨ペアのどれかは不明。 気配値表示していない通貨ペアは無関係。) を示しているだけなので、Tick更新がよく止まる、出来高の少ない寂れたサーバではリアルタイム時計にならないのです^^;




・・・と言うことは、TimeCurrent() と TimeLocal() の正確な時差を測定し続ければ、Tick更新の停止(≒サーバ停止、回線切断)を検出できることになります。TimeCurrent() では、どの通貨ペアが更新された時刻なのか分からないので、特定の通貨ペアの更新時刻を監視したい場合は、MarketInfo(Symbol(),MODE_TIME); を使います。念のため、IsConnected() も監視対象にすれば、完璧です。



以上をまとめて、EAにしたものがRTClock_EA.mq4 です。
デフォルトでは30秒間更新がなければ時刻を黄色表示し、60秒間更新がなければ赤色表示+警告音で知らせます。もっと短い時間で警告させることも可能です。短い時間にすると、MT4がぼょ〜んと切断音を鳴らす前に検出できます。切断中はずっとなり続けるので、聞き逃すこともありません。
時計の大きさや位置、警告を出すまでの時間などの細かな設定をする時は必ずExpert Advisor ボタンを押してEAを止めてから行ってください。

サンプルプログラムなので、大した機能は付いていませんが、デモサーバをお使いで、チャートが一定時間動いてないのを監視したい人には役に立つかもしれません..。

*1:時計の場合は1秒毎で十分です。あまり短い時間でループさせるとPCに負担が掛かります..。