将日线枢轴线导入日内周期并突破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线后,无法访问更早的日线数据。
改进思路
- 在日线周期缓存枢轴数据:使用数组在日线周期计算并存储所有符合条件的枢轴点位和时间戳,避免在日内周期依赖大量回溯。
- 在日内周期读取缓存数据:通过
request.security()调用日线周期的缓存数组,直接获取所有历史枢轴信息。 - 一次性绘制所有线:在
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
相关产品推荐
相关产品推荐

