自定义符号。误差、错误、问题、建议。 - 页 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()时可见。但这是不可见的。请检查一次。

我已经运行了你的文件,但你代码中的处理程序已经被优先处理了。
考虑到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()变慢,要么是图表事件处理 队列变慢。

发现

关于交易、自动交易系统和交易策略测试的论坛

如何创建一个函数来处理每一毫秒?

Nikolai Semko, 2018.09.13 04:45

是的,事情就是这样的。(仅仅不是频率,而是周期。 最大频率=64赫兹)

只是要补充说明一下。

计时器的周期步骤=15.625毫秒。

即用EventSetMillisecondTimer(1)命令和EventSetMillisecondTimer(10)命令,实际周期为15.625ms。

使用EventSetMillisecondTimer(21)命令时,实际周期为31.25ms,使用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函数timeBeginPeriod(1)
,即在想法中,系统定时器现在被递增到1毫秒。
而系统定时器的步骤应该是1毫秒,对吗?
为什么评论中的计数器仍然冻结?