Veo el error 'Pine no puede determinar la longitud de referencia de una serie. Intente usar max_bars_back'

Cuando se calcula un script de Pine, crea un búfer histórico de cierto tamaño para cada variable o función en el código. Ese búfer contiene información sobre los valores anteriores de la variable/función y se usa cuando el código se refiere a los valores pasados usando el operador de referencia de historial []. El tamaño del búfer especifica hasta qué punto del historial se puede solicitar este valor.

Pine determina automáticamente el tamaño de búfer requerido para todas las variables y funciones analizando las referencias pasadas hechas mientras calcula el script en las primeras 244 barras. Si no se detectan referencias pasadas, se asigna un tamaño de búfer predeterminado a la variable o función. Para las variables, el tamaño de búfer predeterminado es 300 barras, para las funciones es una barra.

En algunos casos, Pine no puede asignar un tamaño de búfer adecuado para esa función y en su lugar se usa el tamaño de búfer predeterminado. Esto puede suceder porque:

  • El valor de la variable var1 no se conoce en el momento de la compilación
  • La variable de prueba no solicita ningún dato pasado en las primeras 244 barras del gráfico.

Debido a esto, a la variable de prueba se le asigna un búfer predeterminado de 300 barras. Cuando el script solicita el valor de la barra 301 en el pasado, que está fuera del búfer de la variable, se produce un error.

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

El parámetro max_bars_back y la función max_bars_back () existen para solucionar este problema. Le permiten especificar el tamaño de búfer correcto para las variables y funciones cuando el búfer predeterminado no es suficiente. Descomente la llamada a la función max_bars_back () en el código anterior. Se asignará un búfer de 301 a la variable de prueba y, como resultado, el script calculará correctamente.

A continuación se muestra un ejemplo de una llamada de función a la que se atribuye el tamaño de búfer de una barra predeterminado porque no se invoca en las primeras 244 barras. Si bien no se utiliza ninguna referencia explícita a valores pasados utilizando el operador [], la función requiere, no obstante, los últimos 20 valores para calcular. Por tanto, el script devolverá el error max_bars_back:

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

La función max_bars_back () no se puede utilizar para asignar un tamaño de búfer específico a una función. Cuando necesite hacerlo, o cuando desee establecer el tamaño de búfer predeterminado para todas las variables y funciones en un script, agregue el parámetro max_bars_back al estudio del script o declaración de estrategia. Tenga en cuenta que el uso del parámetro aumentará el uso de recursos del script, por lo que este método solo debe usarse cuando sea necesario:

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

También puede resolver el problema eliminando la expresión problemática de la rama condicional, en cuyo caso no se requiere el parámetro max_bars_back:

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

El error también puede surgir cuando se utilizan funciones que permiten longitudes dinámicas, es decir, valores de serie. El siguiente script arrojará el error max_bars_back porque durante las primeras 300 barras, sma () se calcula con una longitud de 50 y, por lo tanto, solo solicitó 50 barras de datos históricos, limitando su búfer a 50. Sin embargo, después de la barra 300, la longitud cambió a 100, que está fuera de los límites de su búfer establecido:

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

Para solucionar este problema, puede generar un búfer más grande al comienzo de los cálculos del indicador utilizando un valor de longitud intencionalmente grande. En el siguiente código, solicitamos 1000 barras de datos históricos en la primera barra de los cálculos de nuestro indicador. Esto crea un búfer permanente de 1000 barras para nuestro sma () y, como resultado, nunca nos salimos de los límites:

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


Puede obtener más información sobre max_bars_back y el error relacionado en nuestro Manual de usuario.