市场关闭 - 页 7

 
将定时器设置为半秒。情况稍有好转。好吧,让我们暂时保持这种方式。
 
Vasiliy Pushkaryov:
将定时器设置为半秒。情况稍有好转。好吧,让我们暂时保持这种方式。

给我看看代码。

 
fxsaber:

给我看看代码。

我已经把多余的部分清理干净了。

但这样的滞后往往可以被手动抓住,或者说500ms是正常的?


附加的文件:
 
Vasiliy Pushkaryov:

我已经把多余的部分清理干净了。

但这样的滞后往往可以被手动抓住,或者说500ms是正常的?


我试过这样的设计,而不是删除标签,只是在标签存在的情况下替换文本,但我没有注意到任何区别

   if(ObjectFind(idChart, nameFix) == 0)
   {
     ObjectSetString(idChart, nameFix, OBJPROP_TEXT, text);
     ChartRedraw();
     return;
   }
 
Vasiliy Pushkaryov:

是否经常可以手动捕捉这样的滞后,或者500ms是正常的?

这不是一个滞后。你显示OnTimer的时间,然后等待500ms。在这500ms内,时间发生了变化,但OnTimer还没有被调用。

你需要同步--在 "TimerCurrent改变 "的时刻准确地设置EventSetTimer(1)。


试着用这种方式进行同步

bool SetTimerSync( const uint TimerMs = 1000, const uint SyncError = 50 )
{
  // https://www.mql5.com/ru/forum/166646/page5#comment_5796939  
  return((GetCurrenTime() % 1000 > 1000 - SyncError) && EventSetMillisecondTimer(TimerMs));
}

void OnTimer()
{
  static bool Sync = GetCurrenTime() * 0;
   // --- при максимизированном окне выводим время на график
  if (Sync)
    showHideTime(); // https://www.mql5.com/ru/forum/166646/page7#comment_6384173
  else
    Sync = SetTimerSync();
}


int OnInit()
{
  EventSetMillisecondTimer(1);
  
  return INIT_SUCCEEDED;
} 
它不起作用。而且我对MT5的滞后性有不好的想法。自己看看你的脚本在做了这些改变后会有什么表现。
 
fxsaber:

试着用这种方式进行同步

它不起作用。而且我对MT5的滞后性有不好的想法。

在设定的ms数之后,OnTimer没有被调用。因此,累积误差和观察到的滞后。虫子!

 
fxsaber:

这不是一个滞后。你把OnTimer的时间输出到屏幕上,然后等待500ms。在这500毫秒内,时间发生了变化,但是OnTimer还没有被调用。

你需要同步--在 "TimerCurrent改变 "的时刻准确地设置EventSetTimer(1)。


试着用这种方式进行同步

它不起作用。而且我对MT5的滞后性有不好的想法。自己看看你的脚本在做了这些改变后会有什么表现。
你在OnInit的代码中有毫秒 级的计时器,在你的帖子中你写了一个普通的一秒钟的计时器。我猜你终究还是想使用EventSetTimer(1)?
 
Vasiliy Pushkaryov:
你在OnInit的代码里有毫秒级的计时器,在你的帖子里你写的是普通的一秒级的计时器。我猜你终究还是想使用EventSetTimer(1)?

第一个定时器首先被同步化,然后设置第二个定时器。

 
fxsaber:

首先通过第一个定时器进行同步,然后设置第二个定时器。

我明白了,我明天才能检查,谢谢你的帮助。
 
fxsaber:

在设定的ms数之后,OnTimer没有被调用。因此,累积误差和观察到的滞后。这是一个bug!

图表注释中的脚本显示了这个错误

input int TimerMs = 1000;

const bool Init = EventSetMillisecondTimer(TimerMs);

void OnTimer()
{
  static ulong StartTime = 0;  
  static int Count = 0;
  
  if (!StartTime)
    StartTime = GetMicrosecondCount();
  
  Comment("Error " + (string)((int)(GetMicrosecondCount() - StartTime) / 1000 - TimerMs * Count) + " ms.");  
  
  Count++;
}