Fehler, Irrtümer, Fragen - Seite 1733
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Referenz für Arrays ist eine Krücke in der MQL-Sprache, nicht eine Referenz.
Und wenn [] ein Typmodifikator wie * ist, sollte es eine eigene const! haben und nicht eine Referenz.
Der Fehler ist berechtigt - diese Bezeichner sind in der Hilfe als ReadOnly aufgeführt (nicht mit ChartSetInteger kombiniert)https://www.mql5.com/ru/docs/constants/chartconstants/enum_chart_property
Würde es helfen?
Lesen Sie ihn sehr sorgfältig. C++ ist viel schwieriger zu verstehen als MQL. Ich kann dem Artikel nicht viel abgewinnen. Und ich habe überhaupt nicht verstanden, was das mit dem zu tun hat, was hier diskutiert wird.
Ich fand die Funktion jedoch gut,
perfectforwarding
Bevor wir beschreiben, worum es sich dabei handelt, wollen wir auf die vorherige Norm zurückkommen und das bestehende Problem beschreiben. Angenommen, wir haben eine Schablonenfunktion foo, die einen Parameter annimmt und ihn an die Funktion bar(T& something) übergibt:
void foo(T& Object)
{
bar(Object);
}
Es ist also alles in Ordnung. Was aber, wenn wir z.B. die Zahl 100 als Argument an eine Funktion übergeben wollen?
Keine Sorge, wir werden es so schreiben:
void foo(const T& Object)
{
bar(Object);//Ooops
}
Aber in diesem Fall wird es einen Kompilierungsfehler geben, weil bar eine nicht konstante Referenz nimmt. Wir müssen also 2 Funktionen bereitstellen - eine konstante und eine nicht-konstante. Und nun stellen wir uns vor, dass es nicht nur einen Parameter gibt, sondern 2, 3 oder 5. Es stellt sich heraus, dass diese Aufgabe sehr schwierig zu implementieren ist, da wir (2^n - 1) überladene Funktionen haben, wobei n die Anzahl der Funktionsargumente ist. Wenn Sie der Meinung sind, dass eine solche Anzahl von Parametern schlechter Stil ist und niemand auf diese Weise schreibt, dann schauen Sie sich std::bind, std::make_shared usw. an.
Nun wollen wir sehen, welche Lösung uns die neue Norm bietet:
void foo(T&& Object)
{
bar(std::forward<T>(Object));
}
Mit dem obigen Code ist das Problem der Parameterübergabe vollständig gelöst, was als perfekte Übergabe bezeichnet wird, da der Argumenttyp zwischen Aufrufen der externen Funktion foo und der internen Funktion bar erhalten bleibt. Es besteht keine Notwendigkeit mehr, eine Reihe von Funktionen zu überladen - Entwickler von generischem Code können zufrieden sein.
Diese Lösung ist möglich, denn wenn der Template-Parameter T& ist, speichert sich der übergebene Typ selbst, und std::forward wird benötigt, weil jeder benannte Typ innerhalb der Funktion foo zu einem lvalue wird und wir den ursprünglichen Typ benötigen - dafür ist std::forward da - es speichert den ursprünglichen Typ und entfernt den Namen des Arguments (was zu T&& führt), wodurch es später an die exakte bar-Funktion übergeben werden kann.
1455 - Debugging auf historischen Daten (CTRL+F5) funktioniert nicht. Das Testerfenster erscheint, die Visualisierung startet nicht.
Lesen Sie ihn sehr sorgfältig. C++ ist viel schwieriger zu verstehen als MQL. Ich kann dem Artikel nicht viel abgewinnen. Und ich verstehe überhaupt nicht, was das mit dem zu tun hat, was hier diskutiert wird.
Ich fand diese Funktion jedoch gut,
Ich bin auf "(2^n - 1) überladene Funktionen, wobei n die Anzahl der Funktionsargumente ist" gestoßen - das ist eine Unannehmlichkeit in MQL.Es geht darum, rvalue / lvalue / prvalue / xvalue / gvalue zu verstehen, d.h. das, worüber Sie im Grunde mehrere Seiten lang gesprochen haben :) Wie ich sehe, folgte MQ den C++-Standards und übernahm die ihrer Meinung nach wertvollsten Dinge von dort, ohne nur bei rvalue / lvalue stehen zu bleiben.
Ich bin mir dieser Konzepte selbst noch nicht ganz bewusst, obwohl ich sie logisch verstehe :)
Übrigens arbeitet der Speichermanager in MT5 unverständlich, wenn das Programm den Speicher voll ausnutzt. Ich habe es nicht an kleinen Größen gemessen.
Ich besitze zum Beispiel 4 Gigabyte RAM, 2 Kerne, MT5 v1455 x64 auf einer virtuellen Maschine.
Ich lade den Speicher mit Objekten und im Task-Manager sehe ich, dass 1,5 Gbyte Speicher pro Terminal und 1,5 Gbyte pro virtuellem Speicher verwendet werden.MQL_MEMORY_USED zeigt 400 MB nutzbaren Speicher an. Vor dem Start waren es etwa 140 MB für das Terminal und 150 MB für die virtuelle App.
Mir ist auch aufgefallen, dass der Speichermanager, sobald der Speicherverbrauch 400 MB übersteigt, den Speicher nicht vollständig freigibt, obwohl die Objekte tatsächlich gelöscht werden. Und das Verhalten des Debuggers ist unvorhersehbar - ich komme zum Löschen von Objekten, warte auf deren vollständige Entfernung und stoppe danach das Debugging (mit der STOP-Taste im Debugger), es stoppt, der MT5-Manager hat dem System keinen Speicher zugewiesen, d.h. es sind noch 1,5 Gb für das Terminal und 1,5 Gb für den virtuellen Speicher vorhanden. МТ5 selbst hat den Debugging-Prozess noch nicht abgeschlossen, obwohl ME anzeigt, dass das Debugging abgeschlossen ist. Wenn der Objektspeicher weniger als 400 MB beträgt, ist alles in Ordnung, außer dass der Speicher freigegeben wird.
Der Speicher wird erst freigegeben, nachdem die Terminalaufgabe aus der Liste der laufenden Aufgaben entfernt wurde.
Das ist nicht der Fall. Außerdem gibt es keine technischen Details oder Beschreibungen Ihrer Aktionen. Dies ist ein spezieller Bereich, in dem Sie zusätzliche Informationen vorbereiten und bereitstellen müssen, bevor Sie über einen angeblich gefundenen Fehler schreiben.
Die Service-Desk-Entwickler haben sich meine Konfiguration bereits mehrfach gemerkt.
Ich nehme einen beliebigen Standard-Expert Advisor und drücke im MetaEditor die Tastenkombination STRG+F5. Das Hauptfenster des Strategietesters wird mit den im MetaEditor festgelegten Einstellungen geöffnet. Aber die Visualisierung startet nicht.
Das Protokoll
Die Service-Desk-Entwickler haben sich bereits mehrmals an meine Konfiguration erinnert.
Sie haben nicht einmal begriffen, wovon ich spreche.
Was haben Sie getan, bevor Sie mit der Fehlersuche in der Geschichte begonnen haben? Haben Sie MetaEditor konfiguriert (Registerkarte "Tools" - "Einstellungen" - "Debugging")? Zeigen Sie einen Screenshot von MetaEditora (Registerkarte "Tools" - "Einstellungen" - "Debugging"), was steht im Tester auf der Registerkarte "Log"? Was wird im Viewer auf der Registerkarte "Log" geschrieben?
Die Service-Desk-Entwickler haben sich meine Konfiguration bereits mehrfach gemerkt.
Ich nehme einen beliebigen Standard-Expert Advisor und drücke im MetaEditor die Tastenkombination STRG+F5. Das Hauptfenster des Strategietesters wird mit den im MetaEditor festgelegten Einstellungen geöffnet. Die Visualisierung startet nicht.