Vejo o erro 'Pine não pode determinar o comprimento de referência de uma série. Tente usar o max_bars_back'

Quando um script Pine é calculado, ele cria um buffer histórico de um determinado tamanho para cada variável ou função no código. Esse buffer contém informações sobre valores anteriores da variável/função e é usado quando o código se refere aos valores anteriores usando o operador de referência a histórico []. O tamanho do buffer especifica até que ponto no histórico esse valor pode ser solicitado.

O Pine determina automaticamente o tamanho do buffer necessário para todas as variáveis e funções, analisando referências anteriores feitas ao calcular o script nas primeiras 244 barras. Se nenhuma referência anterior for detectada, um tamanho de buffer padrão será atribuído à variável ou função. Para variáveis, o tamanho padrão do buffer é 300 barras, para funções é uma barra.

Em alguns casos, Pine não é capaz de atribuir um tamanho de buffer adequado para essa função e o tamanho de buffer padrão é usado em seu lugar. Isto pode acontecer:

  • Nas ramificações de instruções condicionais (if, iff ou ?) quando referências anteriores a uma variável ou função dentro da instrução condicional são executadas pela primeira vez quando a 244ª barra já passou.
  • Nas funções que suportam comprimento dinâmico, quando o valor do comprimento passado para a função após a 244ª  barra é maior que qualquer valor que foi passado para ela antes (quando o buffer estava sendo calculado).

Dê uma olhada no código abaixo. Ele retornará o erro mencionado acima porque:

  • O valor da variável var1 não é conhecido no momento da compilação
  • A variável de teste não solicita nenhum dado passado nas primeiras 244 barras do gráfico

Devido a isso, a variável de teste recebe um buffer padrão de 300 barras. Quando o script solicita o valor da 301ª barra no passado, que está fora do buffer da variável, ocorre um erro.

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

O parâmetro max_bars_back e a função max_bars_back() existem para solucionar esse problema. Eles permitem que você especifique o tamanho correto do buffer para variáveis e funções quando o buffer padrão não é suficiente. Remova o comentário da chamada de função max_bars_back() no código acima. Um buffer de 301 será atribuído à variável de teste e, como resultado, o script será calculado corretamente.

Aqui está um exemplo de uma chamada de função à qual o tamanho padrão do buffer de uma barra é atribuído porque não é chamado nas primeiras 244 barras. Embora nenhuma referência explícita aos valores passados usando o operador [] seja usada, a função requer os 20 valores passados para calcular. O script retornará, assim, o erro max_bars_back:

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

A função max_bars_back() não pode ser usada para atribuir um tamanho de buffer específico a uma função. Quando você precisar fazer isso ou quando desejar definir o tamanho padrão do buffer para todas as variáveis e funções em um script, adicione o parâmetro max_bars_back à declaração de estudo ou declaração de estratégia do script. Observe que o uso do parâmetro aumentará o uso de recursos do script; portanto, esse método deve ser usado apenas quando necessário:

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

Você também pode resolver o problema removendo a expressão problemática da ramificação condicional. Nesse caso, o parâmetro max_bars_back não é necessário:

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

O erro também pode surgir ao utilizar funções que permitem comprimentos dinâmicos, ou seja, valores em série. O seguinte script lançará o erro max_bars_back porque durante as primeiras 300 barras, sma() é calculado com um comprimento de 50, e, portanto, apenas solicita 50 barras de dados históricos, limitando seu buffer a 50. Após a 300ª barra, no entanto, o comprimento mudou para 100, o que está fora dos limites de seu buffer estabelecido:

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

Para contornar este problema, você pode gerar um buffer maior no início dos cálculos do indicador usando um valor intencionalmente grande de comprimento. No código seguinte, solicitamos 1000 barras de dados históricos na primeira barra dos cálculos do nosso indicador. Isto cria um buffer permanente de 1000 barras para nossa sma(), e como resultado nunca saímos dos limites:

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

Você pode aprender mais sobre max_bars_back e o erro relacionado em nosso Manual do Usuário.