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

Pine Script(97):判断K线涨跌与阴阳线,识别连续形态的第一步

#Pine Script入门教学

用代码判断K线收盘是上涨、下跌还是持平

每个TradingView指标和策略都需要处理价格数据。有时这些处理涉及复杂的计算,但有时,仅仅识别出收盘价比前一根K线更高还是更低就足够了。接下来,我们就来看看如何用代码来识别这些K线。

在TradingView中判断K线的收盘价是上涨、下跌还是不变

在K线图上,每根K线都代表一个交易时段。每根K线有四个数据点,其中最重要的无疑是收盘价。当前收盘价与之前K线的关系,共同决定了趋势的走向。那么,我们的代码要如何判断K线的收盘价是上涨还是下跌呢?

要判断一根K线的收盘是上涨还是下跌,我们需要将它的收盘价与前一根K线的收盘价进行比较。根据这两个数值的对比结果,我们就能知道收盘价是更高、更低还是持平。

有三个非常有用的TradingView功能,可以帮助我们实现这种逐根K线的收盘价比较:

  • close 变量:我们可以用它来获取当前K线的收盘价。
  • 历史引用运算符 ([]):我们可以用它来访问之前K线的收盘价。例如,close[1] 获取的是前一根K线的收盘价,close[2] 则是再往前一根K线的收盘价,以此类推,close[8] 返回的是8根K线前的收盘价。
  • 关系运算符:用于比较两个收盘价。包括大于 (>)、小于 (<) 和等于 (==) 等。

下面我们来看看如何利用这些功能来判断K线的收盘情况。

判断K线是否收盘上涨

要判断当前K线的收盘价是否高于前一根K线,我们只需检查当前收盘价 (close) 是否大于 (>) 前一根K线的收盘价 (close[1]):

closeHigher = close > close[1]

当当前K线收盘上涨时,这个 closeHigher 变量的值为 true;如果收盘价持平或下跌,其值则为 false

一旦我们得到了这个布尔值,就可以在脚本中加以利用。例如,下面的指标会为所有收盘上涨的K线添加绿色背景:

//@version=5
indicator(title="Higher closes", overlay=true)

closeHigher = close > close[1]

bgcolor(closeHigher ? color.green : na)

判断K线是否收盘下跌

要判断K线是否收盘下跌,我们检查当前收盘价 (close) 是否小于 (<) 前一根K线的收盘价 (close[1]):

closeLower = close < close[1]

当当前K线收盘下跌时,closeLower 变量的值为 true;如果收盘价持平或上涨,其值则为 false

得到这个布尔值后,我们可以将它与其他TradingView功能结合使用。例如,下面的代码会在每一根收盘下跌的K线上方绘制一个菱形标记:

//@version=5
indicator(title="Lower closes", overlay=true)

closeLower = close < close[1]

plotshape(closeLower, style=shape.diamond)

判断K线收盘价是否不变

当K线收盘价不变时,意味着当前收盘价 (close) 等于 (==) 前一根K线的收盘价 (close[1]):

closeUnchanged = close == close[1]

当收盘价与前一根K线相同时,closeUnchanged 变量的值为 true;如果收盘上涨或下跌,其值则为 false

利用这个信息,我们可以实现很多功能,例如在每一根收盘价不变的K线下方绘制一个旗帜标记:

//@version=5
indicator(title="Unchanged closes", overlay=true)

closeUnchanged = close == close[1]

plotshape(closeUnchanged, style=shape.flag,
     location=location.belowbar)

判断K线收盘下跌或收盘价不变

要找出收盘下跌或持平的K线,我们检查当前收盘价是否小于或等于 (<=) 前一根K线的收盘价 (close[1]):

lowerOrSameClose = close <= close[1]

判断K线收盘上涨或收盘价不变

要定位收盘上涨或持平的K线,我们判断当前收盘价是否大于或等于 (>=) 前一根K线的收盘价 (close[1]):

higherOrSameClose = close >= close[1]

判断K线收盘上涨或下跌(即收盘价有变动)

要找出收盘价发生变动的K线(即收盘上涨或下跌),我们可以用 or 运算符组合两个条件,但更简洁的方法是判断当前收盘价是否不等于 (!=) 前一个收盘价 (close[1]):

higherOrLowerClose = close != close[1]

在TradingView中识别多K线组合的收盘形态

了解单根K线的收盘情况固然有用,但有时,我们需要通过观察连续多根K线的组合形态,来做出更准确的判断。那么,我们该如何实现呢?

要将对多根K线的判断条件组合起来,我们可以使用两个逻辑运算符:

  • and (与) 运算符:它用于组合多个条件,只有当所有条件都为 true 时,最终的组合结果才为 true。例如,我们可以用它来要求“当前K线并且前一根K线都收盘上涨”。只要其中有任何一个或多个条件为 false,那么 and 组合后的最终结果就是 false
  • or (或) 运算符:它也用于组合多个条件,但不同的是,只要其中有任意一个条件为 true,最终的组合结果就是 true。例如,我们可以用它来判断“当前K线或者前一根K线收盘价不变”。只有当所有条件都为 false 时,or 组合后的最终结果才会是 false

借助这两个运算符,我们就可以编写出各种各样的K线组合形态。下面来看几个实例。

连续两次收盘下跌

要识别连续两次收盘下跌的形态,我们需要判断当前K线和前一根K线是否 (and) 收盘下跌:

twoLowerCloses = close[1] < close[2] and
     close < close[1]

只有当前一根K线收盘下跌 (close[1] < close[2]) 并且 当前K线也收盘下跌 (close < close[1]) 时,twoLowerCloses 这个变量的值才为 true。任何其他的收盘组合都会使该变量为 false

顺便一提,我们也可以用下面这种方式来编写这个连续两次收盘下跌的形态:

closeLower = close < close[1]

twoLowerCloses = closeLower[1] and
     closeLower

先收跌后收涨

要找到“前一根K线收跌,而当前K线收涨”的组合形态,我们可以这样编写代码:

lowerHigherClose = close[1] < close[2] and
     close > close[1]

当上一根K线收盘下跌 (close[1] < close[2]),同时当前K线收盘上涨 (close > close[1]) 时,lowerHigherClose 变量的值为 true。如果K线组合不完全符合这个模式,该变量的值则为 false

我们也可以用以下方式来编写这个形态:

closeHigher = close > close[1]
closeLower  = close < close[1]

lowerHigherClose = closeLower[1] and
     closeHigher

连续三次收盘上涨

我们还可以识别连续三根K线都收盘上涨的情况:

upUpUpCloses = close[2] > close[3] and
     close[1] > close[2] and
     close > close[1]

只有当三件事同时发生时,upUpUpCloses 变量的值才为 true:2根K线前收盘上涨 (close[2] > close[3])、前一根K线收盘上涨 (close[1] > close[2])、以及当前K线收盘上涨 (close > close[1])。只要这三件事没有同时满足,该变量的值就是 false

要实现这个形态,我们也可以使用以下代码:

closeHigher = close > close[1]

upUpUpCloses = closeHigher[2] and
     closeHigher[1] and
     closeHigher

连续两次收盘上涨后接一次收盘下跌

要找到两涨一跌的组合形态,我们可以编写如下的TradingView代码:

upUpDownCloses = close[2] > close[3] and
     close[1] > close[2] and
     close < close[1]

这个 upUpDownCloses 变量只在三种情况同时满足时才为 true:2根K线前收盘上涨 (close[2] > close[3])、前一根K线收盘上涨 (close[1] > close[2])、以及当前K线收盘下跌 (close < close[1])。如果这三个条件没有同时发生,该变量的值就是 false

我们也可以像这样来编写这个涨-涨-跌的形态:

closeHigher = close > close[1]
closeLower  = close < close[1]

upUpDownCloses = closeHigher[2] and
     closeHigher[1] and
     closeLower

连续三次收盘下跌后接一次收盘上涨

我们可以根据需要,构建任意长度的K线组合形态。下面的代码就用于识别“连续三次收盘下跌,随后一次收盘上涨”的形态:

lowerClosesHigh = close[3] < close[4] and
     close[2] < close[3] and
     close[1] < close[2] and
     close > close[1]

这个 lowerClosesHigh 变量只在以下四种情况同时发生时才为 true

  • 3根K线前,收盘价下跌 (close[3] < close[4])。
  • 2根K线前,收盘价再次下跌 (close[2] < close[3])。
  • 随后,前一根K线也收盘下跌 (close[1] < close[2])。
  • 并且,当前K线收盘上涨 (close > close[1])。

只要这四个条件没有同时满足,我们创建的这个变量的值就为 false

当您构建复杂的K线形态时,花点时间预先创建几个辅助变量,通常能让代码更清晰。下面的代码识别的是完全相同的形态,但可读性要好得多:

closeHigher = close > close[1]
closeLower  = close < close[1]

lowerClosesHigh = closeLower[3] and
     closeLower[2] and
     closeLower[1] and
     closeHigher

如何比较实时K线的收盘价?

最后还有一个重点需要讨论。当一个TradingView指标在实时图表上运行时,它会随着每一个价格的变动(Tick)而重新计算。策略也可以通过开启“在每个Tick上重新计算”选项来达到同样的效果。(更多相关信息,请参阅“close变量并不总是返回K线的收盘价”)。

然而,在这些实时计算的过程中,图表上最后一根K线实际上还未收盘。这对我们逐根K线的比较会造成问题。例如,假设我们的代码检查当前K线是否收盘下跌 (close < close[1]),在实时行情中,这实际上是在比较最新的一个报价(last tick)与前一根已收盘K线的收盘价。

如果您的脚本逻辑只应该在K线收盘后才执行,那么您需要在比较条件中加入 barstate.isconfirmed 这个内置变量。当K线已经确认收盘时,该变量返回 true;如果K线仍在接收实时价格更新(即尚未收盘),它会返回 false。通过这种方式,我们就能明确我们比较的到底是实时价格,还是真正的K线收盘价。

因此,要检查当前这根K线是否确认收盘上涨,我们应该这样写:

closeHigher = barstate.isconfirmed and
     close > close[1]

要判断图表上最新的这根K线是否确认收盘下跌,我们应该这样写:

closeLower = barstate.isconfirmed and
     close < close[1]

而这段代码则用于判断最后一根K线是否确认收盘且价格不变

closeUnchanged = barstate.isconfirmed and
     close == close[1]

同理,我们也可以将 barstate.isconfirmed 变量应用到本文前面介绍的所有其他K线形态判断中。

内容总结

  • 通过比较一根K线的收盘价 (close) 与前一根K线的收盘价 (close[1]),我们能判断出K线的收盘动向。close > close[1] 用于判断收盘上涨,close < close[1] 用于判断收盘下跌,而 close == close[1] 则用于判断收盘价不变。
  • 对于更复杂的形态,我们可以将多个比较条件组合起来。使用 and 运算符,可以要求所有条件必须同时为 true;而使用 or 运算符,则只需其中一个条件为 true 即可。
  • 为了确保我们判断的是图表上最后一根K线真正的收盘情况,我们需要加入 barstate.isconfirmed 变量进行判断。否则,我们很可能只是在用当前商品的最新报价(tick)与前一根K线的收盘价进行比较。

如何用代码识别阳线(绿色)与阴线(红色)K线?

默认情况下,TradingView的K线图会用绿色蜡烛来高亮显示那些收盘价高于开盘价的K线,而收盘价下跌的K线则显示为红色。那么,在我们的脚本代码中,要如何识别出这些红色和绿色的K线呢?接下来就让我们一探究竟。

使用 openclose 变量识别红绿K线

在K线图上,K线的颜色取决于其收盘价与开盘价的比较结果。绿色K线(阳线)是指收盘价高于其开盘价的K线;而红色K线(阴线)则是指收盘价低于其开盘价的K线。有时图表可能使用黑白配色而非红绿,但其定义原理是相同的。那么,我们如何在脚本中获取这些信息呢?

要判断一根K线是阳线还是阴线,我们需要比较该K线的收盘价和开盘价。在TradingView中,我们可以通过两个内置变量来获取这些数据:

  • open 变量:返回当前K线的开盘价。
  • close 变量:返回当前K线的收盘价。

通过比较这两个变量,我们就能知道K线的颜色。下面我们来看看具体如何实现。

识别阳线(收盘价高于开盘价)的代码

当一根K线的收盘价高于其开盘价时,我们称之为阳线(绿色K线)。在TradingView代码中,我们可以这样写:

greenCandle = close > open

当K线的收盘价 (close) 大于 (>) 其开盘价 (open) 时,greenCandle 这个布尔变量的值就为 true。如果K线收盘下跌或持平,该变量的值则为 false

现在我们有了一个能简单判断阳线的布尔值,就可以将它与其他TradingView功能结合起来。例如,下面的示例指标会用橘色背景来高亮显示每一根阳线:

//@version=5
indicator(title="Highlight green candles", overlay=true)

greenCandle = close > open

bgcolor(greenCandle ? color.new(color.orange, 80) : na)

识别阴线(收盘价低于开盘价)的代码

当一根K线的收盘价低于其开盘价时,我们称之为阴线(红色K线)。因此,我们可以这样编码:

redCandle = close < open

当K线的收盘价低于 (<) 其开盘价时,redCandle 这个布尔变量的值为 true。如果K线收盘上涨或持平,该变量的值则为 false

有了这个变量,我们就可以运用其他TradingView功能了。例如,下面的指标会在每一根阴线的下方绘制一个黑色的十字叉标记:

//@version=5
indicator(title="Highlight red candles", overlay=true)

redCandle = close < open

plotshape(redCandle, style=shape.xcross,
     color=color.black, location=location.belowbar)

识别十字星(开盘价等于收盘价)的代码

偶尔,K线的收盘价会与其开盘价完全相同,这种K线被称为十字星(Doji)。如果我们的脚本需要识别这种形态,可以这样编码:

dojiCandle = close == open

当K线的收盘价等于 (==) 其开盘价时,dojiCandle 变量的值为 true。如果收盘上涨或下跌,该变量的值则为 false

利用这个变量,我们就可以,比如说,为每一根十字星的背景上色。下面的示例指标就实现了这个功能:

//@version=5
indicator(title="Highlight doji candles", overlay=true)

dojiCandle = close == open

bgcolor(dojiCandle ? color.new(color.teal, 80) : na)

识别红绿K线的组合形态

通过上面的代码,我们已经学会了如何判断当前K线的颜色。但如果我们需要识别的形态涉及到前面几根K线,该怎么办呢?TradingView Pine为此提供了两个关键功能。

第一个是历史引用运算符 ([])。通过这个运算符,我们可以访问之前K线的数据。这样,我们就能判断出例如前一根K线是否为阴线。

第二个是逻辑运算符 andor。它们可以将多个布尔(true/false)条件组合成一个最终的布尔结果。我们可以使用 and 来判断“前一根K线并且当前K线都是阳线”;也可以使用 or 来判断“出现了一根阴线或者一根十字星”。

如果这些听起来有些抽象或复杂,别担心,下面的代码示例会让一切变得清晰明了。

连续两根阳线

要在TradingView Pine中识别连续两根阳线,我们可以这样编写代码:

twoGreenCandles = close[1] > open[1]
     and close > open

只有当上一根K线收盘上涨 (close[1] > open[1]) 并且 当前K线也收盘上涨 (close > open) 时,twoGreenCandles 这个变量的值才为 true。如果不是连续两根阳线,该变量的值就为 false

我们也可以用下面这种更具可读性的方式来编写这个形态:

greenCandle = close > open

twoGreenCandles = greenCandle[1] and 
     greenCandle

连续两根阴线

要识别连续两根阴线,我们可以这样编码:

twoRedCandles = close[1] < open[1] and
     close < open

只有当上一根K线 (close[1] < open[1]) 并且 当前K线 (close < open) 都收盘下跌时,twoRedCandles 这个变量的值才为 true。如果不是连续两根阴线,该变量的值则为 false

我们也可以用下面这种更具可读性的方式来识别两根阴线:

redCandle = close < open

twoRedCandles = redCandle[1] and 
     redCandle

一阴一阳的组合形态

我们可以这样来寻找一根阴线后紧跟一根阳线的组合形态:

redGreenCandles = close[1] < open[1] and 
     close > open

当上一根K线收盘下跌 (close[1] < open[1]),同时当前K线收盘上涨 (close > open) 时,redGreenCandles 变量的值为 true。如果这个阴转阳的形态没有出现,该变量的值则为 false

我们也可以用以下方式来编写这个相同的形态:

redCandle   = close < open
greenCandle = close > open

redGreenCandles = redCandle[1] and 
     greenCandle

两阳一阴的组合形态

要寻找两根阳线后紧跟一根阴线的形态,我们可以使用如下的TradingView代码:

greenGreenRed = close[2] > open[2] and
     close[1] > open[1] and
     close < open

只有当三件事同时发生时,greenGreenRed 这个变量的值才为 true:2根K线前是阳线 (close[2] > open[2]),上一根K线也是阳线 (close[1] > open[1]),并且当前K线是阴线 (close < open)。当这个特定的形态没有出现时,greenGreenRed 变量的值就为 false

顺便一提,我们也可以像这样编写这个相同的形态:

redCandle   = close < open
greenCandle = close > open

greenGreenRed = greenCandle[2] and 
     greenCandle[1] and 
     redCandle

连续三根阳线

要寻找连续三根阳线,我们可以这样编码:

threeGreenCandles = close[2] > open[2] and 
     close[1] > open[1] and
     close > open

这个 threeGreenCandles 变量只在三个特定的条件都满足时才为 true:2根K线前是阳线 (close[2] > open[2]),上一根K线也是阳线 (close[1] > open[1]),并且当前K线同样是阳线 (close > open)。如果不是连续三根阳线,threeGreenCandles 变量的值就为 false

请注意,我们也可以用下面这种更具可读性的方式来编写这个相同的形态:

greenCandle = close > open

threeGreenCandles = greenCandle[2] and 
     greenCandle[1] and 
     greenCandle

连续两根阳线或连续两根阴线

我们可以根据需要构建任意复杂的K线形态。下面的代码就演示了如何寻找“连续两根阳线 连续两根阴线”的形态:

greenGreenOrRedRed = (close[1] > open[1] and close > open) or
     (close[1] < open[1] and close < open)

这个 greenGreenOrRedRed 变量在以下两种情况之一发生时为 true

  • 上一根K线 (close[1] > open[1]) 和当前K线 (close > open) 都是阳线。
  • 或者,上一根K线 (close[1] < open[1]) 和当前K线 (close < open) 都是阴线。

在所有其他情况下,我们创建的这个变量的值都为 false

在处理复杂的K线形态时,一个好的编程习惯是先用辅助变量来定义基础的单K线形态。这能让代码更易于阅读,并能有效防止出错。

下面的代码片段就是一个很好的例子。这里我们寻找的是同样的两阴或两阳形态,但最终得到的代码可读性要高得多:

greenCandle = close > open
redCandle   = close < open

greenGreenOrRedRed = (greenCandle[1] and greenCandle) or
     (redCandle[1] and redCandle)

如何在实时行情中找到已收盘的红绿K线?

最后有一个非常重要的细节需要注意。当一个TradingView指标在实时图表上运行时,它会随着每一个价格的变动(Tick)而重新计算。策略也可以通过开启“在每个Tick上重新计算”选项来达到同样的效果。(详情请参阅“K线的收盘价不一定是其最终收盘价”)。

这里的关键问题是:在这些实时计算的过程中,图表上最后一根K线实际上还未收盘。因此,close 变量返回的是该K线当时的最新价格。当我们的代码逻辑是基于已收盘的K线形态来判断时,这就带来了问题。如果我们编写 close > open 来判断阳线,那么在实时行情中,只要价格在盘中交易时高于开盘价,这段代码就会被触发。

幸运的是,有一个解决方案:barstate.isconfirmed 这个内置变量。当K线已经确认收盘时,该变量返回 true;如果K线尚未收盘,它会返回 false

通过这个变量,我们可以确保我们的比较发生在K线确认收盘之后。(当然,如果您的脚本逻辑允许在盘中触发信号,那么您不必使用 barstate.isconfirmed。)

所以,如果我们想判断当前K线是否确认收盘为阳线,我们应该这样编码:

closedGreen = barstate.isconfirmed and 
     close > open

这段代码告诉我们当前K线是否确认收盘为阴线

closedRed = barstate.isconfirmed and 
     close < open

而用这段代码,我们可以判断当前K线是否确认收盘为十字星

closedDoji = barstate.isconfirmed and 
     close == open

同理,我们也可以将 barstate.isconfirmed 变量应用到任何其他的K线形态判断中。

内容总结

  • K线图上K线的颜色,取决于其开盘价与收盘价的比较。收盘价高于开盘价 (close > open) 的是阳线(绿色)。收盘价低于开盘价 (close < open) 的是阴线(红色)。而开盘价与收盘价相等 (close == open) 时则形成十字星。
  • 对于多K线组合的形态,我们主要使用两个TradingView功能。通过历史引用运算符 ([]),我们可以获取之前K线的数据。通过逻辑运算符 andor,我们可以将多个比较条件组合起来。and 用于构建严格的形态,要求所有条件都满足;而 or 则使形态条件更宽松,只需满足多个替代条件之一即可。
  • 图表的最后一根K线会为指标进行实时更新,这些更新会改变 close 变量的值。当我们的脚本只应该基于已收盘的K线来识别形态时,我们必须在比较条件中包含 barstate.isconfirmed 变量。
赞(0)
未经允许不得转载:图道交易 » Pine Script(97):判断K线涨跌与阴阳线,识别连续形态的第一步
分享到

评论 抢沙发

登录

找回密码

注册