Leinwand vs. Etiketten - Seite 6

 

Warum sollte ich die grafische Darstellung in einem Strategietester testen (insbesondere in einer speziellen Version von Visual Pending), wenn es besser ist, sie direkt in einem Arbeitsdiagramm zu testen?

Und Glückwunsch an diejenigen, die nicht daran denken, die grafische Darstellung in ihren Robotern im nicht-visuellen Tester zu deaktivieren.

 

Nikolay hat recht - die Bearbeitung von Etiketteneigenschaften hat nichts mit der Darstellung von Etiketten zu tun.

Die Beschriftung wird, wie jedes andere Objekt im Diagramm, in einem völlig anderen Thread und unabhängig von der Arbeit des MQL5-Programms gezeichnet. Der Roboter kann nur verlangen, dass das Diagramm noch einmal zwangsweise gerendert wird, aber er kann die Rendering-Zeit nicht messen. Das Zeichnen von Diagrammen mit Objekten erfolgt völlig asynchron.

Aber Rendering Leinwand ist einfach zu messen, wie es direkt in den Fluss des Roboters getan wird und dann während der unabhängigen Rendering des Diagramms bleibt es zu einem nativen BitBlit der Bitmap bereit im Kontext des Fensters zu tun. Dieser Vorgang ist elementar und wird von der Grafikkarte gut beschleunigt.

Bei Textbeschriftungen ist SetFont/TextOut in TTF-Schriften recht teuer.
 
Mihail Matkovskij:

Wenn man dieser Messung Glauben schenkt, sind es 321 Mal.

Diese Zahl zeigt, dass man dieser Messung nicht trauen kann.
Dies ist für einen erfahrenen Programmierer offensichtlich.
Glauben Sie wirklich, dass es eine andere Möglichkeit gibt, Zeichen auf einem grafischen Bildschirm darzustellen als ihre pixelweise Anordnung? Die Zeiten der ECocks sind längst vorbei.
 
Renat Fatkhullin:

Warum sollte ich grafische Zeichnungen in einem Strategietester testen (insbesondere in einer speziellen Version von Visual Pending), wenn es besser ist, dies direkt in einem Arbeitsdiagramm zu tun?

Gleichzeitig gratuliere ich denjenigen, die nicht daran gedacht haben, die grafische Darstellung in ihren Handelsrobotern im nicht-visuellen Tester zu deaktivieren.

Ich hätte es auch auf der Karte überprüfen können. Ich dachte jedoch, es wäre einfacher, dies im Strategy Tester zu tun. Außerdem hatte ich eine Situation, die ich oben beschrieben habe, als die Anzeige auf CCanvas basierte und es den Expert Advisor im Tester stark verlangsamte. Vor allem bei Zecken war es zu beobachten. Um dies im Diagramm zu demonstrieren, müsste die Textausgabe in einer Schleife erfolgen. Das heißt, eine große Aktualisierungsrate zu machen, wie es in meinem Expert Advisor mit Offline-Optimierung getan wird, dass ich auf jetzt arbeiten. Ich entschied mich für eine etikettenbasierte Anzeige, da Canvas das Ganze verlangsamt hätte. Denn, wie Sie bemerkten, wird das Etikett in einem anderen Thread gerendert, so dass es die autonome Optimierung des EA, die ich in einer Schleife laufen lasse, nicht verlangsamen wird.

Es stellt sich heraus, dass, wie Sie sagten, das Zeichnen von Text in Beschriftungen mehr Zeit in Anspruch nimmt als das Zeichnen von OBJ_BITMAP_LABEL. Um es also schneller zu machen, muss es auch in einem separaten Thread gerendert werden. Aber wie? Wenn dies nicht möglich ist, dann ist es aus Sichteiner Anwendung, dieOBJ_LABELverwendet, schneller als OBJ_BITMAP_LABEL...

 
Nikolai Semko:
Dies ist für einen erfahrenen Programmierer offensichtlich.

Für einen erfahrenen Programmierer, der sich eingehend mit dem Terminal beschäftigt hat oder es gründlich kennt, ist das selbstverständlich! Und da ich kein Entwickler des Terminals bin, sondern nur Anwendungen dafür schreibe, weiß ich vielleicht nicht, wie die meisten Programmierer, was nicht in der MQL-Dokumentation steht.

 
Mihail Matkovskij:

Dies ist für einen erfahrenen Programmierer, der die Bedienung des Terminals genau studiert hat oder kennt, offensichtlich! Und da ich kein Entwickler des Terminals bin, sondern nur Anwendungen dafür schreibe, weiß ich vielleicht nicht, wie die meisten Programmierer, was nicht in der MQL-Dokumentation steht.

Und doch versuchen Sie, nicht nur mit einem Entwickler, sondern mit dem Direktor von MQ zu argumentieren.

 
Alexey Viktorov:

Und doch versuchen Sie, nicht nur mit einem Entwickler, sondern mit dem Direktor von MQ zu argumentieren.

Ich versuche nicht zu argumentieren, sondern herauszufinden, ob OBJ_BITMAP_LABEL aus Sicht der anwendenden Anwendung kostengünstiger als OBJ_LABEL gestaltet werden kann!

 
Mihail Matkovskij:

Ich entschied mich für eine etikettenbasierte Anzeige, da Kanvas die Arbeit verlangsamt hätte.

Ich bin mir ziemlich sicher, warum deine Leinwand langsamer wurde.
Weil du versucht hast, mehrere Bilder in ein 30-Millisekunden-Bild zu packen.
Die Sache ist die, dass Frames sowieso nicht öfter als etwa 30 Frames pro Sekunde neu gezeichnet werden (ChartRedraw).

Wie ich hier schon sagte, besteht der Unterschied zwischen Kanvas-Text und Label darin, dass das Füllen des Pixel-Arrays im Falle von Labels asynchron und nicht von Ihnen gesteuert ist, so dass das Füllen des Pixel-Arrays im Falle von Labels nicht öfter als einmal alle etwa 30 Millisekunden geschieht.
Aber es kann mit Canvas passieren, weil es nicht asynchron ist (Bitmap-Füllung). Sie können die Bitmap in 30 Millisekunden zehnmal ausfüllen, aber sie wird nur einmal angezeigt, und neunmal ist sie im Leerlauf.
Deshalb, wie inCanvas ist cool! muss der Programmierer den Startzeitpunkt der BitMap kontrollieren.
Ein Modell für das Verhalten könnte sein:

  • Es gibt eine Funktion, die die Bitmap bildet
  • Die Eingabe dieser Funktion speichert die Startzeit in einer statischen Variable in Millisekunden.
  • Wenn Sie diese Funktion das nächste Mal aufrufen, sollten Sie prüfen, ob seit der letzten Bitmap-Generierung weniger als 30 Millisekunden vergangen sind. Wenn ja, dann beenden und false zurückgeben, wenn nein - mit dem Füllen beginnen und eine neue Bitmap ausgeben.
Es ist natürlich bequemer, eine bool-Variable in die Klasse einzuführen, die die Bildung der Leinwand erlaubt oder verbietet.
 
Nikolai Semko:

Ich bin mir ziemlich sicher, warum dein Kanvas langsamer wurde.
Weil du versucht hast, mehrere Bilder in ein 30-Millisekunden-Bild zu packen.
Die Sache ist die, dass Frames sowieso nicht öfter als etwa 30 Frames pro Sekunde neu gezeichnet werden (ChartRedraw).

Wie ich bereits sagte, besteht der Unterschied zwischen Kanvas-Text und Label darin, dass das Füllen des Pixel-Arrays im Falle von Labels asynchron und nicht von Ihnen gesteuert ist, so dass das Füllen des Pixel-Arrays im Falle von Labels nicht öfter als einmal alle 30 Millisekunden erfolgt.
Aber es kann mit Canvas passieren, weil es nicht asynchron ist (Bitmap-Füllung). Sie können die Bitmap in 30 Millisekunden zehnmal ausfüllen, aber sie wird nur einmal angezeigt, und neunmal ist sie im Leerlauf.
Deshalb, wie inCanvas ist cool! muss der Programmierer die BitMap-Füllzeit kontrollieren.
Ein Modellverhalten könnte folgendermaßen aussehen:

  • Es gibt eine Funktion, die die Bitmap bildet
  • Die Eingabe dieser Funktion speichert die Startzeit der Bilderzeugung in einer statischen Variable in Millisekunden.
  • Wenn Sie diese Funktion das nächste Mal aufrufen, sollten Sie prüfen, ob seit der letzten Bitmap-Generierung weniger als 30 Millisekunden vergangen sind. Wenn ja, wird der Vorgang beendet und false zurückgegeben, wenn nein, wird eine neue Bitmap gefüllt und ausgegeben.
Es wäre vielleicht besser, eine Variable in einer Klasse einzuführen, die die Erstellung einer Leinwand ermöglicht.

Gibt es irgendwo Informationen, wo man mehr darüber lesen kann? Mir ist zwar alles klar, aber trotzdem ist das Thema recht interessant! Nun muss noch die Variante der Bitmap-Aktualisierungssteuerung erstellt und getestet werden. Ich wäre überrascht, wenn die Bitmap schneller wäre als die Etiketten.

 

Hier ist ein Beispiel, das zeigt, wovon ich spreche. Die Grundlage des Skripts ist der Dokumentation hier entnommen.
Es beginnt mit einem zufälligen Array, das 100 mal 100 Zeilen ausgibt und 100 Etiketten erzeugt.
Es werden zunächst 100 Bilder mit Label ausgegeben.
Danach werden 100 Frames mit Canvas-Strings ausgegeben.
Die Leinwand ist dieselbe.
In einer Schleife wird der Schlaf dokumentiert. Wenn die Schleife Sleep(0) enthält, sieht die Situation ganz anders aus. Sie können ein wenig experimentieren.
Alle Rahmen und Zeilen sind zur Kontrolle nummeriert.
Ich habe ein Video aufgenommen und es 30 Mal verlangsamt. Sie können sehen, dass nur zwei von 100 Frames tatsächlich für die Beschriftungen gerendert wurden, außerdem können Sie im zweiten Frame sehen, dass die Beschriftungen aus verschiedenen Frames stammen, d.h. Sie können sehen, dass die Asynchronität funktioniert.

Diese Werte für das Label sind also gefälscht:

Kanvas gibt etwa 60-70 Bilder von 100 aus. Dies liegt daran, dass der Rahmen etwas schneller als 30 Millisekunden gebildet wird und daher nicht alle Rahmen Zeit haben, ausgegeben zu werden, obwohl alle Rahmen gebildet werden.
Experimentieren Sie mit den beiden oberen Parametern

und Zyklusverzögerung.


Wenn Sie die Anzahl der auszugebenden Zeilen erhöhen, kann der Fehler 4001 auftreten. Dies ist ein Fehler in MQ, wenn es zu viele Ausgänge gibt.

Dateien: