カスタムシンボル。エラー、バグ、質問、提案。 - ページ 25

 
jaffer wilson:

私のところでは、これはうまくいきません。

私のMT5バージョンの詳細です。


システム時刻の誤差を変更してみてください。

//+------------------------------------------------------------------+
//|                                           SpeedupSystemTimer.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Уменьшает погрешность системного таймера до 1 ms"

#import "winmm.dll"
   int timeBeginPeriod(uint per);
#import

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
{
   timeBeginPeriod(1);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   ExpertRemove();
}
//+------------------------------------------------------------------+
 
Roman :


システム時刻の誤差を変更してみてください。

試してみました。ファイルをご確認ください。そして動画。きっとわかるはずです。司会者にも、添付ファイルを見るようにお願いしています。

カスタムキャラクターでも 同じことが起こります。

ファイル:
 
jaffer wilson:

試してみました。ファイルをご確認ください。そして動画。きっとわかるはずです。司会者にも、添付ファイルを見るようにお願いしています。

カスタムキャラクターでも同じことが起こります。

TimeCurrent() についてのドキュメントを読む

 
Roman :

TimeCurrent() についてのドキュメントを読む。

ファイルを実行していないのでしょう。どうぞ、あなたの側で一度実行してみてください。私のプログラムでは、TimeCurrent()を使って、秒が0以下になったときの現在時刻を取得しています。これは、SetTime()関数を呼び出します。

そして、残り時間が50秒になったら、TimeCurrent()をチェックせずに、秒数を減らしていくのです。OnTimer()が呼ばれたときに表示されるようにすればよいと思います。しかし、それは目に見えるものではありません。一度ご確認ください。

 
jaffer wilson:

ファイルを実行されていないのでしょう。どうぞ、あなたの側で一度実行してみてください。私のプログラムでは、TimeCurrent()を使って、秒が0以下になったときの現在時刻を取得しています。これは、SetTime()関数を呼び出します。

そして、残り時間が50秒になったら、TimeCurrent()をチェックせずに、秒数を減らしていくのです。OnTimer()が呼ばれたときに表示されるようにすればよいと思います。しかし、それは目に見えるものではありません。一度ご確認ください。

あなたのファイルを実行しましたが、あなたのコード内のハンドラが優先されました。
この2つの指標は、TimeCurrent()の仕様を考えると、ほとんど同じように動作します。


追加されました。
この投稿から OnTimer()の遅延に開発者の注意を喚起した方が良いですね。

ファイル:
 
Roman:

むしろ、この投稿から OnTimer()の遅延に開発者の注意を喚起したいです。

タイマーはミリ秒単位の精度を保証するものではありません。また、ハードウェアの制限により、保証されません。
 
Roman:

むしろ、この投稿から OnTimer()の遅延に開発者の注意を喚起したいです。

16ミリ秒は、ミリ秒が入るものの精度です。これはすでにどこかで議論されていることです。
マイクロ秒だと精度は大丈夫ですが、スピードが遅くなります。
 
Nikolai Semko:
16ミリ秒は、ミリ秒が入るものの精度です。これはすでにどこかで議論されていることです。
マイクロ秒だと精度は問題ないのですが、速度が遅くなります。

システムの精度が〜16ミリ秒であることは明らかである。
この例では16より大きく設定されているので、EventSetMillisecondTimer(20)。
これがOnTimer()ハンドラで、20ミリ秒単位で実行されます。
しかし、コメントに表示されているカウンターは、数ミリ秒ハングアップしているようです。
ハンドラ OnTimer() が遅くなるのか、チャートイベントの処理 キューが遅くなるのか、理由はわかりません。

 
Roman:

システムの精度が〜16ミリ秒であることは明らかである。
この例では16より大きく設定されているので、EventSetMillisecondTimer(20)。
これがOnTimer()ハンドラで、20ミリ秒単位で実行されます。
しかし、コメントに表示されているカウンターは、数ミリ秒ハングアップしているようです。
ハンドラ OnTimer() が遅くなるのか、チャートイベントの処理 キューが遅くなるのか、理由はわかりません。

発見

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

ミリ秒単位で処理する関数を作るには?

ニコライ・セムコ さん 2018.09.13 04:45

そう、そういうことなんです。(最大周波数=64Hz)。

一応、補足しておきます。

タイマーの周期ステップ=15.625ミリ秒。

つまり、EventSetMillisecondTimer(1) コマンドと EventSetMillisecondTimer(10) コマンドでは、実時間が 15.625ms となります。

EventSetMillisecondTimer(21) コマンドと EventSetMillisecondTimer(30) コマンドを使用した場合、実際の周期は 31.25ms となります。

EventSetMillisecondTimer(95) コマンドと EventSetMillisecondTimer(105) コマンドでは、実際の周期は 109.375 ms になります。

など

GetTickCount()は1/(2^6)=1/64秒(15625マイクロ秒)毎に変化 します。
 
Nikolai Semko:

造る

GetTickCount()の値は1/(2^6)=1/64秒(15625マイクロ秒)ごとに変化 します。

ありがとうございます、これで理由がわかりました。
システムタイマーの ステップ変更、やはり15.625の倍数。

追加されました。
しかし、システムタイマーの周期を変更しました。win api function timeBeginPeriod(1)
つまり、アイデアとしては、システムタイマーを1ミリ秒単位でインクリメントするようにしたのです。
そして、システムタイマーのステップは1ミリ秒でいいんですよね?
コメント内のカウンターがフリーズしたままなのはなぜですか?
理由: