结合2个松脚本阴影变量问题

问题描述 投票:0回答:1

我目前正在使用Pine-script写策略,这也是我第一次写代码。 在这里我想结合 2 个松脚本。但是这里出现了一些黄色警告。

警告在 410:13 存在于父作用域中的阴影变量“a”。您想使用“:=”运算符而不是“=”吗?

警告在 420:9 存在于父作用域中的阴影变量“l”。您想使用“:=”运算符而不是“=”吗?

我正在尝试使用这个 pine 代码

length = input.int(50, 'Evaluation Window', minval=0, maxval=200)
fcast = input.int(50, 'Forecast Window', minval=1, maxval=200)

fmode = input.string('Similarity', 'Forecast Mode', options=['Similarity', 'Dissimilarity'])
cmode = input.string('Cumulative', 'Forecast Construction', options=['Cumulative', 'Mean', 'Linreg'])
src = input(close)

fcast_col = input.color(#2157f3, 'Forecast Style', inline='fcast_style', group='Style')
fcast_style = input.string('· · ·', '', options=['──', '- - -', '· · ·'], inline='fcast_style', group='Style')

show_area = input.bool(true, 'Show Area', inline='areas', group='Style')
fcast_area = input.color(color.new(#ff5d00, 50), '', inline='areas', group='Style')
corr_area = input.color(color.new(#0cb51a, 50), '', inline='areas', group='Style')
eval_area = input.color(color.new(color.gray, 50), '', inline='areas', group='Style')
//----
var lines = array.new_line(0)
if barstate.isfirst
    for i = 0 to fcast - 1 by 1
        array.push(lines, line.new(na, na, na, na))
//----
n = bar_index
d = ta.change(src)

top = ta.highest(src, length + fcast * 2)
btm = ta.lowest(src, length + fcast * 2)

if barstate.islast
    float val = na
    k = 0
    A = array.new_float(0)
    X = array.new_int(0)
    for i = 0 to fcast * 2 + length by 1
        array.push(A, src[i])
        if cmode == 'Linreg'
            array.push(X, n[i])

    a = array.slice(A, 0, fcast - 1)
    for i = 0 to length - 1 by 1
        b = array.slice(A, fcast + i, fcast * 2 + i - 1)
        r = array.covariance(a, b) / (array.stdev(a) * array.stdev(b))
        if fmode == 'Similarity'
            val := r >= nz(val, r) ? r : val
            val
        else
            val := r <= nz(val, r) ? r : val
            val
        k := val == r ? i : k
        k

    prev = src
    current = src

    for i = 0 to fcast - 1 by 1
        e = d[fcast + k + fcast - i - 1]
        if cmode == 'Mean'
            current := array.avg(a) + e
            current
        else if cmode == 'Linreg'
            a = array.slice(A, 0, fcast)
            x = array.slice(X, 0, fcast)
            alpha = array.covariance(a, x) / array.variance(x)
            beta = array.avg(a) - alpha * array.avg(x)
            current := alpha * (n + i + 1) + beta + e
            current
        else
            current += e
            current

        l = array.get(lines, i)
        line.set_xy1(l, n + i, prev)
        line.set_xy2(l, n + i + 1, current)
        line.set_color(l, fcast_col)

        if fcast_style == '- - -'
            line.set_style(l, line.style_dashed)
        else if fcast_style == '· · ·'
            line.set_style(l, line.style_dotted)

        prev := current
        prev

    if show_area
        box.delete(box.new(n - length - fcast * 2 + 1, top, n - fcast + 1, btm, border_color=na, bgcolor=eval_area)[1])
        box.delete(box.new(n - fcast + 1, top, n, btm, border_color=na, bgcolor=fcast_area)[1])
        box.delete(box.new(n - k - fcast * 2 + 1, btm, n - k - fcast, top, border_color=na, bgcolor=corr_area)[1])
pine-script
1个回答
0
投票

变量

a
首先声明在
if barstate.islast
的范围内。

if barstate.islast
    ...
    a = array.slice(A, 0, fcast - 1)

然后在更深的两层嵌套范围内再次声明它:

if barstate.islast
    ...
    a = array.slice(A, 0, fcast - 1)
    ...
    for i = 0 to fcast - 1 by 1
    ...
        if cmode == 'Mean'
        ... 
        else if cmode == 'Linreg'
            a = array.slice(A, 0, fcast)
            ...

因此,

a
内的
else if cmode == 'Linreg'
是一个新的自变量,遮蔽了上面声明的
a
,即该范围内的
a
的值(
else if
)独立于来自
a
的值在那个范围之外。如果您的意思是与父范围中的变量相同,您可以使用
:=
而不是
=
来告诉编译器这是一个已经存在的变量
a
,无需创建新变量。

您可以将第二个重命名为,例如

a1
在那段代码中,错误将出现:

        else if cmode == 'Linreg'
            a1 = array.slice(A, 0, fcast)
            x = array.slice(X, 0, fcast)
            alpha = array.covariance(a1, x) / array.variance(x)
            beta = array.avg(a1) - alpha * array.avg(x)
            current := alpha * (n + i + 1) + beta + e
            current
© www.soinside.com 2019 - 2024. All rights reserved.