почему я получаю ошибку во время выполнения с bar_index?

pine-script #pine-script-v4

#pine-script #pine-script-v4

Вопрос:

 structureLookback   = input(title="Lookback", type=input.integer, defval=7,  group=trs)
targetBarIndex      = input(title="Bar Index", type=input.integer, defval=0,  group=trs)


//bar_index low high


n = bar_index < targetBarIndex ? na : bar_index - targetBarIndex
pivotLowHigh = tradeType == "Long" ? (bar_index < targetBarIndex ? na : low[n]) : bar_index < targetBarIndex ? na : high[n]
    
//Fib Trailing variablen

var Price = 0.0
t_Price = tradeType == "Long" ? highest(high, structureLookback) : lowest(low, structureLookback)

//Berechnung des Fib-Levels

fib_m23 = Price-(Price-pivotLowHigh)*(-0.236)


//Update Price aufgrund von Price Action

if ((bar_index >= targetBarIndex and  targetBarIndex != 0)or targetBarIndex==0)
    //long version
    if (t_Price > Price or Price == 0.0) and tradeType == "Long"
        Price := t_Price
plot(pivotLowHigh, color=color.gray, title="SwingLow")
 

Эта часть функции для получения моего сводного значения с заданным индексом бара работает, но через 10-20 секунд я получаю ошибку во время выполнения.

Pine не может определить ссылочную длину ряда. Попробуйте использовать max_bars_back

почему возникает эта ошибка? и какие-либо предложения, что я должен изменить?

Ответ №1:

Эта статья объясняет это: https://www.tradingview.com/chart/?solution=43000587849

В основном это потому, что вы используете low[n] and high[n] с некоторыми n , которые неизвестны и могут выходить за пределы буфера истории этих переменных. Вы пытались поиграть с max_bars_back параметром?


UPD:

Когда вы вычисляете на столбцах с низким разрешением, ваш номер набора столбцов больше 10001, невозможно использовать что-то вроде low[targetBarIndex] , где targetBarIndex = 10000, потому что максимальная длина истории последовательных переменных равна 10000. Вам нужно переписать свой скрипт.

  1. Я предлагаю вам добавить дополнительное условие, которое заставит ваш скрипт вычислять только вокруг желаемого targetBarIndex ( if bar_index > targetBarIndex and bar_index<targetBarIndex 2 ) , потому что, как я вижу, pivotLowHigh значение вычисляется только в этой области.
 //@version=4
strategy("My Strategy", overlay=false, margin_long=100, margin_short=100, max_bars_back = 5000)
structureLookback   = input(title="Lookback", type=input.integer, defval=7)
targetBarIndex      = input(title="Bar Index", type=input.integer, defval=0)

tradeType = "Long"
// //bar_index low high
var float pivotLowHigh = na
var int n = na

if bar_index > targetBarIndex and bar_index<targetBarIndex 2
    n := bar_index - targetBarIndex
    pivotLowHigh := tradeType == "Long" ? low[n] : high[n]
    
    
//Fib Trailing variablen

var Price = 0.0
t_Price = tradeType == "Long" ? highest(high, structureLookback) : lowest(low, structureLookback)

//Berechnung des Fib-Levels

fib_m23 = Price-(Price-pivotLowHigh)*(-0.236)


//Update Price aufgrund von Price Action

if ((bar_index >= targetBarIndex and  targetBarIndex != 0)or targetBarIndex==0)
    //long version
    if (t_Price > Price or Price == 0.0) and tradeType == "Long"
        Price := t_Price
plot(pivotLowHigh, color=color.gray, title="SwingLow")

 
  1. Второй подход, если вам действительно нужно вычислять прошлые значения в каждом баре, тогда вы можете использовать массивы для high ввода и low значений и вычислять значения из них. Размер массива может быть в 10 раз больше, чем история последовательной переменной.

Комментарии:

1. я пытался использовать его, но не понимаю, как это работает. Существует несколько методов для реализации, какой из них правильный и как мне его правильно использовать?

2. Пожалуйста, предоставьте больше вашего кода, я вам помогу

3. я отредактировал больше кода, спасибо.

4. Обновленный ответ.