Pine Script如何获取不含当日的多日最高价,security不能在for循环调用怎么办
可行实现方案
Pine Script不允许在for循环、if分支内调用security/request.security函数,该类跨周期数据加载函数需要在脚本全局阶段预执行,动态调用会触发时序异常。
你要的「排除当日的最近N日最高价」无需用循环实现,可通过预加载全量日线高价序列后直接取区间最大值实现,同时可以彻底解决跨周期取值的未来函数重绘问题:
//@version=5 indicator("最近3日不含当日最高价", overlay=true) period = input.int(3, minval=1, title="统计天数") // 预加载日线高价序列,关闭前瞻避免读取未收盘的当日未来数据 daily_high = request.security(syminfo.tickerid, "D", high, barmerge.gaps_on, barmerge.lookahead_off) // 跳过当日未收盘数据,取已收盘的最近period根日线最高价 prev_days_hh = ta.highest(daily_high[1], period) plot(prev_days_hh, color=color.new(color.blue, 0), title="近3日最高价", linewidth=2)
实现逻辑说明
- 一次性调用
request.security加载所有历史日线的收盘价序列,不需要循环多次调用 daily_high[1]偏移一位直接过滤未收盘的当日日线数据,不会把当日实时产生的价格纳入统计- 搭配
barmerge.lookahead_off参数,彻底禁止跨周期调用时读取未来数据,不会出现你之前遇到的「当日最高价提前绘制在前面K线」的重绘问题
如果需要自定义统计区间(比如取前第2天到前第4天的最高价),可以手动调整偏移参数即可实现类似highest(start, end)的效果:
// 示例:统计前2日到前4日的最高价,共3天 start_offset = 2 end_offset = 4 custom_hh = ta.highest(daily_high[start_offset], end_offset - start_offset + 1)
注意:如果你使用Pine Script v4版本,只需把request.security的request.前缀去掉即可正常运行,其余参数逻辑完全通用。
内容的提问来源于stack exchange,提问作者Abraham Reinhardt
相关产品推荐
相关产品推荐

