Die erste Strategie
Aus Kreuzungssignalen erstellst du Ein- und Ausstiegsregeln für einen Backtest.
Im Kapitel über Kreuzungen zeichnete der Indikator ein Signal, wenn sich die Durchschnitte kreuzten. Jetzt verwendest du dasselbe Ereignis zum Auslösen einer simulierten Order. Bei einer Aufwärtskreuzung eröffnet das Programm eine Kaufposition; bei einer Abwärtskreuzung schließt es sie.
Was macht eine Strategie?
Ein Indikator berechnet und stellt dar. Eine Strategie erteilt zusätzlich Orders an den Backtest-Simulator. Dieser verfolgt auf Basis der historischen Kerzen und vorgegebenen Regeln die Orders, Positionen und Ergebnisse.
Diesen historischen Test nennt man Backtest. In diesem Kapitel sind alle Orders simuliert. Run Pyne code erteilt keine Orders auf einem echten Handelskonto.
Eine Position ist der Bestand nach einem bereits ausgeführten Einstieg. Eine Order ist die Anweisung; die Ausführung ist das Ereignis, das eine Position erzeugt oder verändert. Diese drei Begriffe verwenden wir nicht austauschbar.
Die Regeln zuerst in Worten
Die Regeln unserer Strategie:
- Sie berechnet auf jeder Kerze SMA-Werte mit Länge fünf und zwanzig.
- Bei einer Aufwärtskreuzung erteilt sie eine Einstiegsorder für eine Long-Position von einer Einheit.
- Bei einer Abwärtskreuzung schließt sie die Position zum Einstieg mit der Kennung
Long. - Die Berechnung arbeitet mit den Daten abgeschlossener historischer Kerzen.
Der Wert einer Long-Position steigt mit steigenden und sinkt mit fallenden Kursen. In diesem Beispiel eröffnen wir keine Short-Position.
Die Regel behauptet nicht, dass jede Aufwärtskreuzung profitabel ist. Der Backtest untersucht gerade, was diese Aktionen auf den jeweiligen Daten bewirkt hätten.
Das vollständige Programm
Lege die Datei crossover_strategy.py an:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, strategy, ta
@script.strategy(
"Average Crossing Strategy",
overlay=True,
initial_capital=10000,
default_qty_type=strategy.fixed,
default_qty_value=1,
pyramiding=1,
)
def 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),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
if crosses_up:
strategy.entry("Long", strategy.long)
if crosses_down:
strategy.close("Long")
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)@script.strategy kennzeichnet main() als Strategie. Berechnungen und Linien lassen sich unverändert weiterverwenden. Neu ist der Import des Namensraums strategy, der Orderaktionen und Strategiedaten enthält.
Der Dekorator ist ein mehrzeiliger Aufruf. Seine Einstellungen steuern die Strategieausführung; die Parameter von main() sind Eingaben unserer eigenen Berechnungen.
Anfangskapital und Menge
initial_capital=10000 legt den Anfangskontostand der Simulation fest. Die Marktmetadaten der Demodaten bestimmen die Einheiten und Kursniveaus des Laufs.
default_qty_type=strategy.fixed bedeutet eine feste Menge. default_qty_value=1 fordert eine Order über eine Einheit an. Das ist weder ein Prozent des Kapitals noch unbedingt eine Geldeinheit.
pyramiding=1 erlaubt höchstens einen Einstieg in derselben Richtung. Das Beispiel vergrößert die vorhandene Position nicht durch weitere Long-Einstiege.
Zum Lernen verfolgen wir die Aktionen mit einer kleinen festen Menge. So musst du bei Ergebnisänderungen weniger verschiedene Größenfaktoren gleichzeitig untersuchen.
Namen für Einstieg und Schließung
Das erste Argument von strategy.entry("Long", strategy.long) ist eine Orderkennung. Den Text Long wählt das Programm; das zweite Argument legt die Richtung fest.
strategy.close("Long") verweist auf dieselbe Kennung. Die Namen müssen übereinstimmen. Steigst du mit der Kennung "Buy" ein, richtet sich eine Schließung von "Long" nicht an diesen Einstieg.
Die Abwärtskreuzung bedeutet hier eine Schließung, keinen Short-Einstieg. Ist gerade keine offene Position zu diesem Namen vorhanden, gibt es nichts zu schließen.
In der PyneIDE ausführen
- Speichere das vollständige Programm.
- Wähle Run Pyne code und die Daten
demo. - Prüfe die beiden SMA-Linien und die Trade-Markierungen im Chart.
- Öffne das Panel unter dem Chart und wähle Trades.

Falls keine Trades erscheinen, prüfe, ob du tatsächlich die Strategiedatei ausgeführt hast und ob @script.strategy noch vorhanden ist. Kontrolliere auch die tatsächlichen Werte beider Inputs. SMA-Linien gleicher Länge aus derselben Quelle kreuzen sich nicht.
Zeitpunkt von Signal und Ausführung
Mit den hier verwendeten Standardeinstellungen erteilt das Programm eine Market-Order auf Basis der Schlussdaten der Kerze. Diese wird gewöhnlich zum Eröffnungskurs der nächsten Kerze ausgeführt. Signal- und Einstiegskerze können deshalb verschieden sein.
Dasselbe gilt für die Schließung per Market-Order. Eine bei der Abwärtskreuzung erzeugte Schließungsorder kann die Position bei der nächsten Eröffnung schließen.
Erteilt die letzte Kerze eine neue Order, gibt es in der Datei keine folgende Kerze. Deshalb wird diese Order möglicherweise nicht ausgeführt. Auch eine früher eröffnete Position kann am Datenende offen bleiben.
Der Ausführungsmodus gehört zu den Einstellungen. Im nächsten Kapitel sehen wir ihn uns auch unter Properties an. Beurteile ein Ergebnis immer mit dem Ausführungsmodus, mit dem der Lauf erstellt wurde.
Probiere es selbst aus
Öffne die Strategie-Inputs und stelle die schnelle und langsame Länge jeweils auf 20. Sage zwei Dinge voraus: Wie liegen die Linien zueinander, und wie viele Kreuzungen können Trades auslösen?
Lösung der Aufgabe
Beide SMA-Werte verwenden dieselben Kurse und dieselbe Fenstergröße und stimmen deshalb überein. Es gibt keine Kerze, auf der einer über oder unter den anderen wechselt. Die Strategie eröffnet mit dieser Regel keine Trades.
Der vorhandene Chart zeigt dieses Ergebnis erst, wenn du die geänderten Inputs gespeichert hast und die Neuberechnung abgeschlossen ist. Stelle nach der Prüfung wieder 5 und 20 ein.
Wähle einen Einstieg aus
Suche einen ausgeführten Einstieg und untersuche die Durchschnitte auf der Kerze davor. Die Aufwärtskreuzung muss auf der Signalkerze vorliegen. Vergleiche den Trade-Kurs mit dem Eröffnungskurs der Einstiegskerze und nicht automatisch mit dem Schlusskurs des Signals.