Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 67

 
fxsaber:
Die Feinheiten des Vergleichs ganzer Zahlen anhand eines realen Beispiels

Werden Sie mit Sleep(1000) genau eine Sekunde messen?

Und Sie wissen nicht, dass der Timer im Prozessor einen Fehler von 15 ms hat?

 
Slawa:

Werden Sie Sleep(1000) verwenden, um genau eine Sekunde zu messen?

Wussten Sie, dass der Timer in der CPU eine Fehlerspanne von 15 ms hat?


Hallo, könnten Sie mir bitte sagen, ob es eine Möglichkeit gibt, den Timer-Puffer zurückzusetzen, um den Timer-Einstellungsfehler zu beseitigen?

 
Vladislav Andruschenko:

Hallo, könnten Sie mir bitte sagen, ob es eine Möglichkeit gibt, den Timer-Puffer zurückzusetzen, um einen Timer-Einstellungsfehler zu vermeiden?

Ein Timer-Einstellungsfehler tritt auf, weil die Systemmeldungswarteschlange voll ist. Hierfür kann es viele Gründe geben. In der Regel ist der Überlauf der Warteschlange nur vorübergehend (andernfalls können Sie nicht mehr an Ihrem Computer arbeiten).

Verwenden Sie OnTick, um den Timer zu überwachen. Wenn der Timer nicht gesetzt ist, setzen Sie ihn auf OnTick

In der Zwischenzeit arbeiten wir daran, die Timer-Einstellungen unabhängig vom Status der Nachrichtenwarteschlange zu machen.

PS Das Aktivieren des Systemtimers und das Einstellen des Timers für eine Anwendung sind nicht miteinander verbunden

 
Slawa:

Werden Sie Sleep(1000) verwenden, um genau eine Sekunde zu messen?

Nein, es geht um diese beiden Zeilen des Ganzzahlvergleichs.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2018.01.24 21:48

Die Feinheiten des Vergleichs ganzer Zahlen anhand eines realen Beispiels
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

Auf den ersten Blick sollten beide Zeilen die gleichen Ergebnisse liefern. Aber das ist nicht der Fall. Die erste Option führt manchmal zu einer falschen Ausgabe.

Das Beispiel mit der Zeit ist nur zur Verdeutlichung gewählt.
Slawa:

Und die Tatsache, dass der Timer im Prozessor einen Fehler von 15 ms hat, ist Ihnen das nicht bekannt?

Es ist seltsam, dass Sie immer noch GetTickCount verwenden. Es ist im Forum bewiesen worden (bin zu faul zum Suchen), dass ein Mikrosekunden-Timer nicht langsamer ist als ein Millisekunden-Timer. Gleichzeitig hat es keine wilden Fehler.

 
fxsaber:

Nein, es geht um diese beiden Zeichenketten mit Ganzzahlvergleichen.

Auf den ersten Blick sollten beide Zeichenfolgen die gleichen Ergebnisse liefern. Dies ist jedoch nicht der Fall. Die erste Variante führt manchmal zu einem falschen Ergebnis.

Das Beispiel mit der Zeit ist nur zur Verdeutlichung gewählt.

Es ist seltsam, dass Sie immer noch GetTickCount verwenden. Es wurde im Forum bewiesen (ich bin zu faul, um danach zu suchen), dass der Mikrosekunden-Timer nicht langsamer ist als der Millisekunden-Timer. Gleichzeitig hat es keine wilden Fehler.

Ich meine Sleep(1000)
 
Slawa:

Ein Timer-Fehler tritt auf, weil die Systemmeldungswarteschlange voll ist. Dafür kann es eine Reihe von Gründen geben. Ein Überlauf der Warteschlange ist in der Regel nur vorübergehend (andernfalls können Sie nicht an Ihrem Computer arbeiten).

Verwenden Sie OnTick, um den Timer zu überwachen. Wenn der Timer nicht gesetzt ist, setzen Sie ihn auf OnTick

In der Zwischenzeit arbeiten wir daran, die Timer-Einstellungen unabhängig vom Status der Nachrichtenwarteschlange zu machen.

PS Das Aktivieren des Systemtimers und das Einstellen des Timers für eine Anwendung sind zwei verschiedene Dinge


Das ist genau das, was ich tue,

Der Timer-Fehler tritt nach einiger Zeit auf - nicht sofort. und zwar wegen Überlaufs - wenn es viele Daten gibt, z.B. Bestellhistorie, oder aktuelle Bestellungen von 50 oder mehr.

Ich habe es bereits ausprobiert und versuche immer noch, es zu benutzen, aber ich habe das Gefühl, dass ich es trotzdem versuchen werde.

 
Slawa:
Ich spreche von Sleep(1000).

Ja, Sie haben das Thema des Vergleichs ganzer Zahlen vernachlässigt.

 
fxsaber:

Ja, es geht um den Vergleich von ganzen Zahlen.

Es gibt kein Problem beim Vergleich ganzer Zahlen.

Das Gleiche ohne Schlupf und ohne GetMicrosecondsCount anzeigen

 
Slawa:

Es gibt kein Problem beim Vergleich ganzer Zahlen.

Zeigen Sie das Gleiche ohne den Schlupf und ohne GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
Und das ist kein Problem, das ist eine Feinheit.
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion über "System zur Bilanzierung von Hedging-Positionen in MetaTrader 5"

fxsaber, 2018.01.25 10:14

  1. Zeigt ein Beispiel für eine Handelssituation, auf die Andrew beim Lesen dieses Artikels hingewiesen hat.
  2. HistorySelectByPosition wählt möglicherweise nicht den Auftrag aus, der den Abschluss verursacht hat.
  3. Der Auftrag und das von ihm ausgelöste Geschäft können unterschiedliche IDs haben.
Der zweite und der dritte Punkt sollten zumindest irgendwo geäußert werden. Und das hat sie.

Es geht um die Analyse der Geschichte des Handwerks, nicht um das Schreiben von TS.

Wir wollen zum Beispiel verstehen, wie das Geschäft zustande gekommen ist.
Grund der Beschwerde: