MQL5-Fehler bei der Arbeit mit iClose/iOpen-Zeitreihenzugriff usw. - Seite 4

 
Renat Fatkhullin:

Sofort auf den Code und die Arbeit:

  1. Die Funktion CopyXXX in Indikatoren wartet nicht auf das vollständige synchrone Herunterladen von Daten, sondern gibt nur das weiter, was verfügbar ist. Andernfalls würden sich die Indikatoren wirklich verlangsamen.

  2. Es scheint ein Problem mit der Nachverfolgung zu geben, wenn nicht alle Daten beim ersten Mal synchronisiert wurden.
    Es ist notwendig, in einen sanften Modus zu wechseln: "Ich werde vorsichtig auf das erfolgreiche Herunterladen warten". Zum Beispiel wird OnCalculate nicht aufgerufen.

  3. Der Nachteil ist, dass die globale Initialisierung mit der maximalen Last in OnInit platziert wird, wo der Indikator eine sehr lange Zeit zum Zählen und Warten benötigt.
    In diesem Fall wird die Aktualisierung der Charts dieses Symbols blockiert und viele andere Teilnehmer müssen warten und erhalten keine neuen Daten. Der Indikator sollte keine Ressourcen für eine lange Zeit in Anspruch nehmen. Es ist besser, die lange Initialisierung Schritt für Schritt/Symbolinitialisierung in OnCalculate zu strecken und Schritt für Schritt zu zählen.

  4. Ich habe diesen Indikator etwa 800 MB an historischen Daten über das Netzwerk zur Synchronisierung übertragen lassen.

  5. Der Indikator hat 512 Zeichenlinien, für die explizit Speicherplatz zugewiesen wird. Das ist extrem teuer. Es werden nur 100 Zeilen verwendet.

  6. Der Code ist schlecht lesbar

1. ja, deshalb muss ich sie mehrmals mit einer Pause aufrufen, oder den Indikator mehrmals manuell neu starten, aber auch das hilft nicht immer und der Indikator hört nach einiger Zeit auf zu rechnen

2. ich gebe zu, dass die derzeitige Version nicht optimal ist; ich habe verschiedene Varianten ausprobiert, einschließlich der in der Dokumentation empfohlenen Funktion (Abschnitt "Organisieren des Zugriffs auf Daten"); in der letzten Version habe ich es etwas vereinfacht, und es ist wahrscheinlich auch nicht optimal, iBarShift-Funktionen oft aufzurufen, aber andererseits, wenn man sie ablehnt, muss man eine spezielle Funktion erstellen, um synchronisierte Daten vorzubereiten, die ich noch nicht schreiben kann, das ist sehr umständlich, und es gibt keine Standardfunktion, außerdem, wenn die Sprache eine Standardfunktion hat, um die Zeit n

3. onInit definiert nur Portfoliokombinationen und weist Puffer zu, keine Anfragen in OnInit. Optional habe ich versucht, Charts aller M1-Instrumente im Hintergrund zu öffnen, um das Verschwinden des Caches zu verhindern, und es scheint zu helfen, natürlich bei maximaler Last ist alles schrecklich, 28 Charts... Die erste Datenanforderung erfolgt in OpsCalculate, wo ich CopyClose in einer Schleife mit Pause (RequestData-Funktion) aufrufe, damit die Daten zwischengespeichert werden und alle Instrumente gesammelt werden können, und dann kommt der Aufruf (SetupIntervals, CalculateEquity und andere), und ich dachte, dass auf diese Weise alle Daten bereit sind und alle Aufrufe von iBarShift und iClose und anderen nützlichen Funktionen zwischengespeicherte Daten zurückgeben, aber es funktioniert irgendwie nicht immer

4. das müssen 800 MB Tickdaten sein...? Aber ich weiß nicht, wie ich sonst ein Bündel von Portfolios mit 28 Instrumenten bilden könnte, sie sollten sowieso angefordert werden, in mt4 gab es kein Problem damit (wahrscheinlich, weil alle Zeitrahmen in mt4 separat existieren)

5. die Sache ist die, dass der Indikator davon ausgeht, dass eine Menge von Portfolio-Kombinationen beteiligt sein können, jetzt gibt es eine voreingestellte Kombination mit 420 Zeilen + Service-Linien (alle Arten von Stäben, Kanäle, etc.), theoretisch kann der Benutzer alle 512 Zeilen anfordern, die Anzahl der Puffer kann nicht im Voraus mit #property indicators_buffers begrenzt werden, weil es unbekannt ist, wie viele vom Benutzer angefordert werden, in mt4 ist es bei maximaler Belastung verzögert, aber funktioniert

6. ich werde sie gegebenenfalls kommentieren.


P.S. Ich dachte, Sie hätten vielleicht die falsche Version heruntergeladen, denn ich habe beim ersten Mal einen Fehler gemacht und eine andere Version gepostet, dann aber den Anhang korrigiert.

P.P.S. Ich möchte die Gelegenheit nutzen, um die Funktionalität der synthetischen Charts zu klären, wird diese Funktionalität irgendwie entwickelt werden? Zum Beispiel möchte ich nicht nur die Formel Indizes zu tun, sondern um den Kauf / Verkauf Position einer Gruppe von Instrumenten zu simulieren, jetzt ist es schwer zu tun, weil ich eine umständliche Formel für den Punktwert und Kontraktgröße zu schreiben haben, und der Punktwert nicht auf die Geschichte ändern ...

 

Renat Fatkhullin:

Der Indikator sollte keine Ressourcen für eine lange Zeit in Anspruch nehmen. Es ist besser, die lange Initialisierung gleichmäßig auf eine schrittweise/Zeicheninitialisierung in OnCalculate zu strecken, indem man in Stücken rechnet.

Es ist klar, um andere Programme im Terminal nicht zu verlangsamen, aber es gibt einen Widerspruch: Bei der Berechnung des Portfoliomodells braucht der Indikator alle Datenzeilen auf einmal, weil das Eigenkapital des Portfolios durch sie berechnet wird, d.h. er kann nichts ohne die fertigen Daten berechnen, und das Portfolio braucht alle Komponenten auf einmal, und wenn es mehrere Portfolios gibt und wenn der Vergleich oder die Summierung der Portfolios durchgeführt wird, dann braucht er alle Portfolios, und dann ist es nicht sehr dehnbar - es ist kein Schiebefenster, das in Teilen berechnet werden kann, hier wird zuerst die Berechnung durchgeführt - Deshalb habe ich die Frage nach einer universellen Standardfunktion gestellt, die ein Array mit synchronisierten Daten korrekt für die Berechnung vorbereitet.

 
Vladimir Karputov:

Heruntergeladen von

Es ist jetzt 18.10 und alles funktioniert.


Ich gratuliere Ihnen, Sie hatten Glück und haben nicht die richtige CPU, den richtigen Speicher, das richtige Betriebssystem oder was auch immer... aber das macht den Fehler nicht unwirklich.

Es ist real, und es passiert nicht nur mir.

 
transcendreamer:

Das ist verständlich, um andere Programme im Terminal nicht zu verlangsamen, aber es gibt einen Widerspruch: Bei der Berechnung des Portfoliomodells benötigt der Indikator alle Datenzeilen auf einmal, weil das Eigenkapital des Portfolios mit ihnen berechnet wird, d.h. ohne fertige Daten ist es unmöglich, irgendetwas zu berechnen, und das Portfolio benötigt alle Komponenten auf einmal, und wenn es mehrere Portfolios gibt und wenn es einen Vergleich oder eine Summierung zwischen Portfolios gibt, dann für mehrere Portfolios, und dann kann es sich nicht strecken, weil es kein gleitendes Fenster ist, das in Teilen berechnet werden kann, hier wird zuerst die Berechnung gemacht - Deshalb habe ich die Frage nach einer universellen Standardfunktion gestellt, die ein Array mit synchronisierten Daten korrekt für die Berechnung vorbereitet.

Das ist der entscheidende Fehler. Ich habe das gleiche Problem.

Die Berechnung und Anzeige funktioniert sofort in mt4, aber es gibt kein Problem mit Indikatoren in mt5, während alle Charts, die ich brauche, um die Preise zu erhalten, sind immer offen. Es stellt sich heraus, dass ich nur einfache Indikatoren schreiben kann, wie Single-Buffer-MAs(

 

Es liegt definitiv ein Fehler vor:

1) Server 2012 (build 9200) auf Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Speicher: 3033 / 3839 Mb, Festplatte: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Virtuelle Version (cpu64-rhel6), Speicher: 1340 / 2047 Mb, Festplatte: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

Es liegt definitiv ein Fehler vor:

1) Server 2012 (build 9200) auf Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Speicher: 3033 / 3839 Mb, Festplatte: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, QEMU Virtuelle Version (cpu64-rhel6), Speicher: 1340 / 2047 Mb, Festplatte: 15 / 28 Gb, GMT+2

Das habe ich:

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Arbeitsspeicher: 469 / 8182 Mb, Festplatte: 96 / 148 Gb, GMT+2

 
transcendreamer:

Das ist verständlich, um andere Programme im Terminal nicht zu verlangsamen, aber es gibt einen Widerspruch: Bei der Berechnung des Portfoliomodells benötigt der Indikator alle Datenzeilen auf einmal, weil das Eigenkapital des Portfolios mit ihnen berechnet wird, d.h. ohne fertige Daten ist es unmöglich, irgendetwas zu berechnen, und das Portfolio benötigt alle Komponenten auf einmal, und wenn es mehrere Portfolios gibt und wenn es einen Vergleich oder eine Summierung zwischen Portfolios gibt, dann für mehrere Portfolios, und dann kann es sich nicht strecken, weil es kein gleitendes Fenster ist, das in Teilen berechnet werden kann, hier wird zuerst die Berechnung gemacht - Deshalb habe ich die Frage nach einer universellen Standardfunktion gestellt, die ein Array mit synchronisierten Daten korrekt für die Berechnung vorbereitet.

Sie sollten den Indikator in dem Bewusstsein schreiben, dass Sie nicht alles auf einmal bekommen werden.

In OnInit sollten Sie das Laden der Historie der benötigten Instrumente durch einzelne Aufrufe von CopyXXX anregen, aber Sie müssen auf die vollständige Initialisierung in OnCalculate warten.

Ihre Initialisierungsphase scheint einen Fehler zu haben - Sie warten fälschlicherweise auf Daten und blockieren.

 
Renat Fatkhullin:

Setzen Sie den Code in die Tat um. So weit, so gut.

Übrigens: Datei ohne Körper.

In 2 Stunden ist alles in Ordnung, der Timer tickt in den Kommentaren mit dem richtigen Datum.
 
Vitaly Muzichenko:

Dies ist der entscheidende Fehler. Ich habe das gleiche Problem.

In mt4 funktioniert die Berechnung und Anzeige sofort, aber in mt5 gibt es ein komplettes Problem mit Indikatoren, obwohl alle Charts, von denen Sie Preise erhalten möchten, immer offen sind. Es stellt sich heraus, dass ich nur einfache Indikatoren schreiben kann, wie Single-Buffer-MAs(

Wenn ich nach einem anderen Weg suche, um die von Ihnen benötigte Tabelle zu erhalten, sehe ich keine universelle und bequeme Möglichkeit, dies zu tun. Ich verstehe, dass alles auf die Geschwindigkeit des Terminals und der darin enthaltenen Programme ausgelegt ist.

 
Vitaly Muzichenko:

Dies ist der entscheidende Fehler. Ich habe das gleiche Problem.

In mt4 funktioniert die Berechnung und Anzeige sofort, aber in mt5 gibt es ein komplettes Problem mit den Indikatoren, obwohl alle Charts, von denen Sie die Preise erhalten möchten, immer geöffnet sind. Es stellt sich heraus, dass ich nur einfache Indikatoren schreiben kann, wie z. B. Single-Buffer-MAs(

Ich muss mir den Code ansehen.

Hier im obigen Code gibt es eindeutig eine Reihe von logischen und Ressourcenproblemen.