Jetzt zeichnen wir neben dem Schlusskurs auch den Eröffnungskurs. Dafür erweitern wir das Programm aus dem vorherigen Kapitel: Wir holen einen weiteren Wert aus der Bibliothek und ergänzen einen Zeichenaufruf.

Vor der Änderung gehen wir die Programmzeilen durch, damit du weißt, wofür jede einzelne da ist.

Code ist eine genaue Beschreibung

Im Programm gibst du dem Computer Anweisungen. Zum Beispiel: „Verwende den Schlusskurs der Kerze und zeige ihn als blaue Linie.“ Dafür erwartet der Computer genaue Namen und Satzzeichen.

In Pyne code schreiben wir diese Anweisungen mit der Syntax von Python. Dazu gehören die Klammern der Funktionsaufrufe, Doppelpunkte und die Einrückung der Zeilen. Ihre Aufgaben lernst du in den folgenden Abschnitten kennen.

Öffne die im zweiten Kapitel angelegte Datei first_chart.py. Falls du darin den Indikator umbenannt hast, beeinflusst das die folgende Erklärung nicht.

Die Pyne-Kennzeichnung am Dateianfang

Die ersten drei Zeilen der Datei:

"""
@pyne edge
"""

Die drei Anführungszeichen kennzeichnen Anfang und Ende eines Textblocks. Am Dateianfang kann dieser Block auch eine Beschreibung des Programms enthalten. Python nennt ihn einen Docstring.

PyneCore liest daraus die Kennzeichnung @pyne. Sie teilt ihm mit, dass die Datei Pyne code enthält und andere Regeln als bei gewöhnlichem Python gelten. Vor der Ausführung wandelt PyneCore den Code um, damit wir beispielsweise auf Werte vorheriger Kerzen zugreifen können oder eine Variable ihren Wert für die nächste Kerze behalten kann. Beides behandeln wir in eigenen Kapiteln.

Auch @pyne allein ist eine gültige Kennzeichnung. Eine Pyne-code-Datei kann so beginnen:

"""
@pyne
"""

Was bedeutet das ergänzte edge?

edge kennzeichnet, dass das Programm einen festgelegten, eingeschränkten Teil von Pyne code verwendet. @pyne aktiviert die kerzenweise Funktionsweise; edge bestimmt, welche Sprachelemente und Funktionen wir dafür verwenden dürfen. Die PyneIDE meldet, wenn wir diesen Rahmen verlassen.

Programme mit @pyne können auch weitere Möglichkeiten und Bibliotheken von Python nutzen. Programme mit @pyne edge verwenden die von Pyne erlaubten Werkzeuge und importieren keine beliebigen Python-Bibliotheken. Dadurch können auch Laufzeitumgebungen ohne allgemeine Python-Umgebung sie verarbeiten.

In allen vollständigen Programmen des Buchs behalten wir @pyne edge bei und bleiben innerhalb dieses Sprachumfangs.

Werkzeuge auswählen

Die nächste Zeile:

from pynecore.lib import close, color, plot, script

Die Schreibweise from … import … macht die aufgeführten Namen im Programm verfügbar. In diesem Beispiel holen wir vier Werkzeuge aus der Bibliothek pynecore.lib:

  • close: der Schlusskurs der aktuellen Kerze;
  • color: die verfügbaren Farben;
  • plot: einen Wert im Chart darstellen;
  • script: Typ und Grundeinstellungen des Programms festlegen.

Die Namen werden durch Kommas getrennt. Groß- und Kleinschreibung ist wichtig: close und Close sind unterschiedliche Namen.

Leerzeilen gliedern den Code. Dadurch erkennst du leichter, wo die Aufzählung der Werkzeuge endet und das Programm beginnt.

Name und Darstellung des Programms

@script.indicator("My First Chart", overlay=True)

Diese Zeile legt fest, dass wir einen Indikator erstellen. Ein Indikator berechnet etwas aus den Daten und stellt es dar. In diesem Beispiel zeichnen wir den Schlusskurs.

In den Klammern legen wir die Einstellungen des Indikators fest:

  • Der Text "My First Chart" in Anführungszeichen ist der Name des Indikators.
  • overlay=True legt fest, dass die Darstellung im selben Chart wie die Kerzen erscheint.

True bedeutet wahr. Das Gegenteil ist False. Stellst du overlay auf False, erscheint der Indikator in einem eigenen Panel. Das verwenden wir auch im Kapitel über eigene Berechnungen.

Wo die Berechnung stattfindet

def main():
    plot(close, "Close", color=color.blue, linewidth=2)

def kennzeichnet den Anfang einer Funktion. Eine Funktion ist eine benannte Folge von Anweisungen. Hier heißt sie main.

PyneCore führt den Rumpf von main() für die Kerzen der Daten aus. Sie ist der Einstiegspunkt unseres Programms. Nach dem Klammerpaar steht ein Doppelpunkt; die darunter eingerückte Zeile gehört zum Funktionsrumpf.

Die Einrückung legt fest, welche Zeilen zusammengehören. Wir verwenden vier Leerzeichen pro Einrückungsebene. Drücke am Zeilenanfang Tab: Mit den Standardeinstellungen der PyneIDE erhältst du damit in einem Schritt vier Leerzeichen Einrückung. Shift + Tab rückt die Zeile um eine Ebene zurück. Visual Studio Code rückt eine neue Zeile meist automatisch ein, wenn du nach einer Zeile mit abschließendem Doppelpunkt Enter drückst.

Was verlangen wir von plot?

plot(...) ist ein Funktionsaufruf. In den Klammern stehen die benötigten Werte und Einstellungen:

  • close: diesen Wert darstellen;
  • "Close": diesen Namen für die Darstellung verwenden;
  • color=color.blue: Blau verwenden;
  • linewidth=2: die Linienstärke auf 2 setzen.

Bei den ersten beiden Werten bestimmt die Reihenfolge ihre Bedeutung. color= und linewidth= geben ausdrücklich an, welche Einstellung wir übergeben. Diese Einstellungen heißen Parameter.

Der Punkt in color.blue bedeutet, dass wir die zum Namen color gehörende Farbe blue verwenden. Er gehört zum Zugriff auf diesen Namen; ersetze ihn nicht durch ein Komma.

Zeichne zwei Linien

Für den Schlusskurs haben wir close verwendet. Den Eröffnungskurs erreichst du über open.

Lege im Ordner scripts eine Kopie der Datei namens two_lines.py an. So bleibt das Beispiel aus dem zweiten Kapitel erhalten. Ändere in der Kopie Folgendes:

  1. Ergänze open bei den importierten Werkzeugen.
  2. Benenne den Indikator in "Open and Close" um.
  3. Ergänze im Rumpf von main() einen zweiten Aufruf von plot.

Das vollständige Programm:

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


@script.indicator("Open and Close", overlay=True)
def main():
    plot(close, "Close", color=color.blue, linewidth=2)
    plot(open, "Open", color=color.orange, linewidth=2)

Versuche vor dem Start vorherzusagen, wo die beiden Linien die Kerzen treffen. Speichere die Datei und klicke auf Run Pyne code. Verwende dieselben Beispieldaten wie zuvor.

Neben dem Code von two_lines.py zeigt der DEMO-Kurschart getrennte Linien namens Close und Open.
Zwei Aufrufe von plot, zwei Linien: Close zeigt den Schlusskurs und Open den Eröffnungskurs im selben Chart.

Worauf solltest du achten?

Die blaue Linie verbindet die Schlusskurse, die orangefarbene die Eröffnungskurse der Kerzen. Die Darstellungen im Chart haben Namen: Close und Open. Diese helfen dir, sie auch nach einer Änderung der Farben zu erkennen.

Beide Aufrufe von plot sind gleich weit, um vier Leerzeichen, eingerückt, weil sie zur selben Funktion main() gehören.

Wenn unter open ein Fehler angezeigt wird, prüfe, ob du den Namen in der Importzeile ergänzt hast. Um ein neues Werkzeug zu verwenden, musst du auch seinen Namen verfügbar machen.

Kommentare im Code

Eine Zeile, die mit einem einzelnen # beginnt, ist ein Kommentar:

    # Show the opening price of each candle.
    plot(open, "Open", color=color.orange, linewidth=2)

Ein Kommentar führt keine Aktion aus. Damit kannst du den Zweck eines Schritts für dich selbst oder spätere Leser des Codes erklären. Die Kommentare der Beispiele schreiben wir auf Englisch; die Erklärungen im Buch sind auf Deutsch.

Du kannst einen Kommentar auch ans Ende einer Anweisung schreiben:

    plot(open, "Open", color=color.orange, linewidth=2)  # Show the opening price.

Der Aufruf plot(...) wird dabei ausgeführt. Der Text ab dem folgenden # bis zum Zeilenende ist ein Kommentar und wird von der Laufzeit ignoriert. Zwischen Code und # lassen wir zur besseren Lesbarkeit zwei Leerzeichen.

Probiere es selbst aus

Erstelle eine dritte Linie, die den Höchstkurs der Kerzen zeigt. Dieser Wert heißt high. Die Darstellung soll "High" heißen und die Farbe color.green haben.

Überlege, an welchen beiden Stellen du das Programm erweitern musst. Sage vor dem Start voraus: Kann High unter dem Eröffnungs- oder Schlusskurs derselben Kerze liegen?

Lösung der Aufgabe

Du musst high auch in der Importzeile ergänzen:

from pynecore.lib import close, color, high, open, plot, script

Ergänze im Rumpf von main() diese Zeile, mit derselben Einrückung wie die anderen beiden Aufrufe:

    plot(high, "High", color=color.green, linewidth=2)

Der Höchstkurs einer Kerze ist mindestens so hoch wie ihr Eröffnungs- und Schlusskurs. Deshalb kann der Punkt High an einer Kerze nicht unter einem dieser beiden Werte liegen. Betrachte die verbindenden Linienabschnitte immer an der Position der zugehörigen Kerze.

Prüfe deine Änderung

Gehe das Programm mit den drei Linien durch. Findest du die importierten Daten, den Indikatornamen und die Zeichenaufrufe? Prüfe, ob jeder neu verwendete Datenname in der Importzeile steht und ob alle drei Aufrufe gleich eingerückt sind.

Bevor wir eigene Berechnungen mit Kursen durchführen, sehen wir uns an, wie die PyneIDE bei der Verwendung von Funktionen hilft.