Fehler, Irrtümer, Fragen - Seite 2777

 
Alain Verleyen:

Update :

Der Spitzenwert ist jetzt deutlich höher:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Anzahl = 23520
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Min = 33
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Max = 81011
2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Avg = 149

Um die Reinheit des Experiments zu gewährleisten, muss dieses Skript parallel auf mehreren Diagrammen und mehreren Terminals ausgeführt werden. Vergleichen Sie dann die Zeit des Auflegens.

 
Stanislav Korotky :

Führen Sie dieses Skript für das Experiment parallel auf mehreren Diagrammen und mehreren Terminals aus. Vergleichen Sie dann die Zeit des Schluckaufs.

Ok, aber wenn es bereits mit einem Diagramm passiert ist, wird es mit mehreren Diagrammen nicht besser.

Was würde es Ihnen bringen, es auf mehreren Charts/Terminals laufen zu lassen?

 
Alain Verleyen:

OK, aber wenn es bereits mit einem Diagramm passiert ist, wird es mit mehreren Diagrammen nicht besser.

Was bringt es Ihnen mehr, wenn Sie es auf mehreren Charts/Terminals laufen lassen?

Wenn dies bei verschiedenen Terminals der Fall ist, liegt das Problem auf der Betriebssystemebene.

 
Stanislav Korotky :

Wenn dies bei verschiedenen Endgeräten der Fall ist, liegt das Problem beim Betriebssystem.

Ich hab's. Ich werde es ausprobieren.
 
Stanislav Korotky :

Führen Sie dieses Skript für das Experiment parallel auf mehreren Diagrammen und mehreren Terminals aus. Vergleichen Sie dann die Schwebezeiten.

Ein anderes Terminal, aber 20 Charts (verschiedene Symbole), wurde gleichzeitig gestartet.

Ich habe beim AUDUSD überprüft, wo die Spitze liegt:

2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Anzahl = 240
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Max = 2235
2020.06.13 09: 16: 35.151 342152 (USDJPY, H1) Avg = 472
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Avg = 240
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 16: 35.151 342152 (CADCHF, H1) Max = 2323
2020.06.06.13 09: 16: 35.152 342152 (CADCHF, H1) Avg = 606
2020.06.13 09: 16: 35.152 342152 (EURAUD, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Min = 141
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Min = 47
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Menge = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Min. = 23
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Max = 2368
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Quantity = 240
2020.06.13 09: 16: 35.152 342152 (EURUSD, H1) Avg = 607
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Min = 74
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (USDCHF, H1) Avg = 240
2020.06.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Min = 122
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Quantity = 240
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Max = 2402
2020.06.13 09: 16: 35.152 342152 (AUDNZD, H1) Avg = 660
2020.06.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Min = 157
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Max = 2354
2020.06.13 09: 16: 35.152 342152 (AUDCHF, H1) Avg = 663
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Max = 2380
2020.06.13 09: 16: 35.152 342152 (GBPCHF, H1) Avg = 616
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Max = 2327
2020.06.13 09: 16: 35.152 342152 (EURCHF, H1) Avg = 618
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Max = 2233
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1) Avg = 503
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 16: 35.152 342152 (EURGBP, H1)13 09: 16: 35.152 342152 (CHFJPY, H1) Max = 2387
2020.06.13 09: 16: 35.152 342152 (CHFJPY, H1) Avg = 657
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Max = 2292
2020.06.13 09: 16: 35.152 342152 (AUDJPY, H1) Avg = 612
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Quantity = 240
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (EURNZD, H1) Avg = 612
2020.06.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Min = 121
2020.06.13 09: 16: 35.152 342152 (EURCAD, H1) Avg = 240
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Max = 2328
2020.06.13 09: 16: 35.152 342152 (AUDCAD, H1) Avg = 605
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Max = 2361
2020.06.13 09: 16: 35.152 342152 (AUDUSD, H1) Avg = 611
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Max = 2411
2020.06.13 09: 16: 35.152 342152 (GBPJPY, H1) Avg = 661
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 240
2020.06.13 09: 16: 35.13 09: 16: 35.153 342152 (GBPUSD, H1) Min = 113
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Max = 2362
2020.06.13 09: 16: 35.153 342152 (GBPUSD, H1) Avg = 667
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Quantity = 240
2020.06.06.13 09: 16: 35.153 342152 (USDCAD, H1) Min = 151
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Max = 2386
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Min = 35
2020.06.13 09: 16: 35.153 342152 (USDCAD, H1) Avg = 671
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Max = 2233
2020.06.13 09: 16: 35.153 342152 (EURAUD, H1) Avg = 478
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Quantity = 240
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Min = 10
2020.06.06.13 09: 16: 35.153 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Max = 2384
2020.06.13 09: 16: 35.153 342152 (EURCAD, H1) Avg = 658
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Min = 32
2020.06.06.13 09: 16: 35.153 342152 (USDCHF, H1) Max = 2369
2020.06.13 09: 16: 35.153 342152 (USDCHF, H1) Avg = 614
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Max = 2344
2020.06.13 09: 16: 35.153 342152 (EURJPY, H1) Avg = 658

Und hier kommen die Oberteile ins Spiel:

2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 480
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Min = 38
2020.06.13 09: 17: 35.151 342152 (USDJPY, H1) Max = 17421
2020.06.06.13 09: 17: 35.151 342152 (USDJPY, H1) Avg = 533
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Quantity = 480
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Min = 35
2020.06.06.13 09: 17: 35.151 342152 (EURAUD, H1) Max = 17406
2020.06.13 09: 17: 35.151 342152 (EURAUD, H1) Avg = 518
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Quantity = 480
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Min = 36
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Max = 17425
2020.06.13 09: 17: 35.151 342152 (EURGBP, H1) Avg = 515
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Quantity = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Min = 18
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Max = 17366
2020.06.13 09: 17: 35.151 342152 (EURCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (EURUSD, H1) Avg = 618
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 480
2020.06.13 09: 17: 35.151 342152 (USDCHF, H1) Menge = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Min = 126
2020.06.13 09: 17: 35.151 342152 (CADCHF, H1) Menge = 480
2020.06.13 09: 17: 35.151 342152 (AUDCHF, H1) Max = 10477
2020.06.13 09: 17: 35.151 342152 (EURCAD, H1) Menge = 480
2020.06.13 09: 17: 35.151 342152 (GBPUSD, H1) Menge = 480
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Min = 123
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Min = 112
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Max = 10485
2020.06.13 09: 17: 35.152 342152 (EURCAD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Max = 10435
2020.06.13 09: 17: 35.152 342152 (GBPUSD, H1) Avg = 661
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Min = 71
2020.06.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 480
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Min = 10
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Max = 10487
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664
2020.06.13 09: 17: 35.152 342152 (EURJPY, H1) Avg = 664.13 09: 17: 35.152 342152 (EURNZD, H1) Menge = 480
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Min = 54
2020.06.13 09: 17: 35.152 342152 (EURNZD, H1) Max = 17426
2020.06.06.13 09: 17: 35.152 342152 (EURNZD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Max = 17427
2020.06.13 09: 17: 35.152 342152 (USDCHF, H1) Avg = 649
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Min = 32
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Max = 17433
2020.06.13 09: 17: 35.152 342152 (GBPCHF, H1) Avg = 647
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min = 480
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Min. = 47
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Max = 17415
2020.06.13 09: 17: 35.152 342152 (AUDJPY, H1) Avg = 640
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Min = 48
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Max = 17435
2020.06.13 09: 17: 35.152 342152 (CADCHF, H1) Avg = 637
2020.06.13 09: 17: 35.152 342152 (AUDCHF, H1) Avg = 662
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Quantity = 480
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Min = 43
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Max = 17416
2020.06.13 09: 17: 35.152 342152 (AUDUSD, H1) Avg = 620
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Quantity = 480
2020.06.13 09: 17: 35.13 09: 17: 35.152 342152 (GBPJPY, H1) Min = 13
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Max = 10468
2020.06.13 09: 17: 35.152 342152 (GBPJPY, H1) Avg = 660
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Quantity = 480
2020.06.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Min = 11
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Max = 10474
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Quantity = 480
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Min = 61
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Max = 10491
2020.06.13 09: 17: 35.152 342152 (AUDNZD, H1) Avg = 663
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Max = 17414
2020.06.13 09: 17: 35.152 342152 (EURCHF, H1) Avg = 646
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 480
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Min = 100
2020.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Max = 17421
2020.06.06.13 09: 17: 35.152 342152 (AUDCAD, H1) Avg = 638
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Max = 10488
2020.06.13 09: 17: 35.152 342152 (USDCAD, H1) Avg = 666
2020.06.13 09: 17: 35.152 342152 (CHFJPY, H1) Avg = 656

Es geschah also alles zur gleichen Zeit. Es könnte sich aber auch um ein MT5-Problem handeln. Ich werde das mit anderen gleichzeitigen Terminals überprüfen.

 
Stanislav Korotky:

Wenn dies bei verschiedenen Terminals der Fall ist, liegt das Problem auf der Betriebssystemebene.

Das Problem ist nicht in OS, sondern in MT.
Ich überprüfte es auf MT5 (Build 2009) - alles fliegt, ist die Zeit der Ausführung weniger als 5 ms
Während in MT5 (Build 2485) - alles verlangsamt, die Ausführungszeit oft mehr als 200 ms (vor allem, wenn 50 + Charts geöffnet sind)
Ich habe Code aus der Beschreibung des Problems:https://www.mql5.com/en/forum/342152

Ich verglich Realisierung von ChartGetInteger-Funktion für zwei Versionen von MT5 2009 und MT5 2485, vielleicht gibt es das Problem:
1. In 2485 werden für das Lesen von "atomaren" Feldern eines Diagrammobjekts recht langsame Operationen verwendet:
mfence; lock mov eax,[rax+2C];
Während es in 2009 build wie folgt gemacht wird: lock xadd [rcx+2C],eax

Es scheint auch, dass sich die Logik und die mögliche Verweildauer in ntdll_RtlEnterCriticalSection erheblich geändert haben.
Früher, im Jahr 2009, überprüfte ein kritischer Abschnitt nur ein Paar empfangener Werte, ohne jegliche atomare Operationen.
Und in 2485 konnten die verknüpften Listenobjekte des Diagramms zusätzlich aufgezählt werden.


Vermutlich konnte das Problem auftreten, als der Absturz bei der Arbeit mit Diagrammfunktionen im Rahmen der Umstellung auf den neuen Compiler (vor etwa 2-3 Monaten) behoben wurde.
Assembler-Code für ChartGetInteger-Aufruf in MT5 (Build 2485) ist beigefügt.

 
Sergey Dzyublik :

Das Problem ist nicht in OS, sondern in MT.
Ich habe es auf MT5 (Build 2009) überprüft - alles fliegt, die Ausführungszeit ist weniger als 5 ms
Während in MT5 (Build 2485) - alles verlangsamt, die Ausführungszeit oft mehr als 200 ms (vor allem, wenn 50+ Charts geöffnet sind)
Der Code aus der Problembeschreibung verwendet wurde: https://www.mql5.com/en/forum/342152

Ich verglich Realisierung von ChartGetInteger Funktion für zwei Versionen von MT5 2009 und MT5 2485, vielleicht gibt es das Problem:
1. In 2485 werden für das Lesen von "atomaren" Feldern eines Diagrammobjekts recht langsame Operationen verwendet:
mfence; lock mov eax,[rax+2C];
Während es in 2009 build wie folgt gemacht wird: lock xadd [rcx+2C],eax

Es scheint auch, dass sich die Logik und die mögliche Verweildauer in ntdll_RtlEnterCriticalSection erheblich geändert haben.
Früher, im Jahr 2009, überprüfte ein kritischer Abschnitt nur ein Paar empfangener Werte, ohne jegliche atomare Operationen.
Und in 2485 konnten die verknüpften Listenobjekte des Diagramms zusätzlich aufgezählt werden.


Vermutlich konnte das Problem auftreten, als der Absturz bei der Arbeit mit Diagrammfunktionen im Rahmen der Umstellung auf den neuen Compiler (vor etwa 2-3 Monaten) behoben wurde.
Assembler-Code für ChartGetInteger-Aufruf in MT5 (Build 2485) ist beigefügt.

Die offiziellen Builds waren 2005 Build und dann 2085 Build, haben Sie welche? Ich habe nur 2007 Build.
 
Sergey Dzyublik:

Sie haben die Begriffe "asynchron" und "synchron" falsch verstanden.
Wenn Sie sagen, dass eine Funktion asynchron ist, bedeutet dies, dass sie nicht im aktuellen Thread der Ausführung, sondern in einem anderen Thread ausgeführt wird.

Der Aufruf einer asynchronen Funktion wie ChartSetInteger vom Hauptthread aus ist schnell, da die eigentliche Ausführung in einem anderen Thread erfolgt.

Andererseits erfordert der Aufruf einer synchronen ChartGetInteger-Funktion die Synchronisierung von Threads, was zusätzliche Zeit in Anspruch nehmen kann.
Verzögerungen machen sich besonders bemerkbar, wenn der parallele Thread die Daten der Diagrammstruktur ständig aktualisiert (z. B. wenn der Benutzer das Diagrammfenster verschiebt oder durch den Verlauf blättert).
Der Einfachheit und Zuverlässigkeit halber wird wahrscheinlich ein einziges Synchronisationsobjekt für seine Diagrammdatenstruktur verwendet.
Man kann versuchen, die Ausführungsgeschwindigkeit durch "Datensegmentierung" zu verbessern, aber andererseits kann es jetzt zu Deadlocks, zu wenig aktualisierten Daten oder zu Verlangsamungen an anderen kritischen Stellen kommen.
Im Allgemeinen ist es besser, etwas, das bereits stabil funktioniert, nicht zu verändern.

Ilyas:

Ich gehe davon aus, dass die Spitze ist Rendering Chart Kommentar, sonst, wenn die Chart-Warteschlange leer ist, ChartGetXXX Funktionsaufruf (beachten Sie, der Aufruf mit Synchronisation) dauert 0,13 Millisekunden.

Ich bin es eher gewohnt, in Codes zu sprechen.
Ich habe zum Beispiel einen solchen Indikator skizziert:


ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR, 0) wird ausgeführt, wenn sich die Maus bewegt;
der rote Graph ist die Ausführungszeitstatistik dieser Funktion.
Eine einfache Abfrage nach einer Ziffer ist um ein Vielfaches langsamer als die Funktion BildChart, die den gesamten Bildschirm leert, ein Diagramm mit mehreren tausend Linien erstellt, eine Skala zeichnet, einen Textinformationsblock erstellt und das Ganze auf dem Bildschirm anzeigt.

Das ganze akademische Gerede darüber, dass es aufgrund der Synchronizität so sein sollte, wird als "schwarz ist weiß" wahrgenommen.
Mit einer vollständigen Reihe von Kursen kann ich problemlos mein eigenes, unabhängiges Diagramm auf der Grundlage des Kanvas erstellen und eine vollständige Tabelle mit den Merkmalen dieses Diagramms erstellen, auf die ich innerhalb von Nanosekunden zugreifen kann. Und damit wird die Leinwand des Diagramms in einem anderen Thread gerendert.

Dateien:
 
Ich war lange Zeit dumm, weil ich nicht verstand, was der Compiler an dieser Zeile nicht mag.
  else (Type != -1) // expression has no effect

Vergessen zu schreiben, ob. Ich dachte, es wäre eine gute Idee, die Botschaft für solche Dummköpfe zu buchstabieren.

 
Nikolai Semko:

Eine einfache Abfrage nach einer einzigen Ziffer ist um ein Vielfaches langsamer als die Funktion BildChart, die den gesamten Bildschirm leert, ein Diagramm mit mehreren tausend Linien erstellt, eine Skala zeichnet, einen Textinformationsblock bildet und das Ganze auf dem Bildschirm ausgibt.

Soweit ich weiß, führt der Aufruf von ChartRedraw nicht zum sofortigen Neuzeichnen des Diagramms, sondern erst, wenn eine Get-Methode aufgerufen wird.
Und ChartRedraw ist im Wesentlichen die gleiche asynchrone Methode, so dass Ihre BuildChart Messung nicht zuverlässig ist.