Hallo,
ich habe ein Handelssystem, welches ich versuche in ProBuilder zu programmieren.
Es scheint jedoch ein Fehler im Programmcode zu existieren, weil im Backtest die Orders falsch gesetzt werden.
Nun weiß ich nicht mehr weiter.
Evtl. kann mir jemand helfen:
defparam cumulateorders=false
if not onmarket then
atr=AverageTrueRange[5](close)
buy 1 contract at close[1]+atr*0.88 STOP
sellshort 1 contract at close[1]-atr*0.88 STOP
buysl = close[1]-atr*0.88
sellsl = close[1]+atr*0.88
endif
if longonmarket then
set stop loss buysl
endif
if shortonmarket then
set stop loss sellsl
endif
Das System ist simpel:
Long: Wenn Schlusskurs letzte Kerze + (ATR[5]*0,88)
Short: Wenn Schlusskurs letzte Kerze – (ATR[5]*0,88)
Stop Long: Schlusskurs letzte Kerze – (ATR[5]*0,88)
Stop Short: Schlusskurs letzte Kerze + (ATR[5]*0,88)
Die Werte beziehen sich auf 5-Minuten-Perioden.
Vielen Dank bereits vorab!
Warum sind die Bestellungen Ihrer Meinung nach nicht richtig eingestellt? Haben Sie versucht, die Preisniveaus grafisch darzustellen, mit denen Sie Ihre ausstehenden Bestellungen festlegen? So was:
graphonprice close[1]+atr*0.88
graphonprice close[1]-atr*0.88
Die Anweisung Schließen [1] bezieht sich auf den Kerzenhalter vor 1 Balken und nicht auf das Lesen des Codes. Das Problem könnte sein, dass Sie versuchen, STOP-Aufträge auf ein Niveau zu bringen, das bereits durch den Preis gebrochen ist. Daher könnten Sie dort denken, dass es ein Problem gibt.
Hallo Nicolas, vielen Dank! Die Nachverfolgung der Orders habe ich über die Orderliste aus dem Backtest nachvollzogen. Die Orderliste zeigt, dass schon die erste Order falsch gesetzt wird.
Vorher habe ich mir noch folgenden Indikator erstellt, um die Preise vergleichen zu können:
atrs = AverageTrueRange[5] * 88
LongBuy = Close[1] + atrs
Shortsell = Close[1] - atrs
return LongBuy coloured(0, 178, 66) as "Long Buy", Shortsell coloured(255, 0, 0,)as "Short Sell"
Hiernach wird der erste Preis der neuen Kerze nach dem letzten Schlusskurs (CLOSE[1]) genommen und die ATR überhaupt nicht berücksichtigt.
Bei den STOP-Aufträgen macht die ATR den Unterschied. Im Fall einer LONG-Position wird bei CLOSE[1]+ATR *0.88 gekauft und der STOP liegt bei CLOSE[1] – ATR*0.88. Dadurch müsste der Preis zwischen Kauf und Stop eigentlich unterschiedlich sein, wenn die ATR berücksichtigt wird. Danke!
Wird die ATR mit 88 oder mit 0,88 multipliziert? Das ist ein großer Unterschied zwischen dem Indikator und der Strategie! 🙂 🙂
🙂 Uups, ein Übertragungsfehler in den Beitrag. Die ATR sollte mit 0,88 multipliziert werden. Beim Vergleich mit der Strategie habe ich die 0,88 verwendet….
Mit diesem Code sollte alles gut funktionieren:
defparam cumulateorders=false
if not onmarket then
atr=AverageTrueRange[5](close)
buy 1 contract at close[1]+atr*0.88 STOP
sellshort 1 contract at close[1]-atr*0.88 STOP
buysl = atr*0.88
sellsl = atr*0.88
endif
if longonmarket then
set stop loss buysl
endif
if shortonmarket then
set stop loss sellsl
endif
graphonprice close[1]+atr*0.88
graphonprice close[1]-atr*0.88
SET STOP LOSS ist eine Entfernung, kein Preisniveau!
Ich habe den Code so angewendet aber leider funktioniert bereits die BUY- und SELL Order nicht so wie gedacht. Es scheint, dass die ATR einfach nicht berücksichtigt wird.
Gekauft/Verkauft wird zum Eröffnungskurs der Folgekerze ohne die ATR*0,88 auf den Schlusskurs der Vorkerze zu addieren/hinzuzurechnen.
Trotzdem großen Dank für die Hilfestellung Nicolas!
Ich glaube nicht, wenn Sie sich das Diagramm ansehen, in dem der korrekt berechnete Wert korrekt angegeben ist, der vorherige Abschluss +/- 88% der ATR 5-Perioden. Ich verstehe nicht, warum Sie ihn nicht sehen. Wenn Sie einen BUYSTOP auf ein Preisniveau setzen, über dem Sie liegen, wird die Bestellung direkt auf den Markt gebracht.
Okay, verstanden. Ich habe das mit dem BUYSTOP falsch verstanden. So funktioniert das in der Tat richtig.
In der Strategie hatte ich das jedoch so gedacht, dass CLOSE[1] +/- ATR*0,88 wie zwei Bänder (oberes und unteres Band) mitlaufen und die Orders dann jeweils zu den Kursen (limitierte Order) ausgeführt werden, sobald die Bänder durchbrochen werden (BUY LIMIT ?)
Wenn der Kurs das obere Band durchbricht wird gekauft (BUY) und wenn der Kurs das untere Band durchbricht wird verkauft (SHORTSELL). Die Stoploss werden jeweils an das obere und untere Band gesetzt. Sorry für meine schlechte Programmierkenntnisse…
Das macht der Code schon! Schauen Sie sich die Bänder an, wenn Sie einen Backtest durchführen. Dies sind die Ebenen der Kauf- / Verkaufsaufträge. Möglicherweise haben Sie auch nicht verstanden, dass der Code beim Schließen der Leiste nur einmal ausgeführt wird. Daher bezieht sich die Anweisung Schließen [1] auf den Balken vor dem aktuellen. Sie sollten es mit Close [0] versuchen. Dies ist die Leiste, wenn der Code gelesen wird.
Mit Close[0] hat es geklappt – VIELEN DANK NICOLAS!
defparam cumulateorders=false
atr=AverageTrueRange[11](close)
buy 1 contract at close+atr*0.55 STOP
sellshort 1 contract at close-atr*0.55 STOP
buysl = atr*0.55
sellsl = atr*0.55
if longonmarket then
set stop loss buysl
if shortonmarket then
set stop loss sellsl
endif
graphonprice close[1]+atr*0.55
graphonprice close[1]-atr*0.55
endif
Die ATR habe ich zwischenzeitlich auf 11 und den Multiplikator auf 0,55 gesetzt.
Um die Sache abzuschließen habe ich noch das Gewinn-/Verlustprofil im Backtest angehängt. Ein schönes Wochenende….