You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实盘中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:12:27