如何让PineScript指标仅在5根K线上绘制连续水平线?
PineScript 指标线条显示问题解决方案
问题背景
需要让指标输出的线条非连续,仅在5根K线范围内显示,且为实线。尝试用line.new方法实现后输出异常,原指标用plot函数仅能显示最后1根K线的线条,寻求可行方案。
尝试的line.new代码
line.new(bar_index - 3, level1, bar_index + 3, level1, color=level1_col, width = 2) line.new(bar_index - 3, level2, bar_index + 3, level2, color=level2_col, width = 2) line.new(bar_index - 3, level3, bar_index + 3, level3, color=level3_col, width = 2) line.new(bar_index - 3, level4, bar_index + 3, level4, color=level4_col, width = 2) line.new(bar_index - 3, level5, bar_index + 3, level5, color=level5_col, width = 2) line.new(bar_index - 3, level6, bar_index + 3, level6, color=level6_col, width = 2) line.new(bar_index - 3, level7, bar_index + 3, level7, color=level7_col, width = 2) line.new(bar_index - 3, level8, bar_index + 3, level8, color=level8_col, width = 2)
原指标plot输出代码
plot(level1, style = plot.style_line, color=level1_col, show_last=1, linewidth=2, trackprice=true) plot(level2, style = plot.style_line, color=level2_col, show_last=1, linewidth=2, trackprice=true) plot(level3, style = plot.style_line, color=level3_col, show_last=1, linewidth=2, trackprice=true) plot(level4, style = plot.style_line, color=level4_col, show_last=1, linewidth=2, trackprice=true) plot(level5, style = plot.style_line, color=level5_col, show_last=1, linewidth=2, trackprice=true) plot(level6, style = plot.style_line, color=level6_col, show_last=1, linewidth=2, trackprice=true) plot(level7, style = plot.style_line, color=level7_col, show_last=1, linewidth=2, trackprice=true) plot(level8, style = plot.style_line, color=level8_col, show_last=1, linewidth=2, trackprice=true)
完整指标代码
//@version=5 indicator("Test 81", overlay=true) left = input.int(defval=10, title="Left Bars") right = input.int(defval=1, title="Right Bars") quick_right = input.int(defval=5, title="Quick Right") src = input.string(defval="Close",options = ["Close","High/Low"], title = "Source") pivot_high = src=="Close" ? ta.pivothigh(close,left,right) : ta.pivothigh(high,left,right) pivot_lows = src=="Close" ? ta.pivotlow(close, left,right) : ta.pivotlow(low,left,right) quick_pivot_high = src=="Close" ? ta.pivothigh(close,left,quick_right) : ta.pivothigh(high,left,quick_right) quick_pivot_lows = src=="Close" ? ta.pivotlow(close, left,quick_right) : ta.pivotlow(low, left,quick_right) level1 = src=="Close" ? ta.valuewhen(quick_pivot_high, close[quick_right], 0) : ta.valuewhen(quick_pivot_high, high[quick_right], 0) level2 = src=="Close" ? ta.valuewhen(quick_pivot_lows, close[quick_right], 0) : ta.valuewhen(quick_pivot_lows, low[quick_right], 0) level3 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 0) : ta.valuewhen(pivot_high, high[right], 0) level4 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 0) : ta.valuewhen(pivot_lows, low[right], 0) level5 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 1) : ta.valuewhen(pivot_high, high[right], 1) level6 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 1) : ta.valuewhen(pivot_lows, low[right], 1) level7 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 2) : ta.valuewhen(pivot_high, high[right], 2) level8 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 2) : ta.valuewhen(pivot_lows, low[right], 2) level1_col = close >= level1 ? color.lime : color.orange level2_col = close >= level2 ? color.lime : color.orange level3_col = close >= level3 ? color.lime : color.orange level4_col = close >= level4 ? color.lime : color.orange level5_col = close >= level5 ? color.lime : color.orange level6_col = close >= level6 ? color.lime : color.orange level7_col = close >= level7 ? color.lime : color.orange level8_col = close >= level8 ? color.lime : color.orange plot(level1, style = plot.style_line, color=level1_col, show_last=1, linewidth=2, trackprice=true) plot(level2, style = plot.style_line, color=level2_col, show_last=1, linewidth=2, trackprice=true) plot(level3, style = plot.style_line, color=level3_col, show_last=1, linewidth=2, trackprice=true) plot(level4, style = plot.style_line, color=level4_col, show_last=1, linewidth=2, trackprice=true) plot(level5, style = plot.style_line, color=level5_col, show_last=1, linewidth=2, trackprice=true) plot(level6, style = plot.style_line, color=level6_col, show_last=1, linewidth=2, trackprice=true) plot(level7, style = plot.style_line, color=level7_col, show_last=1, linewidth=2, trackprice=true) plot(level8, style = plot.style_line, color=level8_col, show_last=1, linewidth=2, trackprice=true)
解决方案
问题原因
直接使用line.new会在每根K线都创建新线条,导致画面堆积大量重复线条,出现显示异常;原plot的show_last=1仅能显示最后1根K线的线段。
修正代码思路
- 为每个水平线条创建持久化的线条对象变量,避免重复创建
- 仅在需要更新线条时(如水平位变化、K线超出显示范围)更新线条的坐标和样式
- 设置线条的显示范围为当前K线前后各2根(共5根K线:
bar_index-2到bar_index+2) - 自动删除超出显示范围的旧线条,避免资源占用
完整修正后的代码
//@version=5 indicator("Test 81", overlay=true) left = input.int(defval=10, title="Left Bars") right = input.int(defval=1, title="Right Bars") quick_right = input.int(defval=5, title="Quick Right") src = input.string(defval="Close",options = ["Close","High/Low"], title = "Source") pivot_high = src=="Close" ? ta.pivothigh(close,left,right) : ta.pivothigh(high,left,right) pivot_lows = src=="Close" ? ta.pivotlow(close, left,right) : ta.pivotlow(low,left,right) quick_pivot_high = src=="Close" ? ta.pivothigh(close,left,quick_right) : ta.pivothigh(high,left,quick_right) quick_pivot_lows = src=="Close" ? ta.pivotlow(close, left,quick_right) : ta.pivotlow(low, left,quick_right) level1 = src=="Close" ? ta.valuewhen(quick_pivot_high, close[quick_right], 0) : ta.valuewhen(quick_pivot_high, high[quick_right], 0) level2 = src=="Close" ? ta.valuewhen(quick_pivot_lows, close[quick_right], 0) : ta.valuewhen(quick_pivot_lows, low[quick_right], 0) level3 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 0) : ta.valuewhen(pivot_high, high[right], 0) level4 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 0) : ta.valuewhen(pivot_lows, low[right], 0) level5 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 1) : ta.valuewhen(pivot_high, high[right], 1) level6 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 1) : ta.valuewhen(pivot_lows, low[right], 1) level7 = src=="Close" ? ta.valuewhen(pivot_high, close[right], 2) : ta.valuewhen(pivot_high, high[right], 2) level8 = src=="Close" ? ta.valuewhen(pivot_lows, close[right], 2) : ta.valuewhen(pivot_lows, low[right], 2) level1_col = close >= level1 ? color.lime : color.orange level2_col = close >= level2 ? color.lime : color.orange level3_col = close >= level3 ? color.lime : color.orange level4_col = close >= level4 ? color.lime : color.orange level5_col = close >= level5 ? color.lime : color.orange level6_col = close >= level6 ? color.lime : color.orange level7_col = close >= level7 ? color.lime : color.orange level8_col = close >= level8 ? color.lime : color.orange // 定义线条对象变量,初始为na var line line1 = na var line line2 = na var line line3 = na var line line4 = na var line line5 = na var line line6 = na var line line7 = na var line line8 = na // 定义显示范围:前后各2根K线,共5根 show_start = bar_index - 2 show_end = bar_index + 2 // 更新或创建线条 if not na(level1) if na(line1) line1 := line.new(show_start, level1, show_end, level1, color=level1_col, width=2) else line.set_xy1(line1, show_start, level1) line.set_xy2(line1, show_end, level1) line.set_color(line1, level1_col) if not na(level2) if na(line2) line2 := line.new(show_start, level2, show_end, level2, color=level2_col, width=2) else line.set_xy1(line2, show_start, level2) line.set_xy2(line2, show_end, level2) line.set_color(line2, level2_col) if not na(level3) if na(line3) line3 := line.new(show_start, level3, show_end, level3, color=level3_col, width=2) else line.set_xy1(line3, show_start, level3) line.set_xy2(line3, show_end, level3) line.set_color(line3, level3_col) if not na(level4) if na(line4) line4 := line.new(show_start, level4, show_end, level4, color=level4_col, width=2) else line.set_xy1(line4, show_start, level4) line.set_xy2(line4, show_end, level4) line.set_color(line4, level4_col) if not na(level5) if na(line5) line5 := line.new(show_start, level5, show_end, level5, color=level5_col, width=2) else line.set_xy1(line5, show_start, level5) line.set_xy2(line5, show_end, level5) line.set_color(line5, level5_col) if not na(level6) if na(line6) line6 := line.new(show_start, level6, show_end, level6, color=level6_col, width=2) else line.set_xy1(line6, show_start, level6) line.set_xy2(line6, show_end, level6) line.set_color(line6, level6_col) if not na(level7) if na(line7) line7 := line.new(show_start, level7, show_end, level7, color=level7_col, width=2) else line.set_xy1(line7, show_start, level7) line.set_xy2(line7, show_end, level7) line.set_color(line7, level7_col) if not na(level8) if na(line8) line8 := line.new(show_start, level8, show_end, level8, color=level8_col, width=2) else line.set_xy1(line8, show_start, level8) line.set_xy2(line8, show_end, level8) line.set_color(line8, level8_col) // 删除超出显示范围的旧线条(可选,用于优化性能) if bar_index > show_end + 1 if not na(line1) line.delete(line1) line1 := na if not na(line2) line.delete(line2) line2 := na if not na(line3) line.delete(line3) line3 := na if not na(line4) line.delete(line4) line4 := na if not na(line5) line.delete(line5) line5 := na if not na(line6) line.delete(line6) line6 := na if not na(line7) line.delete(line7) line7 := na if not na(line8) line.delete(line8) line8 := na
说明
- 使用
var关键字定义线条对象,确保变量仅初始化一次,避免每根K线重复创建 - 线条的显示范围设置为
bar_index-2到bar_index+2,刚好覆盖5根K线 - 每次K线更新时,仅更新已有线条的坐标和颜色,而非创建新线条
- 可选的旧线条删除逻辑,可避免图表中堆积过多无效线条,提升性能
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

