Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 116
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 Fehler lag im Indikator-Handle, das in der OnTick-Funktion erstellt wurde, und die Daten werden auf demselben Tick kopiert. Ich habe es in der Nacht verstanden, jetzt werde ich versuchen, die Indikatoren-Handles in die OnInit-Funktion zu übertragen .
Es hat nicht geklappt. Hier ist der Code jetzt
Im Protokoll erscheinen die folgenden Meldungen
2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0
2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0
2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0
Und das ist immer so. Es scheint kein Kopierfehler vorzuliegen.
Bisher gibt es aber weder eine Prüfung auf erfolgreiche Erstellung von Handles, noch eine Prüfung auf erfolgreiche Berechnung von Indikatoren und eine Prüfung auf Kopieren. Die Idee, die Initialisierung von Handles in OnInit() zu verschieben, ist richtig.
Fügen Sie außerdem die Print(MacdArray[0])-Zeile am Anfang von OnTick() ein, um zu sehen, welcher Wert im Array enthalten ist, bevor Sie mit dem Kopieren von Puffern beginnen.
Zum Hinzufügen. Natürlich kann die Verwendung von GetLastError() nach der eigentlichen Funktion eine Besonderheit des Programmierstils sein. Wenn ich mich nicht irre, bedeutet ein Nullwert von GetLastError() nicht immer, dass die Funktion erfolgreich war.
Bisher gibt es aber weder eine Prüfung auf erfolgreiche Erstellung von Handles, noch eine Prüfung auf erfolgreiche Berechnung von Indikatoren und eine Prüfung auf Kopieren. Die Idee, die Initialisierung von Handles in OnInit() zu verschieben, ist richtig.
tol64:
Aber nur zum ersten Mal. Wenn sich an anderer Stelle im Programm herausstellt, dass ein Handle ungültig ist, müssen Sie versuchen, es erneut zu erhalten. Daher können wir nicht sagen, dass der Code, der für das Abrufen von Handles in OnInit() geschrieben wurde, das Problem vollständig löst und zu 100 % korrekt ist. ))
Ich habe überprüft, wie viele Daten mit der Funktion CopyBuffer kopiert wurden, es wird immer 1 geschrieben, und es gibt keinen Fehler, aber die Daten sind trotzdem falsch.
Ich habe dieses Ergebnis dieses Codes im Testgerät:
//---
Das Einzige, was ich vor dem Test getan habe, war, die Indikatorwerte vor der Ausgabe in das Protokoll umzuwandeln:
Wollen Sie damit sagen, dass die Idee, die Initialisierung des Handlers von OnTick() nach OnInit() zu verschieben , an sich falsch ist?
Ich habe dieses Ergebnis dieses Codes im Testgerät erhalten:
//---
Das Einzige, was ich vor dem Test gemacht habe, war die einfache Konvertierung der Indikatorwerte vor der Ausgabe in das Protokoll:
Und ohne "wenn"? Und in Bezug auf diese besondere Situation? Das Handle des Indikators wurde in der Funktion OnTick bei jedem Tick erstellt, und die Daten werden während desselben Ticks kopiert. Das bedeutet, dass jedes Mal derselbe Indikator-Handle angefordert wurde, ohne dass die Gültigkeit/Ungültigkeit geprüft wurde. Werden Sie vor diesem Hintergrund weiterhin argumentieren, dass die Idee, die Initialisierung von Handles von OnTick() zu OnInit() zu verlagern, per se falsch ist?
PS. Es scheint, dass Sie dem Mann geholfen haben, so dass die Frage als erschöpft betrachtet werden kann.