在 Pine Script 中实现自定义平滑移动平均(SMA)完全指南

·

为什么要自己做 SMA?

移动平均(SMA)是技术面分析的“地基”,但如果你只会调用 ta.sma,就无法真正理解它对价格的反应逻辑。下面,我们会用不到五十行的 Pine Script 代码,亲手搭建一个可任意切换价格源的自定义 SMA,并与内置函数逐像素对比,确保零误差。

👉 三分钟带你定位 SMA 高频失效场景,快速修复策略回测失真。


Step 1 拆解问题:SMA 到底在算啥?


Step 2 先把逻辑写成伪代码

function 自定义SMA(N):
    总额 = 0
    从 i=0 到 i=N-1:
        总额 += 收盘价[i]
    return 总额 / N

这段伪代码可直接转化为后续 Pine Script 的语句。


Step 3 在 Pine Script 中落地

3.1 建立输入口

//@version=5
indicator("自定义 SMA", overlay=true)
length = input.int(14, "平滑周期")

让使用者在图形界面上自由调整平滑周期这一核心参数。

3.2 用循环求和

smoothSMA(src, len)=>
    float total = 0.0
    for i = 0 to len-1
        total := total + src[i]
    total / len

这里 src 既可以是收盘价 close,也可以换成高、开、低或平均价,通用性直接拉满。

3.3 画线

mySma = smoothSMA(close, length)
plot(mySma, color=color.blue, linewidth=2, title="自定义 SMA")

此时蓝色线已经是纯粹由我们手工计算出的 SMA。


Step 4 对照实验:让内置 SMA 跳出来

builtinSma = ta.sma(close, length)
plot(builtinSma, color=color.green, linewidth=2, title="内置 SMA")

两根线完全重合?恭喜,自测通过!

👉 用真实数据双盲测试,点此获取讲解视频脚本示例。


Step 5 别踩坑!var 会毁了你的结果


Step 6 提升自由度:把价格源交给用户

sourceList  = input.string("close", "价格源", options=["close","open","high","low","hl2"])
price       = switch sourceList
    "close" => close
    "open"  => open
    "high"  => high
    "low"   => low
    "hl2"   => hl2

mySma   = smoothSMA(price, length)
builtin = ta.sma(price, length)

用户可在 UI 即时切换 价格采样 类型,立刻看到不同数据源对 平滑趋势 的影响。


FAQ:关于自定义 SMA 的 6 个高频疑问

Q1 为什么我的 SMA 前几十根 K 线是空值?
A 计算所需的历史数据不足;当 bar_index < length 时,Pine Script 会返回 na

Q2 可以改成可变权重吗?
A 当然可以!把 for 里的 1 换成基于 i 的加权函数,就变成 加权移动平均 WMA。

Q3 运行效率会差吗?
A 在小周期(如 1 分钟)+ 大 length(如 2000)时,循环有性能损耗;此时推荐改用内置函数或缓存中间结果。

Q4 如何在策略里调用这个函数?
A 直接把整段 smoothSMA 复制到 strategy 文件中即可,无额外依赖。

Q5 如何让两根线差值报警?
A 计算 delta = math.abs(mySma - builtin) 后,用 alertcondition(delta > threshold) 触发提醒。

Q6 支持 security() 跨品种调用吗?
A 支持。src = request.security("NASDAQ:TSLA", "D", close) 传进函数即可实现日内策略引用日级 SMA。


进阶路线图:从 SMA 到自适应均线

  1. total / len 换成 total / weightSum → 完成 WMA。
  2. 改用指数递减因子 → 得到 EMA
  3. 让长度参数随波动率动态调整 → 打造 自适应平滑均线

掌握这三步,任何复杂指标都能拆解为“求和→求权→平滑”这一普世模型。


一键可用完整源码

将以下代码直接粘进 TradingView 编辑器即可运行。自左侧输入面板里切换 价格源平滑周期,两根线误差小于千万分之三视为合格。

//@version=5
indicator("自定义与内置 SMA 对照", overlay=true)

// 输入区
length        = input.int(14, "平滑周期")
srcOption     = input.string("close","价格源", options=["close","open","high","low","hl2"])
src           = switch srcOption
    "close" => close
    "open"  => open
    "high"  => high
    "low"   => low
    "hl2"   => hl2

// 自定义 SMA 函数
smoothSMA(series, len)=>
    float total = 0.0
    for i = 0 to len-1
        total := total + series[i]
    total / len

// 计算 & 画图
plot(smoothSMA(src, length),      color=color.blue,  linewidth=2, title="自定义 SMA")
plot(ta.sma(src, length),         color=color.green, linewidth=2, title="内置 SMA")
plotshape(smoothSMA(src, length) == ta.sma(src, length), location=location.abovebar,
          color=color.red, style=shape.triangleup, title="完全重合标识")

写在最后

亲手写一次 SMA,等于把移动平均从“黑箱”变“透明箱”。当你再面对 指数平滑Hull 平均,甚至 Kalman 滤波 时,都会回到同一套 滚动求和 思想。把本文保存到 收藏夹,随时可以复制-粘贴-魔改,助你在 Pine Script 进阶之路上踩坑更少、收益更稳。