MT5 und Geschwindigkeit in Aktion - Seite 25

 
A100:
Natürlich werden keine Experten/Indikatoren/Skripte ausgeführt - nur manuelle Builds. Die angegebene Latenzzeit ist auf jedem durchschnittlichen modernen 64-Bit-Tablet reproduzierbar. Wenn Sie einen i7-Computer haben, haben Sie diese Verzögerung sicher noch nicht bemerkt.

Verlangsamt sich die apk oder das exe-System?

 
Heute ist der freie Tag. Nur ein Symbol in Market Watch. EA führt OnTimer einmal pro Sekunde aus. Ich habe dieses Protokoll gefunden.
2020.09.06 00:37:09.187         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 8 ms.
2020.09.06 03:57:17.902         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 1731 ms.
2020.09.06 03:57:18.463         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 2292 ms.
2020.09.06 03:59:49.233         Alert: Time[MT4Orders.mqh 1788: ::PositionGetTicket(Index)] = 2 ms.
2020.09.06 04:35:54.170         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 04:55:34.486         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:10:54.387         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 211 ms.
2020.09.06 05:10:54.387         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 895 ms.
2020.09.06 05:23:20.484         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:24:41.484         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:47:41.492         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:50:41.172         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:55:45.176         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 05:57:32.169         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 06:17:11.177         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 06:28:03.184         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 06:30:22.482         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 06:48:07.171         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 07:45:12.490         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 08:23:24.172         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 08:24:26.171         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 08:37:57.183         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 09:08:37.180         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 09:12:58.497         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 09:57:20.486         Alert: Ping = 10000.000
2020.09.06 09:57:21.680         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 195 ms.
2020.09.06 09:57:54.171         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 10:47:56.171         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 11:06:21.175         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 11:11:50.208         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 1023 ms.
2020.09.06 11:11:50.537         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 1049 ms.
2020.09.06 11:11:51.502         Alert: Ping = 10000.000
2020.09.06 11:11:52.370         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 187 ms.
2020.09.06 11:19:41.502         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 11:38:00.176         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 13:49:02.493         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 14:03:28.171         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 14:45:05.175         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 16:43:51.196         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 17:00:17.494         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 17:40:02.486         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 17:54:00.180         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.
2020.09.06 18:16:47.173         Alert: Time[NewTicks.mqh 33: ::SymbolInfoTick(_Symbol,Tick)] = 1 ms.

Auf dem anderen Terminal läuft die Optimierung parallel auf sechs von acht möglichen lokalen Agenten.

Wenn es sich dabei um Netzwerkunterbrechungen handelt, warum wirkt sich dies auf den Abruf des letzten Ticks von Market Watch und den Abruf des letzten Ticks von der Tick-Historie aus?


ZZY Das Terminal Log befindet sich auf der gleichen Strecke.

2020.09.06 01:48:38.338 Network '': scanning network for access points
2020.09.06 01:48:40.195 Network '': scanning network finished
2020.09.06 03:57:04.504 Network '': connection to RannForex-Server lost
2020.09.06 03:57:15.249 Network '': authorized on RannForex-Server through as.eu 6 (ping: 56.41 ms, build 2560)
2020.09.06 03:57:15.249 Network '': previous successful authorization performed from xx.xx.xx.xx on 2020.09.05 21:59:42
2020.09.06 03:57:15.678 Network '': terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 03:57:15.678 Network '': trading has been enabled - hedging mode
2020.09.06 03:57:17.500 Network '': scanning network for access points
2020.09.06 03:57:20.416 Network '': scanning network finished
2020.09.06 05:10:52.296 Network '': connection to RannForex-Server lost
2020.09.06 05:10:53.033 Network '': authorized on RannForex-Server through as.eu 6 (ping: 56.31 ms, build 2560)
2020.09.06 05:10:53.033 Network '': previous successful authorization performed from xx.xx.xx.xx on 2020.09.06 05:10:59
2020.09.06 05:10:53.299 Network '': terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 05:10:53.299 Network '': trading has been enabled - hedging mode
2020.09.06 09:57:18.310 Network '': scanning network for access points
2020.09.06 09:57:20.396 Network '': scanning network finished
2020.09.06 09:57:20.396 Network '': auto connecting to a better access point with 93 % quality (previous: 77 %)
2020.09.06 09:57:20.397 Network '': connection to RannForex-Server lost
2020.09.06 09:57:21.151 Network '': authorized on RannForex-Server through as.eu 5 (ping: 41.60 ms, build 2560)
2020.09.06 09:57:21.151 Network '': previous successful authorization performed from 
xx.xx.xx.xx  on 2020.09.06 05:10:59
2020.09.06 09:57:21.208 Network '': terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 09:57:21.208 Network '': trading has been enabled - hedging mode
2020.09.06 11:08:16.952 Network '': connection to RannForex-Server lost
2020.09.06 11:11:48.892 Network '': authorized on RannForex-Server
2020.09.06 11:11:48.892 Network '': previous successful authorization performed from xx.xx.xx.xx on 2020.09.06 11:11:55
2020.09.06 11:11:48.970 Network '': terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 11:11:48.970 Network '': trading has been enabled - hedging mode
2020.09.06 11:11:49.152 Network '': scanning network for access points
2020.09.06 11:11:51.319 Network '': scanning network finished
2020.09.06 11:11:51.319 Network '': auto connecting to a better access point with 92 % quality (previous: 91 %)
2020.09.06 11:11:51.320 Network '': connection to RannForex-Server lost
2020.09.06 11:11:52.035 Network '': authorized on RannForex-Server through as.eu 5 (ping: 43.31 ms, build 2560)
2020.09.06 11:11:52.035 Network '': previous successful authorization performed from xx.xx.xx.xx on 2020.09.06 11:11:55
2020.09.06 11:11:52.088 Network '': terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 11:11:52.088 Network '': trading has been enabled - hedging mode
2020.09.06 17:11:49.928 Network '': scanning network for access points
2020.09.06 17:11:52.112 Network '': scanning network finished
 
fxsaber:

Wenn es sich dabei um Netzwerkunterbrechungen handelt, warum wirkt sich dies auf den Abruf des letzten Ticks von Market Watch und den Abruf des letzten Ticks von der Tick-Historie aus?

Eine sorgfältige Analyse hat gezeigt, dass CopyTicks bei Netzunterbrechungen langsamer wird.

2020.09.06 21:22:24.105         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 1619 ms.
2020.09.06 21:22:24.515         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 2347 ms.
2020.09.06 21:22:53.814         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 274 ms.
2020.09.06 21:22:53.814         Alert: Time[NewTicks.mqh 43: ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 686 ms.

2020.09.06 21:20:59.301 Network connection to RannForex-Server lost
2020.09.06 21:22:21.043 Network authorized on RannForex-Server
2020.09.06 21:22:21.043 Network previous successful authorization performed from xx.xx.xx.xx on 2020.09.06 11:11:59
2020.09.06 21:22:21.508 Network terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 21:22:21.508 Network trading has been enabled - hedging mode
2020.09.06 21:22:21.915 Network scanning network for access points
2020.09.06 21:22:28.819 Network scanning network finished
2020.09.06 21:22:45.523 Network connection to RannForex-Server lost
2020.09.06 21:22:52.951 Network authorized on RannForex-Server through as.eu 6 (ping: 56.55 ms, build 2560)
2020.09.06 21:22:52.951 Network previous successful authorization performed from xx.xx.xx.xx on 2020.09.06 21:22:28
2020.09.06 21:22:53.024 Network terminal synchronized with RannForex Limited: 1 positions, 0 orders, 67 symbols, 0 spreads
2020.09.06 21:22:53.024 Network trading has been enabled - hedging mode
 
fxsaber:


if (OrderSend(Request, Result))
    _B2(HistorySelect(0, INT_MAX)); // В каком месте самострел?

Zuallererst, zu Ihrer Information.

"Wenn diePrüfung der Grundstruktur (Zeigerprüfung) erfolgreich ist, wird true zurückgegeben -dies bedeutet nicht, dass die Handelsoperation erfolgreich ausgeführt wurde. Um eine genauere Beschreibung des Ergebnisses der Funktionsausführung zu erhalten, sollten die Felder derErgebnisstrukturanalysiert werden."


Zweitens: Nach Ihrer Logik wird ein geöffneter Auftrag nicht in die Liste der Aufträge aufgenommen, sondern der Cache wird komplett gelöscht.)

Sie können DEN gesamten Code optimieren, den Sie haben HistorySelect wird die letzte Stelle für Fragen zur Ausführungszeit sein) Verwenden Sie Caching. Sie können sie zum Beispiel einmal am Tag ungültig machen, aber das wird Ihren EA erheblich beschleunigen.

 
Andrey Pogoreltsev:

Nun, zunächst einmal

Man muss den Code entweder ausführen, um ihn richtig zu verstehen, oder ihn sehr gut von einem Arbeitsblatt ablesen.

Zweitens: Wenn ein Auftrag geöffnet wird, wird er Ihrer Logik zufolge nicht in die Liste der Aufträge aufgenommen, sondern der Cache wird vollständig gelöscht.)

Die Auftragsliste ändert sich nicht. Lesen Sie den Code.

 
fxsaber:

Um den Code richtig zu verstehen, müssen Sie ihn entweder ausführen oder sehr gut vom Blatt ablesen.

Die Liste der Aufträge ändert sich nicht. Lesen Sie den Code.

Hier

if (OrderSend(Request, Result))
    _B2(HistorySelect(0, INT_MAX)); // В каком месте самострел?

Ich sehe diese Logik:

  1. Wenn eine Handelsanfrage erfolgreich an den Server gesendet wurde
  2. Wir wählen die gesamte Geschichte

Es kann aber auch sein, dass die Anfrage bereits auf dem Server abgelehnt wurde - dafür gibt es in diesem Code keine Überprüfung. Welchen Sinn hat es, die Geschichte auszuwählen? Was wollen wir dort sehen?

Hier, in diesen beiden Codezeilen, sehe ich persönlich den Sinn nicht. Ich würde es begrüßen, wenn es eine Möglichkeit gäbe, die Geschichte zu ändern, bevor sie ausgewählt wird. Vielleicht vermitteln diese beiden Zeilen kein vollständiges Bild der Aufgabe. Aber der Zusammenhang zwischen dem erfolgreichen Senden einer Anfrage an den Server und der Auswahl des gesamten Verlaufs ist mir nicht klar. Auch wenn der Server eine Anfrage erfolgreich sendet, wird die Liste der Marktaufträge und Positionen geändert. Was hat die Geschichtsliste damit zu tun?

 
Artyom Trishkin:

Hier ist es

Ich sehe diese Logik:

  1. Wenn eine Handelsanfrage erfolgreich an den Server gesendet wurde
  2. Wählen Sie den gesamten Verlauf

Es könnte aber auch sein, dass die Anfrage bereits auf dem Server abgelehnt wurde - dafür gibt es in diesem Code keine Überprüfung. Welchen Sinn hat es, die Geschichte auszuwählen? Was wollen wir dort sehen?

Hier, in diesen beiden Codezeilen, sehe ich persönlich den Sinn nicht. Ich würde es begrüßen, wenn es eine Möglichkeit gäbe, die Geschichte zu ändern, bevor sie ausgewählt wird. Vielleicht vermitteln diese beiden Zeilen kein vollständiges Bild der Aufgabe. Aber der Zusammenhang zwischen dem erfolgreichen Senden einer Anfrage an den Server und der Auswahl des gesamten Verlaufs ist mir nicht klar. Auch wenn der Server eine Anfrage erfolgreich sendet, wird die Liste der Marktaufträge und Positionen geändert. Was hat das mit der Geschichtsliste zu tun?

If - um die Compiler-Warnung loszuwerden. Sie hat nichts anderes zu tun.

In diesem Thread geht es nicht darum, Ihnen beizubringen, wie man EAs schreibt. Damit sollen die Schwachstellen des Terminals beseitigt werden. Die Entwickler brauchen einen einfachen, präzisen und reproduzierbaren Code, um ihn zu verstehen. Ich schreibe natürlich nichts in dieser Art für mich selbst. Tatsache ist, dass der Combat Advisor die Bremsen protokolliert. Ich beginne zu graben und stelle fest, dass die Verlangsamung auftritt, wenn jemand (zumindest von Hand) eine Position ändert. Dadurch wird der historische Cache zurückgesetzt, obwohl sich der Verlauf natürlich nicht ändert.


Der Code veranschaulicht das Problem perfekt. Es besteht keine Notwendigkeit, den Wiedergabecode mit unnötigen Prüfungen zu überfrachten. Ihre Aufgabe ist es, das Problem deutlich zu machen. Und nach der Behebung - um zu beweisen, dass jetzt alles richtig funktioniert.

 
fxsaber:

Um den Code richtig zu verstehen, müssen Sie ihn entweder ausführen oder sehr gut vom Blatt ablesen.

Die Liste der Aufträge ändert sich nicht. Lesen Sie den Code.

Bedenken Sie, dass ich sehr gut vom Blatt ablesen kann :)


Diesen Code haben Sie von irgendwoher übernommen und Sie haben dort eine neue Positionserstellung, die ja auch ausgeführt wird, richtig?

Andernfalls läuft Ihr Code darauf hinaus, die TP der aktuellen Position zu aktualisieren und den Cache dafür ungültig zu machen, was ebenfalls sehr seltsam ist.

In diesen beiden Fällen wird keine Logik zur Optimierung der Zwischenspeicherung verwendet. Darüber hinaus ist Ihre Lösung nicht skalierbar, da sie zu einer zunehmenden Bremsung führt, wenn die Geschichte wächst.

 
fxsaber:

Der Code veranschaulicht das Problem perfekt. Es besteht keine Notwendigkeit, den Wiedergabecode mit unnötigen Prüfungen zu überfrachten. Ihre Aufgabe ist es, das Problem deutlich zu machen. Und wenn sie korrigiert sind - um zu beweisen, dass jetzt alles richtig funktioniert.

Nach Ihrer Logik müsste also dieser Code hier

int v = 0.0;

for (int i = 0; i < 1000000; i++) {
    v = i;
}

std::cout << "The last number: " << v << std::endl;

eine Trägheit des Prozessors zeigt?

 
Andrey Pogoreltsev:

Sie haben diesen Code von irgendwoher, und Sie haben ihn dort, indem Sie eine neue Position erstellen, die dann auch ausgeführt wird, richtig?

Rhetorische Frage: Was wollen Sie damit erreichen?
Andrey Pogoreltsev:

Nach Ihrer Logik müsste also dieser Code hier

zeigt die Langsamkeit des Prozessors?

Ich antworte nicht mehr, denn Sie reden nur noch Unsinn.