现在编写一个区分上涨与下跌 K 线的程序。它会检查开盘价和收盘价之间的关系,再用颜色和标记显示结果。

真或假

比较 close > open 在收盘价大于开盘价时得到 True,否则得到 False。这是逻辑值,类型为 bool。

比较不会改变任何价格,只回答一个问题。

符号含义示例
>大于close > open
<小于close < open
>=大于等于close >= open
<=小于等于close <= open
==等于close == open
!=不等于close != open

= 给变量赋值,== 比较两个值。bullish = close > open 将比较结果放入 bullish。

开盘价等于收盘价时,close > open 与 close < open 都不为真。为了完整决策,也要处理这种情况。

if、elif 与 else

if 后面的条件决定是否执行缩进部分:

if bullish:
    line_color = color.green
elif bearish:
    line_color = color.red
else:
    line_color = color.gray

先检查 if。若为真,选择绿色,跳过后面分支;否则检查 elif。当前面所有条件都不为真时,执行 else。

每个分支开头的末尾都有冒号,分支内部再缩进四个空格。所以在 main() 中,if 行开头是四个空格,内部赋值行是八个。

完整程序

创建 candle_conditions.py:

"""
@pyne edge
"""
from pynecore.lib import close, color, location, open, plot, plotshape, script, shape


@script.indicator("Candle Conditions", overlay=True)
def main():
    bullish = close > open
    bearish = close < open
    if bullish:
        line_color = color.green
    elif bearish:
        line_color = color.red
    else:
        line_color = color.gray
    plot(close, "Close", color=line_color, linewidth=2)
    plotshape(bullish, "Bullish candle", style=shape.triangleup,
              location=location.belowbar, color=color.green)

用演示数据运行。收盘价线的颜色随 K 线改变,上涨 K 线下方会出现绿色三角形。

candle_conditions.py 的图表显示颜色变化的收盘价线和绿色三角形标记。
逻辑条件选择颜色,并在上涨 K 线下方画出三角形。

plotshape 的第一个实参决定何时显示标记。style 控制形状,location 控制相对 K 线的位置。这里被标记的 K 线只是收盘价高于自己的开盘价,标记并不代表买入指令。

这里同样无须背下参数:将鼠标移到代码中的 plotshape 名称上查看帮助。编写代码时获取帮助提供具体步骤,也介绍了跳转到定义。

计算放在哪里很重要

plot 和 plotshape 在每根 K 线上执行,我们改变的是要显示的数值、颜色或条件。因此,每根 K 线都有对应的显示结果。

平均线也适合采用同样的顺序:

average = ta.sma(close, 20)
above_average = close > average

先在每根 K 线上计算平均值,再由条件使用。不要把 ta.sma 放到 if bullish: 分支里,否则只会在上涨 K 线上执行。

SMA 开头缺值时,close > average 不会给出真信号。如需特别处理缺失情况,使用 na(average)。average == na 不是正确的缺失检查。

组合多个条件

and 在两侧都为真时才为真。or 只需至少一侧为真。not 将逻辑值取反。

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

这个条件同时要求两件事:K 线上涨,且收盘价高于上一收盘价。上涨 K 线仍可能收在上一根收盘价之下,因此这是两个不同条件。

and 和 or 采用短路求值:第一部分已经决定结果时,第二部分不会被求值。对于 and,是第一部分为假时;对于 or,是第一部分为真时。因此,带状态的计算应先放在单独一行执行,再组合得到的逻辑值。

简短的值选择

也可以用一个表达式在两个值之间选择:

line_color = color.green if bullish else color.red

当 bullish 为真时选择绿色,否则选择红色。开盘价等于收盘价时也会选红色。如果希望这种情况为灰色,就保留完整的三分支判断。

自己试一试

在下跌 K 线上方画红色向下三角形,同时保留绿色标记。然后,为两种标记都加入与上一收盘价比较的限制。

参考答案
bullish_signal = bullish and close > close[1]
bearish_signal = bearish and close < close[1]
plotshape(bullish_signal, "Bullish signal", style=shape.triangleup,
          location=location.belowbar, color=color.green)
plotshape(bearish_signal, "Bearish signal", style=shape.triangledown,
          location=location.abovebar, color=color.red)

用这两个新调用替换原来的绿色 plotshape。颜色选择仍然只比较本根开盘价与收盘价,而标记还比较上一收盘价。

找一根没有被标记的 K 线

在加强条件的版本中,找一根上涨却没有绿色标记的 K 线。检查它自己的开盘价和上一根收盘价,说明 and 的哪一部分没有通过。