Indikator wird beschädigt - Seite 6

 
Rosh:
Ok, ich werde warten

Nach mehr als 20 Stunden funktioniert der Indikator einwandfrei. Ich weiß nicht, was ich sagen soll.


 

Rosh, Vergrößern/Verkleinern, nach links/rechts scrollen. Auf welcher Plattform testen Sie 64/32 Bit?

 
AnkaSoftware:

Rosh, Vergrößern/Verkleinern, nach links/rechts scrollen. Welche Plattform testen Sie mit 64/32 Bit?

Ich kann das allgemeine Problem auf 32-Bit replizieren. Die einzige Art und Weise, in der das Betriebssystem relevant zu sein scheint, ist die Frage, warum Ihr 64-Bit-System regelmäßig neue Daten am Anfang oder in der Mitte der Balkenhistorie zu erhalten scheint, während Ihr 32-Bit-System (und das 64-Bit-System von RaptorUK) dies nicht tut. Unabhängig davon scheinen Sie zu beabsichtigen, Ihren Indikator an andere Personen weiterzugeben, und Änderungen an der Balkenhistorie sind Probleme, auf die Sie in der Praxis mit Sicherheit stoßen werden, und sei es nur, weil Ihre Benutzer unter Verbindungsabbrüchen beim Broker leiden, die dazu führen, dass bei der Wiederherstellung der Verbindung fehlende Balken in der Mitte der Historie eingefügt werden.

Wie ich bereits zu erklären versucht habe, ist es fraglich, ob dieser "Fehler" in Ihrem Code oder in MT4 liegt. Es gibt eine Erwartung, wie sich Indikatoren in MT4 verhalten sollen, und Ihr Indikator verhält sich nicht so. Wenn Sie zum Beispiel einen neuen Indikator mit MetaEditor erstellen, wird die Zeile "int counted_bars=IndicatorCounted();" eingefügt. Sie entfernen diese Zeile und ignorieren IndicatorCounted().

Ich kann das allgemeine Problem mit dem folgenden Indikator replizieren, der einfach eine Linie zwischen den letzten 10 Bar-Highs zeichnet, wenn er zum ersten Mal gestartet wird:

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

Sie können die gleiche Art von Problem replizieren, indem Sie Folgendes tun:

* Öffnen Sie einen Chart für ein beliebiges Symbol.

* Fügen Sie den Indikator in den Chart ein.

* Schalten Sie "Chart autoscroll" aus (nur um die folgenden Schritte zu vereinfachen; nicht weil es irgendeinen Einfluss auf das Problem hat)

* Gehen Sie zum Anfang des Charts, indem Sie Home drücken.

* Drücken Sie die Taste "Page Up", um das Herunterladen von zusätzlichen Daten zu erzwingen. (Hinweis: Es gibt kein Problem, es sei denn, dem Diagramm werden an dieser Stelle tatsächlich zusätzliche Daten hinzugefügt).

* Gehen Sie zum Ende des Diagramms, indem Sie auf Ende drücken. Die rote Linie zwischen den Höchstständen ist nun nicht mehr an der richtigen Stelle. Sie wurde in der Zeit nach hinten verschoben.

[All dies verdeutlicht nur, was RaptorUK bereits festgestellt hat.]

 

OK, können Sie bestätigen, IndicatorCounted() wird eine -ve Zahl zurückgeben, in diesem Fall der fehlenden Bars / beschädigte Indikatoren? Lassen Sie mich versuchen, die Indikator-Arrays zu reinitialisieren und die Züge von der Lookback-Bar neu zu zeichnen.

 
AnkaSoftware:

OK, können Sie bestätigen, IndicatorCounted() wird eine -ve Zahl zurückgeben, in diesem Fall von fehlenden Bars / korrupte Indikatoren?

Nein, was passiert - wie ich bereits auf Seite 5 gesagt habe, und wie Sie leicht selbst testen können - ist, dass MT4 IndicatorCounted() auf Null zurücksetzt, wenn neue Balken am Anfang der Historie mit einer Methode wie der oben genannten hinzugefügt werden. Dies führt dazu, dass ein normaler Indikator alle seine historischen Werte neu zeichnet, da er normalerweise die Differenz zwischen Bars und IndicatorCounted() verwendet, um zu bestimmen, welche Bars "schmutzig" sind und aktualisiert werden müssen. Wenn IndicatorCounted() gleich Null ist, berechnet der Indikator daher jeden historischen Balken neu, da Bars - 0 = Bars.

Die Dokumentation von IndicatorCounted()(https://docs.mql4.com/customind/IndicatorCounted) enthält ein Beispiel für diese Vorgehensweise, und es gibt alternative Versionen wie https://www.mql5.com/en/forum/132447, die auf eine sehr geringfügig verbesserte Leistung abzielen, da der Standardcode unter https://docs.mql4.com/customind/IndicatorCounted unnötigerweise einen "sauberen" Balken neu berechnet.
 

Das Hinzufügen von IndicatorCounted()-Prüfungen und die Neuinitialisierung der Indikatoren, wenn IndicatorCounted() den Wert 0 zurückgibt, löst das Problem der Verschiebung von Indikatoren, die durch das Einfügen von Verlaufsbalken oder zusätzlichen Balken verursacht wird.

Es gibt jedoch noch ein weiteres Problem der Beschädigung von Indikatoren, das nicht durch das Einfügen von Historien-Balken verursacht zu werden scheint. Beispielcode beigefügt, um das Problem zu reproduzieren, müssen Sie es für 10 + Stunden laufen, bis mindestens zwei Reinitialisierung von Indikatoren dh IndicatorCounted() Rückkehr 0 (post Indikator Start).

Dateien: