Errore 'Pine cannot determine the referencing length of a series. Try using max_bars_back'

Quando uno script Pine viene elaborato, sono creati dei buffer di valori storici per ogni variabile presente nel codice. Questi contengono informazioni relative ai valori passati delle variabili/funzioni e sono usati quando vi si fa riferimento con l'operatore storico []. Di conseguenza, la dimensione dei buffer indica quando indietro nel tempo si può arrivare con ogni valore.

Pine determina automaticamente la dimensione del buffer di ogni variabile/funzione analizzando i riferimenti al passato che si verificano nel calcolo dello script per le prime 244 barre. Se non ce ne sono, viene assegnata una dimensione standard, che per le variabili è di 300 barre, mentre per le funzioni è di 1 barra.

In alcuni casi, Pine non è in grado di assegnare una dimensione adeguata al buffer, pertanto utilizza quella standard. Nello specifico, questo avviene:

  • all'interno di periodi ipotetici (if, iff o ?), quando i riferimenti passati ad una variabile o una funzione inclusa nella condizionale sono eseguiti per la prima volta oltre la 244esima barra.
  • nelle funzioni che supportano un periodo dinamico, quando il valore del periodo passato alla funzione dopo la 244esima barra è maggiore di ogni altro valore passato in precedenza (quando il buffer stava venendo calcolato).

Dai un'occhiata al codice qui sotto, che restituisce l'errore menzionato nel titolo perché:

  • Il valore della variabile var1 non è noto al momento dell'elaborazione
  • La variabile test non fa alcun riferimento al passato nelle prime 244 barre del grafico

Per questi motivi, alla variabile test viene assegnata la dimensione standard di 300 barre, e quando lo script richiede il valore della 301esima, si verifica l'errore. 

//@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)

Per ovviare a tale problematica, esistono il parametro max_bars_back e la funzione max_bars_back(), che permettono di specificare la dimensione corretta per il buffer di una variabile o una funzione, laddove il valore standard non sia sufficiente. Togliendo il // posto davanti a tale funzione nel codice qui sopra, porta ad assegnare un buffer di 301 alla variabile test, così da rendere il calcolo funzionante.

Ecco un esempio di una funzione a cui viene assegnato il valore di default di 1 barra per la mancata invocazione all'interno delle prime 244 barre. Anche se non ci sono riferimenti espliciti ai valori passati con l'operatore [], la funzione richiede gli ultimi 20 valori per essere calcolata. Pertanto, lo script restituirà il messaggio di errore:

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

 La funzione max_bars_back() non può essere usata per assegnare una dimensione precisa al buffer di una funzione. Quando devi farlo, o quando vuoi impostare il valore di default per tutte le variabili e le funzioni di uno script, aggiungi il parametro max_bars_back alla dichiarazione di study o strategy dello script. Considera che l'utilizzo di tale parametro aumenterà l'utilizzo di risorse dello script, quindi dovrebbe essere usato solo se necessario:

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

Potresti anche risolvere l'errore estraendo l'espressione problematica dal periodo condizionale. In tal caso, il parametro max_bars_back non è richiesto:

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

Questo errore può verificarsi anche con l'utilizzo delle funzioni con periodi dinamici (ad es. con serie assegnate al periodo). Il seguente script restituirà l'errore max_bars_back perché nelle prime 300 barre, sma() è calcolato con un periodo di 50, con conseguente richiesta di 50 valori passati (e buffer limitato a 50), mentre dalla 300esima barra in poi il periodo passa a 100, al di fuori del buffer stabilito con i calcoli precedenti:

//@version=4
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))

Per aggirare la problematica, puoi stabilire un buffer più grande sin dall'inizio: nel codice qui sotto richiediamo uno storico di 1000 barre già dalla prima barra, generando di fatto un buffer permanente fissato a 1000 per la sma() ed evitando il ripetersi della circostanza precedente:

//@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))

Puoi saperne di più su max_bars_back e l'errore relativo nel nostro Manuale utente.