Pine Script技术问题:无法从line1终点K线开盘价绘制line2
Pine Script v6 绘制line2起点开盘价错误排查方案
核心问题排查方向
- 检查
line.new()的起点价格参数:如果直接用当前K线的open,但line1结束的信号是在之前的K线触发的,就会取错开盘价。必须用ta.valuewhen()精准定位到信号触发K线的开盘价,比如ta.valuewhen(信号条件, open, 0),第三个参数0表示取最近一次信号触发时的对应值。 - 核对
ta.valuewhen()参数顺序:别把「条件表达式」和「要获取的价格」写反,正确格式是ta.valuewhen(触发条件, 目标价格, 偏移量)。 - 确认信号触发时机:如果信号是在K线收盘后才确认的(比如用
close判断突破),要保证ta.valuewhen()对应的是信号触发的那根K线,而非当前K线。
- 检查
修正示例代码
假设line1结束的信号是line1End = crossover(ta.sma(close,50), ta.sma(close,200)),正确绘制line2的代码如下:// 存储信号触发K线的开盘价 var float targetOpen = na if (line1End) targetOpen := ta.valuewhen(line1End, open, 0) // 在信号触发时绘制line2 if (line1End) line.new(bar_index, targetOpen, bar_index + 10, close, color=color.blue, width=2)也可以直接在
line.new中调用ta.valuewhen,省去中间变量:if (line1End) line.new(bar_index, ta.valuewhen(line1End, open, 0), bar_index + 10, close, color=color.blue, width=2)额外排查细节
- 变量声明:存储开盘价的变量必须用
var声明,否则每根K线都会重置变量值,导致无法保留信号触发时的开盘价。 - 回测状态影响:如果绘制逻辑只在
barstate.islast时执行,可能会因回测时的K线数据加载问题导致取价错误,建议在信号触发的即时K线执行绘制。
- 变量声明:存储开盘价的变量必须用
内容的提问来源于stack exchange,提问作者Роман Костюк
相关产品推荐
相关产品推荐

