Mercato chiuso - pagina 7

 
Imposta il timer per mezzo secondo. È andata un po' meglio. Ok, lasciamo le cose come stanno per ora.
 
Vasiliy Pushkaryov:
Imposta il timer per mezzo secondo. È andata un po' meglio. Ok, lasciamo le cose come stanno per ora.

Mostrami il codice.

 
fxsaber:

Mostrami il codice.

Ho pulito l'eccesso.

Ma tali ritardi possono spesso essere catturati manualmente, o 500ms è normale?


File:
 
Vasiliy Pushkaryov:

Ho pulito l'eccesso.

Ma tali ritardi possono spesso essere catturati manualmente, o 500ms è normale?


Ho provato questo design invece di rimuovere l'etichetta, solo sostituendo il testo se l'etichetta esiste, ma non ho notato alcuna differenza

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

è possibile catturare spesso lag come questo manualmente, o è normale che siano 500ms?

Questo non è un ritardo. Si visualizza il tempo da OnTimer, poi si aspetta 500ms. In quei 500ms il tempo cambia, ma OnTimer non è ancora stato chiamato.

È necessario sincronizzare - impostare EventSetTimer(1) esattamente nel momento in cui "TimerCurrent è cambiato".


Provato questo modo di sincronizzare

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;
} 
Non funziona. E ho cattivi pensieri verso il ritardo di MT5. Guardate voi stessi come si comporterà il vostro script con questi cambiamenti.
 
fxsaber:

Ho provato a sincronizzare in questo modo

Non funziona. E ho cattivi pensieri verso il ritardo di MT5.

OnTimer non viene chiamato dopo il numero di ms impostato. Da qui l'errore accumulato e il ritardo osservato. È un bug!

 
fxsaber:

Questo non è un ritardo. Si emette il tempo da OnTimer allo schermo, poi si aspetta per 500ms. Durante questi 500 ms il tempo cambia, ma OnTimer non è ancora stato chiamato.

È necessario sincronizzare - impostare EventSetTimer(1) esattamente nel momento in cui "TimerCurrent è cambiato".


Provato questo modo di sincronizzare

Non funziona. E ho cattivi pensieri verso il ritardo di MT5. Guardate voi stessi come si comporterà il vostro script con questi cambiamenti.
Hai un timer al millisecondo nel tuo codice in OnInit, nel tuo post scrivi un normale timer di un secondo. Immagino che tu voglia usare EventSetTimer(1) dopo tutto?
 
Vasiliy Pushkaryov:
Hai un timer di un millisecondo nel tuo codice in OnInit, nel tuo post scrivi un timer regolare di un secondo. Immagino che tu voglia usare EventSetTimer(1) dopo tutto?

Prima viene sincronizzato il primo timer, poi viene impostato il secondo.

 
fxsaber:

Prima c'è la sincronizzazione tramite il primo timer, poi viene impostato il secondo timer.

Capisco, non potrò controllare fino a domani, grazie per il tuo aiuto.
 
fxsaber:

OnTimer non viene chiamato dopo il numero di ms impostato. Da qui l'errore accumulato e il ritardo osservato. È un bug!

Lo script nel commento del grafico mostra questo 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++;
}