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

Pine Script(99):K线范围全解析,实体、影线与波动幅度测量

#Pine Script入门教学

如何获取一根K线的整体范围(high – low)?

无论是棒图(Bar chart)还是K线图(Candlestick chart),它们不仅显示了收盘价和价格的移动方向,还展示了每根K线从最高点到最低点的完整价格范围。

这个范围在不同图表类型上的表现形式有所不同。在棒图上,它是一条垂直线;而在K线图上,我们会在蜡烛实体的上下方看到影线。

一根K线的最高-最低价范围,代表了在该K线所处的时间周期内,价格波动的总幅度。在K线图上,它看起来是这样的:

我们可以使用Pine Script代码来精确测量这个范围。接下来我们看看如何实现。

自定义函数

要获取一根K线的完整范围,我们只需将其最低价从最高价中减去即可。如果我们将这个逻辑封装成一个自定义的Pine Script函数,会是这样:

// BarRange() 函数返回当前K线的范围,即最高价与最低价之差。
BarRange() =>
	high - low

这段代码创建了一个名为 BarRange() 的函数。在函数内部,我们从当前K线的最高价 (high) 中减去其最低价 (low)。这个差值,也就是K线的范围,便是该函数的返回值。

函数应用示例

在我们将上述函数复制粘贴到我们的TradingView脚本后,便可以通过多种方式来使用它。

首先,也是最基本的,要获取当前K线的范围,我们只需直接调用 BarRange() 函数。对于返回的范围值,我们可以做很多事。一种选择是先将它储存在一个变量中,以备后续使用:

// 获取当前K线的范围
rangeOfBar = BarRange()

另一种选择是在图表上将K线范围值绘制出来。为此,我们可以将 BarRange() 与Pine Script的 plot() 函数结合使用。例如,下面的代码会将K线范围以一条橙色 (color.orange) 实线的形式绘制出来:

// 将K线范围以实线形式显示在图表上
plot(BarRange(), color=color.orange, title="Bar ranges")

有时,我们可能想知道K线的范围相当于多少个最小变动价位(tick)。要计算这个值,我们只需将 BarRange() 函数返回的值,除以 syminfo.mintick 这个内置变量即可。结果就是K线最高-最低价范围内包含的tick数量。

例如,我们可以判断这个tick数量是否超过了某个阈值,如果超过了,就创建一个文本标签来提示:

// 判断K线范围是否超过10个tick,如果是,则创建一个标签
if BarRange() / syminfo.mintick > 10
	label.new(bar_index, high, "This bar's range is above 10 ticks!")

除了当前K线的范围,我们还可以获取之前K线的范围值。这需要我们将 BarRange() 函数与Pine Script的历史引用运算符 ([]) 结合起来。我们在方括号中放入一个数字,用以指定要获取的是多少根K线之前的范围。

因此,要获取近期K线的范围,可以这样做:

// 获取前一根K线的范围
prevRange = BarRange()[1]

// 获取3根K线前的范围
earlierRange = BarRange()[3]

在每一根K线上,BarRange() 函数都会返回该K线的范围,这使得它可以与那些能处理时间序列数据的其他函数无缝协作。

例如,我们可以获取近期K线范围的最大值。要知道过去20根K线中的最大范围,我们可以将 BarRange() 与Pine Script的 ta.highest() 函数这样结合起来:

// 获取20周期内的最大K线范围
highestRange = ta.highest(BarRange(), 20)

完整示例指标

让我们通过一个完整的脚本来看看如何应用K线范围。下方的指标会在副图中显示图上每一根K线的范围,同时也会计算该范围的指数移动平均线。当某根K线的范围超过其平均值时,我们会用一种特殊的颜色来突出显示这个较大的范围值。

该指标的完整代码如下:

//@version=5
indicator(title="Range of bar")

// BarRange() 函数返回当前K线的范围,即最高价与最低价之差。
BarRange() =>
	high - low

// 计算K线最高-最低价范围的20周期指数移动平均值
avgRange = ta.ema(BarRange(), 20)

// 决定K线范围的颜色。范围较大时为褐红色,否则为青色。
rangeColour = if BarRange() > avgRange
    color.maroon
else
    color.teal

// 将K线范围以柱状图形式显示
plot(BarRange(), style=plot.style_columns, 
     color=color.new(rangeColour, 30), title="Bar Range")

// 绘制平均范围
plot(avgRange, color=color.orange, linewidth=2, title="Average Range")

我们首先使用 indicator() 函数,通过 title 参数为脚本命名。

然后,我们包含了上文讨论过的 BarRange() 自定义函数。

接下来,我们计算K线范围的平均值:

// 计算K线最高-最低价范围的20周期指数移动平均值
avgRange = ta.ema(BarRange(), 20)

这里,ta.ema() 函数用于计算指数移动平均线 (EMA)。它接收两个参数:第一个是数据源,我们传入 BarRange() 函数,它会返回当前K线的范围;第二个是周期长度,我们设为 20

在绘制K线范围之前,我们先确定要使用的颜色:

// 决定K线范围的颜色。范围较大时为褐红色,否则为青色。
rangeColour = if BarRange() > avgRange
    color.maroon
else
    color.teal

这个if/else语句判断当前K线的范围 (BarRange()) 是否大于其20周期的平均值 (avgRange)。

如果大于,if 代码块便会执行,返回褐红色 (color.maroon) 作为 rangeColour 变量的值。否则,当K线范围不大于其平均值时,else 代码块会为该变量赋予青色 (color.teal)。

接着,我们在图表上显示每根K线的范围:

// 将K线范围以柱状图形式显示
plot(BarRange(), style=plot.style_columns, 
     color=color.new(rangeColour, 30), title="Bar Range")

这里,plot() 函数创建了一个柱状图 (plot.style_columns)。绘制的数值来源于 BarRange() 函数。至于颜色,我们使用 rangeColour 变量,并通过 color.new() 函数为其设置了30%的透明度。

最后,我们绘制K线范围的平均值:

// 绘制平均范围
plot(avgRange, color=color.orange, linewidth=2, title="Average Range")

这次,plot() 函数在图表上显示 avgRange 变量的值。我们没有指定绘图类型,因此Pine Script默认会创建一个常规的线图。这条线以橙色 (color.orange) 显示,并且比常规线条更粗 (linewidth=2)。

在图表上,显示K线最高-最低价范围的柱状图效果如下。我们用不同的颜色高亮了那些范围大于平均值的K线:

内容总结

  • 一根K线的范围,是指在该K线所处的时间周期内,所达到的最高价与最低价之间的距离。
  • 在Pine Script中,要获取这个价格范围,只需将K线的最低价 (low) 从其最高价 (high) 中减去即可。
  • 无论图表类型是什么(K线图、棒图等),high - low 这个表达式始终返回当前K线时间周期内的范围。

如何获取K线的实体范围(open与close之间)?

在K线图上,每根K线都带有一个实心矩形。这个方框被称为实体真实实体,它衡量的是K线开盘价与收盘价之间的距离。也就是说,矩形的顶部和底部,分别代表了K线的开盘价和收盘价。

K线实体的颜色显示了价格的走向。当K线收盘价高于其开盘价时,实体通常为白色或绿色(阳线)。如果收盘价低于开盘价,实体则为黑色或红色(阴线)。

开盘价与收盘价之间的差值,就是K线的实体范围(或称实体大小)。下面是一张示意图:

我们可以使用Pine Script代码来测量这个开盘价到收盘价的范围。接下来我们看看如何实现。

自定义函数

要获取K线的实体大小,我们取其收盘价与开盘价之间的绝对差值。如果我们将这个逻辑封装成一个自定义的Pine Script函数,会是这样:

// BodyRange() 函数返回当前K线的实体范围,即
// 开盘价与收盘价的绝对差值。
BodyRange() =>
	math.abs(close - open)

这段代码创建了一个名为 BodyRange() 的自定义函数。在函数内部,我们从K线的收盘价 (close) 中减去其开盘价 (open),从而得到K线的实体大小。

如果K线收盘下跌(阴线),其开盘价会高于收盘价,导致差值为负数。由于负的尺寸没有实际意义也不准确,我们使用Pine Script内置的 math.abs() 函数来取其绝对值。这样,无论K线是收涨还是收跌,我们总能得到一个代表实体大小的正数。

函数应用示例

在我们将上述函数复制粘贴到我们的TradingView脚本后,便可以通过多种方式来使用它。

一个常见的应用是获取当前K线的实体范围。为此,我们只需直接调用 BodyRange() 函数。对于返回的范围值,我们可以做很多事。一种选择是先将它储存在一个变量中,以备后续使用:

// 获取当前K线的实体范围
rangeOfBody = BodyRange()

另一种可能性是在图表上将K线的实体范围绘制出来。为此,我们可以将 BodyRange()plot() 函数结合使用。例如,下面的代码会将实体范围以一条紫红色 (color.fuchsia) 的实线形式绘制出来:

// 将K线的实体范围以实线形式显示在图表上
plot(BodyRange(), color=color.fuchsia, title="Bar open-close range")

有时,我们可能想知道K线的实体范围相当于多少个最小变动价位(tick)。要计算这个值,我们只需将 BodyRange() 函数返回的值,除以 syminfo.mintick 这个内置变量即可。

例如,我们可以判断这个tick数量是否小于某个阈值,如果是,就创建一个文本标签来提示:

// 判断K线实体范围是否小于15个tick,如果是,则创建一个标签
if BodyRange() / syminfo.mintick < 15
	label.new(bar_index, high, "Open-Close range less than 15 ticks")

除了当前K线的实体范围,我们还可以获取之前K线的范围值。这需要我们将 BodyRange() 函数与Pine Script的历史引用运算符 ([]) 结合起来。我们在方括号中放入一个数字,用以指定要获取的是多少根K线之前的范围。

因此,要获取早期K线的实体范围,可以这样做:

// 获取前一根K线的实体范围
prevBodyRange = BodyRange()[1]

// 获取5根K线前的开盘-收盘范围
pastBodyRange = BodyRange()[5]

在每一根K线上,BodyRange() 函数都会返回该K线的实体范围,这使得它可以与那些能处理时间序列数据的其他函数无缝协作。

例如,我们可以利用这个特性,结合Pine Script的 ta.lowest() 函数,来获取过去10根K线中实体最小的范围值:

// 获取过去10根K线的最小实体范围
lowestBodyRange = ta.lowest(BodyRange(), 10)

完整示例指标

让我们通过一个完整的脚本来看看如何应用K线的实体范围。下方的指标会以柱状图的形式,绘制出每一根K线的实体范围,同时也会显示该范围的简单移动平均线 (SMA)。如果某根K线的实体范围高于其平均值,我们会用不同的颜色来绘制它。

该指标的完整代码如下:

//@version=5
indicator(title="Range of body")

// BodyRange() 函数返回当前K线的实体范围,即
// 开盘价与收盘价的绝对差值。
BodyRange() =>
	math.abs(close - open)

// 计算K线实体范围的15周期简单移动平均值
avgBody = ta.sma(BodyRange(), 15)

// 判断应该用何种颜色来绘制实体范围
bodyColour = if BodyRange() > avgBody * 1.5
    color.orange
else
    color.blue

// 以柱状图形式绘制K线的实体范围
plot(BodyRange(), style=plot.style_columns, color=bodyColour,
     title="Body Range")

// 以实线形式显示平均实体范围
plot(avgBody, color=color.teal, linewidth=2, title="Average Body")

首先,我们使用 indicator() 函数,通过 title 参数为脚本命名。

然后,我们包含了上文讨论过的 BodyRange() 自定义函数。

接下来,我们使用这个函数来计算其简单移动平均线:

// 计算K线实体范围的15周期简单移动平均值
avgBody = ta.sma(BodyRange(), 15)

这里,ta.sma() 函数接收两个参数来计算SMA。第一个是数据源,我们传入 BodyRange(),它返回每根K线的实体范围。第二个是周期长度,我们设为 15

然后,我们来决定绘图的颜色:

// 判断应该用何种颜色来绘制实体范围
bodyColour = if BodyRange() > avgBody * 1.5
    color.orange
else
    color.blue

这个if/else语句判断当前K线的实体范围 (BodyRange()) 是否比其平均实体范围 (avgBody) 大出50%以上。

如果实体确实比平均值大了50%以上,if 代码块便会返回橘色 (color.orange),Pine Script会将这个颜色值储存在 bodyColour 变量中。否则,else 代码块执行,返回蓝色 (color.blue) 作为绘图颜色。

接着,我们使用这个颜色变量来绘制K线的实体范围:

// 以柱状图形式绘制K线的实体范围
plot(BodyRange(), style=plot.style_columns, color=bodyColour,
     title="Body Range")

这里,plot() 函数将实体范围 (BodyRange()) 以柱状图 (plot.style_columns) 的形式显示出来。至于颜色,我们使用了刚才创建的 bodyColour 变量。

代码的最后一部分用于绘制平均实体范围:

// 以实线形式显示平均实体范围
plot(avgBody, color=color.teal, linewidth=2, title="Average Body")

这次,plot() 函数在图表上显示 avgBody 变量的值。我们没有指定绘图类型,因此Pine Script默认会创建一个常规的线图。这条线以青色 (color.teal) 显示,并且比常规线条更粗 (linewidth=2)。

在图表上,显示K线实体大小的柱状图以及平均线的效果如下:

内容总结

  • K线的实体是一个矩形,它捕捉了从K线开盘到收盘的价格活动。
  • 这个矩形的高度,衡量的是K线开-收盘价之间的距离。
  • Pine Script通过 math.abs(close - open) 来获取实体范围。这个方法同样也适用于那些没有K线实体的图表类型(如棒图)。

如何获取K线的完整影线范围?

在K线图上,价格蜡烛的上下方通常会有细小的延伸线。这些线展示了K线触及的最高价和最低价。这些垂直线有多种称谓,例如影线 (wicks)、毛发 (hairs) 或 阴影 (shadows)。

我们可以将这些影线分为上影线和下影线。它们两者相加,便构成了K线的总影线范围。这个范围衡量的是,在该K线周期内,价格在其实体(即开盘价到收盘价的范围)之外波动的总距离。

下面是一张关于K线影线范围的示意图:

一种获取影线范围的方法,是从K线的总波幅中减去其实体的大小。接下来,让我们把它转换成Pine Script代码。

自定义函数

要获取K线的影线范围,我们先计算最高价与最低价之差,然后再减去收盘价与开盘价之差。

如果我们为此编写一个自定义的Pine Script函数,会是这样:

// WickRange() 函数返回当前K线的总影线范围,即
// K线的上影线和下影线距离的总和。
WickRange() =>
	(high - low) - math.abs(close - open)

这段代码创建了一个名为 WickRange() 的自定义函数。在函数内部,我们做了两件事:

首先,我们从K线的最高价 (high) 中减去其最低价 (low),得到K线的总波幅(最高-最低范围)。接着,我们从中减去K线收盘价 (close) 与开盘价 (open) 之间的差值。

后一部分的差值计算出了K线的实体大小。因为对于下跌的阴线,这个值是负数,所以我们使用 math.abs() 函数来取其绝对值。这样我们总能得到一个代表实体大小的正数。

最终,该函数返回K线总波幅与其实体范围之间的差值,这个结果就是上、下影线长度的总和。

函数应用示例

在我们将上述函数复制粘贴到我们的脚本后,便可以通过多种方式来使用它。

最直接的用法是调用该函数,获取当前K线的总影线范围。例如,我们可以先将这个值储存在一个变量中,以备后续使用:

// 获取当前K线的总影线大小
rangeOfWicks = WickRange()

要在图表上显示每根K线的影线范围,我们可以将 WickRange() 函数与Pine Script的 plot() 函数结合使用。下面的代码会将影线范围以一条青色 (color.teal) 的实线形式绘制出来:

// 将K线的影线范围以实线形式显示出来
plot(WickRange(), color=color.teal, title="Wick Range")

同样有用的一个指标是,计算影线范围相当于多少个最小变动价位(tick)。要得到这个值,我们只需将 WickRange() 的返回值除以 syminfo.mintick 这个内置变量即可。

例如,我们可以测试这个tick数量是否等于某个特定值,如果是,就绘制一个文本标签来说明:

// 判断K线的总影线是否为15个tick,如果是则用标签说明
if WickRange() / syminfo.mintick == 15
	label.new(bar_index, high, "This bar's wicks are 15 ticks big")

除了当前K线的影线范围,我们也可以获取之前K线的该值。为此,我们需要将 WickRange() 函数与Pine Script的历史引用运算符 ([]) 结合起来。我们在方括号中放入一个数字,用以指定要获取的是多少根K线之前的范围。

例如:

// 获取前一根K线的影线范围
prevWickRange = WickRange()[1]

// 检索七根K线前的影线范围
earlierWickRange = WickRange()[7]

在每一根K线上,WickRange() 都会返回该K线的影线距离。这个由数值构成的时间序列,可以被其他函数进一步处理,从而实现更深入的分析。

比如,我们想知道过去30根K线中最大的影线范围是多少。在这种情况下,我们可以让 ta.highest() 函数来处理 WickRange() 函数返回的一系列值:

// 获取过去30根K线的最大影线范围
highestWickRange = ta.highest(WickRange(), 30)[1]

完整示例指标

让我们通过一个完整的脚本来看看如何应用 WickRange() 函数。下方的指标会在图表上显示每根K线的影线范围,同时也会绘制该数据的加权移动平均线 (WMA)。影线范围会根据其与平均值的关系,以不同的颜色显示。

该指标的完整代码如下:

//@version=5
indicator(title="Range of wick")

// WickRange() 函数返回当前K线的总影线范围,即
// K线的上影线和下影线距离的总和。
WickRange() =>
	(high - low) - math.abs(close - open)

// 获取K线影线范围的30周期加权移动平均值
avgWick = ta.wma(WickRange(), 30)

// 判断影线范围绘图的颜色
wickColour = if WickRange() > avgWick
    color.fuchsia
else
    color.orange

// 以柱状图形式绘制K线的影线大小
plot(WickRange(), style=plot.style_columns, 
     color=color.new(wickColour, 30), title="Bar Wick Range")

// 在图表上显示平均影线大小
plot(avgWick, color=color.black, linewidth=2, title="Average Wick Range")

我们首先使用 indicator() 函数,通过 title 参数为脚本命名。

然后,我们包含了上文讨论过的 WickRange() 自定义函数。

该指标多次使用了这个函数。第一次是用于获取影线范围的移动平均线:

// 获取K线影线范围的30周期加权移动平均值
avgWick = ta.wma(WickRange(), 30)

这里,ta.wma() 函数计算的是每根K线影线范围 (WickRange()) 的加权移动平均线 (WMA)。平均值的计算周期为最近的 30 根K线。我们将其结果储存在 avgWick 变量中。

然后,我们为后续的绘图选择颜色:

// 判断影线范围绘图的颜色
wickColour = if WickRange() > avgWick
    color.fuchsia
else
    color.orange

这个if/else语句判断当前的影线范围是否大于 (>) 其自身的加权移动平均值 (avgWick)。

如果是,if 代码块会返回紫红色 (color.fuchsia) 作为 wickColour 变量的颜色。否则,else 代码块会为该变量赋予橘色 (color.orange)。

接下来,我们使用这些颜色中的一种来显示每根K线的影线范围:

// 以柱状图形式绘制K线的影线大小
plot(WickRange(), style=plot.style_columns, 
     color=color.new(wickColour, 30), title="Bar Wick Range")

这里,plot() 函数显示 WickRange() 函数的返回值。这些数据显示为柱状图 (plot.style_columns)。绘图的颜色是我们刚才创建的变量。为了让紫红色或橘色更好地显示,color.new() 函数为其应用了30%的透明度。

最后,我们绘制影线范围的加权移动平均线:

// 在图表上显示平均影线大小
plot(avgWick, color=color.black, linewidth=2, title="Average Wick Range")

这次,plot() 函数以黑色 (color.black) 显示平均影线大小 (avgWick)。我们没有指定绘图类型,因此Pine Script默认会创建一个常规的线图。这条线比常规线条更粗 (linewidth=2)。

在图表上,显示影线范围及其平均值的柱状图和线条看起来是这样的:

内容总结

  • K线(蜡烛)的影线是其顶部和底部的垂直线,它们显示了该K线触及的最高价和最低价。
  • 上影线和下影线的长度相加,构成了K线的总影线范围
  • 这个影线范围衡量的是,价格在K线实体(开盘价到收盘价的范围)之外波动的总距离。
  • Pine Script通过从K线的总波幅 (high - low) 中减去其实体范围 (math.abs(open - close)) 来计算这个影线范围。

如何获取K线的上影线范围?

在K线图上,蜡烛的上下方通常会出现细小的线条。这些垂直的延伸线被称为影线 (wicks)、毛发 (hairs) 或 阴影 (shadows)。

我们可以将这些影线分为下影线和上影线。上影线,即蜡烛顶部的垂直线,衡量的是K线的最高价与其开盘价或收盘价之间的距离。

准确地说,上影线的长度是以下两者之间的差值:

  • 对于收盘下跌的K线(阴线),是最高价开盘价之差。
  • 对于收盘上涨的K线(阳线),是最高价收盘价之差。

如果K线收盘价不变(十字星),那么上影线既是最高价与收盘价之差,也是最高价与开盘价之差(因为此时开盘价和收盘价相等)。

但无论K线如何收盘,上影线始终代表了K线顶部的垂直线。下面是一张示意图:

我们可以使用Pine Script代码来测量上影线的范围。接下来就让我们动手实现。

自定义函数

要获取一根K线的上影线范围,我们取其最高价,然后减去该K线开盘价和收盘价中的较大者。如果我们为此编写一个自定义的Pine Script函数,会是这样:

// UpperWickRange() 函数返回K线的上影线范围,即
// 最高价与(开盘价或收盘价中的较大者)的差值。
UpperWickRange() =>
	high - math.max(open, close)

这段代码创建了一个名为 UpperWickRange() 的自定义函数。在函数内部,我们首先使用 math.max() 函数来获取开盘价 (open) 和收盘价 (close) 中的最大值。然后,从K线的最高价 (high) 中减去这个最大值。

由于我们总是取开盘价和收盘价中的较大者,所以我们无需关心K线是收涨还是收跌。实际上,我们衡量的就是最高价与K线实体顶部之间的距离。通过这种巧妙的方式,我们就能得到每一根K线的上影线范围。

函数应用示例

在我们将上述函数复制粘贴到我们的脚本后,便可以通过多种方式来使用它。

首先,也是最基本的,要获取当前K线的上影线大小,我们只需直接调用该函数。为了方便后续使用,我们可以将其返回值储存在一个变量中:

// 获取当前K线的上影线大小
upWickSize = UpperWickRange()

要在图表上显示上影线的范围,我们可以将 UpperWickRange() 函数与Pine Script的 plot() 函数结合使用。例如,下面的代码会将上影线的大小以一条黄色 (color.yellow) 的实线形式绘制出来:

// 将K线的上影线大小以黄线形式绘制出来
plot(UpperWickRange(), color=color.yellow, title="Upper Wick Range")

另一个有用的应用是,计算上影线的大小相当于多少个最小变动价位(tick)。我们只需将 UpperWickRange() 的返回值除以 syminfo.mintick 这个内置变量即可。

当计算出的tick数量超过某个阈值时,我们还可以创建一个文本标签来提示这个信息:

// 判断K线的上影线是否大于20个tick,如果是,则用标签显示
if UpperWickRange() / syminfo.mintick > 20
	label.new(bar_index, high, "Upper wick has more than 20 ticks!")

除了当前K线的上影线,我们也可以获取之前K线的上影线值。为此,我们需要将 UpperWickRange() 函数与Pine Script的历史引用运算符 ([]) 结合起来。我们在方括号中放入一个数字,用以指定要获取的是多少根K线之前的上影线范围。

例如,我们可以这样获取更早K线的上影线范围:

// 获取前一根K线的上影线大小
lastUpWickSize = UpperWickRange()[1]

// 获取3根K线前的上影线范围
prevUpWickRange = UpperWickRange()[3]

在每一根K线上,UpperWickRange() 都会返回该K线的上影线范围。这个由数值构成的时间序列,可以被其他函数进一步处理,从而实现更深入的分析。

例如,要获取过去25根K线中最小的上影线范围,我们可以将 UpperWickRange()ta.lowest() 函数结合使用:

// 获取过去25根K线的最小上影线大小
lowestUpWick = ta.lowest(UpperWickRange(), 25)

完整示例指标

让我们通过一个完整的Pine Script指标来看看如何应用 UpperWickRange() 函数。下方的脚本会在图表上绘制出每一根K线的上影线范围,同时也会显示该范围的指数移动平均线 (EMA)。如果某根K线的上影线大于其平均值,我们会用不同的颜色来绘制它。通过这种方式,我们就能轻松地发现那些特别长的上影线。

该指标的完整代码如下:

//@version=5
indicator(title="Range of upper wick")

// UpperWickRange() 函数返回K线的上影线范围,即
// 最高价与(开盘价或收盘价中的较大者)的差值。
UpperWickRange() =>
	high - math.max(open, close)

// 计算K线上影线范围的45周期EMA
avgUpWick = ta.ema(UpperWickRange(), 45)

// 决定上影线的绘图颜色
upWickColour = if UpperWickRange() >= avgUpWick
    color.new(color.maroon, 30)
else
    color.new(color.lime, 20)

// 以柱状图形式绘制当前K线的上影线大小
plot(UpperWickRange(), style=plot.style_columns, color=upWickColour,
     title="Upper Wick Size")

// 以线条形式显示平均上影线大小
plot(avgUpWick, color=color.orange, linewidth=2, 
     title="Average Upper Wick")

与往常一样,指标以 indicator() 函数开始,通过 title 参数为脚本命名。

然后,我们包含了上文讨论过的 UpperWickRange() 自定义函数。

该脚本多次使用了这个函数。第一次是用于计算移动平均线:

// 计算K线上影线范围的45周期EMA
avgUpWick = ta.ema(UpperWickRange(), 45)

这段代码让 ta.ema() 函数计算上影线范围的45周期指数移动平均线,而上影线范围的值则通过 UpperWickRange() 函数获取。我们将计算出的平均值储存在 avgUpWick 变量中,以备后用。

接下来,我们使用这个平均值来决定绘图的颜色:

// 决定上影线的绘图颜色
upWickColour = if UpperWickRange() >= avgUpWick
    color.new(color.maroon, 30)
else
    color.new(color.lime, 20)

这个if/else语句判断当前K线的上影线范围是否大于或等于 (>=) 其45周期的EMA (avgUpWick)。

如果是,if 代码块会返回一个通过 color.new() 函数设置了30%透明度的褐红色 (color.maroon)。如果上影线小于平均值,else 代码块则会返回一个20%透明度的青柠色 (color.lime)。我们将返回的颜色值存入 upWickColour 变量以供后续使用。

然后,我们在图表上显示每根K线的上影线范围:

// 以柱状图形式绘制当前K线的上影线大小
plot(UpperWickRange(), style=plot.style_columns, color=upWickColour,
     title="Upper Wick Size")

这里,plot() 函数显示 UpperWickRange() 函数的返回值。这些数据显示为柱状图 (plot.style_columns)。

upWickColour 变量设置了绘图的颜色。这个变量的值来源于之前的if/else语句,它使得较长的上影线以褐红色显示。

最后但同样重要的是,我们显示平均的上影线大小:

// 以线条形式显示平均上影线大小
plot(avgUpWick, color=color.orange, linewidth=2, 
     title="Average Upper Wick")

这里,plot() 函数在图表上显示 avgUpWick 变量的值。由于我们没有设置绘图类型,Pine Script会默认创建一个常规的线图。这条线是橘色 (color.orange) 的,并且比常规线条更粗 (linewidth=2)。

在TradingView图表上,上影线范围及其移动平均线的效果如下:

内容总结

  • K线(蜡烛)的上影线是显示在其顶部的垂直线。
  • 这条线显示了最高价收盘价之间(对于阳线)或最高价开盘价之间(对于阴线)的距离。
  • 在Pine Script中,我们使用 high - math.max(open, close) 这个表达式来计算上影线的范围。

如何获取K线的下影线范围?

在K线图上,蜡烛的上下方通常会有细小的延伸线。这些垂直线被称为影线 (wicks)、毛发 (hairs) 或 阴影 (shadows)。

大多数K线都包含上影线和下影线。下影线,即蜡烛实体下方的垂直线,衡量的是K线的最低价与其开盘价或收盘价之间的距离。

准确地说,下影线的长度是以下两者之间的差值:

  • 对于收盘上涨的K线(阳线),是开盘价最低价之差。
  • 对于收盘下跌的K线(阴线),是收盘价最低价之差。

如果K线收盘价不变(十字星),那么下影线既是最低价与收盘价之差,也是最低价与开盘价之差(因为此时开盘价和收盘价相等)。

但无论K线如何收盘,下影线始终代表了K线底部的垂直线。下面是一张示意图:

我们可以使用Pine Script来测量这个下影线的范围。接下来就让我们看看如何实现。

自定义函数

要获取一根K线的下影线范围,我们取其开盘价和收盘价中的较小者,然后再减去该K线的最低价。如果我们为此编写一个自定义的Pine Script函数,会是这样:

// LowerWickRange() 函数返回K线的下影线范围,即
// 最低价与(开盘价或收盘价中的较小者)的差值。
LowerWickRange() =>
	math.min(open, close) - low

这段代码创建了一个名为 LowerWickRange() 的自定义函数。在函数内部,math.min() 函数首先获取K线开盘价 (open) 和收盘价 (close) 中的最小值。这个值代表了K线实体的最低价格,通过这种方式,我们巧妙地兼容了K线收涨和收跌两种情况。

然后,我们从实体底部的这个价格,减去K线自身的最低价 (low)。这样便计算出了K线(蜡烛)的下影线大小。该值最终由函数返回。

函数应用示例

在我们将上述函数复制粘贴到我们的脚本后,便可以通过多种方式来使用它。

一个常见的用例是,在任何需要知道K线下影线范围的时候,直接调用该函数。例如,我们可以先将这个值储存在一个变量中:

// 获取当前K线的下影线大小
lowerWickSize = LowerWickRange()

要在图表上显示下影线的范围,我们可以将 LowerWickRange() 函数与Pine Script的 plot() 函数结合使用。例如,下面的代码会将下影线的大小以一条黑色 (color.black) 的实线形式绘制出来:

// 将K线的下影线大小以黑线形式显示出来
plot(LowerWickRange(), color=color.black, title="Lower Wick Size")

有时,计算下影线范围相当于多少个最小变动价位(tick)也很有用。我们只需将 LowerWickRange() 的返回值除以 syminfo.mintick 这个内置变量即可。

如果计算出的tick数量超过某个阈值,我们还可以创建一个文本标签来提示这个信息:

// 判断K线的下影线是否大于25个tick,如果是则用标签显示
if LowerWickRange() / syminfo.mintick > 25
	label.new(bar_index, high, "Lower wick is bigger than 25 ticks!")

除了当前K线的下影线,我们也可以处理之前K线的下影线值。为此,我们需要将 LowerWickRange() 函数与Pine Script的历史引用运算符 ([]) 结合起来。我们在方括号中键入一个数字,用以指定要获取的是多少根K线之前的下影线范围。

例如,我们可以这样获取更早K线的下影线范围:

// 检索前一根K线的下影线范围
lastLowWick = LowerWickRange()[1]

// 获取八根K线前的下影线大小
prevLowWick = LowerWickRange()[8]

在每一根K线上,LowerWickRange() 都会返回该K线的下影线范围。这个由数值构成的时间序列,可以被其他函数进一步处理,从而实现更深入的分析。

比如,我们想知道近期下影线范围的最大值。在这种情况下,我们可以将 LowerWickRange()ta.highest() 函数结合使用:

// 获取过去30根K线的最大下影线值
highestLowWick = ta.highest(LowerWickRange(), 30)

完整示例指标

让我们通过一个完整的脚本来看看如何应用 LowerWickRange() 函数。下方的指标会在图表上显示每一根K线的下影线范围,同时也会计算该范围的加权移动平均线 (WMA)。当某根K线的下影线大于其平均值时,脚本会用一种特殊的颜色来高亮显示。

该指标的完整代码如下:

//@version=5
indicator(title="Range of lower wick")

// LowerWickRange() 函数返回K线的下影线范围,即
// 最低价与(开盘价或收盘价中的较小者)的差值。
LowerWickRange() =>
	math.min(open, close) - low

// 计算下影线大小的45周期WMA
avgDownWick = ta.wma(LowerWickRange(), 45)

// 判断下影线柱状图的绘图颜色
downWickColour = if LowerWickRange() >= avgDownWick
    color.orange
else
    color.teal

// 以柱状图形式显示K线的下影线范围
plot(LowerWickRange(), style=plot.style_columns, color=downWickColour,
     title="Lower Wick Size")

// 以线条形式绘制平均下影线大小
plot(avgDownWick, color=color.blue, linewidth=2, 
     title="Average Down Wick")

首先,我们调用 indicator() 函数为脚本命名。

然后,我们包含了上文讨论过的 LowerWickRange() 自定义函数。

该脚本多次使用了这个函数。第一次是用于计算下影线范围的移动平均线:

// 计算下影线大小的45周期WMA
avgDownWick = ta.wma(LowerWickRange(), 45)

这里,ta.wma() 函数处理由 LowerWickRange() 函数返回的数据。它在最近的 45 根K线上计算加权移动平均线 (WMA)。我们将计算出的WMA值存入 avgDownWick 变量,以备后用。

接下来,我们将当前K线的下影线与其平均值进行比较:

// 判断下影线柱状图的绘图颜色
downWickColour = if LowerWickRange() >= avgDownWick
    color.orange
else
    color.teal

这个if/else语句判断当前K线的下影线 (LowerWickRange()) 是否大于或等于其45周期的平均值 (avgDownWick)。

如果是,if 代码块便会执行,返回橘色 (color.orange),Pine Script随后将这个颜色值储存在 downWickColour 变量中。

否则,当下影线大小小于其平均值时,else 代码块会返回青色 (color.teal) 作为该变量的值。

之后,我们在图表上显示每根K线的下影线范围:

// 以柱状图形式显示K线的下影线范围
plot(LowerWickRange(), style=plot.style_columns, color=downWickColour,
     title="Lower Wick Size")

这里,plot() 函数显示 LowerWickRange() 函数的返回值。每根K线的下影线范围以柱状图 (plot.style_columns) 的形式显示。至于颜色,我们使用刚才创建的 downWickColour 变量,这使得每个柱子要么是橘色,要么是青色。

接下来,我们绘制平均下影线:

// 以线条形式绘制平均下影线大小
plot(avgDownWick, color=color.blue, linewidth=2, 
     title="Average Down Wick")

plot() 函数在这里将 avgDownWick 变量的值显示在图表上。我们没有指定绘图类型,因此Pine Script默认会创建一个常规的线图。这个绘图是蓝色的 (color.blue),并且比常规线条更粗 (linewidth=2)。

在图表上,下影线范围及其移动平均线的效果如下:

内容总结

  • K线(蜡烛)的下影线是显示在其底部的垂直线。
  • 这条线衡量的是开盘价最低价之间(对于阳线)或收盘价最低价之间(对于阴线)的距离。
  • 在Pine Script中,我们使用 math.min(open, close) - low 这个表达式来计算下影线的范围。
赞(0)
未经允许不得转载:图道交易 » Pine Script(99):K线范围全解析,实体、影线与波动幅度测量
分享到

评论 抢沙发

登录

找回密码

注册