Um die Länge des Durchschnitts auszuprobieren, hast du die Zahl bisher im Quellcode geändert. Jetzt machst du daraus eine Einstellung des Indikators. So kannst du dasselbe Programm mit unterschiedlichen Längen ausführen.

Was ist ein Input?

Ein Input ist eine benannte Eingabe des Programms, die sich von außen ändern lässt. Der Quellcode bestimmt ihren Typ, Standardwert und erlaubten Wertebereich. Innerhalb dieser Grenzen wählt der Benutzer einen Wert.

Unsere Eingabe heißt length und hat den Standardwert 20. Die Variable length bestimmt die Länge des gleitenden Durchschnitts. Für den Code brauchen wir auch den Namensraum input aus dem Modul pynecore.lib.

length: int = input.int(20, title="Average length", minval=1, maxval=200)

Diese Zeile gehört in die Parameterliste von main(). int bedeutet ganze Zahl: Hier sind zum Beispiel 1, 20 oder 200 erlaubt, aber nicht 2,5. input.int beschreibt eine ganzzahlige Eingabe.

20 ist der Standardwert, Average length der angezeigte Titel. minval und maxval bestimmen den kleinsten und größten zulässigen Wert. Eine Länge von null ergibt kein sinnvolles Durchschnittsfenster, deshalb schließen wir sie aus.

Das vollständige Programm

Lege die Datei adjustable_average.py an:

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


@script.indicator("Adjustable Average", overlay=True)
def main(
    length: int = input.int(20, title="Average length", minval=1, maxval=200),
):
    average = ta.sma(close, length)
    plot(average, "Average", color=color.blue, linewidth=2)

Nach der öffnenden Klammer von main haben wir die Parameterliste auf mehrere Zeilen verteilt. ): beendet die Liste und beginnt den Funktionsrumpf. Die Berechnung und Darstellung darunter sind um vier Leerzeichen eingerückt.

Das Komma am Ende der Input-Zeile erlaubt, weitere Parameter zu ergänzen. Es ist auch bei einem einzigen Parameter zulässig. Die beiden eingerückten Bereiche haben unterschiedliche Aufgaben: Innerhalb der Klammern stehen die Eingaben, danach die auszuführenden Anweisungen.

Führe das Programm auf den Demodaten aus. Beim ersten Start entsteht der blaue Durchschnitt aus zwanzig Kerzen.

Öffne die Inputs-Oberfläche

  1. Aktiviere die Datei adjustable_average.py.
  2. Klicke oben rechts im Editor, in der Werkzeugleiste beim Dateitab, auf das Zahnradsymbol. Bewegst du den Mauszeiger darüber, erscheint Edit Inputs….
  3. Suche in der geöffneten Oberfläche das Feld Average length.
  4. Ändere den Wert auf 5 und klicke auf Save.

Du kannst dieselbe Oberfläche auch in der linken Ansicht Pyne unter Scripts öffnen: Klicke mit der rechten Maustaste auf adjustable_average.py und wähle Edit Inputs…. Den Eintrag findest du auch im Rechtsklickmenü des geöffneten Codes.

Neben adjustable_average.py ist die Inputs-Oberfläche mit dem Feld Average length und der Schaltfläche Save geöffnet.
Die Eingabe Average length lässt sich in der Inputs-Oberfläche der PyneIDE ändern.

Nach einem Klick auf Save berechnet die PyneIDE den geöffneten Chart automatisch mit der gespeicherten Einstellung neu. Warte auf die Aktualisierung: Die blaue Linie zeigt jetzt einen Durchschnitt über fünf Kerzen.

Im Quellcode steht weiterhin 20 als Standardwert. Die unter Inputs gespeicherte 5 überschreibt ihn für dieses Projekt.

Stelle den Wert jetzt auf 50 und speichere erneut. Vergleiche im selben Zeitraum, wie die Linie auf Kursänderungen reagiert. Nur den sichtbaren Zeitraum im Chart zu verschieben verändert den Input des Programms nicht.

Wo bleibt die Einstellung gespeichert?

Neben dem Programm speichert eine gleichnamige Datei mit der Endung .toml die Einstellungen. In diesem Beispiel ist das adjustable_average.toml.

TOML ist ein textbasiertes Einstellungsformat. Die PyneIDE verwaltet diese Datei. Für die Übung reicht es deshalb, die Inputs-Oberfläche zu verwenden. Wenn du die Datei öffnest, sieht der Abschnitt für die Länge so aus:

[inputs.length]
value = 5

Die eckigen Klammern kennzeichnen hier eine Gruppe von Einstellungen. Das ist kein Zugriff auf vorherige Kerzen wie im Kapitel über historische Werte: Die Klammern stehen in einer anderen Datei mit den Regeln einer anderen Sprache.

Auch der Parametername im Code und der Titel der Oberfläche sind unterschiedlich. In der Datei steht length, auf der Oberfläche Average length. Für die Programmausführung zählt der Name im Code.

Wenn du einen Input im Quellcode umbenennst, gehört der unter dem alten Namen gespeicherte Wert nicht zur neuen Eingabe. Öffne dann Inputs erneut und prüfe den Wert. Kopiere beim Kopieren eines Programms die danebenliegende .toml-Datei nur mit, wenn du auch die gespeicherten Einstellungen behalten möchtest.

Standardwert und tatsächlicher Wert

Änderst du den Standardwert im Code von 20 auf 30, hast aber bereits den Wert fünf gespeichert, kann die Ausführung weiterhin fünf verwenden. Der gespeicherte Wert hat Vorrang.

Notiere deshalb bei der Beschreibung eines Ergebnisses den tatsächlich verwendeten Input. Der sichtbare Standardwert im Quellcode allein beschreibt nicht alle Einstellungen einer Ausführung.

Probiere es selbst aus

Ergänze einen zweiten Längenparameter. Der kurze Durchschnitt soll den Standardwert 5 und der lange den Standardwert 20 haben. Beide dürfen mindestens 1 und höchstens 200 betragen. Zeichne sie mit getrennten Titeln.

Lösung der Aufgabe

Die Parameterliste von main():

fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),

Der Funktionsrumpf:

fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)

Die beiden Inputs lassen sich getrennt ändern. Die angegebenen Grenzen legen noch nicht fest, dass die schnelle Länge kleiner als die langsame sein muss. Diese Beziehung musst du gesondert prüfen; damit beschäftigen wir uns im Abschlussprojekt.

Prüfe das Speichern

Stelle die Länge auf eins. Ein SMA über eine Kerze entspricht deren Schlusskurs, deshalb muss die Linie durch die Schlusskurse verlaufen. Stelle sie anschließend wieder auf zwanzig. Prüfe beim erneuten Öffnen der Datei, ob die Oberfläche den gespeicherten Wert zwanzig zeigt.