Pine Script:日线蜡烛图叠加低周期图表异常及扩容需求问询
Pine Script低周期叠加日线蜡烛图问题解决指南
一、超过18根日线绘制错乱的修复
常见原因
request.security默认的barmerge策略未正确配置,导致高低周期数据对齐错位- 未禁用前瞻(lookahead)功能,引发数据提前加载的绘制异常
- 直接使用普通变量存储历史数据,超过一定数量后出现索引或覆盖错误
修复代码示例
//@version=5 indicator("叠加日线蜡烛图", overlay=true) // 1. 配置request.security参数:保留缺口、禁用前瞻 [dailyO, dailyH, dailyL, dailyC] = request.security(syminfo.tickerid, "D", [open, high, low, close], barmerge.gaps_on, barmerge.lookahead_off) // 2. 用数组存储历史日线数据,避免数据丢失 var array<float> histO = array.new_float() var array<float> histH = array.new_float() var array<float> histL = array.new_float() var array<float> histC = array.new_float() // 日线切换时存入数组 if change(time("D")) array.push(histO, dailyO) array.push(histH, dailyH) array.push(histL, dailyL) array.push(histC, dailyC) // 最后一根日线补充存入 if barstate.islast array.push(histO, dailyO) array.push(histH, dailyH) array.push(histL, dailyL) array.push(histC, dailyC) // 3. 遍历数组绘制全部历史日线 for i = 0 to array.size(histO)-1 barOffset = array.size(histO)-1 - i dailyTime = time("D")[barOffset] o = array.get(histO, i) h = array.get(histH, i) l = array.get(histL, i) c = array.get(histC, i) plotcandle(dailyTime, o, h, l, c, color=color.new(color.blue, 50), title="历史日线")
二、1小时图显示全部历史日线的实现
核心方案:一次性获取全量历史数据
通过barstate.islast触发全量历史数据收集,避免逐K线请求的性能问题,同时获取服务器允许的最大历史范围:
//@version=5 indicator("全量日线叠加1小时图", overlay=true) // 存储全量日线数据的数组 var array<float> allDailyO = array.new_float() var array<float> allDailyH = array.new_float() var array<float> allDailyL = array.new_float() var array<float> allDailyC = array.new_float() var array<int> allDailyTimes = array.new_int() // 仅在最后一根K线时收集全量数据,降低性能消耗 if barstate.islast // 获取日线周期的总K线数 dailyBarCount = request.security(syminfo.tickerid, "D", bar_index) + 1 // 遍历所有日线K线,收集数据 for i = 0 to dailyBarCount - 1 [o, h, l, c] = request.security(syminfo.tickerid, "D", [open[i], high[i], low[i], close[i]], lookahead=barmerge.lookahead_off) t = request.security(syminfo.tickerid, "D", time[i], lookahead=barmerge.lookahead_off) array.push(allDailyO, o) array.push(allDailyH, h) array.push(allDailyL, l) array.push(allDailyC, c) array.push(allDailyTimes, t) // 绘制所有历史日线蜡烛 for i = 0 to array.size(allDailyO)-1 t = array.get(allDailyTimes, i) o = array.get(allDailyO, i) h = array.get(allDailyH, i) l = array.get(allDailyL, i) c = array.get(allDailyC, i) plotcandle(t, o, h, l, c, color=color.new(color.orange, 40), title="全量日线")
关键说明
- 代码会自动获取服务器允许的最大历史日线数据量,无需手动设置数量限制
- 仅在最后一根K线执行数据收集,大幅降低性能消耗
- 若仍存在显示限制,检查平台的历史数据订阅权限(部分品种的完整历史需付费订阅)
内容的提问来源于stack exchange,提问作者amah
相关产品推荐
相关产品推荐

