MT5 und Geschwindigkeit in Aktion - Seite 44

 
fxsaber:

Mehr als einmal habe ich Situationen erlebt, in denen Terminal die CPU so stark belastet, dass sie auf nichts mehr reagiert.

Dann schaute ich mir die Protokolle an und sah, dass in OnTick wildes Überspringen von Ticks stattfand. Wenn ich jedoch einen EA richtig schreibe, wird sich diese katastrophale Situation nicht auf die Handelsergebnisse auswirken. Ich habe es genau analysiert, alles ist klar.

Ich frage mich, wie weit verbreitet die Mechanismen für den Umgang mit Verzögerungen bei Market Products sind. Ich habe nicht ein einziges Mal gesehen, dass die Maschinenleistung zum Laufen gebracht werden muss. Mindest-Ping ist ein Ja.

Wo haben Sie sie auf den Weg gebracht?

Wenn auf VPS für 2-5 Dollar, dann Verzögerungen in Zehn-und Hunderte von Millisekunden sind leicht in jedem kaum ernst WinAPI-Funktion gefangen. Alles verlangsamt sich ab der Hypervisor-Ebene und verwandelt eine virtuelle Maschine in eine Diashow.

Wie oben erklärt.

 
Renat Fatkhullin:

Es ist nicht GetMicrosecondsCount, das verlangsamt, es ist das Betriebssystem, das die CPU-Ressourcen für jeden Thread in Ihrem strangulierten VPS quantifiziert. Für jede Funktion, jede Aktion, jedes Programm innerhalb Ihrer UPU.

Nun, keine CPU-Shell kann Ressourcen gerecht aufteilen und zuweisen, wenn sie 20 (das ist immer noch respektabel) Betriebssysteme mit 1500 Threads pro Kopie ausführt. Man nehme 8-16 Kerne und verteile sie auf 20 * 1.500 = 30.000 (dreißigtausend physische Spuren).

In meinem Fall (virtuelle Box mit vin7 + 2 Kerne + 16 GB RAM auf meiner eigenen Hardware, auf der nichts anderes läuft), woher kommen die periodischen 2-3 µs?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit im Gefecht

Andrey Khatimlianskii, 2020.10.05 10:19

Nicht wirklich eine UPU, sondern eine virtuelle Maschine auf gemieteter Hardware:

2020.09.29 00:11:11.350 Terminal        MetaTrader 5 x64 build 2615 started for MetaQuotes Software Corp.
2020.09.29 00:11:11.352 Terminal        Windows 7 Service Pack 1 build 7601 on Virtual Box, Intel Core i7-4770  @ 3.40 GHz, 14 / 15 Gb memory, 4 / 31 Gb disk, IE 11, Admin, GMT+2
2020.10.05 11:11:25.340 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:11:31.308 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:12:34.699 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 3 mсs.
2020.10.05 11:13:04.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:13:58.116 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:08.388 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:14.975 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:14:19.095 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:28.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:55.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:15:56.814 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:27.818 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 9 mсs.
2020.10.05 11:16:35.275 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:16:45.775 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 27 mсs.
2020.10.05 11:16:51.715 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.
2020.10.05 11:17:30.477 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 5 mсs.
2020.10.05 11:18:25.081 test (GBPUSD,M15)       Alert: Time[test.mq5 7 in OnTimer: GetMicrosecondCount()] = 2 mсs.

 
Andrey Khatimlianskii:

In meinem Fall (virtuelle Box mit win7 + 2 Kerne + 16GB RAM auf seine eigene Hardware mit nichts anderes Spinning), woher kommt die periodische 2-3 µs?

Das ist der Preis der doppelten Virtualisierung.

Zumal VirtualBox kein vollwertiger Hypervisor vom Typ Hyper-V ist, sondern auf Ihrem aktuellen Desktop-Betriebssystem (auch Windows 7?) aufsetzt, das eine CPU-Shell für einen anderen Anwendungsfall hat.

Sie haben also: Windows 7/10 -> VirtualBox -> Windows 7. Im Wesentlichen zwei Virtualisierungsebenen, wobei die erste Ebene nichts von den Ambitionen von VirtualBox weiß und es nur als normales Programm betrachtet. Die CPU-Ressourcenzuweisung (der Threadsheduler) ist eindeutig verkorkst.

So sollte es sein: Hyper-V 2016/2019 -> Windows 2016/2019

 
Renat Fatkhullin:

Es ist nicht GetMicrosecondsCount, das verlangsamt, es ist das Betriebssystem, das die CPU-Ressourcen für jeden Thread in Ihrem strangulierten VPS quantifiziert. Für jede Funktion, jede Aktion, jedes Programm innerhalb Ihrer UPU.

Ich denke, ein Argument wie dieses wird Sie zum Nachdenken bringen. Berater.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

// Сделал действия по этой ссылке: https://www.mql5.com/ru/forum/342090/page41#comment_18597040

void OnStart()
{
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetMicrosecondCount();
      , 1)
      
  _BV(
  for (int i = 0; i < 1 e6; i++)
    GetTickCount();
      , 1)      
}



2020.10.06 00:24:26.779 Alert: Time[Test6.mq5 52: for(inti=0;i<1 e6;i++)GetMicrosecondCount();] = 16289902 mсs.
2020.10.06 00:24:26.784 Alert: Time[Test6.mq5 57: for(inti=0;i<1 e6;i++)GetTickCount();] = 4300 mсs.


Das ist weit davon entfernt, alles zu verlangsamen. Deshalb konnte ich ganz harmlos zu winmm::timeBeginPeriod(1)+winmm::timeGetTime() wechseln und erhielt die gleiche Geschwindigkeit wie GetTickCount, aber ohne die gefürchtete 16 ms-Grenze. Marktproduzenten dürfen dies jedoch nicht tun, da es sich um eine DLL handelt. Es ist unwahrscheinlich, dass Sie eine reguläre Millisekundenversion erstellen.

 
Renat Fatkhullin:

Die MQL5-Funktion zum Minimieren aller Fenster und der Anwendung selbst ist eine großartige Idee. Daran werden wir arbeiten.

Hier ist noch etwas anderes.

Terminal auf einem VPS betreibt, dann wird er sehr dagegen sein, dass alles plötzlich umgestellt wird. Er kann und sollte Windows selbst minimieren, wenn er die RDP-Sitzung verlässt.

Ich verwende derzeit WinAPI zum Minimieren per Hotkey. Sehr praktisch und viel harmloser als das Standard-TerminalClose.
 
Renat Fatkhullin:


Hier ist ein Beispiel für das, was ich sagen wollte.
Beide Server sind verschiedene Broker, befinden sich im selben Gebiet, können sich am selben Ort befinden.
Auf der Servicekarte wird vorgeschlagen, dass AMP im Vereinigten Königreich ansässig ist.
Und für Just bietet aus irgendeinem Grund in NL.
Warum? Wenn es einen näheren vpc gibt.

dfgh

jt

 
fxsaber:

Ich denke, das ist ein Argument, das Sie zum Nachdenken anregen wird. Berater.


Das ist weit davon entfernt, die Dinge zu verlangsamen. Deshalb konnte ich ganz harmlos zu winmm::timeBeginPeriod(1)+winmm::timeGetTime() wechseln und erhielt eine Geschwindigkeit wie GetTickCount, aber ohne die gefürchtete 16ms-Grenze. Marktproduzenten dürfen dies jedoch nicht tun, da es sich um eine DLL handelt. Es ist unwahrscheinlich, dass Sie eine reguläre Millisekunden-Version machen werden.

Nun, Sie sind ein Meister der rasanten Stresstests ohne Korrelation oder Angemessenheitskontrolle.

Die Messung im Mikrosekundenbereich erfordert natürlich Ressourcen, um Intervalle zu messen, die 1000 Mal kleiner sind als eine Millisekunde.

Wenn Sie gelegentlich Intervalle sehr genau messen müssen, dann verwenden Sie Mikrosekunden. Und es kostet Sie 0 Mikrosekunden.

Wenn Sie so eingestellt sind, dass Sie das Millionenfache als Selbstvermessung bezeichnen, machen Sie sich wahrscheinlich etwas vor.


Auf einem unterdrückten VPS ist die Übertaktung des Systemtimers über timeBeginPeriod riskant. Sie erhöhen nur Ihren CPU-Overhead:

Diese Funktion betrifft eine globale Windows-Einstellung. Windows verwendet den niedrigsten Wert (d. h. die höchste Auflösung), der von einem beliebigen Prozess angefordert wird. Die Einstellung einer höheren Auflösung kann die Genauigkeit der Zeitüberschreitungsintervalle bei Wartefunktionen verbessern. Es kann jedoch auch die Gesamtleistung des Systems verringern, da der Thread-Scheduler die Aufgaben häufiger wechselt. Hohe Auflösungen können auch verhindern, dass das CPU-Energieverwaltungssystem in den Energiesparmodus wechselt. Durch die Einstellung einer höheren Auflösung wird die Genauigkeit des hochauflösenden Leistungszählers nicht verbessert.

Andernfalls hätte das Betriebssystem schon vor langer Zeit ein genaues GetTickCount/GetTickCount64 erstellen und sich über die freie Genauigkeit freuen sollen. Aber nein, Sie müssen für die Genauigkeit dieses Zeitmessers bezahlen.

 
Bitte entfernen Sie dieCHART_IS_MAXIMIZED-Bremsen. Die WinAPI-Lösung ist jetzt nicht mehr um eine Größenordnung schneller als die Standardlösung.
 
Roman:

Hier ist ein Beispiel für das, was ich sagen wollte.
Beide Server sind verschiedene Broker, befinden sich im selben Gebiet, können sich am selben Ort befinden.
Auf der Servicekarte wird vorgeschlagen, dass AMP im Vereinigten Königreich ansässig ist.
Und für Just bietet aus irgendeinem Grund in NL.
Warum? Wenn es eine PSTN-Nähe gibt.

Wir kennen die Geopunkte der Server, und hier werden die Positionen der Brokerserver aus den GeoIP-Basen gebildet.

Und es kommt häufig vor, dass die Informationen nicht der Realität entsprechen. Daher sollten wir niemals davon ausgehen, dass die Position des Maklers korrekt ist.

Wir werden uns das morgen genauer ansehen, denn wir müssen alles noch einmal manuell überprüfen und neu scannen, um die Frage zu beantworten.

 
Renat Fatkhullin:

Das ist der Preis der doppelten Virtualisierung.

Vor allem, weil VirtualBox kein vollständiger Hypervisor vom Typ Hyper-V ist, sondern auf Ihrem aktuellen Desktop-Betriebssystem (auch Windows 7?) aufbaut, das über eine CPU-Shell verfügt, die auf einen anderen Anwendungsfall zugeschnitten ist.

Sie haben also: Windows 7/10 -> VirtualBox -> Windows 7. Im Wesentlichen zwei Virtualisierungsebenen, wobei die erste Ebene nichts von den Ambitionen von VirtualBox weiß und es nur als normales Programm betrachtet. Die CPU-Ressourcenzuweisung (der Threadsheduler) ist eindeutig verkorkst.

So sollte es sein: Hyper-V 2016/2019 -> Windows 2016/2019

Nein, ich habe Virtualisierer auf meinem CentOS im Einsatz. Aber ich bin nicht befugt, diesen Dialog fortzusetzen.