先程までは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でした!!
やはりすごい人だなぁ・・・
ちなみに、割り込みの精度は10ms or 16msの2択となります。これはミリ秒タイマが実装されていると思われるWindowsの割り込み精度が10msか16msの為です。詳しく調査したい場合は 「Windows HAL 割り込み精度」で調査してみてください^^ ピッタリ50ms 秒間20回を期待すると正しく動作しないためご注意あれ。
返信削除だいすけさん
削除ありがとうございます
今回の測定結果からMT4では15.625ms単位になっていそうですね。
VPSはWINDOWSですが、MT4サーバーのOSによってシンクロする時間が違うかもしれませんね。深い・・・
連投すみません。後もう一点、ご存知だったら蛇足ですが、タイマ処理はバックテストでは正しく動作しません。バックテスト時のみOnTick内で判断処理をいれて、実動作時は、タイマ処理で行う等のIsTesting関数による処理切り分けが必要になるのでご注意ください。
返信削除だいすけさん
削除貴重な情報ありがとうございます。
OnTick()冒頭にIsTestingを入れるか
バックテスト用と本番用の二つに分けるか悩みどころですね^^