vorher_berechnet

 
Kommentare, die sich nicht auf "Bugs, Bugs, Probleme" beziehen, wurden in diesen Thread verschoben.
 

MT5 Baujahr 1455

Indikator für den Test:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Indikator in das Diagramm einfügen

2. Schließen Sie das Terminal

3. offenes Terminal

Protokoll:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Übersehe ich etwas oder ist es unmöglich, der Variablen prev_calculated zu vertrauen, ich muss die Krücke knacken?

 
Alexander Puzanov:

MT5 Baujahr 1455

Indikator für den Test:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

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 &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Indikator in das Diagramm einfügen

2. Schließen Sie das Terminal

3. offenes Terminal

Protokoll:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Übersehe ich etwas oder ist es unmöglich, der Variablen prev_calculated zu vertrauen, ich muss die Krücke knacken?

Die Variable prev_calculated kann auch ohne History Paging auf 0 zurückgesetzt werden, wenn sich die Prüfsumme geändert hat (dies ist eine ungefähre Antwort von servicedesk).
 
Alexey Kozitsyn:
Die Variable prev_calculated kann auch ohne History-Paging auf 0 zurückgesetzt werden, wenn sich die Prüfsumme geändert hat (dies ist eine grobe Antwort von servicedesk).
Ich hab's. Danke. Also zum Schreiner...
 
Alexander Puzanov:
Ich verstehe. Danke. Also zum Schreiner...
Es gibt keinen Grund zur Übertreibung - ein Null-Ergebnis von prev_calculate ist ein sehr häufiges Ereignis. Die Aufgabe des Programmierers besteht darin, ein solches Ereignis abzufangen und die Indikatorpuffer in einem solchen Fall korrekt auszufüllen. Nicht mehr und nicht weniger.
 
Ilyas:

Operatoren *(Dereferenzierung/Inderektion) und &(Adresse-von) hinzugefügt, keine weiteren Sprachänderungen werden vorgenommen/geplant

Bitte klären Sie die folgenden Punkte:

* Abrufen einer Variablen per Referenz - gilt nur für:

1. Klassenobjekte

2. Objekte strukturieren

3. Grundlegende Typen

Handelt es sich in diesem Zusammenhang nur um rlvalue oder auch um lvalue?

 
Karputov Vladimir:
Die Aufgabe des Programmierers besteht darin, ein solches Ereignis abzufangen

Ich bin also kein Programmierer - meine Aufgaben sind andere. Carpenter, schätze ich - ich werde 'die Krücke benutzen' und denken, dass ich 'das Ereignis auffange'.

Und ich übertreibe nicht, denn der erklärte Zweck dieser Variablen ist es, die

prev_calculated  // обработано баров на предыдущем вызове

Zusätzlich zu diesem Zweck soll es auch eine Änderungsmarkierung in der Historie sein, und es soll einige andere Änderungen verfolgen. All dies ist nützlich, aber wir können es nicht für seinen direkten Zweck verwenden - um zu zeigen, wie viele "Balken beim vorherigen Aufruf verarbeitet wurden" - prev_calculated.

 
Alexander Puzanov:

Ich bin also kein Programmierer - meine Aufgaben sind andere. Carpenter, schätze ich - ich werde 'die Krücke benutzen' und denken, dass ich 'das Ereignis auffange'.

Und ich übertreibe nicht, denn der erklärte Zweck dieser Variablen ist es, die

prev_calculated  // обработано баров на предыдущем вызове

Zusätzlich zu diesem Zweck soll es auch eine Änderungsmarkierung in der Historie sein, sowie einige andere Änderungen, um den Überblick zu behalten. All dies ist nützlich, aber Sie können es nicht für seinen direkten Zweck verwenden - um zu zeigen, wie viele "Balken beim vorherigen Aufruf verarbeitet wurden" - prev_calculated

Und wenn wir einfach den gesamten Indikator neu berechnen, wenn er 0? Das scheint mir die beste Lösung zu sein.
 
Alexander Puzanov:

Ich bin also kein Programmierer - meine Aufgaben sind andere. Carpenter, schätze ich - ich werde 'die Krücke benutzen' und denken, dass ich 'das Ereignis auffange'.

Und ich übertreibe nicht, denn der erklärte Zweck dieser Variablen ist es, die

prev_calculated  // обработано баров на предыдущем вызове

Zusätzlich zu diesem Zweck soll es auch eine Änderungsmarkierung in der Historie sein, sowie einige andere Änderungen, um den Überblick zu behalten. All dies ist nützlich, aber wir können es nicht für seinen direkten Zweck verwenden - um zu zeigen, wie viele Takte im vorherigen Aufruf verarbeitet wurden - prev_calculated

Ist prev_calculated=0, bedeutet dies, dass eine vollständige Neuberechnung durchgeführt werden sollte. Alle Standardindikatoren werden in diesem Fall vollständig neu berechnet.

Was ist nicht klar?

Es heißt, dass sich die Prüfsumme im Laufe der Geschichte geändert hat. Es wäre billiger, den Indikator neu zu berechnen, als herauszufinden, warum sich die Prüfsumme geändert hat.

In der Dokumentation wird ausdrücklich erwähnt, dass

Beachten Sie den Zusammenhang zwischen dem Rückgabewert von OnCalculate() und dem zweiten Eingabeparameter prev_calculated. Der Parameter prev_calculated im Funktionsaufruf enthält einen Wert , der von OnCalculate() beim vorherigenAufruf zurückgegeben wurde.Dies ermöglicht sparsame Algorithmen für die Berechnung des benutzerdefinierten Indikators, um wiederholte Berechnungen für die Balken zu vermeiden, die sich seit dem letzten Aufruf dieser Funktion nicht verändert haben.

Dazu reicht es in der Regel aus, den Wert des Parameters rates_total zurückzugeben, der die Anzahl der Takte im aktuellen Funktionsaufruf enthält. Wenn sich seit dem letzten Aufruf von OnCalculate() die Preisdaten geändert haben (eine tiefere Historie wurde gepumpt oder Historienleerstellen wurden gefüllt), dann wird der Wert des Eingabeparameters prev_calculated vom Terminal auf Null gesetzt.

 
Alexey Kozitsyn:
Wie wäre es, den gesamten Indikator bei 0 neu zu berechnen? Meiner Meinung nach die beste Lösung.
Das ist genau das, was Sie tun sollten: Wenn Sie prev_calculate==0 erhalten, sollten Sie den gesamten Indikator neu berechnen. Da rev_calculate==0 ist in der Regel ein History Swap. Und wenn die Historie vertauscht wird, bedeutet das, dass es neue Balken geben kann, die übersehen wurden oder nicht früher berechnet wurden - d.h. die Indikatorwerte werden bereits falsch sein.
 
Karputov Vladimir:
Das ist genau das, was Sie tun sollten: Wenn prev_calculate==0 empfangen wird, sollten Sie den GANZEN Indikator neu berechnen. Da rev_calculate==0 ist in der Regel ein History Swap. Und wenn die Historie vertauscht wird, kann es neue Balken geben, die übersehen oder nicht früher berechnet wurden - d.h. die Indikatorwerte werden falsch sein.
:) Das ist es, was ich tue...