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

Pine Script(137):成交量加权均线VWMA与成交量加权平均价VWAP

#Pine Script入门教学

计算成交量加权移动平均线(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并非基于一个固定的周期进行计算,而是在每个日内交易时段开始时启动计算(并在下一个交易日开盘时重置)。

赞(0)
未经允许不得转载:图道交易 » Pine Script(137):成交量加权均线VWMA与成交量加权平均价VWAP
分享到

评论 抢沙发

登录

找回密码

注册