Jetzt erstellst du ein Programm, das steigende und fallende Kerzen unterscheidet. Dafür prüft es die Beziehung zwischen Eröffnungs- und Schlusskurs und zeigt das Ergebnis durch Farbe und Markierung.

Wahr oder falsch

Der Vergleich close > open ergibt True, wenn der Schlusskurs höher als der Eröffnungskurs ist, andernfalls False. Das ist ein logischer Wert mit dem Typ bool.

Der Vergleich verändert keinen der beiden Kurse. Er beantwortet lediglich eine Frage.

ZeichenBedeutungBeispiel
>Größerclose > open
<Kleinerclose < open
>=Größer oder gleichclose >= open
<=Kleiner oder gleichclose <= open
==Gleichclose == open
!=Ungleichclose != open

= weist einer Variablen einen Wert zu, == vergleicht zwei Werte. Die Zeile bullish = close > open speichert das Ergebnis des Vergleichs in bullish.

Sind Eröffnungs- und Schlusskurs gleich, ist weder close > open noch close < open wahr. Für eine vollständige Entscheidung behandeln wir auch diesen Fall.

if, elif und else

Die Bedingung nach if entscheidet, ob der eingerückte Abschnitt ausgeführt wird:

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

Zuerst prüfen wir die Bedingung von if. Ist sie wahr, wählen wir Grün, und die übrigen Zweige entfallen. Ist sie falsch, folgt elif. else wird ausgeführt, wenn keine vorherige Bedingung wahr war.

Am Ende jedes Zweigbeginns steht ein Doppelpunkt. Den Inhalt des Zweigs kennzeichnet eine weitere Einrückung um vier Leerzeichen. Innerhalb von main() beginnt die Zeile mit if also mit vier und die Zuweisung darin mit acht Leerzeichen.

Das vollständige Programm

Lege die Datei candle_conditions.py an:

"""
@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)

Führe sie auf den Demodaten aus. Die Farbe der Schlusskurslinie ändert sich von Kerze zu Kerze. Unter steigenden Kerzen erscheint ein grünes Dreieck.

Der Chart von candle_conditions.py zeigt eine Schlusskurslinie mit wechselnder Farbe und grüne Dreiecksmarkierungen.
Die logische Bedingung wählt eine Farbe und zeichnet unter steigenden Kerzen ein Dreieck.

Das erste Argument von plotshape legt fest, wann das Zeichen erscheint. style bestimmt seine Form, location seine Lage zur Kerze. Die hier markierte Kerze hat lediglich über ihrem eigenen Eröffnungskurs geschlossen. Aus der Markierung folgt kein Kaufauftrag.

Du musst die Parameter auch hier nicht auswendig kennen: Bewege im Code den Mauszeiger auf plotshape und lies die Hilfe. Die Schritte und den Sprung zur Definition findest du im Kapitel Hilfe beim Schreiben von Code.

Der Ort der Berechnung ist wichtig

plot und plotshape laufen auf jeder Kerze. Wir ändern den darzustellenden Wert, die Farbe oder die Bedingung. So hat die Darstellung für jede Kerze ein Ergebnis.

Beim gleitenden Durchschnitt ist dieselbe Reihenfolge sinnvoll:

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

Zuerst berechnen wir den Durchschnitt auf jeder Kerze. Danach verwendet ihn die Bedingung. Setze den Aufruf von ta.sma nicht in den Zweig if bullish:, denn dann liefe er nur auf steigenden Kerzen.

Solange der Anfangswert des SMA fehlt, liefert close > average kein wahres Signal. Soll der Code gesondert auf fehlende Werte reagieren, verwende na(average). average == na ist dafür kein geeigneter Test.

Mehrere Bedingungen verknüpfen

and ist wahr, wenn beide Seiten wahr sind. or ist wahr, wenn mindestens eine Seite wahr ist. not kehrt den logischen Wert um.

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

Diese Bedingung verlangt gleichzeitig zwei Dinge: Die Kerze muss steigen, und der Schlusskurs muss über dem vorherigen Schlusskurs liegen. Eine steigende Kerze kann trotzdem unter dem Schlusskurs der vorherigen Kerze schließen. Deshalb sind das zwei getrennte Prüfungen.

and und or werten kurzschließend aus: Bestimmt der erste Teil bereits das Ergebnis, wird der zweite Teil nicht ausgewertet. Bei and geschieht das, wenn der erste Teil falsch ist, bei or, wenn er wahr ist. Führe Berechnungen mit Zustand deshalb in eigenen Zeilen aus und verknüpfe erst die erhaltenen logischen Werte.

Kurz zwischen Werten wählen

Du kannst die Wahl zwischen zwei Werten auch in einem Ausdruck angeben:

line_color = color.green if bullish else color.red

Das wählt Grün, wenn bullish wahr ist, andernfalls Rot. Auch bei gleichem Eröffnungs- und Schlusskurs würde Rot gewählt. Soll dieser Fall grau erscheinen, bleibe bei der vollständigen Entscheidung mit drei Zweigen.

Probiere es selbst aus

Zeichne über fallenden Kerzen ein rotes, nach unten gerichtetes Dreieck. Behalte das grüne Zeichen bei. Verschärfe anschließend beide Bedingungen um den Vergleich mit dem vorherigen Schlusskurs.

Lösung der Aufgabe
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)

Ersetze den ursprünglichen grünen Aufruf von plotshape durch die beiden neuen. Die Farbwahl betrachtet weiterhin nur Eröffnungs- und Schlusskurs der Kerze. Die Markierungen vergleichen zusätzlich mit dem vorherigen Schlusskurs.

Suche eine ausgelassene Kerze

Suche eine steigende Kerze, die in der verschärften Variante trotzdem kein grünes Zeichen erhält. Prüfe ihren eigenen Eröffnungskurs und den vorherigen Schlusskurs. Erkläre, an welchem Teil von and die Bedingung scheitert.