日内图表周末/假期后线条不显示及仅展示最新日线需求
解决日内图表绘制前一日开盘/收盘线的问题
问题分析
原代码存在两个核心问题:
- 依赖
session.islastbar_regular触发线条绘制,周末或假期后第一个交易日没有前一个常规交易日的最后K线,导致逻辑不触发,线条无法生成。 - 未对旧线条进行清理,会保留历史所有绘制的线条,无法只显示最新一日的。
修复方案
- 改用
ta.change(time("D"))检测新交易日的到来,确保每个交易日都能触发线条绘制逻辑,兼容假期/周末后的场景。 - 声明全局变量存储线条对象,每次绘制新线条前删除旧线条,保证界面只显示最新的一组线条。
修复后的代码
//@version=5 indicator("My script", "test", true, max_lines_count = 2) // 声明全局变量存储线条对象,初始为na var line prevCloseLine = na var line prevOpenLine = na // 获取前一日的开盘价和收盘价 previousClose = request.security(syminfo.tickerid, "D", close[1]) previousOpen = request.security(syminfo.tickerid, "D", open[1]) // 检测新交易日开始,触发线条更新 if ta.change(time("D")) // 删除旧线条 line.delete(prevCloseLine) line.delete(prevOpenLine) // 计算线条的起始和结束时间:当前交易日开盘时间到下一个交易日开盘时间 currentDayOpenTime = time("D") nextDayOpenTime = currentDayOpenTime + 1440*60*1000 // 创建新线条并赋值给全局变量 prevCloseLine := line.new(currentDayOpenTime, previousClose, nextDayOpenTime, previousClose, xloc.bar_time, extend.none, color.red) prevOpenLine := line.new(currentDayOpenTime, previousOpen, nextDayOpenTime, previousOpen, xloc.bar_time, extend.none, color.green)
关键修改说明
- 用
ta.change(time("D"))替代session.islastbar_regular:新交易日的第一根K线就会触发逻辑,避免假期后无触发的问题。 - 新增
var line变量存储线条对象:通过line.delete()在每次更新前清理旧线条,实现只显示最新一日的线条。 - 调整时间计算:用
time("D")获取当前交易日的开盘时间,确保线条从当日开盘开始绘制到次日开盘,覆盖整个交易日时段。
内容的提问来源于stack exchange,提问作者Kunthu Dhadda
相关产品推荐
相关产品推荐

