Hallo alle zusammen!
Ich habe vor wenigen Wochen einen Testaccount mit PRT V11 abgeschlossen.
Meine in der Zeit erstellten Algo-Codes liefen schon ganz gut im Probebetrieb.
Nun habe ich kürzlich ein Konto bei IG eröffnet und mit der Premium-Version von PRT verknüpft.
Beim Upload meiner Codes stellte ich (nach mühsamen Trial&Error) fest, daß es wohl Probleme gibt mit meinen “Highest” und “Lowest”-Codestücken.
ZB
“IF Close < Lowest[2] AND … THEN …” lief vorher (im Backtest) einwandfrei.
“IF Close > Highest[5] AND … THEN …” ebenso.
Alles jeweils im Tick-by-Tick-Mode.
Nun stelle ich beim Backtest desselben Codes via IG/PRT fest, daß ALLE meine HIGHEST/LOWEST Bedingungen offenbar als “nicht erfüllt” gelten und meine Einstiegs-(Buy/Sell)codes daher auch keine Einstiege mehr generieren.
Sobald ich exakt diese Bedingungen lösche funktioniert der Rest technisch einwandfrei – wenn auch das Ergebnis nicht wie gewünscht aussieht.
Ich habe leider keine Ahnung, woran das liegt.
Zeitzonen sind korrekt eingestellt, Datenfeed ist da.
Gibt es jemanden, der ähnliche Erfahrungen gemacht hat und mir da vielleicht aushelfen kann?
Vielen vielen Dank im Voraus!
Beste Grüße
Stefan
Sie sollten Ihren Code und Informationen über das gehandelte Instrument/Vermögenswert und den Zeitrahmen veröffentlichen, um Ihre Trades replizieren zu können.
Handelwert: ALLE (konkret aktuell “Deutschland 40 Kassa 1€”)
Zeitrahmen: ALLE (Backtest und Live)
DEFPARAM PreLoadBars = 5000
// Festlegen der Code-Parameter
DEFPARAM CumulateOrders = False // Kumulieren von Positionen deaktiviert
// Das Handelssystem wird um 0:00 Uhr alle pending Orders stornieren und alle Positionen schließen. Es werden vor der "FLATBEFORE"-Zeit keine neuen Orderaufträge zugelassen.
DEFPARAM FLATBEFORE = 080000
// Stornieren aller pending Orders und Schließen aller Positionen zur "FLATAFTER"-Zeit
DEFPARAM FLATAFTER = 220000
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen vor einer bestimmten Uhrzeit
noEntryBeforeTime = 080000
timeEnterBefore = time >= noEntryBeforeTime
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen nach einer bestimmten Uhrzeit
noEntryAfterTime = 220000
timeEnterAfter = time < noEntryAfterTime
// Verhindert das Trading an bestimmten Wochentagen
Tradeday = OpenDayOfWeek > 0 OR OpenDayOfWeek < 6
PositionSizeLong = 1
PositionSizeShort = 1
ForbiddenLong = 0
ForbiddenShort = 0
//*************************************************************************//
//allgemeines Daytrading M/W/D: o/o/o //
//*************************************************************************//
// Bedingungen zum Einstieg in Short-Positionen //
//***********************************************//
IF NOT LongOnMarket AND NOT ForbiddenShort AND TradeDay AND Time >= 091500 AND Time <= 214500 AND TRADEON THEN
//TrendDown1
IF Close < Close[1] AND Close[1] < Close[2] AND Average[50] < Average[100] AND Average[100] < Average[200] AND Average[2500] < Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 80 AND RSI < 50 AND MACD < 0 THEN
TrailingFlag = 0
SellShort PositionSizeShort CONTRACTS AT MARKET
ENDIF
//SwingDown1
IF Close < Open AND Close < Close[1] AND Close < Lowest[3] AND Close < Average[50] AND Average[50] < Average[100] AND Average[100] < Average[200] AND Close > Average[2500] AND Close > Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 80 THEN
TrailingFlag = 0
SellShort PositionSizeShort CONTRACTS AT MARKET
ENDIF
//SwingDown2
IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close > Average[2500] AND Close < Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 40 AND Aroonup < 80 THEN
TrailingFlag = 0
SellShort PositionSizeShort CONTRACTS AT MARKET
ENDIF
//SwingDown3
IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close > Average[1000] AND Close > Average[4500] AND Aroondown Crosses over Aroonup AND Aroondown < 40 AND Aroonup < 80 THEN
TrailingFlag = 0
SellShort PositionSizeShort CONTRACTS AT MARKET
ENDIF
//50Cross200down
IF Close < Open AND Close < Close[1] AND Close < Lowest[2] AND Close < Average[50] AND Average[50] crosses under Average[200] AND MACD < 0 AND Close < Pivot THEN
TrailingFlag = 2
SellShort PositionSizeShort CONTRACTS AT MARKET
ENDIF
ENDIF
//**********************************************//
// Bedingungen zum Einstieg in Long-Positionen //
//*********************************************//
IF NOT ShortOnMarket AND NOT ForbiddenLong AND TradeDay AND Time >= 091500 AND Time <= 214500 AND TRADEON THEN
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Average[50] > Average[100] AND Average[100] > Average[200] AND Aroonup Crosses over Aroondown AND Aroondown < 30 AND Aroonup < 70 AND Close > Supertrend AND RSI > 60 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//TrendUp2
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Close > Average[4500] AND Aroonup Crosses over Aroondown AND Aroondown < 30 AND Aroonup < 50 AND Close > Supertrend AND RSI > 60 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//TrendUp3: Open>Highest löschen für Turbo
IF Close > Open AND Close > Close[1] AND Close > Highest[4] AND Close < Average[200] AND Aroonup Crosses over Aroondown AND Aroondown < 20 AND Aroonup < 50 AND RSI < 30 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//SwingUp1
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close < Average[2500] AND Close > Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 AND RSI < 30 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//SwingUp2
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[200] AND Close < Average[2500] AND Close < Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//SwingUp3
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close < Average[2500] AND Close < Average[4500] AND Aroonup Crosses over Aroondown AND Aroonup < 70 THEN
TrailingFlag = 0
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
//50Cross200up
IF Close > Open AND Close > Close[1] AND Close > Highest[3] AND Close > Average[50] AND Average[50] crosses over Average[200] AND MACD > 0 AND Close > Pivot THEN
TrailingFlag = 2
Buy PositionSizeLong CONTRACTS AT MARKET
ENDIF
ENDIF
//*************************************************************************//
//Xetra-Korrektur High Low Close, Pivot, Resistance, Support //
//*************************************************************************//
if Time = 220000 AND OPENDAYOFWEEK <6 AND OPENDAYOFWEEK >0 then
DayClose = Close
DayHigh = Highest[840]
DayLow = Lowest[840]
ENDIF
Pivot= (DayHigh + DayLow + DayClose) / 3
ResR1 = Pivot + (Pivot - DayLow)
ResR2 = Pivot + (Dayhigh - Daylow)
ResR3 = Dayhigh + (2 * (Pivot - Daylow))
SupS1 = Pivot - (Dayhigh - Pivot)
SupS2 = Pivot - (Dayhigh - Daylow)
SupS3 = Daylow - (2 * (Dayhigh - Pivot))
//*************************************************************************//
//Moving-Average-Clustering-FilterCode (optional) //
//*************************************************************************//
ClusterSave = 1 //1=ON, 0=OFF
x = 15*pipsize //15-pip range
ma5 = average[5,0](close)
ma50 = average[50,0](close)
ma100 = average[100,0](close)
ma200 = average[200,0](close)
MaxMA = max(ma5,max(ma50,max(ma100,ma200)))
MinMA = min(ma5,min(ma50,min(ma100,ma200)))
IF (MaxMA - MinMA) <= x AND ClusterSave = 1 THEN
Tradeon = 0
ELSIF (MaxMA - MinMA) > x OR (ClusterSave = 0) THEN
Tradeon = 1
ENDIF
//*************************************************************************//
//trailing stop function Risk, Long, Short //
//*************************************************************************//
trailingstartL = 35 //LONG trailing will start @trailinstart points profit
trailingstartS = 35 //SHORT trailing will start @trailinstart points profit
trailingL = 20 //trailing step to move the "stoploss"
trailingS= 20 //trailing step to move the "stoploss"
trailingR= 15 //trailing start+step to move the "stoploss" for risky positions
SaveDistanceL = 10 //Minimum Stop-Abstand 10 lt IG
SaveDistanceS = 10 //Minimum Stop-Abstand 10 lt IG
SaveDistanceR = 10 //Minimum Stop-Abstand 10 lt IG
MinimumPlus = 3 //Anzahl Pips zum Breakeven inkl. Spread+Gebühren
SET TARGET pProfit 80
//reset the stoploss value
IF NOT ONMARKET THEN
TrailingFlag = 0
NewSL = 0
FailsaveSL = 0
ENDIF
//************************//
//manage long positions //
//***********************//
IF LOngONMarket AND TrailingFlag = 0 THEN
newSL = tradeprice(1)-(trailingstartL*pipsize)
FailsaveSL = newSL-(trailingstartL*pipsize)
ENDIF
//breakeven
IF (close-tradeprice(1)) >= ((MinimumPlus+SaveDistanceL)*pipsize) AND TrailingFlag = 0 THEN
TrailingFlag = 1
newSL = tradeprice(1)+(3*pipsize)
FailsaveSL = newSL-(trailingstartL*pipsize)
ENDIF
IF (close-newSL) >= ((trailingL)*pipsize) AND TrailingFlag = 1 THEN
newSL = close-(trailingL*pipsize)
FailsaveSL = newSL-(trailingstartL*pipsize)
ENDIF
IF LongOnMarket AND TrailingFlag = 2 THEN
newSL = tradeprice(1)-(trailingR*pipsize)
FailsaveSL = newSL-(trailingR*pipsize)
//breakeven
IF (close-tradeprice(1)) >= ((MinimumPlus+SaveDistanceR)*pipsize) THEN
newSL = tradeprice(1)+(3*pipsize)
FailsaveSL = newSL-(trailingR*pipsize)
TrailingFlag = 3
ENDIF
IF (close-newSL) >= (trailingR*pipsize) AND TrailingFlag = 3 THEN
newSL = close-(trailingR*pipsize)
FailsaveSL = newSL-(trailingR*pipsize)
ENDIF
ENDIF
//************************//
//manage Short positions //
//************************//
IF ShortONMarket AND TrailingFlag = 0 THEN
newSL = tradeprice(1)+(trailingstartS*pipsize)
FailsaveSL = newSL+(trailingstartS*pipsize)
ENDIF
//breakeven
IF (tradeprice(1)-close) >= ((MinimumPlus+SaveDistanceS)*pipsize) AND TrailingFlag = 0 THEN
TrailingFlag = 1
newSL = tradeprice(1)-(3*pipsize)
FailsaveSL = newSL+(trailingstartS*pipsize)
ENDIF
IF (newSL-close) >= (trailingS*pipsize) AND TrailingFlag = 1 THEN
newSL = close+(trailingS*pipsize)
FailsaveSL = newSL+(trailingstartS*pipsize)
ENDIF
IF ShortOnMarket AND TrailingFlag = 2 THEN
newSL = tradeprice(1)+(trailingR*pipsize)
FailsaveSL = newSL+(trailingR*pipsize)
ENDIF
//breakeven
IF (tradeprice(1)-close) >= ((MinimumPlus+SaveDistanceR)*pipsize) THEN
newSL = tradeprice(1)-(3*pipsize)
FailsaveSL = newSL+(trailingR*pipsize)
TrailingFlag = 3
ENDIF
IF (newSL-close) >= (trailingR*pipsize) AND TrailingFlag = 3 THEN
newSL = close+(trailingR*pipsize)
FailsaveSL = newSL+(trailingR*pipsize)
ENDIF
//stop order to exit the positions
IF newSL>0 THEN
SELL AT newSL STOP
EXITSHORT AT newSL STOP
ENDIF
//failsaveSL if rejected SL
IF LongOnMarket AND close <= FailsaveSL THEN
SELL AT Market
ENDIF
IF ShortOnMarket AND close >= FailsaveSL THEN
EXITSHORT AT Market
ENDIF
Addendum:
gehandelte Timeframe 1 Minute
Ich würde gerne sehen, dass es nach all Ihrem Programmieraufwand gut funktioniert! Das hast du gut gemacht!
Ich schätze, es gibt zu viele Bedingungen, um gleichzeitig übereinstimmend / wahr zu sein und somit die Eröffnung von Trades zu ermöglichen.
Kreuze über / unter können oft ein Killer sein, wenn sie zu oft verwendet oder mit vielen anderen Bedingungen kombiniert werden.
Ich bekomme 90 Trades, wenn ich alle Kreuze auf > ändere … wünschte, ich hätte 2 oder 3 Kreuze gleichzeitig gemacht (nicht alle auf einmal).
Ein paar Ideen, die Sie trotzdem berücksichtigen sollten.
Im Testaccount hatte ich mit exakt diesem Code (plus einen weiteren Code-Teil für Tagesschluss-Rally und einen Simple-Range-BreakOut-Code, optional ein Money-Management-Code und ein Schutzcode gg hohe Volatilität (Kurs über R2 oder unter S2)) bei kleinsten Änderungen im Backuptest in 10,5 Monaten (01.02.2021 bis ca 20.12.2021) ca 120-130 Trades bei Win/Loose-Rate von 62%, Gain/Lost-Ratio von 3,5.
Jetzt 0,0. Nada. Niente. Gleicher Code, gleicheer Backtest. Und das scheint NUR an den “Highest” bzw “Lowest”-Bedingungen zu liegen. Wahrscheinlich ist der Grund ganz banal und ich habe irgend etwas in den Einstellungen bei PRT oder IG übersehen?
Erhalten Sie bei einem Backtest über 100.000 Balken auch nur 1 Trade?
Können Sie über 100.000 Balken backtesten? Wenn ja … wie viele Trades erhalten Sie?
Zeile 18 sollte AND anstelle von OR verwenden, um die Tage von 1 bis 5 zu begrenzen: Tradeday = OpenDayOfWeek > 0 AND OpenDayOfWeek < 6
Ich konnte keinen Trade eröffnen!
Ich bekomme 1 Trade beim Backtest von 100.000 Balken auf DAX M1.
Wenn ich alle Kreuze auf Kreuze unter ändere (kein Sinn, nur um Trades zu bekommen), dann bekomme ich 7 Trades über 100.000 Balken.
Ich sage immer noch, die zahlreichen Bedingungen sind zusammen zu restriktiv … die Bedingungen sind selten zusammen wahr.
Probieren Sie Rollback-Versionen aus, wenn Sie sagen, dass es gut funktioniert hat, und führen Sie dann jeweils einen Rollforward durch?
Lass uns bitte wissen, wie es dir geht. Ich werde weiter daran denken, Bruch- oder Bust-Tests zu beantragen! 🙂
Ich kann bis 1 Millionen backtesten. der Trade kommt aus Zeile 32, wo ich keine “Highest”/”Lowest”-Vergleiche eingefügt habe.
Bei Backtest vom 01.02. bis 20.12.2021 habe ich immer ca 120 Trades (ungefähr 80 Wins/45 Losses; Ratio 3,5, MaxDrawdown 735,- bei 5,-€/Pip, Gewinn insgesamt 20.000,-€) erhalten.
Entwickelt habe ich die Regeln bei 200.000 Ticks Anzeige (ca Mai bis Dezember war das bei mir).
Es hat alles im Demo-Account einwandfrei funktioniert.
Das gehandelte Produkt war vom Demo-Account die Eurex-Micro-Dax 1,-€.
Nun handele ich via IG den Deutschland 40 Kassa 1€.
Ich vermute, es könnte ein anderes Problem sein – nicht im Code, sondern im Daten-Feed zB bei IG?
Bingo … vielleicht! 🙂
Alle Ihre höchsten und niedrigsten Werte müssen wie folgt sein
Close < Lowest[3](Close[1]) // deine Code ist Close < Lowest[3]
WOW!
Ja, DAS ist es!
VIELEN VIELEN VIELEN Dank!
Da wäre ich nie drauf gekommen!
Ich hatte keine Idee, und das Handbuch und alle anderen Sources haben mir keinen Hinweis gegeben!
Ich werde jetzt den Code anpassen, noch ein paar Änderungen für Eleganz und Lesbarkeit einfügen.
Ist es okay, wenn ich meine gesamte Strategie als Dank für die Hilfe öffentlich zur Verfügung stelle !?
Liebe Grüße
Stefan