保持敬畏之心
交易是一场持久战

Pine Script(133):移动平均线概览与简单移动平均线SMA

#Pine Script入门教学

Pine Script有哪些移动平均线

移动平均线是自主交易者和自动化交易者都喜爱使用的流行工具。多年来,交易者们开发了多种移动平均线,每一种都对如何以最佳方式平均价格有着自己独特的见解。那么,TradingView Pine Script中有哪些移动平均线呢?让我们来一探究竟。

Pine Script中的移动平均线

Pine Script提供了以下用于计算移动平均线的内置函数:

函数 移动平均线类型
ta.sma() 简单移动平均线(Simple Moving Average, SMA)
ta.ema() 指数移动平均线(Exponential Moving Average, EMA)
ta.wma() 加权移动平均线(Weighted Moving Average, WMA)
ta.hma() 赫尔移动平均线(Hull Moving Average, HMA)
ta.rma() 相对移动平均线(Relative Moving Average, RMA)
ta.swma() 对称加权移动平均线(Symmetrically-Weighted Moving Average, SWMA)
ta.alma() Arnaud Legoux移动平均线(Arnaud Legoux Moving Average, ALMA)
ta.vwma() 成交量加权移动平均线(Volume-Weighted Moving Average, VWMA)
ta.vwap() 成交量加权平均价(Volume-Weighted Average Price, VWAP)

让我们来快速了解一下每种平均线以及如何用代码实现它。

简单移动平均线(Simple Moving Average)

简单移动平均线(SMA)返回的是过去指定数量K线上的常规算术平均值。在Pine Script中,我们通过 ta.sma() 函数来获取这个平均值。

该函数需要两个参数:用于计算的数据,以及平均线的周期长度(以K线为单位)。

如果我们想获取交易品种收盘价的简单移动平均线,我们可以这样做:

// 计算一个10周期的简单移动平均线 (SMA)
smaValue = ta.sma(close, 10)

plot(smaValue, color=color.navy)

参阅“简单移动平均线(SMA)”一文,以了解更多关于该平均线的信息。

指数移动平均线(Exponential Moving Average)

指数移动平均线(EMA)使用指数加权的方式来赋予近期数据更高的权重,并降低旧数据的重要性。要在Pine Script中编写这种平均线,我们使用 ta.ema() 函数。

该函数需要两个东西:要分析的数据,以及用于计算的K线周期数。

如果我们想知道10周期的收盘价EMA,可以像这样使用该函数:

// 计算10周期的指数移动平均线 (EMA)
emaValue = ta.ema(close, 10)

plot(emaValue, color=color.navy)

“指数移动平均线(EMA)”课程中有更多关于该平均线及其编码方式的信息。

加权移动平均线(Weighted Moving Average)

加权移动平均线(WMA)为每个数据点分配一个特定的权重,近期的数据会获得比旧数据更大的权重。与EMA不同,WMA使用线性权重。我们在Pine Script中通过 ta.wma() 函数来编写这种平均线。

该函数需要我们提供两样东西:用于计算的数据,以及要处理的K线周期数。

如果我们想用WMA来平均K线的收盘价,我们可以这样做:

// 获取20周期的收盘价加权移动平均线
wmaValue = ta.wma(close, 20)

plot(wmaValue, color=color.blue)

请参阅“加权移动平均线(WMA)”一文,以获取更多关于该平均线及其编码方式的信息。

赫尔移动平均线(Hull Moving Average)

赫尔移动平均线(HMA)通过将三个加权移动平均线(WMA)组合在一起,来计算出一个移动平均值,其目的是为了创造出一条既平滑又反应迅速的移动平均线。Pine Script代码使用 ta.hma() 函数来计算该平均线。

该函数需要两个东西:要处理的数据,以及用于计算的K线周期数。

比方说,我们想从收盘价中获取赫尔平均线。在这种情况下,我们可以像这样使用 ta.hma()

// 计算并绘制8周期的赫尔移动平均线
hmaValue = ta.hma(close, 8)

plot(hmaValue, color=color.fuchsia)

关于该平均线的详细信息,请参阅“赫尔移动平均线(HMA)”课程。

相对移动平均线(Relative Moving Average)

相对移动平均线(RMA)计算的是一种指数平均值,与EMA非常相似。不同之处在于,RMA赋予最新价格的权重较小,这使得它比EMA的反应更慢(但也更平滑,噪音更少)。Pine Script代码使用 ta.rma() 函数来计算该平均线。

我们向该函数提供两样东西:要分析的数据,以及用于计算的K线周期数。

如果我们想获取交易品种收盘价的相对移动平均线,可以像这样使用该函数:

// 获取12周期的收盘价相对移动平均线
rmaValue = ta.rma(close, 12)

plot(rmaValue)

请参阅“相对移动平均线(RMA)”一文,以了解更多关于该平均线的信息。

对称加权移动平均线(Symmetrically-Weighted Moving Average)

对称加权移动平均线(SWMA)为其处理的数据点分配不同的权重,这些权重是对称分布的。我们使用Pine Script的 ta.swma() 函数来计算该平均线。

该函数只需要用于计算的数据。至于其周期长度,该函数总是使用固定的4根K线。

如果我们对对称加权的收盘价感兴趣,可以这样编码:

// 计算并绘制收盘价的对称加权移动平均线
swmaValue = ta.swma(close)

plot(swmaValue)

请参阅“对称加权移动平均线(SWMA)”一文,以获取更多关于该平均线的信息。

Arnaud Legoux移动平均线(Arnaud Legoux Moving Average)

Arnaud Legoux移动平均线(ALMA)通过为每个数据点分配不同的权重来计算平均值,并使用高斯分布来得出这些权重。我们使用 ta.alma() 函数来编写这种平均线。

该函数需要几个参数:要处理的数据和平均线的长度,还需要一个用于权衡平滑度与响应速度的偏移值(offset),以及一个控制整体平滑度的sigma值。

如果我们想要收盘价的Arnaud Legoux移动平均线,可以这样做:

// 计算收盘价的ALMA,长度为12周期,
// 偏移量为0.70,sigma为7
almaValue = ta.alma(close, 12, 0.70, 7)

plot(almaValue)

请参阅“Pine Script的Arnaud Legoux移动平均线”一文,以获取更多关于该移动平均线的信息。

成交量加权移动平均线(Volume-Weighted Moving Average)

成交量加权移动平均线(VWMA)使用每根K线的成交量来对该K线的数据点进行加权。这使得高成交量的K线获得更大的权重,而低成交量的K线对移动平均线值的影响则较小。我们使用 ta.vwma() 函数来计算该平均线。

该函数需要两个东西:用于计算的数据,及其周期长度(以K线为单位)。

要获取成交量加权的平均收盘价,我们可以这样做:

// 获取20周期的收盘价成交量加权移动平均线
vwmaValue = ta.vwma(close, 20)

plot(vwmaValue)

请参阅“成交量加权移动平均线(VWMA)”一文,以获取更多关于该平均线的信息。

成交量加权平均价(Volume-Weighted Average Price)

成交量加权平均价(VWAP)是一个自某个时间点(例如日内交易时段的开始)以来计算的平均值。尽管它是一个锚定的平均值,而非“移动”的,但它仍然是在对数据进行平均。它通过给予成交量更大的K线比成交量更小的K线更大的权重来实现这一点。我们使用 ta.vwap() 函数来获取该平均值。

该函数需要一个东西:要处理的数据。它返回该数据自日内交易时段开始以来的成交量加权平均值。

如果我们想要K线收盘价的成交量加权平均价,可以像这样使用该函数:

// 计算成交量加权的平均收盘价
vwapValue = ta.vwap(close)

plot(vwapValue)

请参阅“成交量加权平均价(VWAP)”一文,以获取更多关于该平均线的信息。

总结

Pine Script开箱即用地支持多种移动平均线。

  • 有标准的平均线(ta.sma())
  • 线性加权的(ta.wma(), ta.hma())
  • 指数加权的(ta.ema(), ta.rma())
  • 对称加权的(ta.swma())
  • 成交量加权的(ta.vwma(), ta.vwap())
  • 以及特殊的(ta.alma())平均线。

计算简单移动平均线(SMA)

在Pine Script中,我们使用 ta.sma() 函数来计算简单移动平均线(SMA)。

常见的简单移动平均线返回的是最近几根K线的平均值。为此,它将该周期内的所有数据相加,然后除以K线的数量。我们可以对任何存储在变量中、或由函数、表达式返回的数值使用 ta.sma()

默认语法

该函数的定义如下:

ta.sma(source, length)
  • source:要处理的数值序列。这是我们计算SMA所依据的数据。
  • length:一个整数,用于设置移动平均线的周期长度(以K线数量计)。

ta.sma() 会返回一个浮点值,该值是 source 在最近 length 根K线上的平均值。

快速范例

所以,我们给 ta.sma() 两样东西:一个要处理的数值序列,以及要计算的K线数量。让我们看看如何使用它。

  • 一个常见的任务是获取收盘价的平均值。要计算它,我们让 ta.sma() 处理 close 变量,像这样:
    // 计算一个10周期和50周期的简单移动平均线 (SMA)
    fastAverage = ta.sma(close, 10)
    slowAverage = ta.sma(close, 50)
    
    plot(fastAverage, color=color.navy)
    plot(slowAverage, color=color.fuchsia)
    
  • 除了K线的价格,简单移动平均线可以对任何数值序列进行计算。例如,对于平均成交量,我们可以这样做:
    // 计算成交量的简单移动平均线
    volumeAverage = ta.sma(volume, 10)
    
    plot(volumeAverage)
    
  • ta.sma() 函数也可以获取一个数值表达式的平均值。例如,下面的代码计算了K线高低点范围的40周期平均值:
    // 获取K线高低点范围的平均值
    avgRange = ta.sma(high - low, 40)
    
    plot(avgRange)
    
  • 另一个选择是从其他函数返回的值中获取简单移动平均线。比方说,我们计算了相对强弱指数(RSI)震荡指标。要获取平均RSI,我们可以这样做:
    // 首先计算RSI,然后使用RSI的值来计算SMA
    rsiValue   = ta.rsi(close, 7)
    rsiAverage = ta.sma(rsiValue, 15)
    
    plot(rsiValue, color=color.fuchsia)
    plot(rsiAverage, color=color.orange)
    
  • 如果我们不需要RSI的值,我们可以直接使用 ta.rsi() 来计算平均值:
    // 首先计算RSI,然后使用RSI的值来计算SMA
    rsiAverage = ta.sma(ta.rsi(close, 7), 15)
    
    plot(rsiAverage, color=color.orange)
    

ta.sma() 的特性

  • ta.sma() 返回 source 在最近 length 个值上的总和,再除以 length。也就是说,我们将所有数据相加,然后除以数据点的数量。这种方法给予每个数据点相同的权重(因此重要性也相同)。
  • 要知道简单移动平均线是上升还是下降,我们可以比较它的当前值和前一个值。但 ta.rising() 函数可以判断平均线是否已连续上涨了指定数量的K线,这更容易使用,也需要更少的代码。同样地,ta.falling() 函数可以判断平均线是否已连续下跌了指定数量的K线。
  • 要判断一个序列是否与简单移动平均线发生交叉,我们使用 ta.cross() 函数。要测试交叉是否发生在特定方向,我们使用 ta.crossover() 函数(用于上穿)或 ta.crossunder() 函数(用于下穿)。

计算过程

以公式形式,TradingView是这样计算简单移动平均线的:

在Pine Script代码中,一个简单移动平均线按如下方式计算:

pine_sma(source, length) =>
    sum = 0.0
    for i = 0 to length - 1
        sum += source[i] / length
    sum

plot(pine_sma(close, 15))

请知悉,使用 ta.sma() 函数计算简单移动平均线,比使用上面的 for 循环更高效。为了获得最佳的脚本性能(并减少代码输入量),我们最好使用 ta.sma()

脚本范例

让我们看看一个完整的脚本如何使用简单移动平均线(SMA)。下方的指标会计算10周期和30周期的收盘价SMA。

我们在图表上绘制这些平均线,然后检查是否有交叉信号发生。当交叉发生时,我们为图表背景上色以作为视觉提示。

该指标的完整代码如下:

//@version=5
indicator(title="Simple Moving Average example", overlay=true)

// 输入项
averageData = input.source(close, title="Average Data Source")

fastLength = input.int(10, title="Fast Average Length")
slowLength = input.int(30, title="Slow Average Length")

// 计算平均线
fastAverage = ta.sma(averageData, fastLength)
slowAverage = ta.sma(averageData, slowLength)

// 绘制平均线
plot(fastAverage, color=color.orange, title="Fast SMA")
plot(slowAverage, color=color.teal, title="Slow SMA")

// 寻找移动平均线交叉
crossAbove = ta.crossover(fastAverage, slowAverage)
crossUnder = ta.crossunder(fastAverage, slowAverage)

// 用绿色和红色背景高亮交叉
crossColour = if crossAbove
    color.new(color.green, 80)
else if crossUnder
    color.new(color.red, 80)

bgcolor(crossColour, title="Crosses Background")

首先,我们调用 indicator() 函数,用于命名该脚本并将其叠加显示在主图的交易品种上。

然后,我们通过三个输入项来创建自定义设置。第一个是数据源输入选项(input.source()),用于指定SMA的计算数据。另外两个设置是使用 input.int() 函数创建的整数输入,它们用于设定移动平均线的周期长度。

接下来,我们计算SMA:

// 计算平均线
fastAverage = ta.sma(averageData, fastLength)
slowAverage = ta.sma(averageData, slowLength)

我们两次调用 ta.sma() 函数。第一次,我们让函数处理 averageData 值,周期长度为 fastLength 根K线。这两个输入变量的默认值分别是 close10,因此我们得到的是10周期的收盘价简单移动平均线。

另一个 ta.sma() 调用也运行在 averageData 值上,但这次的周期长度为 slowLength 根K线。该输入变量的初始值为 30,所以这里我们得到30周期的平均值。

在计算完平均线后,脚本继续执行其他代码。这些代码首先调用 plot() 函数在图表上绘制平均线。我们让快线显示为橙色(color.orange),慢线则使用青色(color.teal)。

然后我们寻找移动平均线的交叉。我们使用 ta.crossover() 函数来判断快线是否上穿了慢线,并使用 ta.crossunder() 函数来判断快线是否下穿了慢线。

决定交叉的背景颜色是我们的下一步。为此,一个级联 if 语句会检查是否发生了上穿。如果是,我们使用绿色(color.green)。如果不是,我们再测试是否发生了下穿。在这种情况下,我们使用红色(color.red)。两种颜色都通过 color.new() 函数设置了80%的透明度。

在确定了背景颜色后,我们就可以将其应用到图表了。我们最后使用 bgcolor() 函数来完成这一步。

在图表上,该脚本用实线绘制了快线和慢线。当快线上穿慢线时,我们得到绿色的背景;当发生下穿时,则得到红色的背景:

总结

  • ta.sma() 函数用于计算简单移动平均线(SMA)。
  • 我们向该函数提供一个要处理的数值序列,以及要计算的K线数量。
赞(0)
未经允许不得转载:图道交易 » Pine Script(133):移动平均线概览与简单移动平均线SMA
分享到

评论 抢沙发

登录

找回密码

注册