hier möchte ich mich mal über das richtige Backtesten und Optimieren auslassen.
Vielleicht erspare ich so dem einen oder anderen ein Haufen Arbeit und Zeit.
Zunächst brauch man eine Strategie. Man kann sich auch aus den vorgefertigen Strategieschnipels selbst eine zusammenstellen. Das soll jetzt aber nicht das Thema hier sein.
Zum Thema:
Je genauer die Datenhistorie, desto besser werden die Backtests.
In der Regel kann man immer M1 - Close - Daten beim Broker downloaden. Bei MBT für ein halbes Jahr etwa, bei IB 1 Jahr.
Für viele Strategien reicht eine Datenauflösung von M1 aus. Dazu öffnet man einfach einen Chart in MC und stellt die darzustellende Zeit (zB vom 1.1.2010 bis heute) und das Timeframe auf M1. Nun werden die Daten geladen.
Aus den M1-Daten bastelt sich MC automatisch auch M30, H1, H4 und alle anderen Daten.
Man sollte, um sich selbst eine Datenbank aufzubauen, alle interessanten Quotes aller Instrumente selbst aufnehmen. Dazu nimmt man den Quote Manager.
Im Quote Manager kann man einstellen, welche Daten bei welchem Broker recorded werden sollen, und in welcher Auflösung. Ich empfehle, lieber zu viele Instrumente einzustellen als zu wenig. Ein alter Lappi und eine normale DSL-Verbindung schafft es problemlos, alle Tick/M1 und je Bid/Ask/Close-Daten von allen FX-pairs bei MBT aufzunehmen. Welche Daten recordet werden sollen, stellt man ein indem man auf das Instrument klickt und dann "Fields to collect", dann erscheint das Fenster:
Mit Klick auf "Apply to all symbols" wird das für alle übernommen.
Anschließend markiert man alle "blau" und klickts rechts und dann auf "Connect...".
Nun recordet der QM alle Daten. Schließt man den QM (am Wochenende), dann überträgt er die Daten vom Cache in die richtige Datenbank.
Das sollte man wissen, wenn man ab und an die Datenbank auf einen anderen Rechner kopiert, um mit MC im Offlinemodus Backtests durchzuführen.
Wichtig ist noch die Einstellung der richtigen Timezones. Ich habe mir im QM eine eigene "Exchange & ECN" - Vorlage erstellt für MBT, um die Daten aufzunehmen.
Haben wir eine gute Datenbasis aufgebaut, können wir richtig backtesten.
Den Portfolio Backtester würde ich persönlich nicht nutzen. Er unterstützt (noch) kein IOG (IntraBarOrdergeneration) und auch keinen Bar Magnifer. Stattdessen lieber aus dem Chart heraus backtesten. Bei einem Backtest wird MC blockiert, man kann nichts anderes mehr machen. Deshalb ist es ratsam, für längere Optimierungen eine 2. Instanz von MC auf demselben Rechner aufzumachen (das geht und ist erlaubt).
So, wir haben jetzt eine einfache Strategie, welche auf M30 basiert. Die Einstiegsorders werden alle auf M30 generiert. Die Ausstiege, sofern Pipbasiert oder Profit/Lostbasiert, sollen aber auch innerhalb der Bars passieren.
Wenn wir das jetzt backtesten, werden die Ausstiege aber erst zum nächsten vollen Bar "abgerechnet". Das fühlt zu Fehlergebnissen.
Deshalb ist es wichtig, die Strategie von Anfang an richtig zu coden.
Die Befehle sind aber ungünstig wenn man Pipbasiert arbeiten möchte.
Also als Ausstiegsorders lieber nehmen:
if MarketPosition = 1 then Sell ("TPlong") next bar entryprice + (TP * 0.0001) limit;
if MarketPosition = 1 then Sell ("SLlong") next bar entryprice - (SL * 0.0001) stop;
if MarketPosition = -1 then buytocover ("TPshort") next bar entryprice - (TP * 0.0001) limit;
if MarketPosition = -1 then buytocover ("SLshort") next bar entryprice + (SL * 0.0001) stop;
Auch diese limit/stop-orders sind intrabarbasiert. Sie werden punktgenau generiert, auch wenn man diesen Kurs nicht zur Verfügung hat.
Jetzt kommt aber das Problem bei M30 und relativ engen TP und SL: Innerhalb des M30-Kurses weiß man nur die Daten: OHLC (Open, High, Low, Close). Wann welcher Kurs genau erreicht wird, kann nicht gesagt werden. Es kann also sein, dass die Startegie erst den TP abrechnet obwohl ein enger SL vorher getroffen worden ist auf live. Genaueres dazu, als Beschreibung für Ninjatrafder aber auch für MC gültig, findet man auf DarthTraders Blog.
Jetzt gibt es eine Möglichkeit, in MC die Genauigkeit zu erhöhen:
Aktivierung des "Bar magnifers" - siehe Bild unten.
Man sollte mindestens M1 einstellen. Jetzt rechnet MC also trotz des M30 intern mit M1. Sofern Ticks vorhanden sind, auch diese nehmen!
Im Bild sieht man auch gleich oben die Möglichkeit, nicht nur auf Close zu backtesten, sondern auch auf getrennten Bid/Ask-Linien. Das macht Sinn bei Scalpern wenn man die entsprechenden Daten vorher recordet hat.
Voraussetzung ist noch, dass man im Chart das 1. Instrument als Ask einstellt und ein 2. Instrument drüberlegt mit Bid.
Im Idealfall also backtestet man mit getrennten Ask/Bid-Linien und mit dem "Bar Magnifer 1 Tick". genauer gehts nicht. Entsprechend länger dauert jedoch das Backtesten. Nun wird jedoch der tatsächliche Spread mit einkalkuliert!
Intern wird so gerechnet:
Auf den Closedaten der Einstieg, und dann, sofern eine Posi offen ist, wird mit genaueren Ticks der Ausstieg berechnet. Das ist insgesamt recht zeitsparend, da nicht immer alle Ticks durchkalkuliert werden (wenn keine Posi offen ist).
Möchte man, dass die Einstiege unabhängig vom TF errechnet werden, aktiviert man IntraBarOrderGeneration (In den Parametereinstellungen der letzte Reiter)
Das macht NUR Sinn, wenn die Einstiege nicht auf den Closedaten basieren sollen, sondern zB rein nach Kursen oder bestimmten, krummen Zeiten etc.
IOG kann man auch fest im Code aktivieren indem man ganz oben reinschreibt:
[intraBarOrderGeneration=true]
Auch IOG macht nur Sinn mit entsprechend genauen Daten aus dem Bar Magnifer.
Achtung: Nun dauert ein Backtest wesentlich länger, da immer Tickbasiert (oder was man im Bar Magnifer eingestellt hat) gerechnet wird.
In den Einstellungen zum Chart noch die Kommission einstellen. Bei FX und MBT ist das zB 0.0000295 $ per share.
Wenn man nicht mit getrennten Bid/Ask-Linien backtestet, noch einen üblichen Spread dazuaddieren (oder bei Slippage dazuaddieren).
Zusammenfassung:
Aus dem Chart heraus backtesten und optimieren
Bar Magnifer aktivieren und auf kleinstmögliche TF stellen
ggf. getrennt mit Bid/Ask-Kursen backtesten
Den Code von Anfang an so schreiben dass er fürs backtesten geeignet ist
EDIT:
Danke an Siscop für den Hinweis!
Wichtig ist noch zu wissen, dass Variablen innerhalb eines Bars nicht aktualisiert werden! Will man, dass innerhalb eines Bars Variablen geändert und gespeichert werden, muss man im Code das dieser Variable explizit sagen.
Zu Beginn des Codes legt man ja die Variablen fest, zB
So,
hier möchte ich mich mal über das richtige Backtesten und Optimieren auslassen.
Vielleicht erspare ich so dem einen oder anderen ein Haufen Arbeit und Zeit.
Zunächst brauch man eine Strategie. Man kann sich auch aus den vorgefertigen Strategieschnipels selbst eine zusammenstellen. Das soll jetzt aber nicht das Thema hier sein.
Zum Thema:
Je genauer die Datenhistorie, desto besser werden die Backtests.
In der Regel kann man immer M1 - Close - Daten beim Broker downloaden. Bei MBT für ein halbes Jahr etwa, bei IB 1 Jahr.
Für viele Strategien reicht eine Datenauflösung von M1 aus. Dazu öffnet man einfach einen Chart in MC und stellt die darzustellende Zeit (zB vom 1.1.2010 bis heute) und das Timeframe auf M1. Nun werden die Daten geladen.
Aus den M1-Daten bastelt sich MC automatisch auch M30, H1, H4 und alle anderen Daten.
Man sollte, um sich selbst eine Datenbank aufzubauen, alle interessanten Quotes aller Instrumente selbst aufnehmen. Dazu nimmt man den Quote Manager.
Im Quote Manager kann man einstellen, welche Daten bei welchem Broker recorded werden sollen, und in welcher Auflösung. Ich empfehle, lieber zu viele Instrumente einzustellen als zu wenig. Ein alter Lappi und eine normale DSL-Verbindung schafft es problemlos, alle Tick/M1 und je Bid/Ask/Close-Daten von allen FX-pairs bei MBT aufzunehmen. Welche Daten recordet werden sollen, stellt man ein indem man auf das Instrument klickt und dann "Fields to collect", dann erscheint das Fenster:
Mit Klick auf "Apply to all symbols" wird das für alle übernommen.
Anschließend markiert man alle "blau" und klickts rechts und dann auf "Connect...".
Nun recordet der QM alle Daten. Schließt man den QM (am Wochenende), dann überträgt er die Daten vom Cache in die richtige Datenbank.
Das sollte man wissen, wenn man ab und an die Datenbank auf einen anderen Rechner kopiert, um mit MC im Offlinemodus Backtests durchzuführen.
Wichtig ist noch die Einstellung der richtigen Timezones. Ich habe mir im QM eine eigene "Exchange & ECN" - Vorlage erstellt für MBT, um die Daten aufzunehmen.
Haben wir eine gute Datenbasis aufgebaut, können wir richtig backtesten.
Den Portfolio Backtester würde ich persönlich nicht nutzen. Er unterstützt (noch) kein IOG (IntraBarOrdergeneration) und auch keinen Bar Magnifer. Stattdessen lieber aus dem Chart heraus backtesten. Bei einem Backtest wird MC blockiert, man kann nichts anderes mehr machen. Deshalb ist es ratsam, für längere Optimierungen eine 2. Instanz von MC auf demselben Rechner aufzumachen (das geht und ist erlaubt).
So, wir haben jetzt eine einfache Strategie, welche auf M30 basiert. Die Einstiegsorders werden alle auf M30 generiert. Die Ausstiege, sofern Pipbasiert oder Profit/Lostbasiert, sollen aber auch innerhalb der Bars passieren.
Wenn wir das jetzt backtesten, werden die Ausstiege aber erst zum nächsten vollen Bar "abgerechnet". Das fühlt zu Fehlergebnissen.
Deshalb ist es wichtig, die Strategie von Anfang an richtig zu coden.
Hilfreich sind die internen MC-Befehle (Auszug):
Die Befehle sind automatisch intrabar-basiert.
Die Befehle sind aber ungünstig wenn man Pipbasiert arbeiten möchte.
Also als Ausstiegsorders lieber nehmen:
if MarketPosition = 1 then Sell ("TPlong") next bar entryprice + (TP * 0.0001) limit; if MarketPosition = 1 then Sell ("SLlong") next bar entryprice - (SL * 0.0001) stop; if MarketPosition = -1 then buytocover ("TPshort") next bar entryprice - (TP * 0.0001) limit; if MarketPosition = -1 then buytocover ("SLshort") next bar entryprice + (SL * 0.0001) stop;Auch diese limit/stop-orders sind intrabarbasiert. Sie werden punktgenau generiert, auch wenn man diesen Kurs nicht zur Verfügung hat.
Jetzt kommt aber das Problem bei M30 und relativ engen TP und SL: Innerhalb des M30-Kurses weiß man nur die Daten: OHLC (Open, High, Low, Close). Wann welcher Kurs genau erreicht wird, kann nicht gesagt werden. Es kann also sein, dass die Startegie erst den TP abrechnet obwohl ein enger SL vorher getroffen worden ist auf live. Genaueres dazu, als Beschreibung für Ninjatrafder aber auch für MC gültig, findet man auf DarthTraders Blog.
Jetzt gibt es eine Möglichkeit, in MC die Genauigkeit zu erhöhen:
Aktivierung des "Bar magnifers" - siehe Bild unten.
Man sollte mindestens M1 einstellen. Jetzt rechnet MC also trotz des M30 intern mit M1. Sofern Ticks vorhanden sind, auch diese nehmen!
Im Bild sieht man auch gleich oben die Möglichkeit, nicht nur auf Close zu backtesten, sondern auch auf getrennten Bid/Ask-Linien. Das macht Sinn bei Scalpern wenn man die entsprechenden Daten vorher recordet hat.
Voraussetzung ist noch, dass man im Chart das 1. Instrument als Ask einstellt und ein 2. Instrument drüberlegt mit Bid.
Im Idealfall also backtestet man mit getrennten Ask/Bid-Linien und mit dem "Bar Magnifer 1 Tick". genauer gehts nicht. Entsprechend länger dauert jedoch das Backtesten. Nun wird jedoch der tatsächliche Spread mit einkalkuliert!
Intern wird so gerechnet:
Auf den Closedaten der Einstieg, und dann, sofern eine Posi offen ist, wird mit genaueren Ticks der Ausstieg berechnet. Das ist insgesamt recht zeitsparend, da nicht immer alle Ticks durchkalkuliert werden (wenn keine Posi offen ist).
Möchte man, dass die Einstiege unabhängig vom TF errechnet werden, aktiviert man IntraBarOrderGeneration (In den Parametereinstellungen der letzte Reiter)
Das macht NUR Sinn, wenn die Einstiege nicht auf den Closedaten basieren sollen, sondern zB rein nach Kursen oder bestimmten, krummen Zeiten etc.
IOG kann man auch fest im Code aktivieren indem man ganz oben reinschreibt:
Auch IOG macht nur Sinn mit entsprechend genauen Daten aus dem Bar Magnifer.
Achtung: Nun dauert ein Backtest wesentlich länger, da immer Tickbasiert (oder was man im Bar Magnifer eingestellt hat) gerechnet wird.
In den Einstellungen zum Chart noch die Kommission einstellen. Bei FX und MBT ist das zB 0.0000295 $ per share.
Wenn man nicht mit getrennten Bid/Ask-Linien backtestet, noch einen üblichen Spread dazuaddieren (oder bei Slippage dazuaddieren).
Zusammenfassung:
EDIT:
Danke an Siscop für den Hinweis!
Wichtig ist noch zu wissen, dass Variablen innerhalb eines Bars nicht aktualisiert werden! Will man, dass innerhalb eines Bars Variablen geändert und gespeichert werden, muss man im Code das dieser Variable explizit sagen.
Zu Beginn des Codes legt man ja die Variablen fest, zB
Will man, dass die Variablen auch innerhalb eines Bars aktualisiert und gespeichert werden, schreibt man vor der Variable folgendes: IntraBarPersist
Dasselbe mit Arrays.
Das ist insbesondere bei aktivierten IOG wichtig!
Hier gehts zu Teil 1: Tipps und Tricks um eine Strategie zu aktivieren