日内时间框架跨多交易日标记指定bars的技术需求与问题
解决日内时间框架下跨交易时段的Bar计数与标记问题
需求
- 在日内(intraday)时间框架下,从用户指定的起始时间开始,计算固定数量的K线(bars)并标记这些K线,支持跨多个交易时段。
现存问题
- 当前代码在当日交易时段结束后停止计数与标记,无法跨后续交易日的交易时段继续。
- 代码仅适配5分钟时间框架,无法兼容任意日内时间框架。
原5分钟框架代码(无法跨时段运行)
//@version=5 indicator("Gann TimeCycle", overlay=true) IntraColor = input.color(color.new(color.aqua, 55), "IntraColor") Intra = input(defval=true, title="Intra", group = "Gann Cycles", inline = "Intra") IntraStart = input.time(timestamp("12 Jan 2023 00:01 +0000"), "Intra StartDate") z = 1 * (Intra ? 1 : 0) //plot intra cycle line.new(IntraStart, close, IntraStart, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart, close, text="i0", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*9*300000, close, IntraStart + z*9*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*9*300000, close, text="i9", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*17*300000, close, IntraStart + z*17*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*17*300000, close, text="i17", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*26*300000, close, IntraStart + z*26*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*26*300000, close, text="i26", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*34*300000, close, IntraStart + z*34*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*34*300000, close, text="i34", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*40*300000, close, IntraStart + z*40*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*40*300000, close, text="i40", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*55*300000, close, IntraStart + z*55*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*55*300000, close, text="i55", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*68*300000, close, IntraStart + z*68*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*68*300000, close, text="i68", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*77*300000, close, IntraStart + z*77*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*77*300000, close, text="i77", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*80*300000, close, IntraStart + z*80*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*80*300000, close, text="i80", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*90*300000, close, IntraStart + z*90*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*90*300000, close, text="i90", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*103*300000, close, IntraStart + z*103*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*103*300000, close, text="i103", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*112*300000, close, IntraStart + z*112*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*112*300000, close, text="i112", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*121*300000, close, IntraStart + z*121*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*121*300000, close, text="i121", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*135*300000, close, IntraStart + z*135*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*135*300000, close, text="i135", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor) line.new(IntraStart + z*144*300000, close, IntraStart + z*144*300000, close, xloc = xloc.bar_time, extend=extend.both, color=IntraColor , width = 1) label.new(IntraStart + z*144*300000, close, text="i144", xloc = xloc.bar_time, yloc=yloc.belowbar, style = label.style_none, textcolor = IntraColor)
改进后的代码(支持任意日内框架+跨时段标记)
//@version=5 indicator("Gann TimeCycle - 跨时段版", overlay=true) // 用户输入 IntraColor = input.color(color.new(color.aqua, 55), "标记颜色") Intra = input(defval=true, title="启用日内周期标记", group = "Gann Cycles", inline = "Intra") IntraStart = input.time(timestamp("12 Jan 2023 00:01 +0000"), "起始时间") // 定义需要标记的Bar数量列表 cycleBars = input.intarray([0,9,17,26,34,40,55,68,77,80,90,103,112,121,135,144], "需要标记的Bar序号", group = "Gann Cycles") // 计算从起始时间到当前Bar的累计Bar数量 var int startBarIndex = na if not na(IntraStart) and Intra // 找到起始时间对应的Bar索引 if time == IntraStart startBarIndex := bar_index // 如果起始时间在历史Bar中,初始化startBarIndex else if na(startBarIndex) and IntraStart < time[0] and IntraStart > time[1] startBarIndex := bar_index - 1 // 遍历需要标记的Bar序号,绘制线条和标签 if Intra and not na(startBarIndex) for barNum in cycleBars // 计算目标Bar的索引 targetBarIndex = startBarIndex + barNum // 确保目标Bar存在 if targetBarIndex >= 0 and targetBarIndex <= bar_index targetTime = time[bar_index - targetBarIndex] line.new(targetTime, low, targetTime, high, xloc=xloc.bar_time, extend=extend.both, color=IntraColor, width=1) label.new(targetTime, low, text="i" + str.tostring(barNum), xloc=xloc.bar_time, yloc=yloc.belowbar, style=label.style_none, textcolor=IntraColor)
关键改进说明
- 适配任意日内时间框架:不再硬编码Bar时长,通过K线的索引计数,无需关注不同时间框架的时间差,自动兼容所有日内周期。
- 跨交易时段计数:使用
bar_index统计实际存在的K线数量,直接跳过非交易时段的空白时间,自然支持跨交易日的交易时段继续计数。 - 代码优化:将需要标记的Bar序号整理为数组,通过循环批量绘制标记,大幅减少重复代码,后续修改或添加标记点更便捷。
- 精准起始定位:通过判断起始时间与历史K线时间的关系,精准锁定起始K线的索引,确保计数从正确的位置开始。
内容的提问来源于stack exchange,提问作者Bhaavin Ashar
相关产品推荐
相关产品推荐

