Я получаю ошибку 'Pine cannot determine the referencing length of a series. Try using max_bars_back'

Когда вычисляется скрипт, написанный на Pine, он создает исторический буфер определенного размера для каждой переменной или функции в коде. Этот буфер содержит информацию о предыдущих значениях переменной/функции и используется, когда код ссылается на прошлые значения с помощью оператора обращения к истории []. Размер буфера указывает, как далеко в истории может быть запрошено это значение.

Pine автоматически определяет необходимый размер буфера для всех переменных и функций, анализируя прошлые ссылки, сделанные при расчете сценария на первых 244 барах. Если прошлых ссылок не было обнаружено, переменной или функции назначается размер буфера по умолчанию. Для переменных размер буфера по умолчанию составляет 300 баров, для функций - один бар.

Проблема обычно возникает в ветвях условных операторов (if, iff или ?), если ссылки на прошлые значения переменной или функции внутри условного оператора выполняются, когда 244-й бар уже пройден. В таких случаях Pine не сможет определить правильный размер буфера для этой функции, и вместо этого используется размер буфера по умолчанию. Код, данный ниже, вернёт вышеупомянутую ошибку, потому что:

  • Значение переменной var1 на момент компиляции неизвестно
  • Переменная test не ссылается в прошлое на первых 244 барах графика

Из-за этого переменной test назначается буфер по умолчанию, 300 баров. Когда скрипт запрашивает значение 301 бара в прошлом (значени вне этого буфера), возвращается ошибка.

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

Параметр max_bars_back и функция max_bars_back() существуют, чтобы обойти это ограничение. Они позволяют определить конкретный размер буфера для переменных и функций, если буфер по умолчанию не подходит. Раскомментируйте функцию max_bars_back() в коде выше: переменной test будет задан размер буфера 301 и скрипт будет успешно скомпилирован.

Ниже вы можете увидеть пример функции, для которой по умолчанию определяется буфер размером в 1 бар из-за того, что на первых 244 барах она не задействована. Хоть функция не обращается в прошлое непосредственно при помощи оператора [], ей всё ещё требуется 20 прошлых значений для вычисления. Скрипт вернёт ошибку max_bars_back:

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

Функцию max_bars_back() нельзя использовать, чтобы задать конкретный размер буфера для функции. Когда вам нужно это сделать, или когда вы хотите задать всем функциям и переменным в коде конкретный размер буфера, вы можете добавить агрумент max_bars_back к объявлению функций study or strategy. Обратите внимание, что такое увеличит количество потребляемых индикатором ресурсов, так что к этому методу стоит прибегать только при необходимости:

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

Проблему так же можно решить, если убрать проблемное выражение из условной ветки. В таком случае в 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)


Вы можете узнать больше о max_bars_back и данной ошибке в нашем мануале.