Pine Script:4H图表单次request.security获取日线数据计算SMA失效问题
问题根源:周期数据的重复填充与计算上下文差异
你的间接方法失效的核心原因是计算SMA的上下文周期错误:
- 当你用
request.security(syminfo.tickerid, "D", close)获取日线收盘价时,在4h图表上,每一根4h K线都会返回当前对应的日线收盘价——也就是说,同一个日线收盘价会被重复填充到该交易日内的所有4h K线中。 - 此时调用
ta.sma(dailyChartClose, smaPeriod),其实是在4h周期的重复数据序列上计算SMA,而不是在日线周期的原始数据序列上计算。这就导致结果和直接用4h收盘价计算的SMA一致,完全偏离了预期。
而直接方法有效的原因是:request.security()会切换到日线周期环境中执行ta.sma(close, smaPeriod),也就是用日线级别的收盘价序列计算出正确的日线SMA,再把这个结果返回到4h图表上(每个交易日的所有4h K线共享同一个日线SMA值)。
高效解决方案:单次request.security计算多周期SMA
要实现只调用一次request.security()就获取多个日线SMA,你可以在security的回调中一次性计算所有需要的指标,通过元组返回多个结果。示例代码如下:
//@version=5 indicator(title="Multi SMA from Single Security Call", shorttitle="Multi SMA", overlay=true) // 定义需要计算的日线SMA周期列表 smaPeriods = [100, 200, 1400] // 单次调用request.security,在日线周期内计算所有SMA [dailySma100, dailySma200, dailySma1400] = request.security(syminfo.tickerid, "D", [ta.sma(close, smaPeriods[0]), ta.sma(close, smaPeriods[1]), ta.sma(close, smaPeriods[2])]) // 绘制所有日线SMA plot(dailySma100, color=color.green, title="100-Day SMA") plot(dailySma200, color=color.red, title="200-Day SMA") plot(dailySma1400, color=color.blue, title="1400-Day SMA")
代码说明:
- 把所有需要计算的SMA放在
request.security()的第三个参数里,用元组包裹——这个计算逻辑是在日线周期上下文中执行的,得到的是真正的日线SMA值。 - 接收返回的元组,直接得到所有日线SMA结果,无需多次调用
request.security()。 - 最终在4h图表上,每个交易日的所有4h K线都会显示对应的日线SMA值,和直接方法的效果完全一致,但仅用了一次security调用。
内容的提问来源于stack exchange,提问作者silverstreak
相关产品推荐
相关产品推荐

