You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日内时间框架跨多交易日标记指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:55:29