You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:04