Pine Script技术问题:如何从滞后确定的日期开始绘制指标?
Pine Script 回溯绘制指标问题解决方案
问题1:plot函数结合三元运算符能否实现回溯绘制?
是的,确实无法实现。Pine Script采用逐K线顺序执行逻辑,plot()的输出仅依赖当前及已处理过的K线数据。而季度最高成交量K线需等整个季度结束才能确定,此时该季度内的历史K线已完成处理,无法通过三元运算符回溯修改plot()在这些K线上的输出——三元运算符只能控制当前及后续K线的显示状态,无法补绘已处理K线的指标内容。
问题2:line.new是否是唯一替代方案?
不是唯一方案,除line.new()外,还有两种可规避数量限制的思路:
- 复用line对象:无需为每个季度新建line,在新季度开始时删除旧的line实例,再创建新线条。这种方式始终只保留当前生效的线条,不会触发50-500条的数量上限。
- 数组存储+plot补绘:提前将每个季度目标K线的索引存入数组,同时把对应周期内的指标值也存储在数组中。当运行到后续K线时,通过
plot()结合数组判断,对历史K线的指标值进行补绘。该方法逻辑稍复杂,但能摆脱line对象的数量限制。
对您计划的优化建议
您提出的A-B-C方案具备可行性,可补充以下优化点:
- 步骤B中,用
var变量存储目标K线的索引/日期,后续所有K线只要索引大于等于目标值,就通过plot()输出指标,保证从目标K线到当前的指标连续显示。 - 步骤C的标注使用
label.new(),配合var变量控制仅在目标K线绘制一次,避免重复创建标注对象。
核心逻辑示例代码
// 初始化变量存储目标K线及指标数据 var int targetBarIndex = na var float[] indicatorValues = array.new_float() // 季度划分判断 isQtrEnd = ta.change(ta.quarter) != 0 // 计算季度内成交量及最高成交量 qtrVolumeSum = ta.sum(volume, ta.barssince(isQtrEnd) + 1) qtrMaxVolume = ta.highest(qtrVolumeSum, ta.barssince(isQtrEnd) + 1) // 季度结束时确定目标K线 if isQtrEnd targetBarIndex = ta.valuewhen(qtrVolumeSum == qtrMaxVolume, bar_index, 0) // 存储目标K线到当前的指标值(按需使用) array.clear(indicatorValues) for i = targetBarIndex to bar_index array.push(indicatorValues, yourCustomIndicator[i]) // 从目标K线开始绘制指标 plot(bar_index >= targetBarIndex ? yourCustomIndicator : na, color=color.blue) // 在目标K线添加标注 if bar_index == targetBarIndex label.new(bar_index, low, "起始K线", color=color.red, textcolor=color.white)
内容的提问来源于stack exchange,提问作者lp6970
相关产品推荐
相关产品推荐

