Hallo zusammen, bin ganz ganz neu hier und mache gerade die ersten Gehversuche mit einem ganz einfachen System. Aber es will einfach kein Backtest funktionieren, woran kann es liegen?
Das System: DAX, monthly. Wenn open um 250-500 Pkt kleiner als open des Vormonats, dann Long-Positioneröffnen. TP 250, SL 300, max. 30 Tage stehenlassen.
// DAX – IG Market
// Time Frame = 1 Month
// general parameters
defparam cumulateorders = false
once positionSize = 1
// conditions to enter long
if open < (open[-1] – 250) and open > (open[-1] – 500) then
buy positionSize contract at market
endif
if longonmarket then
set stop ploss 300
set target pprofit 250
endif
Hallo Teddy,
Wenn du das Open des vorherigen Monats haben willst ist es open[1] (keine -1). Open ohne Klammern gibt dir das Open des Monats der gerade um ist, da PRT deinen Code immer nur am Ende jeder Kerze durchgeht. Ich weiss nicht, ob du das berücksichtigt hast.
Hier dein berichtigter Code.
// DAX – IG Market
// Time Frame = 1 Month
// general parameters
defparam cumulateorders = false
once positionSize = 1
// conditions to enter long
if open <= (open[1] – 250) and open >= (open[1] – 500) then
buy positionSize contract at market
endif
if longonmarket then
set stop ploss 300
set target pprofit 250
endif
Da der Code wie gesagt immer am Ende jeder Kerze ausgewertet wird, hast du natürlich eine saftige Verzögerung in deinem Programm.
Bsp.: Ende diesen Monats (August) guckt das Program, ob der Dax am 1.8. 250-500 Pkte. niedriger war als am 1.7.. Wenn das der Fall war, dann gehst du long. Ich glaube, das hattest du dir anders vorgestellt.
Oh das war mir nicht bekannt, dass der Code nur an Ende einer Kerze ausgeführt wird. Ich hatte auch schon nach Fachliteratur Ausschau gehalten, wo so etwas drin steht, hab aber leider nix gefunden. Danke erstmal.
So, nun habe ich auf Stundenbasis umgestellt, um 1 h nach Eröffnung des 1.Tages eines Monats einen Trade starten zu können. Im Backtest rührt sich dennoch nichts. Irgendwas scheint noch nicht zu stimmen?
// DAX – IG Market
// Time Frame = 1 h
// general parameters
defparam cumulateorders = false
once positionSize = 1
// conditions to enter long
if day = 1 and Hour = 1 and open <= (DOpen(30) – 250) and open >= (DOpen(30) – 500) then
buy positionSize contract at market
endif
if longonmarket then
set stop ploss 300
set target pprofit 250
endif
if day = 28 or 29 or 30 and longonmarket then
sell positionSize contract at market
endif
Wann genau willst du das dein Program eine Position eröffnet. Du vergleichst jetzt den Kurz vom Abend (21:00) des letzten des Monats mit dem Kurs um 1:00 (nachts) am 1. des Monats. Fällt der 1. auf ein Wochenende geht’s in die Hose. Mit solchen Zeitangaben muss du immer ganz genau gucken, dass die auch dann ausgeführt werden, wenn du das willst.
Oft hilft es den Inhalt der Variablen mit “graph” ausgeben zu lassen, damit man sehen kann, was genau passiert.
Außerdem benutze bitte <> um Code einzufügen, sonst bekommst du’s bald mit Nicolas zu tun. 😉
Am Wochenende soll natürlich nicht versucht werden, einen Trade einzugehen 🙂
Eine Position long soll morgens (am besten gegen 09:00 h) am 1.Handelstag eines Monats eröffnet werden, wenn der Kurs am 1.Handelstag des Vormonats zur gleichen Zeit 250-500 Pkt höher war. Man muß sich ganz genau bzw. interpretationsfrei ausdrücken, dass habe ich jetzt auch schon bemerkt. Der Code ist nicht wohlwollend bzw. kann den Willen des Autors nicht umsetzen wenn es nicht zu 100 % stimmt …
Das ist richtig, du musst immer alle Eventualitäten berücksichtigen. Was ist, wenn der 1. ein Son- oder Feiertag ist? Hat die Umstellung von Sommer- zu Winterzeit hier Einfluß? Beim Programmieren ist es eher so, das was schiefgehen kann, tut es auch früher oder später. 🙂
Im Programmierhandbuch von ProOrder ist “Day” definiert mit: Gibt den Tag des aktuellen Balkens an.” Es wird leider nicht unterschieden zwischen Handelstag und Kalendertag, beides muss ja nicht identisch sein. Es stellt sich mir also die Frage, wie man den 1.Handelstag exakt anspricht, ohne Handelstag und Kalendertag zu verwechseln, sodaß eine fehlerfreie Ausführung sichergestellt ist. Despair weiß wie?
Es gibt leider keine PRT Variable die angibt, ob der heutige Tag ein Handelstag ist, oder nicht. Du musst das selber programmieren. currentdayoftheweek gibt dir den aktuellen Wochentag. Also muß dein Program gucken, ob der 1. ein Sontag oder Samstag ist.Wenn ja dann warte bis Montag. Dann musst du gucken, wie die Situation vor einem Monat war. So etwas fehlerfrei zu programmieren ist etwas lästig, mit 7 Tagen in einer Woche und Monaten die mal 30 und mal 31 Tage lang sind…
Aber nicht verzweifeln, es ist machbar. 🙂