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

将日线枢轴线导入日内周期并突破max_bars_back限制的技术问询

问题:突破max_bars_back限制,在日内周期绘制所有日线枢轴线

已在日线周期创建枢轴线,需在1分钟等日内周期显示该线。目前已实现日线级别线导入1分钟周期,但受max_bars_back=4999限制,超过5000根1分钟K线对应的级别线无法绘制。疑惑使用request.security("D")为何仍受1分钟K线数量限制,寻求突破限制以绘制所有可见K线对应级别线的方法。

原代码如下:

//@version=5
indicator("Auto Lines", overlay = true, max_bars_back = 4999, max_lines_count = 500, max_labels_count = 500)

string GROUP_LOGIC = "Logic Settings"

lookback = input.int(2, "Pivot Lookback", group = GROUP_LOGIC)
percent = input.int(2, "Prozent", group = GROUP_LOGIC)

string GROUP_STYLE = "Style Settings"

bullishColor = input.color(color.green, "Bullish Color", group = GROUP_STYLE)
bearishColor = input.color(color.red, "Bearish Color", group = GROUP_STYLE)
neutralColor = input.color(color.white, "Neutral Color", group = GROUP_STYLE)


var float currentHigh = na
var float currentLow = na
var float currentHighTmp = na
var float currentLowTmp = na

ticker_D = ticker.new(syminfo.prefix, syminfo.ticker, session.regular)
//[pH, pL, h, l, last_day_close, bar_index_d, time_d]  = request.security(ticker_D, "D", [ta.highest(lookback),ta.lowest(lookback), high, low, close, bar_index, time], gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)

pH              = request.security(ticker_D, "D", ta.highest(lookback), gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
pL              = request.security(ticker_D, "D", ta.lowest(lookback), gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
h               = request.security(ticker_D, "D", high, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
l               = request.security(ticker_D, "D", low, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
last_day_close  = request.security(ticker_D, "D", close, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
bar_index_d     = request.security(ticker_D, "D", bar_index, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)
time_d          = request.security(ticker_D, "D", time, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_off)

plot(bar_index_d, "bar_index_d", display = display.data_window)
plot(time_d, "time_d", display = display.data_window)
plot(currentHigh, "currentHigh", display = display.data_window)
plot(currentLow, "currentLow", display = display.data_window)

plot(h, "h", display = display.data_window)
plot(l, "l", display = display.data_window)

plot(pH, "pH", display = display.data_window)
plot(pL, "pL", display = display.data_window)

var int high_counter = 0
var int low_counter = 0
var int high_counter_2 = 0
var int low_counter_2 = 0

newSession = bool(ta.change(time('D')))
count = ta.barssince(newSession)


if barstate.islastconfirmedhistory
    for i = 0 to 4999
        if i == 0
            currentHigh := h
            currentLow := l
            high_counter := high_counter+1
            low_counter := low_counter+1
            
            if timeframe.isdaily
                line.new(x1=bar_index_d, x2=bar_index_d+1,y1=currentHigh,y2=currentHigh,xloc = xloc.bar_index,color = bullishColor,width = 1,extend = extend.right)
                line.new(x1=bar_index_d, x2=bar_index_d+1,y1=currentLow,y2=currentLow,xloc = xloc.bar_index,color = bearishColor,width = 1,extend = extend.right)
            if timeframe.isintraday
                line.new(x1=time[count + 1], x2=time_close + (1 * 86400000),y1=currentHigh,y2=currentHigh,xloc = xloc.bar_time,color = bullishColor,width = 1,extend = extend.right)
                line.new(x1=time[count + 1], x2=time_close + (1 * 86400000),y1=currentLow,y2=currentLow,xloc = xloc.bar_time,color = bearishColor,width = 1,extend = extend.right)

        else
            if h[i] > currentHigh and h[i] == pH[i]
                high_counter_2 := high_counter_2+1

                if timeframe.isdaily
                    line.new(x1=bar_index_d-i, x2=bar_index_d-i+1,y1=h[i],y2=h[i],xloc = xloc.bar_index,color = h[i] > currentHigh * (1.00 + percent/100) ? neutralColor : bullishColor,width = 1,extend = extend.right)
                if timeframe.isintraday
                    line.new(x1=time_d[count+i], x2=time_close + (1 * 86400000),y1=h[i],y2=h[i],xloc = xloc.bar_time,color = h[i] > currentHigh * (1.00 + percent/100) ? neutralColor : bullishColor,width = 1,extend = extend.right)
                currentHigh := h[i]                
            if l[i] < currentLow and l[i] == pL[i]
                low_counter_2 := low_counter_2+1

                if timeframe.isdaily
                    line.new(x1=bar_index_d-i, x2=bar_index_d-i+1,y1=l[i],y2=l[i],xloc = xloc.bar_index,color = l[i] < currentLow * (1.00 - percent/100) ? neutralColor : bearishColor,width = 1,extend = extend.right)
                if timeframe.isintraday
                    line.new(x1=time_d[count+i], x2=time_close + (1 * 86400000),y1=l[i],y2=l[i],xloc = xloc.bar_time,color = l[i] < currentLow * (1.00 - percent/100) ? neutralColor : bearishColor,width = 1,extend = extend.right)
                currentLow := l[i]
            //if l[i + 1] > h[i] and l[i + 1] > currentHigh and h[i] > currentHighTmp
                //drawLine(bar_index - i, h[i], bar_index - i + 1, h[i], h[i] > currentHigh * (1.00 + percent/100) ? neutralColor : bullishColor, "yes")
                //currentHigh := h[i]
                //drawLine(bar_index - i - 1, l[i + 1], bar_index - i, l[i + 1], l[i + 1] > currentHigh * (1.00 + percent/100) ? neutralColor : bullishColor, "yes")
                //currentHigh := l[i + 1]

            //if h[i + 1] < l[i] and h[i + 1] < currentLow and l[i] < currentLowTmp
                //drawLine(bar_index - i, l[i], bar_index - i + 1, l[i], l[i] < currentLow * (1.00 - percent/100) ? neutralColor : bearishColor, "yes")
                //currentLow := l[i]
                //drawLine(bar_index - i - 1, h[i + 1], bar_index - i, h[i + 1], h[i + 1] < currentLow * (1.00 - percent/100) ? neutralColor : bearishColor, "yes")
                //currentLow := h[i + 1]

            if l[i] < currentLow
                currentLowTmp := l[i]
            if h[i] > currentHigh
                currentHighTmp := h[i]
        if currentLow < currentLowTmp
            currentLowTmp := currentLow
        if currentHigh > currentHighTmp
            currentHighTmp := currentHigh

plot(high_counter, "high_counter", display = display.data_window)
plot(low_counter, "low_counter", display = display.data_window)
plot(high_counter_2, "high_counter_2", display = display.data_window)
plot(low_counter_2, "low_counter_2", display = display.data_window)
解决方案

问题根源

request.security()返回的日线数据是与当前图表K线一一映射的,在1分钟周期时,每根日线对应多根1分钟K线,但代码中h[i]这类索引访问的是当前图表周期的历史K线对应的日线数据,而非日线周期本身的历史数据。max_bars_back=4999限制的是当前图表周期可回溯的K线数量,因此超过5000根1分钟K线后,无法访问更早的日线数据。

改进思路

  1. 在日线周期缓存枢轴数据:使用数组在日线周期计算并存储所有符合条件的枢轴点位和时间戳,避免在日内周期依赖大量回溯。
  2. 在日内周期读取缓存数据:通过request.security()调用日线周期的缓存数组,直接获取所有历史枢轴信息。
  3. 一次性绘制所有线:在barstate.islastconfirmedhistory中循环数组绘制所有枢轴线,突破单周期回溯限制。

优化后代码

//@version=5
indicator("Auto Lines - Unlimited", overlay = true, max_lines_count = 500)

// --- 逻辑设置 ---
lookback = input.int(2, "Pivot Lookback")
percent = input.int(2, "Prozent")

// --- 样式设置 ---
bullishColor = input.color(color.green, "Bullish Color")
bearishColor = input.color(color.red, "Bearish Color")
neutralColor = input.color(color.white, "Neutral Color")

// --- 日线周期缓存枢轴数据 ---
var float[] pivotHighs = array.new_float()
var float[] pivotLows = array.new_float()
var int[] pivotHighTimes = array.new_int()
var int[] pivotLowTimes = array.new_int()

// 在日线周期执行筛选和缓存逻辑
if request.security(syminfo.tickerid, "D", barstate.islastconfirmedhistory)
    dailyHigh = request.security(syminfo.tickerid, "D", high)
    dailyLow = request.security(syminfo.tickerid, "D", low)
    ph = request.security(syminfo.tickerid, "D", ta.highest(lookback))
    pl = request.security(syminfo.tickerid, "D", ta.lowest(lookback))
    dailyCloseTime = request.security(syminfo.tickerid, "D", time_close)
    
    // 缓存符合条件的枢轴高点
    if dailyHigh == ph
        array.push(pivotHighs, dailyHigh)
        array.push(pivotHighTimes, dailyCloseTime)
    // 缓存符合条件的枢轴低点
    if dailyLow == pl
        array.push(pivotLows, dailyLow)
        array.push(pivotLowTimes, dailyCloseTime)

// --- 日内周期绘制所有枢轴线 ---
if barstate.islastconfirmedhistory
    // 绘制枢轴高点线
    var float currentHigh = na
    for i = 0 to array.size(pivotHighs) - 1
        phVal = array.get(pivotHighs, i)
        phTime = array.get(pivotHighTimes, i)
        
        // 确定线条颜色
        lineColor = na
        if na(currentHigh)
            lineColor = bullishColor
            currentHigh = phVal
        else
            lineColor = phVal > currentHigh * (1 + percent/100) ? neutralColor : bullishColor
            currentHigh := phVal > currentHigh ? phVal : currentHigh
        
        // 从枢轴日结束时间延伸到当前最新时间
        line.new(x1=phTime, x2=time_close, y1=phVal, y2=phVal, 
                 xloc=xloc.bar_time, color=lineColor, width=1, extend=extend.right)
    
    // 绘制枢轴低点线
    var float currentLow = na
    for i = 0 to array.size(pivotLows) - 1
        plVal = array.get(pivotLows, i)
        plTime = array.get(pivotLowTimes, i)
        
        // 确定线条颜色
        lineColor = na
        if na(currentLow)
            lineColor = bearishColor
            currentLow = plVal
        else
            lineColor = plVal < currentLow * (1 - percent/100) ? neutralColor : bearishColor
            currentLow := plVal < currentLow ? plVal : currentLow
        
        // 从枢轴日结束时间延伸到当前最新时间
        line.new(x1=plTime, x2=time_close, y1=plVal, y2=plVal, 
                 xloc=xloc.bar_time, color=lineColor, width=1, extend=extend.right)

关键改进点

  • 数据缓存:在日线周期直接筛选并存储所有符合条件的枢轴点,不受日内周期的回溯限制。
  • 突破max_bars_back:通过数组存储历史数据,可访问所有日线历史枢轴点,无需依赖当前图表周期的K线回溯。
  • 高效画线:一次性循环数组绘制所有线,避免逐K线循环的性能瓶颈和限制。

内容的提问来源于stack exchange,提问作者Waldemar Heimann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:25:54