用代码判断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线呢?接下来就让我们一探究竟。
使用 open 和 close 变量识别红绿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线是否为阴线。
第二个是逻辑运算符 and 和 or。它们可以将多个布尔(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线的数据。通过逻辑运算符and和or,我们可以将多个比较条件组合起来。and用于构建严格的形态,要求所有条件都满足;而or则使形态条件更宽松,只需满足多个替代条件之一即可。 - 图表的最后一根K线会为指标进行实时更新,这些更新会改变
close变量的值。当我们的脚本只应该基于已收盘的K线来识别形态时,我们必须在比较条件中包含barstate.isconfirmed变量。


