Der Wechsel der TF ist ein Problem

 
Eigentlich ist das Problem, dass der Indikator , der die Linie zeichnet, wenn er die TF ändert, wo die Geschichte noch nicht geladen ist, dann werden die Balken zum Diagramm hinzugefügt, und es berechnet wieder die Daten, bzw., die vorherigen sind auch ausgelassen + Überspringen.
 
Vasyl Nosal:
Das Problem ist nämlich, dass der Indikator , der die Linie zeichnet, wenn er die TF ändert, bei der die Historie noch nicht geladen ist, die Daten berechnet, dann werden die Balken zum Diagramm hinzugefügt, und er berechnet erneut die Daten, bzw. die vorherigen werden auch ausgelassen.

Es liegt also ein Fehler in der Logik des Indikators vor. Beim Laden der Historie ist die ideale Option des Indikators, seinen Zustand zum Zeitpunkt des letzten Balkens, der sich in der Historie nicht verändert hat, zu berechnen und die Daten auf dem aktualisierten Teil der Historie neu zu berechnen.

In der Realität ist diese Option nicht immer möglich, da die Rückgabe der Umgebung des Indikators bei einem bestimmten Balken bedeuten würde, dass die Berechnung vom Anfang der Historie an durchgeführt werden müsste. Daher wird bei komplexen Algorithmen des Indikators eine vollständige Neuberechnung der Historie durchgeführt, wenn auch nur ein Balken geladen wird (nicht zu verwechseln mit der Eröffnung eines neuen Balkens).

 
Vasyl Nosal:
Eigentlich ist das Problem, dass der Indikator , der die Linie an der Änderung der TF, auf die die Geschichte noch nicht geladen ist, berechnet die Daten, dann die Balken in das Diagramm hinzugefügt werden, und es wieder berechnet die Daten, bzw., die vorherigen sind auch links + Überspringen.

Im Indikator sollte in OnCalculate() eine Überprüfung vorgenommen werden:

if(prev_calculated==0)  // значит история изменилась или это первый проход
 
Karputov Vladimir:

Der Indikator in OnCalculate() muss prüfen, ob:

Ich danke Ihnen.

Ich war nur durch die Tatsache verwirrt, dass die Warnmeldungen mir anzeigten, dass die Geschichte in Stücken geladen wurde.

Ja, das ist richtig.

 
Ihor Herasko:

Es liegt also ein Fehler in der Logik des Indikators vor. Beim Laden der Historie ist die ideale Option des Indikators, seinen Zustand zum Zeitpunkt des letzten Balkens, der sich in der Historie nicht verändert hat, zu berechnen und die Daten auf dem aktualisierten Teil der Historie neu zu berechnen.

In der Realität ist diese Option nicht immer möglich, da die Rückgabe der Umgebung des Indikators bei einem bestimmten Balken bedeuten würde, dass die Berechnung vom Beginn der Historie an durchgeführt werden müsste. Daher wird bei komplexen Algorithmen des Indikators eine vollständige Neuberechnung der Historie durchgeführt, wenn auch nur ein Balken geladen wird (nicht zu verwechseln mit der Eröffnung eines neuen Balkens).

Die einzige praktikable Lösung ist also nur?

for(int i=Raten_Gesamt-vorher_berechnet;i>=0;i--)

 
Vasyl Nosal:

Die einzige Lösung, die funktioniert, ist also?

for(int i=Raten_Gesamt-vorher_berechnet;i>=0;i--)

Und wenn ich die Neuberechnung nicht nur für den aktuellen Balken benötige (z. B. 4)?

for(int i=rates_total-prev_calculated+4;i>=0;i--) 

{ 

if(i>Bars) i=Bars; 
 

Ja, es funktioniert.

Wenn Takte in Abschnitten geladen werden, werden sie in Abschnitten neu berechnet.

Das richtige Stück ist nur das letzte, das weiter nach links geladen wird, haha.

 
Vasyl Nosal:

Ja, es funktioniert.

Wenn Takte in Abschnitten geladen werden, werden sie in Abschnitten neu berechnet.

Das richtige Stück ist nur das letzte, das weiter nach links geladen wird, haha.

Zeit zu lernen, wie man Indikatoren schreibt.
 
Victor Nikolaev:
Es ist an der Zeit zu lernen, wie man Indikatoren schreibt

Unterrichte mich.

Und ich sage, dass die Entwickler bei den ersten Berechnungen des Indikators Anpassungen vornehmen sollten.

 
Victor Nikolaev:
Zeit zu lernen, wie man Indikatoren schreibt

Sie wollen einen Trick? Raten Sie mal, was Alert zurückgegeben hat?

int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],
                const double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
  {
  if(prev_calculated!=0) Alert(prev_calculated," M:",Period());
return(rates_total);
  }

 
Vasyl Nosal:

Sie wollen einen Trick? Raten Sie mal, was Alert zurückgegeben hat?

Ich verwende keine Warnmeldungen in Indikatoren. Sehen Sie eine vollständige Neuberechnung vor, wenn eine Historie heruntergeladen wurde. Es ist leicht zu kontrollieren.

Grund der Beschwerde: