2016年7月4日月曜日

【解決&多謝】 複数通貨ペアのOnTick() EventSetMillisecondTimer その3

それではいよいよEventSetMillisecondTimerの実力をみてみます!!!!

先程までは1分回に何回というカウントでしたが
今回は1秒に何回かを見ます。

もうひとつ変更点が「その2」までは0からカウントしていましたが1からすることにしました。


int i,os;datetime t;string texts;
void OnInit(){EventSetMillisecondTimer(1);}
void OnDeinit(const int reason){EventKillTimer();}
void OnTimer(){
if(os==TimeSeconds(TimeLocal()))
{i++;}
else{
texts+=TimeMinute(TimeLocal())+":"+TimeSeconds(TimeLocal())+" count"+i+"\n";
Comment(texts);i=1;os=TimeSeconds(TimeLocal());
}}

まずは1/1000秒

本番は三回目からです
1000と出ればいいのですが・・・

結果は59回 意味深な数です。
一分と間違えていないか何度も確認したのですが
何度やっても1秒間に60前後です
16~17/1000ミリ秒がミニマムでしょうか

パソコンの処理時間を考えて50ミリ秒程度にするのがよさそうですね。
そういえば、だいすけさんが初めに書かれた数字も50でした!!

やはりすごい人だなぁ・・・















4 件のコメント:

  1. ちなみに、割り込みの精度は10ms or 16msの2択となります。これはミリ秒タイマが実装されていると思われるWindowsの割り込み精度が10msか16msの為です。詳しく調査したい場合は 「Windows HAL 割り込み精度」で調査してみてください^^ ピッタリ50ms 秒間20回を期待すると正しく動作しないためご注意あれ。

    返信削除
    返信
    1. だいすけさん
      ありがとうございます
      今回の測定結果からMT4では15.625ms単位になっていそうですね。
      VPSはWINDOWSですが、MT4サーバーのOSによってシンクロする時間が違うかもしれませんね。深い・・・

      削除
  2. 連投すみません。後もう一点、ご存知だったら蛇足ですが、タイマ処理はバックテストでは正しく動作しません。バックテスト時のみOnTick内で判断処理をいれて、実動作時は、タイマ処理で行う等のIsTesting関数による処理切り分けが必要になるのでご注意ください。

    返信削除
    返信
    1. だいすけさん
      貴重な情報ありがとうございます。
      OnTick()冒頭にIsTestingを入れるか
      バックテスト用と本番用の二つに分けるか悩みどころですね^^

      削除