计算成交量加权移动平均线(VWMA)
在Pine Script语言中,我们使用 ta.vwma() 函数来计算成交量加权移动平均线(Volume-Weighted Moving Average, VWMA)。
VWMA的特点是,在计算移动平均线时,它会给予成交量更大的K线更高的权重。反之,成交量相对较小的K线所占的权重就更低,因此对移动平均线最终值的影响也更小。
默认用法
该函数的定义如下:
ta.vwma(source, length)
source 指的是用于计算的数值序列,即我们希望计算其成交量加权移动平均值的数据源。
length 是一个整数,用于设定移动平均线的计算周期(以K线数量计)。
ta.vwma() 函数的返回值有两种可能:
- 返回一个浮点数类型的VWMA值。
- 或者,当图表上的交易品种没有成交量数据时(例如指数或现货外汇),函数会返回
na值。
代码示例
因此,使用 ta.vwma() 时我们需要提供两个参数:要处理的数据源和计算周期。下面我们通过几个实例来了解具体用法。
移动平均线最常见的任务之一就是处理K线的收盘价。要基于收盘价计算成交量加权移动平均线,我们可以像这样将 close 变量传入函数:
// 计算周期为20的收盘价成交量加权移动平均线
averageClose = ta.vwma(close, 20)
plot(averageClose)
除了K线价格,VWMA也可以基于任何返回值为序列的变量进行计算。例如,如果我们想基于K线的平均价 ohlc4(即 (open + high + low + close) / 4)来计算移动平均线,可以这么做:
// 计算周期为14的K线OHLC均价的VWMA
ohlcAverage = ta.vwma(ohlc4, 14)
plot(ohlcAverage)
ta.vwma() 函数的应用不限于内置变量,它可以处理任何在每根K线上都有数值的表达式。假设我们想计算开盘价在单根K线内的变化量的平均值,可以这么写:
// 获取开盘价单周期差值的25周期平均值
openChangeAvg = ta.vwma(open - open[1], 25)
plot(openChangeAvg)
另一种用法是在另一个函数返回的数据上计算VWMA。例如,在计算出钱德动量摆动指标(Chande Momentum Oscillator, CMO)后,如果想对其结果进行平滑处理,只需在CMO的值上调用 ta.vwma() 函数即可:
// 使用5周期VWMA平滑9周期的钱德动量摆动指标
cmoValue = ta.cmo(close, 9)
cmoAverage = ta.vwma(cmoValue, 5)
plot(cmoValue)
plot(cmoAverage, color=color.orange)
如果我们的脚本并不需要CMO的原始值,也可以将 ta.cmo() 函数直接嵌套在 ta.vwma() 内部。这样代码更为简洁,且能得到相同的结果:
// 使用5周期VWMA平滑9周期的钱德动量摆动指标
cmoAverage = ta.vwma(ta.cmo(close, 9), 5)
plot(cmoAverage, color=color.orange)
ta.vwma() 的特性
除了 ta.vwma(),TradingView还提供了另一种成交量加权平均指标:VWAP(成交量加权平均价)。它们二者的主要区别在于计算的区间不同:
- VWMA是一种移动平均线,它始终使用一个固定长度的窗口来处理最近的K线数据(例如,一个持续滚动的20周期窗口)。
- VWAP是一种锚定平均线,其计算始终从当日交易时段的第一根K线开始。这导致其计算周期是可变的,具体取决于交易时段已开始的时间。例如,在刚开盘后不久,其周期可能只有5;而临近收盘时,周期可能长达60。
计算逻辑
TradingView是通过两条简单移动平均线(SMA)来计算成交量加权移动平均线的。其逻辑是:第一条SMA用于计算数据与成交量乘积的平均值;第二条SMA则计算成交量自身的平均值。最后,将第一个结果除以第二个结果,便得到了VWMA。
在Pine Script代码中,该逻辑的实现如下:
pine_vwma(source, length) =>
ta.sma(source * volume, length) / ta.sma(volume, length)
plot(pine_vwma(close, 15))
与这个自定义函数相比,内置的 ta.vwma() 不仅使用起来更方便,而且得益于TradingView的后台优化,其运行效率也可能更高。
脚本示例
接下来,我们通过一个完整的脚本来看看如何应用 ta.vwma() 函数。下方的指标会计算两条成交量加权移动平均线(VWMA):一条周期为6的快线和一条周期为36的慢线。
我们会在图表上同时绘制这两条平均线。然后,我们会比较它们与K线收盘价的相对位置:当K线收盘于快线上方,且快线也位于慢线上方时,我们会将两条均线显示为绿色;如果K线收盘于快线下方,且快线也低于慢线时,则将它们显示为红色。
完整的指标代码如下:
//@version=5
indicator(title="Volume-Weighted Moving Average example", overlay=true)
// 输入选项
averageData = input.source(close, title="Average Data Source")
fastLength = input.int(6, title="Fast Average Length")
slowLength = input.int(36, title="Slow Average Length")
// 计算成交量加权移动平均线
fastAverage = ta.vwma(averageData, fastLength)
slowAverage = ta.vwma(averageData, slowLength)
// 决定移动平均线的颜色
averageColour = if close > fastAverage and fastAverage > slowAverage
color.green
else if close < fastAverage and fastAverage < slowAverage
color.red
else
color.gray
// 绘制平均线
plot(fastAverage, color=averageColour, linewidth=2, title="Fast VWMA")
plot(slowAverage, color=averageColour, linewidth=2, title="Slow VWMA")
首先,我们调用 indicator() 函数来配置指标。title 参数为脚本命名,而 overlay=true 参数则将指标叠加显示在主图表的交易品种上。
接着,我们创建了三个输入项。第一个是 input.source() 创建的数据源输入,用于指定均线所计算的数据。另外两个是 input.int() 创建的整数输入,分别用于配置快慢两条平均线的周期。
然后,我们来计算这两条成交量加权移动平均线(VWMA):
// 计算成交量加权移动平均线
fastAverage = ta.vwma(averageData, fastLength)
slowAverage = ta.vwma(averageData, slowLength)
第一个 ta.vwma() 调用基于 averageData 输入变量(默认为收盘价)计算VWMA,其周期由 fastLength 输入变量设定(默认为 6)。
第二个 ta.vwma() 调用则计算另一条VWMA,它同样处理 averageData 数据,但周期为 slowLength(默认为 36)。
完成计算后,脚本继续执行其他任务。首先,一个级联 if 语句被用来决定绘图颜色。第一个条件判断K线收盘价是否高于快线,且快线是否高于慢线。如果两个条件都满足,我们就将颜色选定为绿色(color.green)。
若第一个条件不成立,脚本会检查下一个条件:K线收盘价是否低于快线,且快线是否也低于慢线。如果满足,则选择红色(color.red)。如果以上条件都不成立,则使用灰色(color.gray)作为默认颜色。
为了在图表上显示这两条平均线,我们两次调用了 plot() 函数。我们将刚才通过 if 语句决定的颜色 averageColour 同时赋给两条均线。linewidth 参数将线条设置得比默认值更粗,以提高可见性。
该指标加载到图表上后,会在上升趋势期间显示为绿色的线条,在下降趋势期间显示为红色的线条。当价格横盘整理时,线条则显示为灰色:
总结
ta.vwma() 函数用于计算成交量加权移动平均线(VWMA)。
我们只需为其提供两个参数:一个用于计算的数值序列,以及一个以K线数量为单位的周期长度。
计算成交量加权平均价(VWAP)
在Pine Script语言中,我们使用 ta.vwap() 函数来获取成交量加权平均价(Volume-Weighted Average Price, VWAP)。
VWAP是一种日内平均价指标,其计算从每个交易日开盘时重新开始。在交易时段内,它会根据每根K线的成交量来赋予其价格不同的权重。这意味着成交量高的K线在VWAP的计算中占有更大的比重,而成交量低的K线则影响甚微。
默认用法
该函数的定义如下:
ta.vwap(source)
source 指的是用于计算的数值序列,即我们希望计算其VWAP的(价格)数据源。
ta.vwap() 函数的返回值有两种可能:
- 返回一个浮点数类型的VWAP值。
- 或者,当图表上的交易品种不包含成交量数据时(例如现货外汇和指数),函数会返回
na值。
代码示例
要获取VWAP,我们只需告诉 ta.vwap() 要处理哪个数据源即可。下面我们来看几种用法。
VWAP的一个典型用法是计算每根K线的平均价(hlc3)的加权平均。要计算 (high + low + close) / 3 的成交量加权平均价,我们可以这么写:
// 获取hlc3的成交量加权平均价
hlcVwap = ta.vwap(hlc3)
plot(hlcVwap)
除了 hlc3,VWAP也可以基于任何返回值为序列的变量进行计算。例如,要获取收盘价的VWAP,我们只需将 close 变量传入 ta.vwap() 函数:
// 计算成交量加权平均收盘价
closeVwap = ta.vwap(close)
plot(closeVwap)
ta.vwap() 函数的应用不限于内置变量,它可以处理任何在每根K线上都有数值的表达式。比如,我们想获取14周期收盘价变化量的成交量加权平均值,可以这样调用 ta.vwap():
// 获取14周期收盘价差值的VWAP
closeDiffVwap = ta.vwap(close - close[14])
plot(closeDiffVwap)
另一种用法是在另一个函数返回的数据上计算VWAP。假设我们想平滑变化率(Rate of Change, ROC)指标。为此,我们可以在ROC的计算结果上调用 ta.vwap() 函数:
// 计算8周期变化率并用VWAP进行平滑
rocValue = ta.roc(close, 8)
rocVwap = ta.vwap(rocValue)
plot(rocValue)
plot(rocVwap, color=color.orange)
如果我们的脚本并不需要ROC的原始值,也可以将 ta.roc() 函数直接嵌套在 ta.vwap() 函数内部。这样可以得到相同的结果,但代码更为简洁:
// 计算8周期变化率并用VWAP进行平滑
rocVwap = ta.vwap(ta.roc(close, 8))
plot(rocVwap, color=color.orange)
ta.vwap() 的特性
VWAP的计算周期锚定在日内交易时段的开始。在日内的第一根K线上,其计算周期为1;第二根K线的周期为2;第三根为3,以此类推。通过这种方式,VWAP囊括了当天自开盘以来的所有价格数据,无论当天有多少根K线。
每到一个新的交易日,VWAP都会重新开始计算。这一点与常规的移动平均线不同,后者总是基于一个固定的周期(例如,始终计算最近的30根K线)进行计算。
我们无法使用 ta.vwap() 函数来计算一个长于单日交易时段的VWAP。如果我们希望在不同于每日开盘的时间点重置VWAP,就需要自己编写相应的计算逻辑。
除了 ta.vwap(),另一个基于成交量的平均指标是成交量加权移动平均线(VWMA)。VWMA是一种移动平均线,它始终计算最近若干数量的K线。而VWAP则是从每个交易日开始时重新计算的锚定平均线。
脚本示例
接下来,我们通过一个完整的脚本来演示如何使用 ta.vwap() 函数。下方的指标会计算收盘价的成交量加权平均价(VWAP),并围绕它构建一个基于百分比的价格通道。
当价格突破该通道上轨时,我们视其为上涨信号,并将K线标记为绿色。反之,若价格跌破通道下轨,红色的K线则会提示下跌趋势。
完整的指标代码如下:
//@version=5
indicator(title="Volume-Weighted Average Price example", overlay=true)
// 输入选项
averageData = input.source(close, title="Average Data Source")
bandOffset = input.float(0.05, title="Price Band Offset (%)",
step=0.05) / 100
// 计算成交量加权平均价及其价格通道
vwapData = ta.vwap(averageData)
upperBand = vwapData * (1 + bandOffset)
lowerBand = vwapData * (1 - bandOffset)
// 绘制平均价及其通道
plot(vwapData, color=color.orange, title="VWAP")
plot(upperBand, color=color.blue, title="Upper band")
plot(lowerBand, color=color.blue, title="Lower band")
// 为超出通道的K线着色
barColour = if close > upperBand
color.green
else if close < lowerBand
color.red
else
color.gray
barcolor(barColour)
我们从 indicator() 函数开始,它用于配置脚本的名称,并通过 overlay=true 将指标叠加显示在主图表的交易品种上。
接着,我们创建了两个输入项。第一个是 input.source() 创建的数据源输入,用于定义计算VWAP所用的价格数据。另一个是 input.float() 创建的浮点数输入,用于设定上下通道的百分比偏移量。
然后,我们计算成交量加权平均价:
// 计算成交量加权平均价
vwapData = ta.vwap(averageData)
upperBand = vwapData * (1 + bandOffset)
lowerBand = vwapData * (1 - bandOffset)
这段代码在 averageData 输入变量(默认为收盘价)上执行 ta.vwap() 函数。为了计算上下通道线,我们用 bandOffset 输入变量(默认值为0.05%)所设定的百分比来增加和减少VWAP的值。
数据计算完毕后,脚本继续执行其他任务。首先,它通过三次调用 plot() 函数来绘图。这会将VWAP显示为一条橙色(color.orange)的常规线,而上下通道线则显示为蓝色(color.blue)。
随后,一个级联 if 语句被用来决定图表K线的颜色。它首先判断K线的收盘价是否高于通道上轨,如果是,则选择绿色(color.green)。否则,第二个条件会判断收盘价是否低于通道下轨,如果是,则使用红色(color.red)。若K线在通道内部交易,则使用默认的灰色(color.gray)。
指标的最后一行代码调用了 barcolor() 函数,它将我们最终选定的颜色应用到图表的K线上。
该指标加载到图表上后,会绘制出一条成交量加权平均价线和两条基于百分比的通道线。当K线超出这个范围时,它们会被标记为绿色或红色,以分别指示上涨和下跌趋势:
总结
ta.vwap() 函数用于计算成交量加权平均价(VWAP)。
该函数需要知道要计算哪个数据源。其计算周期是自当前交易时段开始以来的K线数量。
与移动平均线不同,VWAP并非基于一个固定的周期进行计算,而是在每个日内交易时段开始时启动计算(并在下一个交易日开盘时重置)。




