Tradesignal How To 07
ENTWICKLUNG EINER SYSTEMATISCHEN HANDELS-STRATEGIE.
TEIL 2: MIT DER FORMELSPRACHE EQUILLA ZUM TRADING-ERFOLG.
Die zweite Ausgabe unserer Equilla-Reihe beschreibt, wie Variablen, Inputs und Wenn-Dann-Bedingungen funktionieren. Anhand einer einfachen Handelsstrategie erfahren Sie Schritt für Schritt, welche Befehle Sie für Einstiege, Ausstiege und Stopps brauchen und wie diese in einem Code zusammengeführt werden.
INHALT.
- Variablen – die Container für Daten
- Bedingungsabhängige Abläufe
- Step by step zur ersten Handelsstrategie
- Implementierung eines Stopps
- Ergebnisse des Backtests
- Fazit
HINWEIS: Der vorliegende Beitrag ist im TRADERS’ Magazin (Ausgabe 09/2014) erschienen.
VARIABLEN – DIE CONTAINER FÜR DATEN.
Bevor wir mit der Erstellung der Handelsstrategie beginnen, möchten wir unsere Leser mit der Funktionsweise von Variablen vertraut machen.
Sie sind es, die Zahlen, Berechnungsergebnisse, Benutzereingaben oder Kurswerte speichern und diese überhaupt erst für die Weiterverarbeitung und spätere Verwendung zugänglich machen. Variablen entstehen, indem sie im Skript durch den Tag „Variables“ deklariert werden.
WICHTIG HIERBEI: Variablen gelten immer nur innerhalb des jeweiligen Skriptes, weil nur dort der Zugriff auf die Variable besteht.
BEDINGUNGSABHÄNGIGE ABLÄUFE.
Neben Variablen gehören bedingungsabhängige Abläufe zu den zentralen Elementen einer Handelsstrategie. Sie bestimmen, welche Reaktion auf bestimmte Ereignisse (z.B. Berechnungsergebnisse, Benutzereingaben) erfolgen soll.
- Einfache Bedingung (if… then…): WENN Bedingung DANN mache a
- Bedingung mit Verzweigung (if… then… else…): WENN Bedingung DANN mache a, ANSONSTEN mache b
Neben diesen beiden Grundformen können Bedingungen auch verschachtelt werden, wodurch mehrere Abfragen und Anweisungen durchgeführt werden. Wie solch eine verschachtelte Bedingung aussehen kann, wird im weiteren Verlauf anhand der Kauf und
Verkaufsbefehle der Crossover-Handelsstrategie dargestellt.
STEP BY STEP ZUR ERSTEN HANDELSSTRATEGIE.
Mithilfe der vordefinierten und Funktionen und Indikatoren können Tradesignal-User ihre individuelle Handelsstrategie schreiben. Wir möchten an dieser Stelle die allseits bekannte Crossover-Methode als Grundlage für solch eine Strategie nutzen.
Fangen wir mit dem Kopfteil an. Hier wird eine kurze Beschreibung der Handelsstrategie angegeben, um bei einer Vielzahl unterschiedlicher Strategien schnell erkennen zu können, welcher Ansatz jeweils dahinter steht steht.
Meta:
Synopsis ("Dieses Handelssystem handelt Überschneidungen des Kurses mit der 200-Tage-Linie. Es kann sowohl long only, als auch als Long-Short-Variante genutzt werden. Der Initial Stopp basiert auf der ATR.");
Weiter geht es mit dem Eingabebereich. Hier werden alle benutzerspezifischen Parameter (Inputs) sowie die eben besprochenen Variablen deklariert. Mit Price(Close) wird bestimmt, dass der Gleitende Durchschnitt auf Schlusskursbasis berechnet wird.
Der Input Period(200,1) dient zur Eingabe der Periodenzahl. Die Zahl 1 bedeutet, dass nur ganzzahlige Änderungen dieses Parameters zugelassen werden. Zur Definition von bullishen und bearishen Signalen, die später über die Eingabemaske der Software modifiziert werden können, dienen die Inputs Bullish und Bearish.
Jeder dieser Inputs bietet zwei Auswahlmöglichkeiten. So kann der User beim Input Bullish festlegen, ob ein Long-Einstieg oder ein Short-Ausstieg erfolgen soll. Analog dazu bietet der Input Bearish die Möglichkeiten des Long-Ausstiegs sowie des Short-Einstiegs. Mithilfe dieser Option können im späteren Backtest bequem alle Kombinationen durchgespielt werden.
Um Ein- und Ausstiegssignale im Chart anzeigen zu lassen, fügen wir Visuals als Input ein und stellen diesen standardmäßig auf Active, sodass der Gleitende Durchschnitt automatisch im Chart dargestellt wird.
Inputs: Price(Close),
Period(200,1),
Bullish(LongEntry,ShortExit)= LongEntry,
Bearish(LongExit,ShortEntry)= LongExit,
Visuals(Active,Inactive)=Active;
Im nächsten Schritt kommen wir zu den Variablen, die im vorliegenden Script für die fortlaufende Berechnung und Speicherung der Werte des Gleitenden Durchschnitts verantwortlich sind. Die Variable avg greift dabei auf die bereits in Teil 1 vorgestellte Funktion AverageFC zurück, die einen einfachen Gleitenden Durchschnitt berechnet. Sie greift hierbei auf die Inputs Price und Period zurück, die wir auf Close-Basis der letzten 200 Handelsperioden deklariert haben. (Möchte man hingegen den exponentiellen Durchschnitt verwenden, muss auf die Funktion XAverage zurückgegriffen werden.)
Variables:
avg, avtr;
avg=AverageFC(Price,Period);
avtr=avgtruerange(14);
Der nachfolgende Programmteil enthält das eigentliche Herzstück der Handelsstrategie. Werfen wir zunächst einen Blick auf den ersten Teil, der für die bullishen Signale zuständig ist:
If Price Crosses Over avg Then
If Bullish = LongEntry Then
Buy Next Bar at Market
Else If Bullish=ShortExit Then
Cover Next Bar at Market;
Wie man erkennen kann, ist die Befehlsstruktur relativ einfach zu verstehen. Schließt der zugrundeliegende Markt oberhalb der 200-Tage-Linie („..crosses over avg..“), kommt die folgende Bedingung ins Spiel: Wenn der Input Bullish auf LongEinstieg eingestellt
ist, dann erfolgt der Kauf des Wertpapiers per Market-Order zur nächsten Handelsperiode. Ist dieser dagegen auf ShortAusstieg eingestellt, erfolgt die Schließung (cover) einer vorhandenen Short-Position – ebenfalls per Market-Order zur nächsten Handelsperiode. Die gleiche Struktur kommt nun beim Bearish-Modus zum Einsatz:
If Price Crosses Under avg Then
If Bearish=LongExit Then
Sell Next Bar at Market
Else If Bearish=ShortEntry Then
Short Next Bar at Market;
IMPLEMENTIERUNG EINES STOPPS.
Zum Abschluss möchten wir noch einen einfachen Stopp zur Verlustbegrenzung implementieren. Konkret soll ein ATR-Stopp zum Einsatz kommen. Mithilfe der vorinstallierten Funktionen ist dies einfach umsetzbar.
SetStopContract;
SetStopLoss(LotSize*1*avtr[BarsSinceEntry]);
Der Code berechnet den Stopp anhand der Stückzahl (LotSize), die mit der einfachen Average True Range (avtr) multipliziert wird. Die eckige Klammer sorgt dafür, dass der ATR-Wert zum Zeitpunkt des Einstiegs fixiert wird. LotSize ist der Multiplikator des Futures pro Punkt, z.B. 25 beim DAX Future. Um zu definieren, dass der Stopp pro Future gilt – und nicht für die Gesamtposition – wird in der oberen Zeile SetStopContract hinzugefügt. Mithilfe der Funktion BarsSinceEntry lässt sich auch problemlos ein Zeitstopp einbauen. Für Long Positionen gilt:
If MarketPosition=1 and BarsSinceEntry >=10 Then Sell next bar at low[BarsSinceEntry] stop;
Hier prüft das Programm zunächst, ob der Markt eine Long-Position hält (marketposition=1) und bereits mindestens 10 Handelsperioden seit dem Einstieg vergangen sind. Ist dies der Fall, wird die Position geschlossen, sobald der Markt unterhalb des Tiefs der Einstiegskerze schließt. Ist der Markt in einer Short-Position, gilt:
If MarketPosition=-1 and BarsSinceEntry >=10 Then Cover next bar at high[BarsSinceEntry] stop;
Möchte man den Stopp nach 50 Handelsperioden auf Einstand ziehen, müsste der Ausstiegsbefehl wie folgt lauten:
If MarketPosition=1 and BarsSinceEntry >=50 Then Sell next bar at low[BarsSinceEntry] stop;
If MarketPosition=-1 and BarsSinceEntry >=50 Then Cover next bar at high[BarsSinceEntry] stop;
Zu guter Letzt möchten wir, dass der Gleitende Durchschnitt und die Stopps automatisch im Chart dargestellt werden. Mithilfe der beiden Grafikfunktionen DrawSymbol und DrawLine kann dies wie folgt in die Tat umgesetzt werden.
If Visuals=Active Then begin
DrawSymbol(GetActiveOrderPrice(1));
DrawLine(avg);
End;
Der vollständige Equilla Code ist in Abbildung 1 zu sehen.
Meta:
Synopsis ("This trading system trades with crosses of the price with the 200-day line. It may be used as long only, as well as in a long-short version. The initial stop is based on the ATR.");
Inputs: Price(Close),
Period(200,1),
Bullish(LongEntry,ShortExit)= LongEntry,
Bearish(LongExit,ShortEntry)= LongExit,
Visuals(Active,Inactive)=Active;
Variables:
avg, avtr;
avg=AverageFC(Price,Period);
avtr=avgtruerange(14);
If Price Crosses Over avg Then
If Bullish = LongEntry Then
Buy Next Bar at Market
Else If Bullish=ShortExit Then
Cover Next Bar at Market;
If Price Crosses Under avg Then
If Bearish=LongExit Then
Sell Next Bar at Market
Else If Bearish=ShortEntry Then
Short Next Bar at Market;
SetStopContract;
SetStopLoss(LotSize*1*avtr[BarsSinceEntry]);
If MarketPosition=1 and BarsSinceEntry >=50 Then Sell next bar at low[BarsSinceEntry] stop;
If MarketPosition=-1 and BarsSinceEntry >=50 Then Cover next bar at high[BarsSinceEntry] stop;
If Visuals=Active Then begin
DrawSymbol(GetActiveOrderPrice(1));
DrawLine(avg);
End;
ABB. 1: EQUILLA CODE.
Der vorliegende Equilla Code handelt Überkreuzungen des Kurses mit der 200-Tage-Linie und nutzt einen Initial Stop auf ATR-Basis.
ERGEBNISSE DES BACKTESTS.
Mit dem eben vorgestellten Handelssystem, können wir nun den ersten Praxistest durchführen. Hierzu kompilieren wir den Equilla-Code und ziehen ihn anschließend bequem per Drag and Drop in einen Chart unserer Wahl, zum Beispiel den DAX.
Tradesignal visualisiert alle Ein- und Ausstiege im DAX-Chart sowie den entsprechenden Verlauf der Kapitalkurve. Die im Equilla Script deklarierten Inputs können bequem über die Werkzeugleiste modifiziert werden, die Ergebnisse sind sofort im Chart sichtbar. Möchte man also erfahren, ob sich auch der Handel der Short-Signale beim DAX ausgezahlt hätte, genügen nur wenige Klicks.
Auch die Änderung der Periodenlänge lässt sich hier dank der im Code deklarierten Inputs bequem steuern.
Alle Ein- und Ausstiegssignale und Stopps werden im Chart visuell markiert, die Kurve darunter zeigt den historischen Verlauf der Kapitalkurve. Quelle: Tradesignal.
FAZIT.
Mit Tradesignal können Trader ohne große Programmierkenntnisse individuelle Handelsstrategien entwickeln und das eigene Trading auf eine solide Basis stellen. Mithilfe vordefinierter Funktionen lassen sich die eigenen Ideen in ein Script überführen und anschließend backtesten und optimieren.
Die Formelsprache Equilla liefert hierfür zahlreiche Tools und Module, die dem Systementwickler das Leben einfacher machen. Mehr dazu im nächsten Teil unserer Equilla-Serie.
Für Fragen rund um Tradesignal stehen wir Ihnen jederzeit gerne zur Verfügung. Wenn Sie noch kein Tradesignal-Kunde sind, stellen wir Ihnen auch gerne eine Testversion zur Verfügung.
Das war’s für heute. Take care, take profit und auf Wiedersehen.