Frage zum Codebeispiel der Funktion CopyBuffer

 

Guten Tag,

in der Dokumentation zur Funktion CopyBuffer (Link: https://www.mql5.com/de/docs/series/copybuffer) wurde unten ein Codebeispiel
eingefügt, welches das Kopieren eines Buffers veranschaulichen soll. Ich habe ein paar Fragen zu dem Teil, der sich in der OnCalculate Funktion
abspielt und wäre für jede Antwort mehr als dankbar.

Zunächst wird im Beispiel folgende Abfrage durchgeführt:

//--- check if all data calculated
if(BarsCalculated(ma_handle)<rates_total) return(0);

Nun meine erste Frage:

Warum wird hier der Wert 0 zurückgegeben? Aus meiner Sicht wäre es doch sinnvoller, den Wert von prev_calculated zurückzugeben, damit die
bisher berechneten Bars nicht doppelt berechnet werden, oder? Bei 0 müsste dann ja im nächsten Durchlauf alles neu berechnet werden.


Meine nächsten beiden Fragen beziehen sich auf das folgende Fragment:

int to_copy;
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
else {
    to_copy=rates_total-prev_calculated;
    //--- last value is always copied
    to_copy++;
}

In welchem Fall ist es möglich, dass prev_calculated größer ist, als rates_total? Muss dieser Fall überhaupt abgefangen werden?

Was verbirgt sich hinter "last value is always copied"? Warum wird to_copy hier noch einmal inkrementiert? Beinhaltet to_copy zu diesem Zeitpunkt nicht
schon die Anzahl an Bars, die berechnet werden müssen?

Ich bedanke mich jetzt schon für eure Zeit, diesen Post zu lesen und würde mich über jede Antwort freuen!

Viele Grüße

Chris

Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyBuffer
Dokumentation zu MQL5: Zugang zu Zeitreihen und Indikatoren / CopyBuffer
  • www.mql5.com
Zugang zu Zeitreihen und Indikatoren / CopyBuffer - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 

1) "Warum wird hier der Wert 0 zurückgegeben?"

Wenn:

BarsCalculated(ma_handle)<rates_total

wurde nicht alles korrekt berechnet, zB. weil noch nicht alle Daten da sind (Stichwort threadrace), und da Indikatoren kein Sleep(..) kennen, ist das die einzige Möglichkeit etwas zu warten!

2) "In welchem Fall ist es möglich, dass prev_calculated größer ist, als rates_total?"

Was ist wenn auf Seiten des Servers etwas passiert und die Werte neu gesetzt werden?

3) "Warum wird to_copy hier noch einmal inkrementiert"

Ich denke das ist das leidige Problem mit der Null: Wenn prev_calculated == als rates_total dann ist to_copy == 0, dann würde nix kopiert werden

 

Vielen Dank für die Antwort!

Was mir selbst noch zu 3) eingefallen ist:
Es kann ja sein, dass ein neuer Tick stattgefunden hat, ohne das eine neue Bar angebrochen ist.
Für diesen Fall muss natürlich der aktuelle Wert der aktuellsten Bar neu kopiert werden, was
durch das Inkrementieren von to_copy erreicht wird (genau die Sache mit der Null eben).

Grund der Beschwerde: