如何修复Pine Script脚本,使其在收盘价位置显示ATR趋势线数值?
问题描述
我多次尝试,但无法让ATR趋势线在K线收盘价对应的刻度位置显示数值。如截图所示,数值出现在当前K线实际收盘前较早的位置。希望优化该脚本,实现更清晰的交易入场信号。
原始代码
//@version=5 indicator("Trendlines with Breaks",overlay=true) length = input.int(14) k = input.float(1.,'Slope',minval=0,step=.1) method = input.string('Atr','Slope Calculation Method', options=['Atr','Stdev','Linreg']) show = input(false,'Show Only Confirmed Breakouts') //---- upper = 0. lower = 0. slope_ph = 0. slope_pl = 0. src = close n = bar_index //---- ph = ta.pivothigh(length,length) pl = ta.pivotlow(length,length) slope = switch method 'Atr' => ta.atr(length)/length*k 'Stdev' => ta.stdev(src,length)/length*k 'Linreg' => math.abs(ta.sma(src*bar_index,length)-ta.sma(src,length)*ta.sma(bar_index,length))/ta.variance(n,length)/2*k slope_ph := ph ? slope : slope_ph[1] slope_pl := pl ? slope : slope_pl[1] upper := ph ? ph : upper[1] - slope_ph lower := pl ? pl : lower[1] + slope_pl //---- single_upper = 0 single_lower = 0 single_upper := src[length] > upper ? 0 : ph ? 1 : single_upper[1] single_lower := src[length] < lower ? 0 : pl ? 1 : single_lower[1] upper_breakout = single_upper[1] and src[length] > upper and (show ? src > src[length] : 1) lower_breakout = single_lower[1] and src[length] < lower and (show ? src < src[length] : 1) plotshape(upper_breakout ? low[length] : na,"Upper Break",shape.labelup,location.absolute,#26a69a,-length,text="B",textcolor=color.white,size=size.tiny) plotshape(lower_breakout ? high[length] : na,"Lower Break",shape.labeldown,location.absolute,#ef5350,-length,text="B",textcolor=color.white,size=size.tiny) //---- var line up_l = na var line dn_l = na var label recent_up_break = na var label recent_dn_break = na if ph[1] line.delete(up_l[1]) label.delete(recent_up_break[1]) up_l := line.new(n-length-1,ph[1],n-length,upper,color=#26a69a, extend=extend.right,style=line.style_dashed) if pl[1] line.delete(dn_l[1]) label.delete(recent_dn_break[1]) dn_l := line.new(n-length-1,pl[1],n-length,lower,color=#ef5350, extend=extend.right,style=line.style_dashed) if ta.crossover(src,upper-slope_ph*length) label.delete(recent_up_break[1]) recent_up_break := label.new(n,low,'B',color=#26a69a, textcolor=color.white,style=label.style_label_up,size=size.small) if ta.crossunder(src,lower+slope_pl*length) label.delete(recent_dn_break[1]) recent_dn_break := label.new(n,high,'B',color=#ef5350,textcolor=color.white,style=label.style_label_down,size=size.small) //---- plot(upper,'Upper',color = ph ? na : #26a69a,offset=-length) plot(lower,'Lower',color = pl ? na : #ef5350,offset=-length) alertcondition(ta.crossover(src,upper-slope_ph*length),'Upper Breakout','Price broke upper trendline') alertcondition(ta.crossunder(src,lower+slope_pl*length),'Lower Breakout','Price broke lower trendline')
问题根源与修复方案
核心问题
脚本中多处使用offset=-length和索引偏移操作,导致趋势线、信号标签与实际K线位置错位,最终出现数值显示提前的问题。
关键修改点
- 移除趋势线绘制偏移:删除
plot()函数中的offset=-length参数,让趋势线直接对齐当前K线的收盘价刻度。 - 修正趋势线索引:调整
line.new()的起点/终点索引,确保从确认的枢轴点开始,延伸至当前K线,避免位置错位。 - 调整信号标签位置:修改
plotshape()的偏移参数,让突破标签精准显示在信号触发的K线上。
修改后的完整代码
//@version=5 indicator("Trendlines with Breaks",overlay=true) length = input.int(14) k = input.float(1.,'Slope',minval=0,step=.1) method = input.string('Atr','Slope Calculation Method', options=['Atr','Stdev','Linreg']) show = input(false,'Show Only Confirmed Breakouts') //---- upper = 0. lower = 0. slope_ph = 0. slope_pl = 0. src = close n = bar_index //---- ph = ta.pivothigh(length,length) pl = ta.pivotlow(length,length) slope = switch method 'Atr' => ta.atr(length)/length*k 'Stdev' => ta.stdev(src,length)/length*k 'Linreg' => math.abs(ta.sma(src*bar_index,length)-ta.sma(src,length)*ta.sma(bar_index,length))/ta.variance(n,length)/2*k slope_ph := ph ? slope : slope_ph[1] slope_pl := pl ? slope : slope_pl[1] upper := ph ? ph : upper[1] - slope_ph lower := pl ? pl : lower[1] + slope_pl //---- single_upper = 0 single_lower = 0 single_upper := src > upper ? 0 : ph ? 1 : single_upper[1] single_lower := src < lower ? 0 : pl ? 1 : single_lower[1] upper_breakout = single_upper[1] and src > upper and (show ? src > src[1] : 1) lower_breakout = single_lower[1] and src < lower and (show ? src < src[1] : 1) plotshape(upper_breakout ? low : na,"Upper Break",shape.labelup,location.absolute,#26a69a,text="B",textcolor=color.white,size=size.tiny) plotshape(lower_breakout ? high : na,"Lower Break",shape.labeldown,location.absolute,#ef5350,text="B",textcolor=color.white,size=size.tiny) //---- var line up_l = na var line dn_l = na var label recent_up_break = na var label recent_dn_break = na if ph[1] line.delete(up_l[1]) label.delete(recent_up_break[1]) up_l := line.new(n-length, ph[1], n, upper, color=#26a69a, extend=extend.right,style=line.style_dashed) if pl[1] line.delete(dn_l[1]) label.delete(recent_dn_break[1]) dn_l := line.new(n-length, pl[1], n, lower, color=#ef5350, extend=extend.right,style=line.style_dashed) if ta.crossover(src, upper) label.delete(recent_up_break[1]) recent_up_break := label.new(n, low, 'B', color=#26a69a, textcolor=color.white,style=label.style_label_up,size=size.small) if ta.crossunder(src, lower) label.delete(recent_dn_break[1]) recent_dn_break := label.new(n, high, 'B', color=#ef5350,textcolor=color.white,style=label.style_label_down,size=size.small) //---- plot(upper,'Upper',color = ph ? na : #26a69a) plot(lower,'Lower',color = pl ? na : #ef5350) alertcondition(ta.crossover(src, upper),'Upper Breakout','Price broke upper trendline') alertcondition(ta.crossunder(src, lower),'Lower Breakout','Price broke lower trendline')
修改说明
- 移除所有不必要的
offset参数,确保趋势线和信号与当前K线完全对齐 - 简化突破条件判断逻辑,直接用当前收盘价与趋势线对比,避免索引偏移导致的信号延迟
- 调整趋势线绘制起点,从确认枢轴点的K线(
n-length)延伸至当前K线(n),保证趋势线的连续性和位置准确性
内容的提问来源于stack exchange,提问作者Paul Cas
相关产品推荐
相关产品推荐

