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线。这两个输入变量的默认值分别是 close 和 10,因此我们得到的是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线数量。




