首页 > 解决方案 > 将脚本转换为 V4 时声明自引用变量会破坏图表

问题描述

我将多个脚本组合成一个指标来创建警报,并且正在使用不同版本的脚本,因此我尝试将版本 4 用于所有内容。

我使用的指标之一是 VWAP 标准偏差带指标,它初始化变量如下:

start = security(syminfo.tickerid, "D", time)

newSession = iff(change(start), 1, 0)


vwapsum = 0.0
volumesum = 0.0
v2sum = 0.0
vwapsum := iff(newSession, hl2*volume, hl2*volume + vwapsum[1])
volumesum := iff(newSession, volume, volume + volumesum[1])
v2sum := iff(newSession, volume*hl2*hl2, volume*hl2*hl2 + v2sum[1])

我添加了vwapsum = 0.0和其他初始化,因为否则它会引发错误。这应该在一天开始时开始增加价值,因此频带会在下一个会话开始时逐渐扩展和收缩。但是,当我在市场开盘时应用指标时,我正在收缩。

在这张图片中,您可以看到宫缩。 1. 在每日训练开始时纠正收缩。 2. 打开图表或应用指标时不正确的收缩。 在这张图片中,您可以看到宫缩。1. 在每日训练开始时纠正收缩。2. 打开图表或应用指标时不正确的收缩。

什么是正确的方法来让它正确地绘制图表?这是由于手动将变量设置为 0.0,还是由于 V4 解释 newSession 语句的方式发生了变化?

以下是重现错误的最小可行脚本:

//@version=4

study("VWAP-deviation", overlay=true)

devUp1 = input(title="Stdev above", type=input.float, defval=2.0)
devDn1 = input(title="Stdev below", type=input.float, defval=2.0 )

start = security(syminfo.tickerid, "D", time)
newSession = iff(change(start), 1, 0)

vwapsum = 0.0
volumesum = 0.0
v2sum = 0.0
vwapsum := iff(newSession, hl2*volume, hl2*volume + vwapsum[1])
volumesum := iff(newSession, volume, volume + volumesum[1])
v2sum := iff(newSession, volume*hl2*hl2, volume*hl2*hl2 + v2sum[1])

myvwap = vwapsum/volumesum
dev = sqrt(max(v2sum/volumesum - myvwap*myvwap, 0))

plot(myvwap, title="VWAP", color=color.green)
plot(myvwap + devUp1 * dev, title="VWAP Upper", color=color.red)
plot(myvwap - devDn1 * dev, title="VWAP Lower", color=color.red)

标签: pine-script

解决方案


你的意思是这样的吗?

//@version=4
study("VWAP-deviation", overlay=true)

devUp1 = input(title="Stdev above", type=input.float, defval=2.0)
devDn1 = input(title="Stdev below", type=input.float, defval=2.0 )

var float   vwapsum     = na
var float   volumesum   = na
var float   v2sum       = na

newSession = change(time('D'))

vwapsum     := newSession ? hl2*volume          : hl2*volume            + vwapsum[1]
volumesum   := newSession ? volume              : volume                + volumesum[1]
v2sum       := newSession ? volume * pow(hl2,2) : volume * pow(hl2,2)   + v2sum[1]

myvwap      = vwapsum/volumesum
dev         = sqrt(max(v2sum/volumesum - pow(myvwap,2), 0))

plot(newSession ? na : myvwap               , title="VWAP",       color=color.green, style=plot.style_linebr)
plot(newSession ? na : myvwap + devUp1 * dev, title="VWAP Upper", color=color.red,   style=plot.style_linebr)
plot(newSession ? na : myvwap - devDn1 * dev, title="VWAP Lower", color=color.red,   style=plot.style_linebr)

推荐阅读