Pinescript v5中request.security返回数据与高时间帧不一致问题
Pine Script v5 request.security 高时间帧数据匹配问题
问题描述
在Pine Script v5中使用request.security从高时间帧(selectedTimeframe)请求数据时,返回的float数组与实际高时间帧数据完全不符。当前下方图表为4小时高时间帧,上方为1小时低时间帧,核心问题是:1小时低时间帧请求4小时数据时,返回价格与实际4小时价格不一致。已尝试手动输入时间帧字符串、仅请求高时间帧收盘价,问题依旧。
原代码
float ph = request.security(syminfo.tickerid, selectedTimeframe, ta.pivothigh(src1, prd, prd)[barstate.isrealtime ? 1 : 0],barmerge.gaps_on)[barstate.isrealtime ? 0 : 1] float pl = request.security(syminfo.tickerid, selectedTimeframe, ta.pivotlow(src2, prd, prd)[barstate.isrealtime ? 1 : 0],barmerge.gaps_on)[barstate.isrealtime ? 0 : 1]
问题分析
问题根源在于双重索引操作和barstate.isrealtime的逻辑冲突:
- 你在
request.security的参数内部,已经对ta.pivothigh/ta.pivotlow做了一次索引[barstate.isrealtime ? 1 : 0],之后又对整个request.security的返回值再做一次反向索引[barstate.isrealtime ? 0 : 1],这会直接打乱高时间帧数据的对齐逻辑,导致拿到错误的bar数据。 request.security本身会自动处理低时间帧到高时间帧的数据对齐,额外的外层索引会破坏这种对齐机制,最终返回的不是对应高时间帧的正确数据。
修正方案
方案1:移除双重索引,简化逻辑
直接在高时间帧环境下计算枢轴点,依赖request.security自带的对齐机制:
// 直接在高时间帧计算枢轴点,无需额外外层索引 float ph = request.security(syminfo.tickerid, selectedTimeframe, ta.pivothigh(close, prd, prd), barmerge.gaps_on) float pl = request.security(syminfo.tickerid, selectedTimeframe, ta.pivotlow(close, prd, prd), barmerge.gaps_on)
方案2:针对实时bar调整内部逻辑(如需)
如果必须处理实时bar的特殊情况,仅在request.security内部做索引判断,不要在外层重复操作:
// 仅在高时间帧计算时处理实时bar的索引逻辑 float ph_realtime = request.security(syminfo.tickerid, selectedTimeframe, barstate.isrealtime ? ta.pivothigh(close, prd, prd)[1] : ta.pivothigh(close, prd, prd), barmerge.gaps_on) float pl_realtime = request.security(syminfo.tickerid, selectedTimeframe, barstate.isrealtime ? ta.pivotlow(close, prd, prd)[1] : ta.pivotlow(close, prd, prd), barmerge.gaps_on)
额外排查要点
- 确认
selectedTimeframe格式正确:比如4小时需写为"4H",1天写为"D",需符合Pine Script的时间帧字符串规范。 - 测试时可先单独请求高时间帧的
close数据,确认request.security返回值与高时间帧收盘价一致后,再加入枢轴点计算,逐步排查问题。 barmerge.gaps_on仅控制是否保留高时间帧缺口,不会影响价格匹配,可根据需求切换为barmerge.gaps_off。
内容的提问来源于stack exchange,提问作者Oyeleke Isreal Timilehin
相关产品推荐
相关产品推荐

