今度は、陽線と陰線を区別するプログラムを作ります。始値と終値を比較し、その結果を色とマーカーで表示します。

真と偽

close > openの結果は、終値が始値より高ければTrue、そうでなければFalseです。これは論理値で、型はboolです。

比較しても価格は変わりません。問いに対する答えが得られるだけです。

記号意味例
>より大きいclose > open
<より小さいclose < open
>=以上close >= open
<=以下close <= open
==等しいclose == open
!=等しくないclose != open

=は変数への代入、==は2つの値の比較です。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を実行します。

各分岐の先頭行はコロンで終わります。内部は、さらに4個のスペースで字下げします。main()内なら、ifの行は4個、内部の代入は8個のスペースで始まります。

プログラム全体

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)

デモデータで実行してください。終値の線の色が足ごとに変わり、陽線の下に緑の三角が現れます。

candle_conditions.pyのチャートに、色が変わる終値の線と緑の三角マーカーが表示されている。
論理条件で色を選び、陽線の下に三角を描画します。

plotshapeの最初の引数は、いつマーカーを表示するかを指定します。styleは形、locationはローソク足に対する位置です。ここで印が付くのは、単に終値が始値より高かった足です。マーカーが買い注文を意味するわけではありません。

パラメーターは暗記しなくてかまいません。コードのplotshapeにポインターを置き、ヘルプを確認してください。コードを書くときのヘルプで、定義へ移動する方法とともに説明しています。

計算する場所が重要

plotとplotshapeはすべての足で実行します。変えるのは、描画する値、色、条件です。これにより、すべての足について表示結果が得られます。

移動平均でも、次の順番が適切です。

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

先にすべての足で平均を計算し、その後の条件で使います。ta.smaをif bullish:の中に置くと、陽線でしか実行されないため、入れないでください。

SMAが初期の欠損値である間は、close > averageは真のシグナルを返しません。欠損に対して別の処理をしたいときは、na(average)を使います。average == naは正しい欠損判定ではありません。

複数の条件を組み合わせる

andは両方が真のときに真です。orは少なくとも片方が真なら真です。notは論理値を反転します。

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

陽線であることと、終値が前の終値より高いことを、同時に求めています。陽線でも前の足の終値より低く引ける場合があるため、別々の条件です。

andとorは短絡評価を行います。最初の部分で結果が決まれば、2つ目は評価しません。andでは最初が偽、orでは最初が真のときです。そのため、状態を使う計算は別の行で実行し、その結果の論理値を組み合わせてください。

式で2つの値を選ぶ

2つの値の選択は、1つの式でも書けます。

line_color = color.green if bullish else color.red

bullishが真なら緑、そうでなければ赤です。始値と終値が同じ場合も赤になります。その場合を灰色にしたければ、3つに分岐する元の書き方を使います。

自分で試す

陰線の上に、下向きの赤い三角を描いてください。緑の印は残します。その後、両方の条件に前の終値との比較も加えて、条件を厳しくします。

解答
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を、この2つの呼び出しに置き換えます。色の選択は引き続き同じ足の始値と終値だけを見ます。マーカーには、前の終値との比較も使います。

印が付かなかった足を探す

厳しい条件にした版で、緑の印がない陽線を探してください。その始値と前の終値を確認し、andのどちらの条件を満たさなかったか説明してください。