Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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.Wenn man dieser Messung Glauben schenkt, sind es 321 Mal.
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...
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.
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.
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!
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:
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:
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.