Знаете ли вы, как исправить аргумент функции безопасности, чтобы он не имел побочных эффектов?

#tradingview-api

Вопрос:

Этот сценарий представляет собой средство проверки, которое идентифицирует активы, нарушающие верхнюю или нижнюю линию регрессии

Я уже несколько дней пытаюсь заставить скрининг работать, но безуспешно.

Проблема в том, что мы не можем поместить «line.new» в систему безопасности

Каждый раз, когда я пытаюсь найти решение, я получаю ошибку.

Вот основная ошибка: аргумент «выражение» функции безопасности не должен иметь побочных эффектов. Спасибо

 //@version=4
study("Screener and RegLine", shorttitle="Screener amp; RL", overlay = true)
resolution = input(title="Screener Resolution", type=input.resolution, defval="15")

// Symbol
t1  = input(title= "Ticker 1",   type=input.symbol, defval="BINANCE:BTCUSDTPERP")
t2  = input(title= "Ticker 2",   type=input.symbol, defval="BINANCE:ETHUSDTPERP")
t3  = input(title= "Ticker 3",   type=input.symbol, defval="BINANCE:BCHUSDTPERP")
t4  = input(title= "Ticker 4",   type=input.symbol, defval="BINANCE:XRPUSDTPERP")
t5  = input(title= "Ticker 5",   type=input.symbol, defval="BINANCE:EOSUSDTPERP")




// Regression Line
min  = input(14,minval=4)
max  = input(28)
mult = input(2)
src  = input(close)
cmla = cum(src)
cmlb = cum(cmla[1])
cmlc = cum(src*src)
r(p)=>
    sum = cmlb - cmlb[p]
    a = (p*cmla-sum)
    b = cmla - cmla[p]
    c = cmlc - cmlc[p]
    //----
    num = (a - b*(p 1)/2)/p
    vary = c/p - pow(b/p,2)
    varx = (p*p - 1)/12
    pow(num/sqrt(vary*varx),2)

screenerFunc() =>
    k = 0.,p = 0
    r(p)
    for i = min to max
        c = r(i)
        k := max(c,k)
        p := k == c ? i : p
    den = p*(p 1)/2
    wma = (p*cmla-(cmlb - cmlb[p]))/den
    sma = (cmla - cmla[p])/p
    A = 4*sma-3*wma, B= 3*wma-2*sma

    Var = (cmlc - cmlc[p])/p - pow((cmla - cmla[p])/p,2)
    rmse = sqrt(Var - r(p)*Var)*mult
    n = bar_index
    var line ln = na
    var line up = na
    var line dn = na,
    var label la = na
    transparent = color.new(color.white, 100)
    if n > min
        up := line.new(n[p] 1,A rmse,n,B rmse,extend=extend.right, color=#ffffff,width=2)
        dn := line.new(n[p] 1,A-rmse,n,B-rmse,extend=extend.right, color=#ffffff,width=2)
        la := label.new(n[p] 1,A-rmse,tostring(p),color=transparent, style=label.style_label_up,textcolor=color.gray)
    line.delete(ln[1]),line.delete(up[1]),line.delete(dn[1])
    label.delete(la[1])

    isTrueTop = 0 
    if barstate.islast 
        if high > line.get_price(up, bar_index) 
            isTrueTop := 1 
     

    isTrueBot = 0 
    if barstate.islast 
        if low < line.get_price(dn, bar_index) 
            isTrueBot := 1 
     

    long = isTrueTop
    short = isTrueBot
    R_bull =long
    R_bear = short
    [R_bull,R_bear] 


[R_bull, R_bear] = screenerFunc()

// Security
[R_bull1,R_bear1]   = security(t1,   resolution, screenerFunc())
[R_bull2,R_bear2]   = security(t2,   resolution, screenerFunc())
[R_bull3,R_bear3]   = security(t2,   resolution, screenerFunc())
[R_bull4,R_bear4]   = security(t4,   resolution, screenerFunc())
[R_bull5,R_bear5]   = security(t5,   resolution, screenerFunc())