TradingView指标开发:能否为动态值使用hline?求解决方案
解决TradingView动态水平线右侧价格显示问题
问题核心
你需要展示基于OHLC计算的动态枢轴点水平线,希望像原生hline一样在右侧价格栏显示对应价格,但line.new无法实现该效果,label体验不佳,直接使用hline因静态特性无法动态更新。
解决方案
使用plot函数替代line.new和label,plot支持动态数值,默认会在右侧价格栏显示对应价格,同时可通过参数配置实现水平线延伸效果,兼顾视觉展示与价格显示需求。
修改后的代码
//@version=5 indicator("动态枢轴点水平线", overlay=true) // 定义时间周期输入(需在指标设置中选择) currentTF = input.timeframe("D", title="枢轴点计算周期") // 获取指定周期的OHLC数据 yuksek = request.security(syminfo.tickerid, currentTF, high[1], lookahead=barmerge.lookahead_on) dusuk = request.security(syminfo.tickerid, currentTF, low[1], lookahead=barmerge.lookahead_on) kapanis = request.security(syminfo.tickerid, currentTF, close[1], lookahead=barmerge.lookahead_on) // 计算枢轴点及阻力/支撑位 pp = (yuksek + dusuk + kapanis) / 3 r1 = 2 * pp - dusuk r2 = pp + yuksek - dusuk r3 = yuksek + 2 * (pp - dusuk) s1 = 2 * pp - yuksek s2 = pp - (yuksek - dusuk) s3 = dusuk - 2 * (yuksek - pp) // 使用plot绘制动态水平线,右侧价格栏自动显示数值 plot(pp, color=color.black, title="Karar Seviyesi", linewidth=1, extend=extend.right, display=display.data_window) plot(r1, color=color.green, title="Direnç 1", linewidth=1, extend=extend.right, display=display.data_window) plot(r2, color=color.green, title="Direnç 2", linewidth=1, extend=extend.right, display=display.data_window) plot(r3, color=color.green, title="Direnç 3", linewidth=1, extend=extend.right, display=display.data_window) plot(s1, color=color.red, title="Destek 1", linewidth=1, extend=extend.right, display=display.data_window) plot(s2, color=color.red, title="Destek 2", linewidth=1, extend=extend.right, display=display.data_window) plot(s3, color=color.red, title="Destek 3", linewidth=1, extend=extend.right, display=display.data_window)
代码说明
- 动态数值支持:
plot函数直接接收动态计算的枢轴点数值,随K线更新自动刷新 - 右侧价格栏显示:通过
display=display.data_window确保数值在右侧价格栏展示(默认已开启,显式声明更稳妥) - 水平线延伸:
extend=extend.right实现与line.new一致的向右延伸效果 - 样式区分:通过
color和title参数区分不同枢轴点类型,图例中也会对应显示
补充优化(带图表标签)
如果需要在图表上直接显示价格标签(替代原label功能),可以保留原有的label逻辑,配合plot使用,既保留右侧价格栏显示,又增加图表内的标签提示:
//@version=5 indicator("动态枢轴点水平线(带标签)", overlay=true) currentTF = input.timeframe("D", title="枢轴点计算周期") yuksek = request.security(syminfo.tickerid, currentTF, high[1], lookahead=barmerge.lookahead_on) dusuk = request.security(syminfo.tickerid, currentTF, low[1], lookahead=barmerge.lookahead_on) kapanis = request.security(syminfo.tickerid, currentTF, close[1], lookahead=barmerge.lookahead_on) pp = (yuksek + dusuk + kapanis) / 3 r1 = 2 * pp - dusuk r2 = pp + yuksek - dusuk r3 = yuksek + 2 * (pp - dusuk) s1 = 2 * pp - yuksek s2 = pp - (yuksek - dusuk) s3 = dusuk - 2 * (yuksek - pp) // 绘制水平线 plot(pp, color=color.black, title="Karar Seviyesi", linewidth=1, extend=extend.right) plot(r1, color=color.green, title="Direnç 1", linewidth=1, extend=extend.right) plot(r2, color=color.green, title="Direnç 2", linewidth=1, extend=extend.right) plot(r3, color=color.green, title="Direnç 3", linewidth=1, extend=extend.right) plot(s1, color=color.red, title="Destek 1", linewidth=1, extend=extend.right) plot(s2, color=color.red, title="Destek 2", linewidth=1, extend=extend.right) plot(s3, color=color.red, title="Destek 3", linewidth=1, extend=extend.right) // 动态更新标签 var label_pp = label.new(na, na, '', style=label.style_label_down, color=color.black, textcolor=color.white, size=size.small) var label_r1 = label.new(na, na, '', style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small) var label_r2 = label.new(na, na, '', style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small) var label_r3 = label.new(na, na, '', style=label.style_label_down, color=color.green, textcolor=color.white, size=size.small) var label_s1 = label.new(na, na, '', style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) var label_s2 = label.new(na, na, '', style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) var label_s3 = label.new(na, na, '', style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small) if barstate.islast label.set_xy(label_pp, bar_index + 30, pp) label.set_text(label_pp, 'Karar Seviyesi ▪ ' + str.tostring(pp, format.mintick)) label.set_xy(label_r1, bar_index + 30, r1) label.set_text(label_r1, 'Direnç ▪ ' + str.tostring(r1, format.mintick)) label.set_xy(label_r2, bar_index + 30, r2) label.set_text(label_r2, 'Direnç ▪ ' + str.tostring(r2, format.mintick)) label.set_xy(label_r3, bar_index + 30, r3) label.set_text(label_r3, 'Direnç ▪ ' + str.tostring(r3, format.mintick)) label.set_xy(label_s1, bar_index + 30, s1) label.set_text(label_s1, 'Destek ' + str.tostring(s1, format.mintick)) label.set_xy(label_s2, bar_index + 30, s2) label.set_text(label_s2, 'Destek ' + str.tostring(s2, format.mintick)) label.set_xy(label_s3, bar_index + 30, s3) label.set_text(label_s3, 'Destek: ' + str.tostring(s3, format.mintick))
内容的提问来源于stack exchange,提问作者Batuhan Sancak
相关产品推荐
相关产品推荐

