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

