Markt geschlossen - Seite 7

 
Stellen Sie den Timer auf eine halbe Sekunde ein. Es wurde ein wenig besser. OK, belassen wir es erst einmal dabei.
 
Vasiliy Pushkaryov:
Stellen Sie den Timer auf eine halbe Sekunde ein. Es wurde ein wenig besser. Okay, belassen wir es erst einmal dabei.

Zeigen Sie mir den Code.

 
fxsaber:

Zeigen Sie mir den Code.

Ich habe den Überschuss aufgeräumt.

Aber solche Verzögerungen können oft manuell abgefangen werden, oder sind 500 ms normal?


Dateien:
 
Vasiliy Pushkaryov:

Ich habe den Überschuss aufgeräumt.

Aber solche Verzögerungen können oft manuell abgefangen werden, oder sind 500 ms normal?


Ich habe dieses Design ausprobiert, anstatt die Beschriftung zu entfernen, nur den Text zu ersetzen, wenn die Beschriftung vorhanden ist, aber ich habe keinen Unterschied festgestellt

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

Ist es oft möglich, solche Verzögerungen manuell abzufangen, oder sind 500 ms normal?

Es handelt sich nicht um eine Verzögerung. Sie zeigen die Zeit von OnTimer an und warten dann 500ms. In diesen 500ms ändert sich die Zeit, aber OnTimer wurde noch nicht aufgerufen.

Sie müssen synchronisieren - setzen Sie EventSetTimer(1) genau in dem Moment, in dem "TimerCurrent changed".


Versuchen Sie, auf diese Weise zu synchronisieren

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;
} 
Das funktioniert nicht. Und ich habe schlechte Gedanken gegenüber MT5 lag. Sehen Sie selbst, wie sich Ihr Skript mit diesen Änderungen verhalten wird.
 
fxsaber:

Versuchen Sie, auf diese Weise zu synchronisieren

Das funktioniert nicht. Und ich habe schlechte Gedanken gegenüber MT5 lag.

OnTimer wird nicht nach der eingestellten Anzahl von ms aufgerufen. Daraus ergeben sich der kumulierte Fehler und die beobachtete Verzögerung. Käfer!

 
fxsaber:

Es handelt sich nicht um eine Verzögerung. Sie geben die Zeit von OnTimer auf dem Bildschirm aus und warten dann 500ms. Während dieser 500 ms ändert sich die Zeit, aber OnTimer wurde noch nicht aufgerufen.

Sie müssen synchronisieren - setzen Sie EventSetTimer(1) genau in dem Moment, in dem "TimerCurrent changed".


Versuchen Sie, auf diese Weise zu synchronisieren

Das funktioniert nicht. Und ich habe schlechte Gedanken gegenüber MT5 lag. Sehen Sie selbst, wie sich Ihr Skript mit diesen Änderungen verhalten wird.
Sie haben einen Millisekunden-Timer in Ihrem Code in OnInit, in Ihrem Beitrag schreiben Sie einen normalen Ein-Sekunden-Timer. Ich vermute, Sie wollen doch EventSetTimer(1) verwenden?
 
Vasiliy Pushkaryov:
Sie haben einen Millisekunden-Timer in Ihrem Code in OnInit, in Ihrem Beitrag schreiben Sie einen regulären, einsekündigen Timer. Ich vermute, Sie wollen doch EventSetTimer(1) verwenden?

Der erste Timer wird zuerst synchronisiert, dann wird der zweite Timer gesetzt.

 
fxsaber:

Zunächst erfolgt eine Synchronisierung über den ersten Timer, dann wird der zweite Timer gesetzt.

Verstehe, ich werde es erst morgen überprüfen können, danke für Ihre Hilfe.
 
fxsaber:

OnTimer wird nicht nach der eingestellten Anzahl von ms aufgerufen. Daraus ergeben sich der kumulierte Fehler und die beobachtete Verzögerung. Es ist ein Fehler!

Das Skript im Chart-Kommentar zeigt diesen Fehler

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++;
}
Grund der Beschwerde: