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
相关产品推荐
相关产品推荐

