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
Der Indikator wird für alle Balken einmal berechnet, d.h. er kann beim Start etwas langsam sein, wenn es sich um eine landwirtschaftliche Geschichte handelt.
Anschließend wird ein Wertepaar neu berechnet - alles muss funktionieren :)
Vergessen Sie nicht, dass Programmierer Menschen sind, die in ihrer Freizeit gerne von Hand durch Zeitfenster springen. Und jeder neue Zeitrahmen ist eine weitere Deinitialisierung und Initialisierung der Anatomie des Indikators, alle Berechnungen werden erneut durchgeführt. Daher wird ArrayInitialize() jedes Mal ausgelöst, wenn von einer TF zu einer anderen gesprungen wird. Wenn der Indikator komplex ist und mehrere Puffer enthält, die neu initialisiert werden müssen, häufen sich die Verzögerungen, und ich spreche nicht einmal von einem Speicherüberlauf, der automatisch zugewiesen wird.
Wie naiv ich doch bin! Ich bin immer zuversichtlich, dass die Initialisierung in OnInit() ausreicht, und ich kann mich in diesem Stadium damit vergnügen und meinen Kopf in dringendere Aufgaben in OnCalculate() stecken. Aber nein, das tue ich nicht. Übrigens, mehr oder weniger erfolgreiches Schreiben von komplexen Indikatoren hat mir kein klares Verständnis dafür gegeben, warum ArrayInitialize() genau in OnCalculate() enthalten sein muss, indem es bei jedem Tick überprüft wird, anstatt der primären und einzigen Initialisierung in OnInit(). Nach meiner Erfahrung habe ich nur Fälle gefunden, in denen die Ablehnung dieser Variante sofort zu Problemen führte, aber darauf werde ich später eingehen. Für den Moment möchte ich anmerken, dass vom Standpunkt der einfachen und offensichtlichen menschlichen Logik (und nicht der Code-Logik) ArrayInitialize() in OnCalculate() sehr verwerflich aussieht, wenn man bedenkt, dass ich noch nie auf Fälle gestoßen bin, in denen
Das erste Mal würde das Programm mehr als einmal ausgelöst werden - beim ersten Start. Das heißt, es entstehen neue Fraktale und der Zustand ist still. Was zum Teufel macht es also in OnCalculate()?Ich bin sogar noch naiver in meinem Glauben, dass
Ich bin angeblich verpflichtet, die Arrays dieser Aufräumarbeiten und den Effekt des ökonomischen Algorithmus automatisch von der Originaldatei Fractals.mq5 zu übernehmen, die ebenfalls vorhanden ist, allerdings in einer etwas anderen Form. Aber - immer wieder nein!!! Ich musste zweimal nachdenken und meinen eigenen Code erstellen, indem ich den Indikator, dessen Handle ich verwende, kopierte. Ich erinnere mich, wie ich zum ersten Mal den Code der Indikatoren analysierte und erstaunt war, als ich Fractals.mq5 mit dem Beispiel von iFractals aus der Hilfe verglich und feststellte, dass der zweite Code größer war als der erste (selbst nach der Reduzierung seiner Länge). Ich weiß es nicht. Werfen Sie mir alle Hüte zu, aber Programmierer erwarten eigentlich, dass sie in einer Zeile etwas in ihren Code einfügen können, das auf eine ganze Bibliothek, Klasse oder etwas Umfangreiches dort verweist, aber hier...
Jetzt werde ich den Kern des Problems aufdecken, das ich vorhin erwähnt habe. Ich füge den Code des iFractals-Indikators vereinfacht für die oberen Fraktale bei. Im ersten Beispiel wird der Puffer für die gesamte Historie gefüllt. Wir wollen die Situation ändern, indem wir nur einen Teil der Geschichte kopieren. Wir kommentieren die Zuweisung der kopierten Werte für die erste Berechnung aus und setzen unseren eigenen kleineren Wert:
values_to_copy=100; // то же, что amount
Springen wir nun auf den Zeitskalen herum und lassen wir uns von den fraktalen Artefakten erschrecken, die dabei entstanden sind. Mir ist nichts Besseres eingefallen, als den nicht geerbten Codeblock clean up arrays aus Fractals.mq5 automatisch zu kopieren, um den Teil der Geschichte zu bereinigen, in dem Fraktale nicht benötigt werden: Jetzt ist alles(mit viel Redundanz!!!) perfekt aufgeräumt, und gleichzeitig zeigt Print() an, wann und wie oft die Reinitialisierung funktionieren wird, und zeigt die Puffergröße an. Wir können sehen, dass es nicht 100 sind, sondern viel mehr. Wenn ich Staub von einem Tisch wischen muss, wische ich den Staub vom Tisch, anstatt die ganze Wohnung zu reinigen. Oder besteht der Trick darin, mir um jeden Preis zu versichern, dass die Speicher- und Zeitüberschreitung kein Problem ist, dass man einen Weg finden kann, das Problem indirekt zu lösen, und dass man den eklatanten Ressourcenverzehr, der sich meiner Kontrolle entzieht, ignoriert?Ein fx, eine bestimmte Größe muss eingestellt werden... Warum eine gebogene Schleife mit unterschiedlichen Grenzen, wenn man eine direkte Schleife mit den gleichen Grenzen machen kann?)
Andernfalls wird der Indikator auf Krücken beruhen.
Ehrlich gesagt wollte ich nicht zur Last fallen, aber mir war klar, dass Sympathisanten den gesamten Code durchforsten würden. Es ist wie in der Anekdote über Chapay und Petka, als Wassili Iwanowitsch zurückkehrte und um eine Schaufel bat - es stellte sich heraus, dass sie kaputt war - das Pferd war begraben - das Dorf wurde von den Weißen angegriffen, während Chapay weg war. Da ich davon ausgehe, dass sich niemand mit den Details des Codes anderer Leute befassen möchte, kann ich nur auf die Indikatorausgabe verweisen, die (abgesehen von Bremsen und anderen Dingen) wie folgt aussieht: https://www.mql5.com/ru/forum/1111/page577#comment_119227. Und jetzt denken Sie darüber nach und sagen: Ist es vernünftig, zu denken, dass dort alles einfach ist und scheinbar offensichtliche Lösungen vorzuschlagen?
Nicht umsonst vereinfache und begrenze ich den Code, bevor ich in einem bestimmten Teil etwas frage. Deshalb bitte ich Sie, sich darauf zu beschränken und nicht das ganze Pferd zu exhumieren, es sei denn, es gibt einen Amateur...
Tatsächlich ist der vierte - spezielle - Puffer im Prinzip länger als die ersten drei (gleich lang), und dank SetIndexBuffer() erstreckt er sich über die gesamte Geschichte! Wenn wir die Schleifengrenzen auf den vierten Puffer ausdehnen und gleichzeitig die Größe der ersten drei Arrays an diesen anpassen, erhöht sich zumindest die Anzahl der Elemente in der Schleife, was die geschätzte Zeit für das Lesen des gesamten linken Pufferelementsegments erhöht. Dies ist nur die Spitze eines Eisbergs von Problemen, die bei einer solchen Variante des Algorithmus auftreten werden. Außerdem dauert die Neuinitialisierung anderer Puffer länger, weil sie jetzt größer sind. Das vierte spezielle Array kann sonst nicht explizit mit EMPTY_VALUE gefüllt werden, da der Indikator eine starke Transposition von Fraktalen aus anderen Zeitfenstern nach einem bestimmten Algorithmus aufweist, bei dem es keine Übereinstimmung zwischen den Indizes der ersten drei Puffer und dem vierten Puffer gibt...
//und EMPTY_VALUE-Werte werden den Elementen 0 und 1 von Arrays zugewiesen, mm... und auf den letzten drei Takten)
Wie das? Warum nicht alle? Das verstehe ich nicht. Können Sie das erklären? Ich beziehe mich dabei nicht auf die Zuweisung der tatsächlichen (effektiven) Werte, sondern auf die unvermeidliche Durchsuchung des gesamten Puffers. ArrayInitialize(), wie auch viele andere Array-Funktionen, basieren auf einer Schleife, die für MQL-Programmierer implizit ist.
Die Frage nach Speicherüberlauf bleibt gültig, und die Entwickler sollten darüber nachdenken, einen zusätzlichen Parameter inArrayInitialize() einzuführen, der die Anzahl und noch besser die Grenzen der Puffer-Neuinitialisierung angibt.
P.S.: Ich denke, ich kann erraten, warum ArrayInitialize() in OnInit() hier nicht effizient ist. Puffer sind dynamisch, sie ändern ihre Größe, und in OnInit() werden sie nur einmal und für die aktuelle Länge mit Werten initialisiert, wobei die tatsächlichen Größen der Puffer in OnCalculate() noch nicht bekannt sind.
Die Anzeige im Visualisierer funktioniert nicht:
Im Terminal im Online-Terminal funktioniert es einwandfrei:
Ich füge die folgenden Zeilen in den Code des Expert Advisors ein
Ich setze diese drei Indikatoren auf ein sauberes Diagramm und speichere die Vorlage als Expert Advisor. Das Bild ist in meinem vorherigen Beitrag online.
Ich führe den Expert Advisor im Visualizer aus.
1. Die gespeicherte Vorlage anzeigen
2. Versuchen Sie, die Visualisierung ohne die Vorlage laufen zu lassen (d.h. löschen Sie die entsprechende tpl-Datei vorher). In der neuesten Version 555 sollten die automatisch hinzugefügten benutzerdefinierten Indikatoren korrekt angezeigt werden.
Alles funktioniert. Ich danke Ihnen.
Die Vorlage wurde entfernt. Von Experten in OnInit() vorgeschrieben:
Übermittlung der *.tpl-Datei
Jetzt wieder mit Vorlage versucht - funktioniert nicht. Entfernen Sie die Vorlage - es funktioniert.
x100intraday:
Denken Sie darüber nach und sagen Sie mir, ob es sich lohnt, zu glauben, dass dort alles einfach ist und scheinbar offensichtliche Lösungen vorgeschlagen werden?
alle Genies sind einfach.
Den Rest konnte ich nicht machen. Die Anekdote über die Frage im Forum, wie man Mandeln entfernt, erinnert mich daran :)
Ich bin nicht sicher, wie ich es machen soll... Ich bin nicht sicher, wie ich es machen soll.
alle Genies sind einfach.
Den Rest konnte ich nicht machen. Die Anekdote über die Frage im Forum, wie man Mandeln entfernt, erinnert mich daran :)
Das Beispiel des imho orthodoxen Indikators Fraktale begrenzt. vielleicht hilft es ja...
Nächster Code:
Ausgänge:
2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) andere = {123, 456}
Die Initialisierungsliste hat also nicht funktioniert, es ist Müll in der Struktur. Ist dies ein Fehler oder nicht?
Ich habe zwei Agenten von der Cloud getrennt und sie verbinden sich immer noch alle 30 Sekunden mit den Cloud-Servern.
MO 0 Netzwerk 00:00:17 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
LK 0 Netzwerk 00:00:47 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RG 0 Netzwerk 00:01:17 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NS 0 Netzwerk 00:01:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RO 0 Netzwerk 00:02:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
OK 0 Netzwerk 00:02:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
MG 0 Netzwerk 00:03:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
DR 0 Netzwerk 00:03:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
DN 0 Netzwerk 00:04:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
EJ 0 Netzwerk 00:04:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
GF 0 Netzwerk 00:05:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RR 0 Netzwerk 00:05:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NN 0 Netzwerk 00:06:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
KJ 0 Netzwerk 00:06:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
QF 0 Netzwerk 00:07:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
HQ 0 Netzwerk 00:07:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
PM 0 Netzwerk 00:08:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
QI 0 Netzwerk 00:08:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
KE 0 Netzwerk 00:09:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
NQ 0 Netzwerk 00:09:51 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
OM 0 Netzwerk 00:10:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
RI 0 Netzwerk 00:10:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
LE 0 Netzwerk 00:11:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
EP 0 Netzwerk 00:11:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
IL 0 Netzwerk 00:12:18 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
HH 0 Netzwerk 00:12:48 verbunden mit 2.agents.mql5.com (über einen Proxy-Server 192.168.0. )
FD 0 Netzwerk 00:13:18 verbunden mit 2.agents.mql5.com (über einen Proxyserver)
Ich habe zwei Agenten von der Cloud getrennt und sie verbinden sich immer noch alle 30 Sekunden mit den Cloud-Servern.
Lassen Sie uns zu servicedesk gehen.
Bitte klären Sie, wie genau Sie die Verbindung getrennt haben? Haben Sie die Dienste gelöscht (eingefroren)? Bitte fügen Sie die Protokolle der Problem-Agenten bei.
Die Proxy-Einstellungen in Ihren Protokollen sind etwas seltsam. Haben Sie die Proxy-Einstellungen in Ihre Agenten-Konfigurationen geschrieben? Bitte fügen Sie der Bewerbung die common.ini Ihres Agentenmanagers bei.