Ich erhalte den Fehler: 'Pine kann die Bezugslänge einer Serie nicht bestimmen. Versuchen Sie es mit max_bars_back'.

Wenn ein Pine-Skript berechnet wird, erstellt es einen historischen Puffer einer bestimmten Größe für jede Variable oder Funktion im Code. Dieser Puffer enthält Informationen über frühere Werte der Variablen/Funktion und wird verwendet, wenn der Code mit Hilfe des historischen [] Referenzierungsoperators auf die vergangenen Werte verweist. Die Größe des Puffers gibt an, wie weit in der Vergangenheit dieser Wert angefordert werden kann.

Pine bestimmt automatisch die erforderliche Puffergröße für alle Variablen und Funktionen, indem frühere Referenzen analysiert werden, die während der Berechnung des Skripts auf den ersten 244 Balken gemacht wurden. Wenn keine früheren Referenzen erkannt werden, wird der Variable oder Funktion eine Standardpuffergröße zugewiesen. Für Variablen beträgt die Standardpuffergröße 300 Balken, für Funktionen einen Balken.

In einigen Fällen ist Pine nicht in der Lage, eine geeignete Puffergröße für diese Funktion zuzuweisen und stattdessen wird die Standard-Puffergröße verwendet. Dies kann passieren: 

  • In Verzweigungen von bedingten Anweisungen (if, iff, or ?), wenn vergangene Verweise auf eine Variable oder Funktion innerhalb der bedingten Anweisung erst dann ausgeführt werden, wenn der 244ste Balken bereits vergangen ist.
  • In Funktionen, die dynamische Länge unterstützen, wenn der Längenwert, der nach dem 244. Balken an die Funktion übergeben wird, größer ist als jeder Wert, der vorher übergeben wurde (als der Puffer berechnet wurde).

Aus diesem Grund wird der Variablen test ein Standardpuffer von 300 Balken zugewiesen. Wenn das Skript den Wert des 301. Balkens in der Vergangenheit anfordert, der sich außerhalb des Puffers der Variable befindet, tritt ein Fehler auf.

//@version=4
study("max_bars_back var",overlay=true)
var1 = input(301)
test = 0.0
//max_bars_back(test, 301)
if bar_index > 244
    test := test[var1]
plot(test)

Um dies zu umgehen, gibt es den Parameter max_bars_back und die Funktion max_bars_back(). Sie ermöglichen es Ihnen, die korrekte Puffergröße für Variablen und Funktionen anzugeben, wenn der Standardpuffer nicht ausreicht. Fügen Sie den max_bars_back()-Function Call im obigen Code ein. Der Testvariablen wird ein Puffer von 301 zugewiesen, und als Ergebnis wird das Skript korrekt berechnet.

Hier ist ein Beispiel für einen Function Call, dem die Standard-Puffergröße von einem Balken zugewiesen wird, weil er nicht in den ersten 244 Balken aufgerufen wird. Obwohl kein expliziter Verweis auf vergangene Werte mit dem Operator [] verwendet wird, benötigt die Funktion dennoch die vergangenen 20 Werte zur Berechnung. Das Skript gibt daher den Fehler max_bars_back zurück:

//@version=4
study("Requires max_bars_back")
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)

Die Funktion max_bars_back() kann nicht verwendet werden, um einer Funktion eine bestimmte Puffergröße zuzuweisen. Wenn Sie dies tun müssen oder wenn Sie die Standardpuffergröße für alle Variablen und Funktionen in einem Skript festlegen wollen, fügen Sie den Parameter max_bars_back der Studien- oder Strategiedeklarationsanweisung des Skripts hinzu. Beachten Sie, dass die Verwendung des Parameters den Ressourcenverbrauch des Skripts erhöht, weshalb diese Methode nur bei Bedarf verwendet werden sollte:

//@version=4
study("Requires max_bars_back", max_bars_back=20)
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)

Sie können das Problem auch lösen, indem Sie den problematischen Ausdruck aus dem bedingten Zweig herausnehmen; in diesem Fall ist der Parameter max_bars_back nicht erforderlich:

//@version=4
study("Requires max_bars_back")
test = 0.0
vwma20 = vwma(close, 20)
if bar_index > 1000
    test := vwma20
plot(test)
Der Fehler kann auch bei der Verwendung von Funktionen auftreten, die dynamische Längen, d. h. Serienwerte, zulassen. Das folgende Skript löst den max_bars_back-Fehler aus, weil sma()während der ersten 300 Balken mit einer Länge von 50 berechnet wird und somit nur 50 Takte historischer Daten anforderte, was seinen Puffer auf 50 begrenzt. Nach dem 300. Balken änderte sich die Länge jedoch auf 100, was außerhalb der Grenzen seines festgelegten Puffers liegt:
//@version=4
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))
Um dieses Problem zu umgehen, können Sie einen größeren Puffer am Anfang der Berechnungen des Indikators erzeugen, indem Sie einen absichtlich großen Längenwert verwenden. Im folgenden Code fordern wir 1000 Balken historischer Daten am ersten Balken der Berechnungen unseres Indikators an. Dies erzeugt einen permanenten 1000-Balken-Puffer für unser sma(), und als Ergebnis gehen wir nie aus dem Rahmen:
//@version=4
study("Not out of bounds")
series_length = bar_index > 300 ? 100 : 50
passed_length = bar_index == 0 ? 1000 : series_length 
plot(sma(close, passed_length))

In unserer Bedienungsanleitung können Sie mehr über max_bars_back und den damit verbundenen Fehler erfahren.