实盘中barstate.isnew下Array内容无法保留的问题求助
Pine Script数组实盘状态回滚与varip异常表现解析
问题场景
- 编写了测试数组
push/remove操作的Pine Script v6指标,回测时数组状态可正常传递到下一根K线(添加新元素并移除首个元素),但实盘运行时,新K线出现时数组状态仿佛回滚到之前状态。 - 已尝试删除重建指标、重启浏览器等操作,问题依旧。
- 发现将数组变量用
varip而非var声明后,数组修改能在历史及实盘新K线的执行上下文间保留,但这与官方文档中varip不会在新K线上下文保存内容的描述不符。
测试代码
//@version=6 indicator("My script test unshift array", overlay=true) var t = array.new_int() if barstate.isnew if array.size(t) > 0 log.info('-- at new bar we must see identical entity of the array: ---') for j = t.size() - 1 to 0 log.info('t(' + str.tostring(j) + ')=' + str.format_time(array.get(t, j), 'YYYY-MM-dd HH:mm', 'UTC+3')) array.push(t, time) if t.size() > 3 log.info('removed ' + str.format_time(array.remove(t, 0), 'YYYY-MM-dd HH:mm', 'UTC+3')) log.info('pushed new time=' + str.format_time(time, 'YYYY-MM-dd HH:mm', 'UTC+3')) for i = t.size() - 1 to 0 log.info('t(' + str.tostring(i) + ')=' + str.format_time(array.get(t, i), 'YYYY-MM-dd HH:mm', 'UTC+3')) log.info('-- end of current bar ---')
原因解析
1. var在实盘与回测的差异
var声明的变量会在脚本初始化时创建一次,回测时由于按K线顺序串行计算,每根K线的计算基于上一根K线结束时的状态,因此数组状态能正常传递。但实盘环境中,脚本会在当前K线的每个tick都执行一次,var的修改仅在当前tick的临时上下文中生效;当新K线生成时,系统可能错误加载上一根K线初始状态的快照,而非结束时的最终状态,导致数组看起来回滚。
2. varip的实际行为与文档描述的偏差
官方文档称varip(variable in place)不会在K线之间保存状态,这一描述仅针对历史K线重绘场景——当脚本重绘历史K线时,varip的修改不会影响其他K线的状态。但在实盘连续K线处理中,varip的状态会在当前K线的所有tick更新中保留,并且当新K线生成时,状态会直接传递到新K线的执行上下文,因为实盘的实时上下文是连续的,不存在历史重绘时的上下文隔离。
结论
对于需要在实盘K线之间保留动态集合(数组、字典等)状态的场景,varip反而能实现预期效果,这是Pine Script实盘环境中变量上下文传递逻辑导致的特殊表现,与文档描述的历史重绘场景存在差异。
内容的提问来源于stack exchange,提问作者Eugeny
相关产品推荐
相关产品推荐

