You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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线的线段。

修正代码思路

  1. 为每个水平线条创建持久化的线条对象变量,避免重复创建
  2. 仅在需要更新线条时(如水平位变化、K线超出显示范围)更新线条的坐标和样式
  3. 设置线条的显示范围为当前K线前后各2根(共5根K线:bar_index-2到bar_index+2)
  4. 自动删除超出显示范围的旧线条,避免资源占用

完整修正后的代码

//@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:04:50