如何设置line.new的x1、x2在指定交易时段起止,仅当日显示
解决思路
- 第一步:通过
time()函数指定时区为Asia/Shanghai(对应东八区UTC+8),匹配到每日8:30的开盘bar和次日3:50的收盘bar对应的索引值,作为线段的x1、x2坐标 - 第二步:用var数组存储当日生成的所有线段,每日开盘时自动清空上一交易日的旧线段,保证仅展示当前交易日的线段
- 第三步:修改原有line.new的逻辑,取消extend.right参数,直接用匹配到的起止坐标替换原来的bar_index相关参数
可直接运行的修改后代码
//@version=5 indicator("交易日时段水平线", overlay=true) var step = syminfo.mintick*500 // 存储当日生成的线段 var array<line> dayLines = array.new_line() // 匹配东八区当日8:30的bar索引 startTime = time("D", "08:30-08:31", "Asia/Shanghai") x1 = bar_index - ta.barssince(startTime == time) // 匹配东八区次日3:50的bar索引 endTime = time("D", "03:50-03:51", "Asia/Shanghai") totalBarsOfDay = ta.valuewhen(endTime == time, bar_index - ta.valuewhen(startTime == time, bar_index, 0), 0) x2 = x1 + totalBarsOfDay // 每日开盘时清空上一日的旧线段 if startTime array.clear(dayLines) // 在最后一根K线生成线段 if barstate.islast // 先清空之前最后一根K线生成的重复线段 for i = 0 to array.size(dayLines) - 1 line.delete(array.get(dayLines, i)) array.clear(dayLines) // 生成新的水平线段 for counter = 0 to 5 - 1 stepUp = math.ceil(close / step) * step + (counter * step) currentLine = line.new(x1, stepUp, x2, stepUp, color=color.blue, width=2) array.push(dayLines, currentLine)
逻辑说明
- 时区参数用
Asia/Shanghai即可完全匹配东八区时间,无需手动换算夏令时,Pine Script会自动处理 - 若你交易的品种收盘时间不是次日3:50,直接修改
endTime里的时间字符串即可适配 - 数组存储线段的逻辑是为了避免K线刷新时生成大量重复线段,保持图表整洁
- 如果需要调整线段的数量,直接修改
for counter = 0 to 5 -1里的数字即可,比如要生成10条就改成0 to 10 -1
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

