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

如何在Pine Script中创建可拖动竖线及解决甘氏盒指标问题

Pine Script甘氏盒指标问题解决方案

问题1:无需修改参数,拖动水平线(价格线)

当前代码中,水平线位置被input.float固定,且每根K线更新时都会用输入值重置线条位置,导致无法拖动。解决方法:

  • 创建线条时添加editable=true参数,开启交互编辑权限
  • 仅在指标初始化时设置线条初始位置,后续不再用输入值覆盖,保留用户拖动后的位置

问题2:拖动竖线到当前K线后的未来区域

默认线条无法延伸至未来,需修改两个核心设置:

  • 创建竖线时添加extend=extend.right参数,允许线条向右延伸至未来区域
  • 同样仅在初始化时设置竖线初始位置,避免输入时间值重置用户拖动后的位置

问题3:在竖线上添加时间标签

通过动态获取竖线的当前X坐标(时间),生成可读时间文本并绑定到标签,实现标签随竖线拖动同步更新:

  • 使用line.get_x1()获取竖线的当前时间位置
  • 用time_to_string()将时间格式化为yyyy-MM-dd HH:mm的可读字符串
  • 每根K线更新时同步更新标签的位置和文本内容

修改后的完整代码

//@version=5
indicator(title="Gann Box", overlay=true)

// 输入参数:仅作为线条初始值使用
L1 = input.float(62500, "Horizontal Line 1 Price", inline = "1")
L2 = input.float(63750, "Horizontal Line 2 Price", inline = "2")
L3 = input.float(65450, "Horizontal Line 3 Price", inline = "3") 

CP1 = input.string(title='', options=[" Up", " Down"], defval=" Up", inline = "1")
CP2 = input.string(title='', options=[" Up", " Down"], defval=" Up", inline = "2")
CP3 = input.string(title='', options=[" Up", " Down"], defval=" Up", inline = "3")

lineDate1 = input.time(timestamp("26 Apr 2024 13:30"), title="Line Location1")
lineDate2 = input.time(timestamp("26 Apr 2024 14:30"), title="Line Location2")
lineDate3 = input.time(timestamp("26 Apr 2024 15:30"), title="Line Location3")

// 初始化水平线:开启可编辑权限,仅设置初始位置
var hLine1 = line.new(x1=lineDate1, y1=L1, x2=lineDate3, y2=L1,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true)
var hLine2 = line.new(x1=lineDate1, y1=L2, x2=lineDate3, y2=L2,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true)
var hLine3 = line.new(x1=lineDate1, y1=L3, x2=lineDate3, y2=L3,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true)

// 初始化竖线:开启可编辑+允许延伸到未来,仅设置初始位置
var vLine1 = line.new(x1=lineDate1, y1=L1, x2=lineDate1, y2=L3,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true, extend=extend.right)
var vLine2 = line.new(x1=lineDate2, y1=L1, x2=lineDate2, y2=L3,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true, extend=extend.right)
var vLine3 = line.new(x1=lineDate3, y1=L1, x2=lineDate3, y2=L3,
     color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_time, editable=true, extend=extend.right)

// 初始化价格标签:绑定水平线位置
var label hLabel1 = label.new(x=lineDate3, y=L1, text="   " + str.tostring(L1) + "-" + CP1, 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_left, xloc=xloc.bar_time)
var label hLabel2 = label.new(x=lineDate3, y=L2, text="   " + str.tostring(L2) + "-" + CP2, 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_left, xloc=xloc.bar_time)
var label hLabel3 = label.new(x=lineDate3, y=L3, text="   " + str.tostring(L3) + "-" + CP3, 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_left, xloc=xloc.bar_time)

// 初始化竖线时间标签:绑定竖线位置
var label vLabel1 = label.new(x=lineDate1, y=L3, text=time_to_string(lineDate1, "yyyy-MM-dd HH:mm"), 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_bottom, xloc=xloc.bar_time)
var label vLabel2 = label.new(x=lineDate2, y=L3, text=time_to_string(lineDate2, "yyyy-MM-dd HH:mm"), 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_bottom, xloc=xloc.bar_time)
var label vLabel3 = label.new(x=lineDate3, y=L3, text=time_to_string(lineDate3, "yyyy-MM-dd HH:mm"), 
     color=color.green, textcolor=color.white, size=size.normal, style=label.style_label_bottom, xloc=xloc.bar_time)

// 动态更新所有标签的位置和文本
// 更新价格标签
label.set_xy(hLabel1, x=line.get_x2(hLine1), y=line.get_y1(hLine1))
label.set_text(hLabel1, "   " + str.tostring(line.get_y1(hLine1)) + "-" + CP1)
label.set_xy(hLabel2, x=line.get_x2(hLine2), y=line.get_y1(hLine2))
label.set_text(hLabel2, "   " + str.tostring(line.get_y1(hLine2)) + "-" + CP2)
label.set_xy(hLabel3, x=line.get_x2(hLine3), y=line.get_y1(hLine3))
label.set_text(hLabel3, "   " + str.tostring(line.get_y1(hLine3)) + "-" + CP3)

// 更新时间标签
var float vYPos = L3 // 标签固定在竖线底部
label.set_xy(vLabel1, x=line.get_x1(vLine1), y=vYPos)
label.set_text(vLabel1, time_to_string(line.get_x1(vLine1), "yyyy-MM-dd HH:mm"))
label.set_xy(vLabel2, x=line.get_x1(vLine2), y=vYPos)
label.set_text(vLabel2, time_to_string(line.get_x1(vLine2), "yyyy-MM-dd HH:mm"))
label.set_xy(vLabel3, x=line.get_x1(vLine3), y=vYPos)
label.set_text(vLabel3, time_to_string(line.get_x1(vLine3), "yyyy-MM-dd HH:mm"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:42:09