Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 985

 

do { ... Pufferfüllcode

}

while(diese beiden Werte stimmen nicht überein)

kurz gesagt, die Werte in der Schleife abrufen, bis sie übereinstimmen, und erst dann den folgenden Code ausführen
 
Maxim Dmitrievsky:

do { ... Pufferfüllcode

}

while(diese beiden Werte sind nicht ident isch)

Kurz gesagt, holen Sie sich die Werte in der Schleife, bis sie gleich sind, und führen Sie erst dann den folgenden Code aus

Solange ein Indikator nicht funktioniert, werden die Daten (Fluss) nicht an den anderen Indikator weitergegeben, d.h. die Schleife im Indikator ohneOnCalculate dieses Indikators hilft nicht. Und sobald OnCalculate beendet ist, werden die Daten an den Expert Advisor weitergegeben, und das ist falsch.

Oder vielleicht verstehe ich Ihre Idee nicht.
 
Aleksey Vyazmikin:

Der Punkt ist also, dass solange ein Indikator nicht funktioniert, die Daten (Fluss) nicht an einen anderen übertragen werden, d.h. die Schleife im Indikator ohne Beendigung von OnCalculate dieses Indikators wird nicht helfen.

man empfängt die Werte aus den Puffern der anderen Indikatoren einen nach dem anderen, wenn ihre Zahl nicht gleich ist, holt man sie wieder, bis sie gleich ist, und vergisst die Streams. Aber im Allgemeinen macht das niemand so - es ist sehr langsam

 
Aleksey Vyazmikin:

Der Punkt ist also, dass solange ein Indikator nicht funktioniert, die Daten (Fluss) nicht an einen anderen Indikator weitergegeben werden, d.h. die Schleife im Indikator ohne OnCalculate dieses Indikators wird nicht helfen. Aber sobald OnCalculate beendet ist, werden die Daten an den Expert Advisor weitergegeben, und sie sind fehlerhaft.

Oder ich verstehe Ihre Idee nicht.

die Bedingung muss erfüllt sein, dann werden nur die Puffer gefüllt, so wie ich es verstehe (die Anzahl der Balken in den Puffern der anderen Indikatoren bleibt die gleiche)

alle Bedingungen zwangsweise erfüllen, bevor die Puffer des aktuellen Indikators gefüllt werden

oder an den falschen Programmierer zurückgeben - warum sollten wir seine Probleme auf dem falschen Gebiet lösen?

 
Maxim Dmitrievsky:

man holt sich die Werte aus den Puffern der anderen Indikatoren, einen nach dem anderen, wenn ihre Zahl nicht gleich ist, holt man sie wieder, bis sie gleich ist, vergiss die Streams. aber im Allgemeinen macht das niemand, es ist eine Perversion der Indikatoren von Indikatoren, sehr langsam

Maxim Dmitrievsky:

die Bedingung muss erfüllt sein, dann werden nur die Puffer gefüllt, so wie ich es verstehe (die Anzahl der Balken in den Puffern der anderen Indikatoren bleibt gleich)

Erzwungene Ausführung aller Bedingungen, bevor die Puffer des aktuellen Indikators gefüllt sind

oder dem Programmierer, der ein schlechtes Händchen hat, zurückgeben, warum sollten wir seine Probleme an der falschen Stelle lösen?

Wenn die Berechnung nicht von anderen Indikatoren bereit ist, werden die Werte Null sein, so gibt es keinen Sinn, Force-Fill hier, können Sie die Vergangenheit Daten zu füllen, aber mit dem gleichen Effekt, können Sie Daten nicht für den aktuellen Bar aus dem Indikator, sondern für die Vergangenheit ein, und dann sollte der Code überhaupt nicht geändert werden.

Warum diskutieren wir hier? Weil die Situation im Tester und im realen Konto unterschiedlich ist, die Simulation von Sleep funktioniert sehr seltsam, und die Neuberechnung des Indikators für 15 Sekunden Schlupf erfolgt nur einmal, während sie bei jedem Tick oder auf Anfrage erfolgen muss, und sie erfolgt nicht in 15 Sekunden, sondern in 13, laut dem Protokoll.

Darüber hinaus ist das Problem der Synchronisierung relevant, und es wäre gut, für solche Situationen die Möglichkeit hinzuzufügen, den Indikator über die Notwendigkeit zu informieren, den Datenfluss an andere Indikatoren weiterzuleiten, ohne die es unmöglich ist, weitere Berechnungen durchzuführen - dies wäre eine Lösung - der Befehl, den Fluss an einen anderen Indikator ohne Abschluss der Berechnung weiterzuleiten.

Dementsprechend sollte der Expert Advisor auf die Daten des Indikators warten und Ticks überspringen, bis die Berechnung vollständig abgeschlossen ist; wenn man nun versucht, die "while"-Anweisung zu verwenden, bleibt das Ergebnis der Berechnung hängen (d.h. es passiert nichts, der Tester steht einfach nur da), und das ist auch nicht korrekt.

Ich habe natürlich den Entwickler informiert, aber ich habe seit über einem Monat nichts mehr von ihm gehört - die Kosten der Freiberuflichkeit.

 

die Situation im Tester und im realen Konto ist anders, die Sleep-Simulation funktioniert sehr seltsam, und die Neuberechnung des Indikators für 15 Sekunden Schlupf tritt nur einmal auf, während es bei jedem Tick oder bei Bedarf auftreten sollte, aber es tritt nicht in 15 Sekunden auf, sondern in 13, laut dem Protokoll.

Darüber hinaus ist das Problem der Synchronisierung relevant, und es wäre gut, für solche Situationen die Möglichkeit hinzuzufügen, den Indikator über die Notwendigkeit zu informieren, den Datenfluss an andere Indikatoren weiterzuleiten, ohne die es unmöglich ist, weitere Berechnungen durchzuführen - dies wäre eine Lösung - der Befehl, den Fluss an einen anderen Indikator ohne Abschluss der Berechnung weiterzuleiten.

Dementsprechend sollte der Expert Advisor auf Daten vom Indikator warten und Ticks bis zum Ende der vollständigen Berechnung überspringen, aber jetzt, wenn man versucht, die"while"-Anweisung zu verwenden, um auf die korrekten Ergebnisse der Berechnung zu warten, friert er ein/bleibt stecken (d.h. es passiert nichts, der Tester steht einfach da), und das ist auch nicht korrekt.

 

LieberArtyom Trishkin!

Ich hoffe sehr, dass Sie, da Sie festgestellt haben, dass die obigen Fragen für Anfänger sind, die Antwort bereits kennen und mir helfen können!

Ich warte auf eine Antwort von einem Fachmann.

 
Aleksey Vyazmikin:

LieberArtyom Trishkin!

Ich hoffe wirklich, dass Sie, da Sie festgestellt haben, dass die obigen Fragen für Anfänger sind, bereits die Antwort kennen und mir helfen können!

Ich warte auf eine Antwort von einem Fachmann.

Der einzige Rat, den ich geben kann, ist folgender: Der Indikator sollte OnCalculate() beenden, wenn er nicht die erforderliche Anzahl von Balken für die Berechnung erhalten hat: if(rates_total<Anzahl der_Balken erforderlich) return 0;

Der Expert Advisor sollte die vom Indikator empfangenen Daten prüfen und nur dann Berechnungen mit den empfangenen Daten durchführen, wenn diese nicht mit dem leeren Indikatorwert übereinstimmen.

  1. Im Indikator werden die Puffer zunächst mit einem leeren Wert initialisiert (was das ist, kann im Indikator eingestellt werden)
  2. Überprüfen Sie im Indikator (die Puffer sind bereits mit einem leeren Wert gefüllt) die Anzahl der verfügbaren Balken (siehe oben).
  3. Wenn die Prüfung der Verfügbarkeit der Balken bestanden ist, wird der Berechnungszyklus des Indikators ausgeführt, wobei die Puffer mit den erforderlichen Werten gefüllt werden.
    ... ... ...
  4. Prüfen Sie im Expert Advisor, wie viele Balken vom Indikator berechnet werden (es gibt eine Standardfunktion BarsCalculated())
  5. Daten aus dem Indikator holen
  6. Je nachdem, was wir bekommen - es hängt von der Logik Ihres TS ab
    1. Wenn es sich bei dem Indikator um eine Linie handelt, zeigt sein leerer Wert an, dass er noch nicht berechnet wurde - wir nehmen ihn nicht für Berechnungen her.
    2. Wenn der Indikator - Pfeile, dann gibt es eine andere Logik (weil der leere Wert ist auch seine Arbeitsdaten), zum Beispiel, wenn dies ein Fraktal, dann überprüfen wir die Bar Nummer 3, und aus den erhaltenen Werte zurückschieben.
  7. Beziehen Sie Ihre eigene Logik ein und schieben Sie nicht alles auf die Terminal Bugs.
  8. Zunächst einmal überprüfe ich Bugs bei mir selbst.
  9. Und Sie?
 
Artyom Trishkin:

Ich kann nur raten: der Indikator sollte OnCalculate() verlassen, wenn er nicht die richtige Anzahl von Balken für die Berechnung erhalten hat: if(rates_total<number_of_bars required) return 0;

Vielen Dank für den Tipp, kein Problem mit dem Ausgang, aber es löst die Situation nicht, ich habe als eine gescheiterte Berechnung für jetzt getan

if(barsch!=channel.BarsCalculated())return(counted_bars=rates_total-1);

Und irgendwie füllt es die Puffer und erhält Daten von anderen Indikatoren und Daten werden nicht an den EA übergeben, bis eine Bedingung erfüllt ist. Ich habe die Korrektheit der Daten noch nicht überprüft, aber sie scheinen korrekt zu sein. Oder täusche ich mich vielleicht, und es stimmt tatsächlich etwas nicht?

Artyom Trishkin:

Der Expert Advisor sollte die vom Indikator empfangenen Daten prüfen und nur dann Berechnungen mit den empfangenen Daten durchführen, wenn diese nicht mit dem leeren Indikatorwert übereinstimmen.

Der Expert Advisor führt die Berechnungen jeweils beim Eintreffen eines neuen Balkens durch, bzw. der Versuch, auf den richtigen Wert des Indikators zu warten, führt zum Anhalten des Testers.

Artyom Trishkin:
  1. Im Indikator werden die Puffer zunächst mit einem leeren Wert initialisiert (was das ist - kann im Indikator eingestellt werden)
  2. Überprüfen Sie im Indikator (die Puffer sind bereits mit einem leeren Wert gefüllt) die Anzahl der verfügbaren Balken (siehe oben).
  3. Wenn die Prüfung der Verfügbarkeit der Balken bestanden ist, wird der Zyklus der Indikatorberechnung durchgeführt, indem die Puffer mit den erforderlichen Werten gefüllt werden
    ... ... ...
  4. Prüfen Sie im Expert Advisor, wie viele Balken vom Indikator berechnet werden (es gibt eine Standardfunktion BarsCalculated())
  5. Daten aus dem Indikator holen
  6. Je nachdem, was wir bekommen - es hängt von der Logik Ihres TS ab
    1. Wenn es sich bei dem Indikator um eine Linie handelt, zeigt sein leerer Wert an, dass er noch nicht berechnet wurde - wir nehmen ihn nicht für Berechnungen her.
    2. Wenn der Indikator - Pfeile, dann gibt es eine andere Logik (weil der leere Wert ist auch seine Arbeitsdaten), zum Beispiel, wenn dies ein Fraktal, dann überprüfen wir die Bar Nummer 3, und aus den erhaltenen Werten zurückschieben.
  7. Beziehen Sie Ihre eigene Logik ein und schieben Sie nicht alles auf die Terminal Bugs.
  8. Als erstes prüfe ich bei mir selbst auf Fehler.
  9. Und Sie?

1. Es ist wahr.

2. und so geschieht es. Diese Berechnung wird beim nächsten Tick korrekt sein, aber ich möchte die korrekte Berechnung beim ersten Tick erhalten, da Expert Advisor in der Schleife nicht auf weitere Ticks wartet oder die Erwartung nicht mit meiner Geduld vereinbar ist, d.h. sie ist nicht realistisch - es gibt einen Fehler.

3.

4. Ja, natürlich.

5. Ja, das tun wir, aber der Indikator muss Daten von anderen Indikatoren erhalten, und das ist das Problem!

6. 1-2. Es ist nicht korrekt, absichtlich falsche Daten in den Indikatorpuffer einzugeben, da dies die Erkennung von Algorithmusfehlern im Code des Expert Advisors nur erschwert.

7. Ich beschreibe alles logisch, aber ich habe den Indikator nicht geschrieben, daher ist es für mich schwer zu verstehen, woran das liegt. Ich habe die vernünftige Erscheinungsform des Indikators beschrieben, nämlich die Unfähigkeit, eine Berechnung durchzuführen, ohne gepufferte Werte von anderen Indikatoren zu erhalten, aufgrund des Monopols des Datenstroms (Indikatoren werden sequentiell berechnet).

8. Ich habe bereits hier und zuvor darauf hingewiesen, dass ich nicht der Autor bin, ich habe viel Zeit - fast einen Tag - damit verbracht, die Gründe dafür zu ermitteln.

9. Und ich bin auf der Suche nach einer Lösung für das Problem, aber auch, wenn jemand hat mit diesem konfrontiert, kann mir schnell helfen. Ich wiederhole, in diesem Thread begann ich zu schreiben, weil der Schlaf, und dann kam heraus, die anderen Funktionen des Testers, die ich auch glauben, den Fehler.

Vielen Dank für die Antwort.

 
Aleksey Vyazmikin:

Vielen Dank für den Tipp, kein Problem mit der Ausgabe, aber es löst nicht die Situation, ich habe als eine gescheiterte Berechnung so weit gemacht

Und irgendwie füllt es die Puffer und erhält Daten von anderen Indikatoren, die Daten werden nicht an den EA übergeben, bis die Bedingung erfüllt ist. Ich habe die Korrektheit der Daten noch nicht überprüft, aber es sieht korrekt aus. Oder täusche ich mich vielleicht, und es stimmt tatsächlich etwas nicht?

Der Expert Advisor führt die Berechnung allein durch, wenn ein neuer Balken eintrifft, und daher führt der Versuch, auf den richtigen Wert des Indikators zu warten, zum Stillstand des Testers.

1. Das tut es.

Und so ist es auch. 2. Diese Berechnung wird beim nächsten Tick korrekt sein, aber ich brauche eine korrekte Berechnung beim ersten Tick, weil mein Expert Advisor in der Schleife nicht auf weitere Ticks wartet oder die Erwartung nicht mit meiner Geduld vereinbar ist, d.h. sie ist nicht realistisch - es gibt einen Fehler.

3.

4. Ja, natürlich.

5. Ja, das tun wir, aber der Indikator muss Daten von anderen Indikatoren erhalten, und das ist das Problem!

6. 1-2. Es ist nicht korrekt, absichtlich falsche Daten in den Indikatorpuffer einzugeben, da dies die Erkennung von Algorithmusfehlern im Code des Expert Advisors nur erschwert.

7. Ich beschreibe alles logisch, aber ich habe den Indikator nicht geschrieben, daher ist es für mich schwer zu verstehen, woran das liegt. Ich habe die vernünftige Erscheinungsform des Indikators beschrieben, nämlich die Unfähigkeit, eine Berechnung durchzuführen, ohne gepufferte Werte von anderen Indikatoren zu erhalten, aufgrund des Monopols des Datenstroms (Indikatoren werden sequentiell berechnet).

8. Ich habe bereits hier und früher darauf hingewiesen, dass ich nicht der Autor bin, ich habe viel Zeit - fast einen Tag - damit verbracht, die Ursachen zu ermitteln.

9. Und ich bin auf der Suche nach einer Lösung für das Problem, aber auch, wenn jemand hat mit diesem konfrontiert, kann mir schnell helfen. Ich wiederhole, in diesem Thread begann ich zu schreiben, weil der Schlaf, und dann kam heraus, die anderen Funktionen des Testers, die ich auch glauben, den Fehler.

Vielen Dank für die Antwort.

In OnInit() rufen Sie die Zeitreihe des Symbols auf: iTime(Symbol,Timeframe,1);

Fordern Sie gleich zu Beginn in OnTick() den gewünschten Takt der gewünschten Zeitreihe mit der entsprechenden iFunc() an, oder if( iTime(Symbol,Timeframe,10)==0) return;

In diesem Fall wird der Expert Advisor keinen neuen Balken erkennen und auf den nächsten Tick warten.

In OnInit() haben wir die Zeitreihendaten angefordert und damit das Paging der Daten aktiviert.

In OnTick() prüfen wir, ob die minimal erforderliche Historie für den EA verfügbar ist, und wenn sie noch nicht verfügbar ist, warten wir auf den nächsten Tick.

Und bis alle Daten, die der Expert Advisor benötigt, eingegangen sind, wartet er auf den nächsten Tick.

Sobald alle erforderlichen Daten gepumpt und erhalten wurden, beginnt der Expert Advisor mit dem neuen Balken und der erforderlichen Historie zu arbeiten.

Um die seriellen Daten auf dem neuesten Stand zu halten, ist es zwingend erforderlich, dass mindestens alle zwei Minuten ein Zugriff erfolgt. Erstellen Sie einen zweiten Timer für etwa anderthalb Minuten (90 Sekunden) und beziehen Sie sich darin einfach auf eine beliebige Zeitreihe des gewünschten Symbols, z.B. iTime(Symbol,Timeframe,1); Ohne die empfangenen Daten zu überprüfen - "wackeln" Sie einfach mit der Historie. Dann sind alle Daten des Symbols immer auf dem neuesten Stand.