Pine Script如何实现跨任意时间框架不变的3日、30日静态平均成交量指标
Pine Script 静态日均成交量指标修正方案
问题根源
你的判断正确,当前代码的核心问题是:security 函数返回的是「当前图表每根K线对应的目标时间帧成交量值」,在低于日线的时间框架下,同一个交易日的所有K线会返回相同的日线成交量。此时你用 vol[i] 取到的是当前图表前i根K线对应的数值,不是过去i个交易日的成交量,因此切换时间周期后计算结果会发生变化。
修正思路
将3日、30日成交量平均的计算逻辑直接放到 security 函数内部,在指定的日线时间框架下完成历史周期统计,再把最终计算结果返回到当前图表,确保任意时间周期下读取的数值都是固定的日线级别计算结果。
修正后完整代码
//@version=4 study("Average Volume Indicator", "AVI", overlay = false) // User Inputs res = input("D", "Timeframe", input.resolution, group = "Volume Selection") vlg = input(30, "Long Period", step = 1, group = "Volume Selection") vsh = input(3, "Short Period", step = 1, group = "Volume Selection") // 直接在目标时间框架内完成所有计算 [vol_prev, vma_lg, vma_sh] = security(syminfo.tickerid, res, [volume[1]/1000000, sma(volume, vlg)/1000000, sma(volume, vsh)/1000000], barmerge.gaps_off, barmerge.lookahead_off) // 计算差值百分比 vma_per = (vma_sh - vma_lg) / vma_lg * 100 // 原循环与SMA计算逻辑一致,直接复用结果即可 vol_per = vma_per table vol_tab = table.new(position.top_right, 3, 1, bgcolor=color.new(color.white,50)) table.cell(vol_tab, 1, 0, "VOL: " + tostring(vol_per, "0") + "%", text_color = color.white) table.cell(vol_tab, 2, 0, "VMA: " + tostring(vma_per, "0") + "%", text_color = color.white)
如果你使用Pine Script v5,只需将代码头部的
//@version=4改为//@version=5,study函数替换为indicator即可正常运行。
关键改动说明
- 取消了当前图表层面的SMA与循环计算,所有历史周期统计都在
security内部的日线时间框架下完成,确保取到的是过往N个交易日的成交量,而非当前图表的N根K线对应成交量 - 一次
security调用返回多个计算结果,避免重复调用降低运行效率 - 保留了原有的无未来函数配置,不会出现信号漂移问题
- 删除了逻辑冗余的循环计算代码,运行效率更高
内容的提问来源于stack exchange,提问作者ThePix
相关产品推荐
相关产品推荐

