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

TradingView脚本开发求助:水平线加价格标签及区间画线需求

Pine Script 解决方案:水平线价格标签添加 + 手动区间水平线绘制

一、给自定义水平线添加价格标签

要实现类似内置斐波那契回撤线的价格标签,核心是用label.new()函数配合水平线的价格位置,在图表固定区域生成标签。需注意避免重复创建标签,可通过var声明标签变量实现复用更新。

示例代码(替换你已有的支撑/压力/中心价计算逻辑即可):

//@version=5
indicator("自定义水平位带标签", overlay=true)

// 示例:自定义计算水平位(替换为你的实际计算逻辑)
supportLevel = ta.lowest(low, 20)
resistanceLevel = ta.highest(high, 20)
midLevel = (supportLevel + resistanceLevel) / 2

// 绘制基础水平线
line.new(bar_index[10], supportLevel, bar_index, supportLevel, color=color.green, width=2)
line.new(bar_index[10], resistanceLevel, bar_index, resistanceLevel, color=color.red, width=2)
line.new(bar_index[10], midLevel, bar_index, midLevel, color=color.blue, width=2)

// 初始化标签变量(避免重复创建)
var label supportLabel = na
var label resistanceLabel = na
var label midLabel = na

// 更新标签位置与文本
supportLabel := label.new(bar_index, supportLevel, str.tostring(supportLevel, "#.####"), 
     color=color.new(color.green, 90), textcolor=color.green, style=label.style_label_left)
resistanceLabel := label.new(bar_index, resistanceLevel, str.tostring(resistanceLevel, "#.####"), 
     color=color.new(color.red, 90), textcolor=color.red, style=label.style_label_left)
midLabel := label.new(bar_index, midLevel, str.tostring(midLevel, "#.####"), 
     color=color.new(color.blue, 90), textcolor=color.blue, style=label.style_label_left)

关键细节:

  • var关键字确保标签仅初始化一次,后续仅更新位置和文本
  • str.tostring()可自定义价格小数位数,按需调整#.####格式
  • style=label.style_label_left让标签贴在水平线右侧,对齐斐波那契标签风格
  • 半透明背景色避免遮挡K线

二、手动选择K线区间并绘制水平线

提供两种实现方案,按需选择:

方案1:通过输入框指定K线索引区间

适合精确指定区间范围的场景:

//@version=5
indicator("手动区间水平线(索引版)", overlay=true)

// 输入区间参数:从当前K线往前数的起始/结束位置
startBar = input.int(20, "起始K线(往前数)", minval=1)
endBar = input.int(0, "结束K线(往前数)", minval=0)

// 确保起始K线在结束K线之前
if startBar <= endBar
    startBar := endBar + 1

// 获取区间内的高低开收盘价
rangeLow = ta.lowest(low, startBar - endBar)
rangeHigh = ta.highest(high, startBar - endBar)
rangeOpen = open[startBar]
rangeClose = close[endBar]

// 绘制区间水平线
line.new(bar_index[startBar], rangeLow, bar_index, rangeLow, color=color.teal, width=1, style=line.style_dashed)
line.new(bar_index[startBar], rangeHigh, bar_index, rangeHigh, color=color.orange, width=1, style=line.style_dashed)
line.new(bar_index[startBar], rangeOpen, bar_index, rangeOpen, color=color.purple, width=1, style=line.style_dashed)
line.new(bar_index[startBar], rangeClose, bar_index, rangeClose, color=color.yellow, width=1, style=line.style_dashed)

// 添加区间标签
var label rangeLowLabel = na
var label rangeHighLabel = na
var label rangeOpenLabel = na
var label rangeCloseLabel = na

rangeLowLabel := label.new(bar_index, rangeLow, "区间低点: " + str.tostring(rangeLow, "#.####"), 
     color=color.new(color.teal, 90), textcolor=color.teal, style=label.style_label_left)
rangeHighLabel := label.new(bar_index, rangeHigh, "区间高点: " + str.tostring(rangeHigh, "#.####"), 
     color=color.new(color.orange, 90), textcolor=color.orange, style=label.style_label_left)
rangeOpenLabel := label.new(bar_index, rangeOpen, "区间开盘: " + str.tostring(rangeOpen, "#.####"), 
     color=color.new(color.purple, 90), textcolor=color.purple, style=label.style_label_left)
rangeCloseLabel := label.new(bar_index, rangeClose, "区间收盘: " + str.tostring(rangeClose, "#.####"), 
     color=color.new(color.yellow, 90), textcolor=color.yellow, style=label.style_label_left)

方案2:鼠标手动绘制线段选择区间

适合直观交互的场景:

//@version=5
indicator("手动区间水平线(画线版)", overlay=true)

// 创建可交互的线段工具
var line rangeLine = line.new(na, na, na, na, color=color.white, width=2, style=line.style_dotted)

// 当线段被修改时,获取区间范围并绘制水平线
if line.get_x1(rangeLine) != na and line.get_x2(rangeLine) != na
    x1 = line.get_x1(rangeLine)
    x2 = line.get_x2(rangeLine)
    startIdx = math.min(x1, x2)
    endIdx = math.max(x1, x2)
    
    // 获取区间高低开收
    rangeLow = ta.lowest(low, endIdx - startIdx + 1)
    rangeHigh = ta.highest(high, endIdx - startIdx + 1)
    rangeOpen = open[startIdx]
    rangeClose = close[endIdx]
    
    // 删除旧水平线,避免重复
    var line lowLine = na
    var line highLine = na
    var line openLine = na
    var line closeLine = na
    
    line.delete(lowLine)
    line.delete(highLine)
    line.delete(openLine)
    line.delete(closeLine)
    
    // 绘制新水平线
    lowLine := line.new(startIdx, rangeLow, bar_index, rangeLow, color=color.teal, width=2)
    highLine := line.new(startIdx, rangeHigh, bar_index, rangeHigh, color=color.orange, width=2)
    openLine := line.new(startIdx, rangeOpen, bar_index, rangeOpen, color=color.purple, width=2)
    closeLine := line.new(startIdx, rangeClose, bar_index, rangeClose, color=color.yellow, width=2)

内容的提问来源于stack exchange,提问作者tang_bohu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:41