TradingView Pine Script如何实现历史紫色POC线条持续延伸?
核心问题根因
- 现有脚本仅用单个
p_poc变量存储最新的前一日POC值,每次跨交易日p_poc都会被更新为新价格,历史pdPOC对应的旧价格值会被直接覆盖,没有对应的系列值支撑旧线。哪怕开启trackprice,也只会跟随最新的p_poc值,旧历史线会在p_poc更新的位置直接断开消失,无法持续右伸。 - 原有plot传参逻辑存在偏差:把
change(p_poc) ? na : color.purple写在颜色参数位置,仅控制线的显示颜色,没有修改plot的核心系列值(第一个传入参数)。p_poc跳变时,旧价格位置的系列值会被新值替换,旧线没有留存基础。 - Pine v4的
trackprice生效规则为:当plot的系列值在某根bar上输出固定非空价格,且后续该系列值不再跳变时,才会从这根bar开始把固定价格线一直拉到图表最右边缘。单个plot的系列值会跟随p_poc不断跳变,天然无法留存多条历史价格线。
实现持续延伸的修改方案
- 替换单变量p_poc逻辑,用两个数组分别存储每一个历史pdPOC的价格、以及该pdPOC被锁定的bar位置,限制数组长度避免触发Pine运行时内存上限(通常最多存30-50条历史线即可满足使用需求)。
- 利用Pine v4静态编译的特性,预先声明固定数量的plot,每个plot对应数组中存储的一条历史pdPOC。每个plot的系列值逻辑为:当当前bar索引超过该pdPOC被锁定的位置时,输出对应的固定pdPOC价格,否则输出na。
- 给所有对应历史pdPOC的plot开启
trackprice=true属性,让每条线从自己被锁定的bar位置开始,持续向右延伸到图表最右侧。 - 保留原有的最新pdPOC标签绘制逻辑,对应数组里最新存储的pdPOC值即可。
核心修改代码片段
// 原有d_poc计算逻辑全部保留 d_poc := poc_index * tick_size + a_min // 新增:历史pdPOC存储逻辑,最多保留30条 var array<float> pdPOC_list = array.new_float() var array<int> pdPOC_time = array.new_int() if is_new_bar(dtf) // 新交易日启动时,锁定前一日的最终POC值和对应bar位置 array.unshift(pdPOC_list, d_poc[1]) array.unshift(pdPOC_time, bar_index[1]) // 超出最大存储数时移除最早的记录,避免内存超限 if array.size(pdPOC_list) > 30 array.pop(pdPOC_list) array.pop(pdPOC_time) // 替换原有单条plot逻辑,逐一生成对应历史pdPOC的独立plot // 最新的pdPOC线 plot(bar_index >= nz(array.get(pdPOC_time, 0), bar_index + 1) ? array.get(pdPOC_list, 0) : na, "pdPOC_Latest", color=color.purple, trackprice=true, offset=0) // 上一交易日的pdPOC线,透明度调低避免视觉杂乱 plot(bar_index >= nz(array.get(pdPOC_time, 1), bar_index + 1) ? array.get(pdPOC_list, 1) : na, "pdPOC_History1", color=color.new(color.purple, 80), trackprice=true, offset=0) plot(bar_index >= nz(array.get(pdPOC_time, 2), bar_index + 1) ? array.get(pdPOC_list, 2) : na, "pdPOC_History2", color=color.new(color.purple, 80), trackprice=true, offset=0) // 按照上述格式,重复写满需要的30条历史线plot即可 // 保留原有标签逻辑,仅绑定最新pdPOC plotshape(array.size(pdPOC_list) > 0 ? array.get(pdPOC_list, 0) : na, style=shape.labeldown, location=location.absolute, color=color.purple, textcolor=color.white, show_last=1, text="pdPOC", offset = offset_val, transp=20, title="pdPOC")
内容的提问来源于stack exchange,提问作者frien_dd
相关产品推荐
相关产品推荐

