Fehler, Irrtümer, Fragen - Seite 2776

 
Ilyas:

Dies ist kein Fehler, sondern die Kosten eines Sync-Befehls für ein Diagramm

Warum brauchen Sie einen Befehl für eine Karte, um Merkmale aus ihr zu entfernen? Gibt es nicht einfach eine Tabelle mit den Merkmalen aller Diagramme im Speicher, aus der man einfach Daten in Nanosekunden statt in Millisekunden (nicht einmal in Mikrosekunden!) entnehmen kann?
Es ist klar, dass die Funktionen ChartSetInteger, ChartSetDouble und ChartSetString asynchron sind.
Aber warum verhalten sich die Funktionen ChartGetInteger, ChartGetDouble und ChartGetString in Bezug auf die Ausführungsgeschwindigkeit als asynchron, obwohl sie synchron sind?

Wenn eine solche Tabelle nicht im Speicher vorhanden ist und diese Funktionen das Diagramm jedes Mal verlangsamen müssen, um den angeforderten Parameter zu generieren, dann verstehe ich gar nichts.
Es ist nicht teuer, eine solche Tabelle zu haben und sie auf dem neuesten Stand zu halten. Realistisch sind einige Kilobytes im Speicher und ein kleiner Bruchteil einer Mikrosekunde, um die Tabelle zu aktualisieren, wenn sich die Merkmale des Diagramms ändern.
Ilyas, bitte sag mir, was ich verpasse?

 
Nikolai Semko:

Aber warum verhalten sich dann die Funktionen ChartGetInteger, ChartGetDouble, ChartGetString asynchron in Bezug auf die Ausführungsgeschwindigkeit, wenn sie synchron sind?

Sie haben ein falsches Verständnis von den Begriffen asynchron und synchron.
Wenn man sagt, dass eine Funktion asynchron ist, bedeutet dies, dass sie nicht im aktuellen Ausführungsstrang, sondern in einem anderen Strang - parallel - ausgeführt wird.

Die Funktion ist asynchron - das bedeutet, dass die Funktion nicht auf die Ausführung des Befehls wartet, der in der angegebenen Tabelle erfolgreich in die Warteschlange gestellt wurde, sondern sofort die Kontrolle zurückgibt.
Die Eigenschaft ändert sich erst, nachdem der Befehl in der Diagrammwarteschlange abgearbeitet worden ist.
DieFunktionChartRedrawmuss aufgerufen werden, um Befehle in der Diagrammwarteschlange sofort auszuführen.

Der Aufruf der asynchronen Funktion ChartSetInteger aus dem Hauptthread ist schnell, da die eigentliche Ausführung in einem anderen Thread stattfindet.


Andererseits erfordert der Aufruf der synchronen Funktion ChartGetInteger die Synchronisierung von Threads, was zusätzliche Zeit in Anspruch nehmen kann.
Die Verzögerungen machen sich besonders bemerkbar, wenn der parallele Thread die Daten der Diagrammstruktur ständig aktualisiert (z. B. wenn der Benutzer das Diagrammfenster bewegt 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 in anderen kritischeren Bereichen kommen.
Im Allgemeinen ist es besser, etwas, das bereits reibungslos läuft, nicht anzutasten.

 
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.
Die Verzögerungen machen sich besonders bemerkbar, wenn der parallele Thread die Daten der Diagrammstruktur ständig aktualisiert (z. B. wenn der Benutzer das Diagrammfenster bewegt 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.
Alles in allem ist es besser, etwas, das bereits stabil läuft, nicht zu verändern.

Sie haben recht, aber es scheint einige Engpässe zu geben. Der Markt ist jetzt geschlossen, ich habe den Code unten auf 1 Chart ausgeführt, sonst funktioniert nichts. Es läuft auf einem VPS mit nur MT5 läuft und ich habe nicht mit Chart / MT5 mit etwas anderem als einem Screenshot interagiert. Zeit in µs, 127 µs im Durchschnitt, aber der Spitzenwert beträgt 43.995 µs.


Dateien:
342152.mq5  5 kb
 

Meine Herren Entwickler!

Bitte korrigieren Sie mich, wenn ich im falschen Thread geschrieben habe. Es gibt Vorschläge zur Benutzerfreundlichkeit und Fehlersuche, die meiner Meinung nach für viele nützlich und für mich wichtig sind.


1. Erhöhen Sie die Länge der OBJPROP_TOOLTIP-Zeile für Objekte (2 Mal ist ausreichend). Für Strategien mit vielen Grafiken ist die aktuelle Länge sehr kurz. Für die Fehlersuche müssen Sie jedes Mal Zeit aufwenden, um alle erforderlichen Daten einzupflegen. Dann müssen Sie die Ermäßigungen für die Verbraucher regelmäßig ändern und/oder ergänzen.


2. Erhöhen Sie die Länge der Kommentare auf die Namen der Eingabeparameter (2-mal ist ausreichend). Kommentare zu den Eingabeparametern sind für Verbraucher erforderlich. Und bei einer großen Anzahl ist es auch praktisch, eine zusätzliche Nummerierung vorzunehmen. Für die Optimierung ist es wichtig, den Namen der Variablen zu kennen. Infolgedessen ist es oft nicht möglich, alles in der derzeitigen Länge unterzubringen. Beispiel:


3. Die Auswahl der Spalten in der Optimierungsergebnistabelle zu variieren, bis hin zur Anzeige aller Spalten ausENUM_STATISTICS, und den Benutzer wählen zu lassen, was er/sie braucht. Dies ist einesehr schlechte Wahl für die Analyse. Der Drawdown in % ist bei der Optimierung mit einem festen Volumen nutzlos. Es gibt keine Möglichkeit, die maximale Inanspruchnahme in Bezug auf Währung und Einlage zu wählen. Manchmal gibt es bei der Optimierung eine starke Verzerrung zwischen Kauf- und Verkaufspositionen, aber das kann man erst nach einem einzigen Test feststellen. Oft müssen wir die fehlenden Parameter in das Ergebnisfeld(STAT_CUSTOM_ONTESTER) eintragen. Aber wir wollen dort zusätzliche Ergebniskriterien anzeigen, und es ist möglich, nur eines anzuzeigen, was wir noch hinnehmen könnten, wenn wir die Anzahl der Spalten der Standardkriterien vonENUM_STATISTICS variiert hätten. Alles in allem muss ich viel zusätzliche Zeit für Überoptimierung und Analyse aufwenden.

Ich danke Ihnen!

 
Alain Verleyen:

Sie haben recht, aber es scheint einige Engpässe zu geben. Der Markt ist jetzt geschlossen, ich habe den unten stehenden Code auf 1 Chart ausgeführt, sonst funktioniert nichts. Es läuft auf einem VPS mit nur MT5 läuft, und ich habe nicht mit dem Chart / MT5 mit etwas anderem als einem Screenshot interagiert. Die Zeitangaben sind in µs, im Durchschnitt 127 µs, aber der Spitzenwert beträgt 43.995 µs.

Ich gehe davon aus, dass die Spitze das Rendern des Diagrammkommentars ist, andernfalls, wenn die Diagrammwarteschlange leer ist, dauert der Aufruf der Funktion ChartGetXXX (beachten Sie den Aufruf mit Synchronisierung) 0,13 Millisekunden

 
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.
Die Verzögerung macht 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 in anderen kritischeren Bereichen kommen.
Im Allgemeinen ist es besser, etwas, das bereits reibungslos läuft, nicht anzutasten.

Das stimmt, um die Verarbeitung von synchronen Befehlen zu beschleunigen, müssen Sie die Architektur ändern (insbesondere die GUI), die mehr Last/Zeit erzeugt, indem sie das Diagramm zum Rendern blockiert.
 
Interessantes Verhalten.
Wenn Sie die Taste PrtScr drücken und das Diagrammfenster verschieben, führt dies zu schrecklichen Verzögerungen von bis zu 5 Sekunden.
Wenn Sie jedoch nur einen Screenshot des terminal.exe-Programmfensters mit ALT + PrtScr machen, gibt es überhaupt keine Verzögerung.
 
Ilyas:
TERMINAL_GUI_ON/OFF

Dem eingebauten VPS-Dienst nach zu urteilen, gibt es eine gewisse Erfahrung.

 
Ilyas :

Ich gehe davon aus, dass die Spitze das Rendern des Diagrammkommentars ist, andernfalls, wenn die Diagrammwarteschlange leer ist, dauert der Aufruf der Funktion ChartGetXXX (Achtung, der Aufruf mit Synchronisierung) 0,13 Millisekunden

Nein, Ilyas, es sieht so aus, als gäbe es keinen Kommentar zum Diagramm. Ich werde die Protokolle verwenden und sie veröffentlichen.

Edit: Hier ist das Ergebnis, keine Interaktion mit dem Chart oder MT5 oder Windows, nach dem Ausführen, außer um die Protokolle zu kopieren. Nur 1 Diagramm, keine andere Software läuft auf dem System. Der Spitzenwert ist geringer, aber immer noch sehr wichtig im Vergleich zum Durchschnitt. (µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Anzahl = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Min = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Max = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Avg = 147

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д. Значение...
 
Alain Verleyen :

Nein, Ilyas, es sieht so aus, als gäbe es keinen Kommentar zu der Grafik. Ich werde die Protokolle verwenden und sie veröffentlichen.

Edit: Hier ist das Ergebnis, keine Interaktion mit dem Chart oder MT5 oder Windows, einmal gestartet, außer zum Kopieren der Protokolle. Nur 1 Diagramm, keine andere Software läuft auf dem System. Der Spitzenwert ist geringer, aber immer noch sehr wichtig im Vergleich zum Durchschnitt. (µs)

2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Anzahl = 7440
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Min = 37
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Max = 17776
2020.06.13 07: 11: 25.192 342152 (EURGBP, H1) Avg = 147

Update :

Der Spitzenwert ist jetzt deutlich höher:

2020.06.13 08: 18: 25.187 342152 (EURGBP, H1) Max = 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