Mercado cerrado - página 7

 
Puse el temporizador en medio segundo. Mejoró un poco. Bien, dejémoslo así por ahora.
 
Vasiliy Pushkaryov:
Poner el temporizador en medio segundo. Mejoró un poco. Bien, dejémoslo así por ahora.

Muéstrame el código.

 
fxsaber:

Muéstrame el código.

He limpiado el exceso.

Pero estos desfases suelen poder captarse manualmente, ¿o lo normal son 500ms?


Archivos adjuntos:
 
Vasiliy Pushkaryov:

He limpiado el exceso.

Pero estos desfases suelen poder captarse manualmente, ¿o es que 500ms es lo normal?


He probado este diseño en lugar de eliminar la etiqueta, sólo sustituir el texto si la etiqueta existe, pero no he notado ninguna diferencia

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

¿es posible captar manualmente lapsos como este, o es normal que sean 500ms?

Esto no es un retraso. Se muestra el tiempo de OnTimer, y luego se espera 500ms. En esos 500ms la hora cambia, pero todavía no se ha llamado a OnTimer.

Es necesario sincronizar - establecer EventSetTimer(1) exactamente en el momento en que "TimerCurrent cambió".


Intentado esta forma de 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;
} 
No funciona. Y tengo malos pensamientos hacia el lag de la MT5. Comprueba por ti mismo cómo se comportará tu script con estos cambios.
 
fxsaber:

Intentado esta manera de sincronizar

No funciona. Y tengo malos pensamientos hacia el lag de MT5.

OnTimer no se llama después del número de ms establecido. De ahí el error acumulado y el desfase observado. ¡Bicho!

 
fxsaber:

Esto no es un retraso. Se emite el tiempo de OnTimer a la pantalla, luego se espera 500 ms. Durante estos 500 ms el tiempo cambia, pero OnTimer aún no ha sido llamado.

Es necesario sincronizar - establecer EventSetTimer(1) exactamente en el momento en que "TimerCurrent cambió".


Intentado esta forma de sincronizar

No funciona. Y tengo malos pensamientos hacia el lag de MT5. Comprueba por ti mismo cómo se comportará tu script con estos cambios.
Tienes un temporizador de milisegundos en tu código en OnInit, en tu post escribes un temporizador normal de un segundo. ¿Supongo que quieres usar EventSetTimer(1) después de todo?
 
Vasiliy Pushkaryov:
Tienes un temporizador de milisegundos en tu código en OnInit, en tu post escribes un temporizador normal, de un segundo. ¿Supongo que quieres usar EventSetTimer(1) después de todo?

Primero se sincroniza el primer temporizador y luego se ajusta el segundo.

 
fxsaber:

Primero se produce la sincronización a través del primer temporizador, y luego se pone en marcha el segundo.

Ya veo, no podré comprobarlo hasta mañana, gracias por tu ayuda.
 
fxsaber:

OnTimer no se llama después del número de ms establecido. De ahí el error acumulado y el desfase observado. ¡Es un error!

El script en el comentario del gráfico muestra este error

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ón de la queja: