求助:修复Pine Script开盘10分钟高低价线绘制异常问题
Pine Script 开盘10分钟区间线问题修复
问题概述
尝试绘制美股EST时间9:30-9:39开盘10分钟区间的最高价、最低价及中间价线,运行后出现两个问题:
- 线条本该从9:30开始绘制,却延迟到9:39才显示;
- 已设置
textalign = text.align_right,但标签右对齐未生效。
原代码
indicator("10 Min Opening", overlay = true) // import PineCoders/VisibleChart/4 (Do not use yet) var int _minutes_elapsed = na var float _hh = na var float _ll = na var float _midle = na var line _hLine = na var line _lLine = na var line _midLine = na var int _x1 = na if hour(time) == 09 and minute(time) == 30 _hh := 0 _ll := 500 _midle := 0 _x1 := bar_index if hour(time) == 09 and minute(time) >= 30 and minute(time) <= 39 _hh := math.max(_hh,high) _ll := math.min(_ll,low) _midle := (_hh + _ll) / 2 _minutes_elapsed += 1 _hLine := line.new(_x1 ,_hh,bar_index ,_hh, xloc = xloc.bar_index,color = color.green) _lLine := line.new(_x1 ,_ll,bar_index ,_ll, xloc = xloc.bar_index,color = color.green) _midLine := line.new(_x1 ,_midle,bar_index ,_midle, xloc = xloc.bar_index,color = color.green, style = line.style_dashed) _hLine.set_y1(_hh),_hLine.set_y2(_hh) _lLine.set_y1(_ll),_lLine.set_y2(_ll) _midLine.set_y1(_midle),_midLine.set_y2(_midle) _hLabel = label.new(bar_index + 20 ,_hh,"H= " + str.tostring(_hh),color=color.green,style= label.style_none,textcolor=color.green,size = size.normal,textalign = text.align_right) _lLabel = label.new(bar_index + 20 ,_ll,"L= " + str.tostring(_ll),color=color.green,style= label.style_none,textcolor=color.green,size = size.normal) _midLabel = label.new(bar_index + 20 ,_midle,"Mid= " + str.tostring(_midle),color=color.green,style= label.style_none,textcolor=color.green,size = size.normal) label.delete(_hLabel[1]) label.delete(_lLabel[1]) label.delete(_midLabel[1]) if bar_index > bar_index[1] _hLine.set_x1(bar_index),_hLine.set_x1(bar_index) _lLine.set_x1(bar_index),_lLine.set_x1(bar_index) _midLine.set_x1(bar_index),_midLine.set_x1(bar_index)
问题原因与修复方案
1. 线条延迟显示问题
- 原因:
- 9:30-9:39区间内每根K线重复创建新的
line对象,逻辑冗余; - 最后一段代码错误地将线条起点(
x1)不断重置为当前bar_index,导致线条始终仅显示当前K线的一个点,直到9:39后停止更新才显示完整区间。
- 9:30-9:39区间内每根K线重复创建新的
- 修复:
- 用
var声明线条对象,仅在9:30时初始化一次; - 区间内仅更新线条的终点(
x2)和Y轴值,而非重复创建; - 删除错误的线条起点重置代码块。
- 用
2. 标签右对齐失效问题
- 原因:
- 每根K线重复创建/删除标签,导致对齐逻辑不稳定;
- 标签坐标设置与右对齐属性的逻辑不匹配。
- 修复:
- 用
var声明标签对象,仅初始化一次; - 动态更新标签的文本和Y轴位置,保留右对齐设置;
- 统一为所有标签设置
textalign = text.align_right。
- 用
修复后完整代码
indicator("10 Min Opening", overlay = true) // 全局变量初始化,var确保仅创建一次 var float _hh = na var float _ll = na var float _midle = na var line _hLine = na var line _lLine = na var line _midLine = na var label _hLabel = na var label _lLabel = na var label _midLabel = na var int _x1 = na // 当日9:30 EST触发:初始化基础值、线条和标签 if hour(time) == 9 and minute(time) == 30 _hh := high _ll := low _midle := (_hh + _ll) / 2 _x1 := bar_index // 初始化线条,起点固定为9:30的bar _hLine := line.new(_x1, _hh, _x1, _hh, xloc = xloc.bar_index, color = color.green) _lLine := line.new(_x1, _ll, _x1, _ll, xloc = xloc.bar_index, color = color.green) _midLine := line.new(_x1, _midle, _x1, _midle, xloc = xloc.bar_index, color = color.green, style = line.style_dashed) // 初始化标签,设置右对齐 _hLabel := label.new(_x1 + 20, _hh, "H= " + str.tostring(_hh), color=color.green, style=label.style_none, textcolor=color.green, size=size.normal, textalign=text.align_right) _lLabel := label.new(_x1 + 20, _ll, "L= " + str.tostring(_ll), color=color.green, style=label.style_none, textcolor=color.green, size=size.normal, textalign=text.align_right) _midLabel := label.new(_x1 + 20, _midle, "Mid= " + str.tostring(_midle), color=color.green, style=label.style_none, textcolor=color.green, size=size.normal, textalign=text.align_right) // 9:30-9:39区间内:实时更新高低价、线条和标签 if hour(time) == 9 and minute(time) >= 30 and minute(time) <= 39 _hh := math.max(_hh, high) _ll := math.min(_ll, low) _midle := (_hh + _ll) / 2 // 更新线条终点和Y值,实现实时延伸 line.set_x2(_hLine, bar_index) line.set_y1(_hLine, _hh) line.set_y2(_hLine, _hh) line.set_x2(_lLine, bar_index) line.set_y1(_lLine, _ll) line.set_y2(_lLine, _ll) line.set_x2(_midLine, bar_index) line.set_y1(_midLine, _midle) line.set_y2(_midLine, _midle) // 更新标签文本和Y位置,保持右对齐 label.set_text(_hLabel, "H= " + str.tostring(_hh)) label.set_y(_hLabel, _hh) label.set_text(_lLabel, "L= " + str.tostring(_ll)) label.set_y(_lLabel, _ll) label.set_text(_midLabel, "Mid= " + str.tostring(_midle)) label.set_y(_midLabel, _midle)
修复后效果说明
- 线条从9:30开始实时延伸,随区间内K线更新动态扩展到当前bar;
- 标签右对齐生效,文本右侧对齐到指定X位置;
- 代码逻辑更高效,避免重复创建对象导致的资源浪费。
内容的提问来源于stack exchange,提问作者Sonny Hua
相关产品推荐
相关产品推荐

