如何防止TradingView Pine Script中已生成绘图重绘后自动消失?
Pine Script 实现已渲染绘图永久保留的方案
你遇到的绘图自动擦除是request.security()(旧版为security())开启lookahead_on参数后,未来数据回补触发重绘导致的,要实现绘图一旦渲染就永久保留,可通过以下三种方式组合实现:
- 用
var关键字声明持久化存储结构锁存绘图状态var修饰的变量仅会在脚本首次加载时初始化一次,后续行情更新、脚本重算都不会重置已有值。只要某根K线上触发绘图条件,就将对应位置的绘图状态永久写入持久化结构,后续哪怕跨周期函数返回值因未来数据修正发生变化,锁存的状态也不会被改写,对应的绘图就不会被擦除。
参考实现代码:// 初始化持久化布尔数组存储每根K线的绘图标记状态 var array<bool> permanentPlotFlags = array.new_bool() // 原带lookahead参数的跨周期调用 lookaheadData = request.security(syminfo.tickerid, timeframe.period, close, lookahead = barmerge.lookahead_on) // 自定义绘图触发条件 triggerCond = ta.crossover(close, lookaheadData) // 为新生成的K线补入初始状态 array.push(permanentPlotFlags, false) // 条件触发时永久将对应K线的标记置为true if triggerCond array.set(permanentPlotFlags, bar_index, true) // 仅根据锁存的永久状态绘图,不受后续重算影响 plotshape(array.get(permanentPlotFlags, bar_index), title="永久信号", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small) - 结合K线确认状态过滤实时重绘
实时行情中未收盘K线的价格、跨周期返回值会持续变动,可加入barstate.isconfirmed判断,仅在K线完全收盘、数据不再变动时才判定绘图条件并写入持久化状态,避免实时K线阶段反复渲染、擦除绘图。该方案需要和上述持久化锁存逻辑搭配使用,单独使用无法解决历史K线的重绘擦除问题。 - 偏移跨周期返回值消除未来数据影响
如果必须开启lookahead_on参数获取跨周期数据,可通过历史偏移运算符[]将返回值偏移1根K线,仅使用已经确定的历史跨周期数据做判断:
基于固定不变的历史数据触发的绘图,不会因后续重算被擦除。// 取上一根K线的跨周期lookahead返回值,数据不会随当前K线行情变动 stableCrossData = request.security(syminfo.tickerid, "D", close, lookahead = barmerge.lookahead_on)[1]
注意:以上为重绘场景下保留绘图的兜底实现,规范开发中仍建议优先关闭
lookahead参数、使用无未来函数的逻辑编写指标,从根源上避免重绘问题。
内容的提问来源于stack exchange,提问作者Funso
相关产品推荐
相关产品推荐

