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.

Home Screener azioni Screener forex Screener cripto Calendario economico Su di noi Caratteristiche Grafico Costi Invita un amico Regolamento Centro di supporto Soluzioni per broker & siti web Widget Librerie grafiche Libreria grafica leggera Blog & Novità Twitter
Profilo Impostazioni profilo Account e fatturazione Amici invitati Coin I miei ticket di supporto Centro di supporto Messaggi Privati Chat Esci