Marché fermé - page 7

 
Réglez le minuteur sur une demi-seconde. Ça s'est un peu amélioré. OK, restons-en là pour l'instant.
 
Vasiliy Pushkaryov:
Réglez le minuteur sur une demi-seconde. Ça s'est un peu amélioré. Ok, gardons ça comme ça pour le moment.

Montrez-moi le code.

 
fxsaber:

Montrez-moi le code.

J'ai nettoyé l'excès.

Mais de tels décalages peuvent souvent être rattrapés manuellement, ou bien 500 ms sont-ils normaux ?


Dossiers :
 
Vasiliy Pushkaryov:

J'ai nettoyé l'excès.

Mais de tels décalages peuvent souvent être rattrapés manuellement, ou bien 500 ms sont-ils normaux ?


J'ai essayé cette conception : au lieu de supprimer l'étiquette, je remplace simplement le texte si l'étiquette existe, mais je n'ai pas remarqué de différence.

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

Est-il souvent possible de rattraper des retards comme celui-ci manuellement, ou est-ce que 500ms est normal ?

Ce n'est pas un décalage. Vous affichez l'heure de OnTimer, puis attendez 500 ms. Pendant ces 500 ms, l'heure change, mais OnTimer n'a pas encore été appelé.

Vous devez synchroniser - définir EventSetTimer(1) exactement au moment où "TimerCurrent a changé".


J'ai essayé cette méthode de synchronisation

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;
} 
Cela ne fonctionne pas. Et j'ai de mauvaises pensées envers le retard de la MT5. Voyez par vous-même comment votre script se comportera avec ces changements.
 
fxsaber:

J'ai essayé cette méthode de synchronisation

Cela ne fonctionne pas. Et j'ai de mauvaises pensées à l'égard du retard de MT5.

OnTimer n'est pas appelé après le nombre de ms défini. D'où l'erreur accumulée et le décalage observé. Bug !

 
fxsaber:

Ce n'est pas un décalage. Vous transmettez l'heure de OnTimer à l'écran, puis attendez 500 ms. Pendant ces 500 ms, l'heure change, mais OnTimer n'a pas encore été appelé.

Vous devez synchroniser - définir EventSetTimer(1) exactement au moment où "TimerCurrent a changé".


J'ai essayé cette méthode de synchronisation

Cela ne fonctionne pas. Et j'ai de mauvaises pensées envers le retard de la MT5. Voyez par vous-même comment votre script se comportera avec ces changements.
Vous avez une minuterie en millisecondes dans votre code dans OnInit, dans votre post vous écrivez une minuterie normale d'une seconde. Je suppose que vous voulez utiliser EventSetTimer(1) après tout ?
 
Vasiliy Pushkaryov:
Vous avez une minuterie en millisecondes dans votre code dans OnInit, dans votre post vous écrivez une minuterie normale d'une seconde. Je suppose que vous voulez utiliser EventSetTimer(1) après tout ?

La première minuterie est d'abord synchronisée, puis la deuxième minuterie est réglée.

 
fxsaber:

Il y a d'abord une synchronisation via la première minuterie, puis la deuxième minuterie est réglée.

Je vois, je ne pourrai pas le vérifier avant demain, merci pour votre aide.
 
fxsaber:

OnTimer n'est pas appelé après le nombre de ms défini. D'où l'erreur accumulée et le décalage observé. C'est un bug !

Le script dans le commentaire du graphique montre ce 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++;
}
Raison: