我目前正在使用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])
变量
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