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.
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:
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:
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:
study("Requires max_bars_back")
test = 0.0
vwma20 = vwma(close, 20)
if bar_index > 1000
test := vwma20
plot(test)
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))
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.