Fehler, Irrtümer, Fragen - Seite 2723

 
Aleksey Mavrin:

Können Sie mir sagen, was los ist und wie ich die Aktualisierung der Karte beschleunigen kann? Die Funktion ChartRedraw wird vom Expert Advisor aufgerufen, aber es gibt immer noch eine Verzögerung von ein paar Minuten.

ChartRedraw wird nur für das Zeichnen (Aktualisieren) von grafischen Objekten benötigt, wir brauchen ChartRedraw nicht für einen normalen Indikator, der über Indikatorpuffer zeichnet

ich denke, Sie sollten das Problem im Indikator suchen, vielleicht ist die Berechnung der Puffer bei jedem Tick nicht korrekt, es gibt "Autoren", die die gesamte Geschichte bei jedem Tick berechnen

ZZY: Ich kann es nicht bestätigen, aber vielleicht aktualisiert ChartRedraw den gesamten Chart mit der synchronisierten Historie, wenn ja, starten Sie den Indikator jedes Mal mit einer vollständigen Berechnung der gesamten Historie neu

UPD: Versuchen Sie, die Geschichte auf dem Diagramm zu einer kleineren Anzahl von Bars 10 000 ist genug, in MT4 gab es einen Fall, in dem eine schwere Indikator "verschlungen" alle Speicher und dann gesucht, warum EA nicht richtig funktionieren (es funktionierte dann nicht). Obwohl es in MT5 unwahrscheinlich ist, dass der gesamte Speicher verwendet wurde...., aber es kommt vor

 
Igor Makanu:

ChartRedraw wird nur für das Zeichnen (Aktualisieren) von grafischen Objekten benötigt, Sie brauchen ChartRedraw nicht für einen normalen Indikator, der über Indikatorpuffer zeichnet

ich denke, Sie sollten das Problem im Indikator suchen, vielleicht ist die Berechnung der Puffer bei jedem Tick nicht korrekt, es gibt "Autoren", die die gesamte Geschichte bei jedem Tick berechnen

ZZY: Ich kann nicht bestätigen, aber vielleicht ChartRedraw aktualisiert das gesamte Diagramm mit synchronisierten Geschichte, wenn ja, dann jedes Mal, wenn Sie den Indikator mit einer vollständigen Berechnung der gesamten Geschichte neu starten

UPD: Versuchen Sie, die Geschichte auf dem Chart zu einer kleineren Anzahl von Bars 10 000 ist genug, in MT4 gab es einen Fall, in dem eine schwere Indikator "verschlungen" den ganzen Speicher und dann gesucht, warum EA nicht richtig funktionieren (es funktionierte dann nicht). In MT5 ist es zwar unwahrscheinlich, dass der gesamte Speicher verwendet wird...., aber es kann passieren.

Ich habe versucht, die Berechnung zu optimieren und habe die vorherige Version des Indikators getestet. Ich habe bisher alle 1000 Balken berechnet und warte jetzt darauf, dass ein neuer Balken geöffnet wird.

Sollte dies der Grund sein, wäre ich dennoch sehr überrascht. 1k Balken mit nicht sehr starken Berechnungen verlangsamen das Zeichnen des Diagramms für 2 Minuten?

 
Aleksey Mavrin:

Wenn das der Grund ist, ist es immer noch eine große Überraschung wert. 1 Bar von nicht sehr starken Berechnungen verlangsamt das Zeichnen des Diagramms für 2 Minuten?

kann es meiner Meinung nach nicht sein, das Terminal wird einen solchen Indikator mit der Meldung "zu lange Berechnung in xxx Indikator " entladen.

die MT-Laufzeit (4/5) ist sehr schnell, natürlich kann man die gleichen Daten auch mehrmals berechnen, aber imho muss man sich schon anstrengen

Ich denke, der Autor des Indikators ist nicht mit der wirtschaftlichen Berechnung von Indikatorpuffern vertraut, und er vergisst, die letzten Balken korrekt zu berechnen... gehen Sie zu QB, um zu lernen, wie Indikatoren geschrieben werden ;)

 
Slava :

Befinden sich diese beiden Programme in demselben Terminal oder in zwei verschiedenen Terminals?

Der Code zur Reproduktion des Problems ist hier zu finden. https://www.mql5.com/en/forum/332849

Sie müssen den Code mindestens 2 Mal ausführen, um ihn zu reproduzieren.

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
 
Alexey Navoykov:

Überhaupt nicht notwendig. Warum C? Wie wäre es mit C#? - Von der Bedeutung her ist es näher an C#.

Wahrscheinlich, weil µl c++ ähnlich ist und die Strukturen von c dorthin kamen.

Das ganze Gerede über passive Strukturen ist meiner Meinung nach eine archaische Vorstellung.

Wenn Sie Konstruktoren benötigen, verwenden Sie Klassen oder gehen Sie zu Sharp. Warum sollten wir den Strukturen diese Bedeutung vorenthalten? Dadurch werden die Programme nur noch ausdrucksstärker. Ich kann den Code von jemandem nehmen und sehen, dass er/sie eine Struktur statt einer Klasse hat und eine Menge Informationen aus nur einem Wort erhalten. Sie werden nichts erhalten, Sie werden fleißig den Quellcode studieren, um das gleiche Ergebnis zu erhalten, das ich in einem Wimpernschlag erhalten habe. Meiner Erfahrung nach wird diese Konvention der Strukturen respektiert, vielleicht sogar als eine Art nihilistischer Marginalismus.

Ich glaube, dass jeder Typ zumindest einen Konstruktor haben sollte. Uninitialisierte Felder sind ein Übel und sollten vermieden werden.

Das ist nichts Böses, wie es dir scheint. Vaughn sogar in den Standard gezogen: Lesen von uninitialized unsigned char und std::byte ist nicht undefinded Verhalten. Sie können die Aggregatinitialisierung für POD verwenden. Und vergessen Sie nicht - all diese Initialisierung ist nicht kostenlos, es ist echte Ressourcenverbrauch (CPU, Speicher, Größe einer ausführbaren Datei). Wenn es Ihnen bei Ihrem Number Cruncher scheißegal ist, kann es bei einem Mikrocontroller wichtig sein. Schließlich ist C/C++ nicht nur eine Windows-Mischung wie Sharp.

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
Allein durch die Initialisierung einer einzigen Variablen erhöhte sich die Befehlsgröße um 30 %.
 
Stanislav Korotky:

In einem Terminal. Der Experte schreibt die Daten, der Indikator liest die Daten. Sie hängen an verschiedenen Karten, könnten aber natürlich auch an derselben hängen (falls das eine Rolle spielt). Build 2380.

Der Expert Advisor, der die Datei liest, muss diese Datei geschlossen halten.

Die Besonderheit der Implementierung von Dateien in MQL5 ist, dass sie die Daten von Dateien in ihren eigenen Puffern auf das Maximum zu halten. Wenn die Informationsmenge so groß ist, dass sie nicht in den Puffer passt, kann Ihr Trick funktionieren, den Zeiger an den Anfang und dann an das Ende der Datei zu setzen.

Öffnen Sie also die Datei, prüfen Sie den Inhalt und schließen Sie sie wieder.

 
Slava :

Ein Expert Advisor, der eine Datei liest, muss diese Datei geschlossen halten.

Die Besonderheit der Implementierung von Dateien in MQL5 ist, dass sie Daten aus Dateien so weit wie möglich in ihren eigenen Puffern halten. Wenn die Informationsmenge so groß ist, dass sie nicht in den Puffer passt, kann Ihr Trick, den Zeiger an den Anfang und dann an das Ende der Datei zu setzen, funktionieren.

Öffnen Sie also die Datei, prüfen Sie den Inhalt und schließen Sie sie wieder.

FileFlush () ist also nutzlos?
 
Alain Verleyen:
FileFlush () ist also nutzlos?

Nein. FileFlush muss durchgeführt werden, wenn Sie möchten, dass jemand anderes die geänderte Datei lesen kann.

Das Problem ist, dass das MQL5-Programm die Datei in seinen eigenen Puffer liest, wenn es sie öffnet. Es weiß nichts von Änderungen in der Datei, bis es sie erneut liest. Die Datei kann nur durch Schließen und anschließendes Öffnen der Datei wieder gelesen werden

 
Slava:
Nein. FileFlush muss durchgeführt werden, wenn Sie möchten, dass jemand anderes die geänderte Datei lesen kann.

Auch wenn Sie die Datei schließen?

 
Andrey Barinov:

Auch wenn Sie die Datei schließen?

Das ist genau das, wovon ich spreche. Schließen, dann wieder öffnen

Oder meinen Sie FileFlush vor dem Schließen der Datei?