如何在Pine Editor中绘制会话末根bar的高低点连线并延伸至下一会话末根bar
Pine Script 实现方案
核心逻辑拆解
- 第一步:识别交易时段的收尾bar
利用time()函数匹配指定session的时间范围,当检测到「前一根bar在session内、当前bar不在session内」的跳变时,前一根bar即为对应session的最后一根bar。 - 第二步:固定区间高低价位
检测到session收尾bar时,提取该bar的high、low数值暂存,作为下一段水平线段的基准y坐标。 - 第三步:实现跨时段延伸的水平线
以暂存的收尾bar索引为起点,将线段的终点动态绑定到下一次session跳变的位置,保证两条线刚好从上个session的最后一根bar,连续延伸至下一个session的最后一根bar,无断点。 - 第四步:可选区间填充
关联同一时段的两条高低线对象,用fill()函数实现围合区域的背景填充,功能独立设为可开关项,不影响核心绘图逻辑。
可直接运行的核心代码
//@version=5 indicator("Session High/Low Horizontal Range", overlay=true) // 基础可配置参数 targetSession = input.session("0830-1600", title="目标交易时段", group="基础配置") sessionTimezone = input.string("America/New_York", title="时段对应时区", group="基础配置") highLineColor = input.color(color.new(color.red, 0), title="上边界线颜色", group="线条配置") lowLineColor = input.color(color.new(color.green, 0), title="下边界线颜色", group="线条配置") lineWidth = input.int(2, title="线条宽度", minval=1, group="线条配置") enableRangeFill = input.bool(false, title="启用区间背景填充", group="附加功能") fillSetting = input.color(color.new(color.blue, 90), title="填充颜色", group="附加功能") // 持久化存储线、填充对象,避免逐bar重复创建占用内存 var line highBoundaryLine = na var line lowBoundaryLine = na var fill rangeFill = na // 判断当前bar是否落在目标交易时段内 isInTargetSession = not na(time(timeframe.period, targetSession, sessionTimezone)) // 检测session边界跳变:当前bar在时段外、上一根在时段内(即上一根就是该时段最后一根bar) sessionEndDetected = not isInTargetSession and isInTargetSession[1] if sessionEndDetected // 清除上一轮的填充对象 if not na(rangeFill) fill.delete(rangeFill) // 把旧线段的终点固定在当前检测到的session收尾bar位置 if not na(highBoundaryLine) line.set_x2(highBoundaryLine, bar_index[1]) line.set_x2(lowBoundaryLine, bar_index[1]) // 基于刚识别的session收尾bar的高低点,创建新的水平线段,初始终点设为当前bar newSessionHigh = high[1] newSessionLow = low[1] startBarIndex = bar_index[1] highBoundaryLine := line.new(startBarIndex, newSessionHigh, bar_index, newSessionHigh, color=highLineColor, width=lineWidth) lowBoundaryLine := line.new(startBarIndex, newSessionLow, bar_index, newSessionLow, color=lowLineColor, width=lineWidth) // 如果开启填充,就关联新的两条线生成背景 if enableRangeFill rangeFill := fill.new(highBoundaryLine, lowBoundaryLine, color=fillSetting)
关键注意事项
- 时区参数必须和你定义的交易时段匹配,否则会出现session边界识别偏移,比如设置伦敦时段就对应填
Europe/London,设置国内A股时段就对应填Asia/Shanghai - 所有持久化对象都用
var声明,避免每根K线重复创建新的线对象,拖慢脚本运行速度 - 线段的终点会在每次检测到新的session收尾bar时自动更新,刚好满足「延伸至下一个session最后一根bar」的效果,无需手动调整坐标
- 填充功能默认关闭,完全独立,不会干扰核心的线条绘制逻辑
内容的提问来源于stack exchange,提问作者Steve M
相关产品推荐
相关产品推荐

