Mercado fechado - página 7

 
Eu defino o temporizador por meio segundo. Ficou um pouco melhor. OK, vamos mantê-lo assim por enquanto.
 
Vasiliy Pushkaryov:
Defina o temporizador por meio segundo. Ficou um pouco melhor. Ok, vamos mantê-lo assim por enquanto.

Mostre-me o código.

 
fxsaber:

Mostre-me o código.

Eu limpei o excesso.

Mas tais atrasos podem muitas vezes ser pegos manualmente, ou 500ms é normal?


Arquivos anexados:
 
Vasiliy Pushkaryov:

Eu limpei o excesso.

Mas tais atrasos podem muitas vezes ser pegos manualmente, ou 500ms é normal?


Eu tentei este projeto em vez de remover a etiqueta, apenas substituindo o texto se a etiqueta existir, mas não notei nenhuma diferença

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

é muitas vezes possível apanhar desfasamentos como este manualmente, ou é 500ms normal?

Isto não é um atraso. Você exibe o tempo da OnTimer, depois espera por 500ms. Nesses 500ms o tempo muda, mas o OnTimer ainda não foi chamado.

Você precisa sincronizar - definir EventSetTimer(1) exatamente no momento em que o "TimerCurrent mudou".


Tentei desta forma sincronizar

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;
} 
Não funciona. E eu tenho maus pensamentos em relação ao MT5 lag. Veja por si mesmo como seu roteiro se comportará com estas mudanças.
 
fxsaber:

Tentei desta forma sincronizar

Não funciona. E eu tenho maus pensamentos em relação ao MT5 lag.

OnTimer não é chamado após o número definido de ms. Daí o erro acumulado e o atraso observado. Bug!

 
fxsaber:

Isto não é um atraso. O tempo de saída do OnTimer para a tela é de 500ms. Durante esses 500 ms o tempo muda, mas OnTimer ainda não foi chamado.

Você precisa sincronizar - definir EventSetTimer(1) exatamente no momento em que o "TimerCurrent mudou".


Tentei desta forma sincronizar

Não funciona. E eu tenho maus pensamentos em relação ao atraso do MT5. Veja por si mesmo como seu roteiro se comportará com estas mudanças.
Você tem um timer de um milissegundo em seu código no OnInit, em seu correio você escreve um timer regular de um segundo. Acho que você quer usar o EventSetTimer(1) afinal de contas?
 
Vasiliy Pushkaryov:
Você tem um timer de um milissegundo em seu código no OnInit, em seu correio você escreve um timer regular de um segundo. Acho que você quer usar o EventSetTimer(1) afinal de contas?

O primeiro timer é sincronizado primeiro, depois o segundo timer é definido.

 
fxsaber:

Primeiro há a sincronização através do primeiro timer, depois o segundo timer é definido.

Entendo, só poderei verificar amanhã, obrigado por sua ajuda.
 
fxsaber:

OnTimer não é chamado após o número definido de ms. Daí o erro acumulado e o atraso observado. É um bug!

O script no comentário do gráfico mostra este erro

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++;
}
Razão: