Market closed - страница 7

 
Поставил таймер на полсекунды. Стало чуть лучше. Ладно, пусть пока так будет.
 
Vasiliy Pushkaryov:
Поставил таймер на полсекунды. Стало чуть лучше. Ладно, пусть пока так будет.

Код покажите.

 
fxsaber:

Код покажите.

Я поубирал лишнее.

Но такие отставания часто вручную можно словить, или это на 500 мс нормально?


Файлы:
 
Vasiliy Pushkaryov:

Я поубирал лишнее.

Но такие отставания часто вручную можно словить, или это на 500 мс нормально?


Пробовал вместо удаления метки и такую конструкцию, просто замена текста, если метка существует, но особой разницы не заметил

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

такие отставания часто вручную можно словить, или это на 500 мс нормально?

Это не отставание. Вы выводите время из OnTimer на экран, затем ожидаете 500 мс. За эти 500 мс время меняется, но OnTimer еще не вызвался.

Вам нужно синхронизироваться - выставить EventSetTimer(1) ровно в момент, когда "TimerCurrent изменился".


Попробовал так синхронизироваться

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.

OnTimer вызывается не через заданное количество мс. Отсюда накапливаемая ошибка и наблюдаемое отставание. Баг это!

 
fxsaber:

Это не отставание. Вы выводите время из OnTimer на экран, затем ожидаете 500 мс. За эти 500 мс время меняется, но OnTimer еще не вызвался.

Вам нужно синхронизироваться - выставить EventSetTimer(1) ровно в момент, когда "TimerCurrent изменился".


Попробовал так синхронизироваться

Не получается. И у меня нехорошие мысли в сторону лага MT5. Посмотрите сами, как Ваш скрипт будет вести себя с этими изменениями.
В OnInit в коде у Вас миллисекундный таймер, в посте пишите обычный, посекундный. Я так понимаю, все-таки EventSetTimer(1) нужно использовать?
 
Vasiliy Pushkaryov:
В OnInit в коде у Вас миллисекундный таймер, в посте пишите обычный, посекундный. Я так понимаю, все-таки EventSetTimer(1) нужно использовать?

Сначала идет синхронизация через первый таймер, затем задается второй.

 
fxsaber:

Сначала идет синхронизация через первый таймер, затем задается второй.

Ясно. Смогу уже только завтра проверить, спасибо за помощь.
 
fxsaber:

OnTimer вызывается не через заданное количество мс. Отсюда накапливаемая ошибка и наблюдаемое отставание. Баг это!

Скрипт в комментарии к чарту показывает этот баг

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++;
}