ProRealCode - Trading & Coding with ProRealTime™
Liebe Leute!
Ich habe heute noch einmal einen neuen Code geschrieben! Mag hier noch einmal jemand diesen auf 1-Minuten-Basis im DAX über mehrere Jahre testen? Derzeit kann ich leider weiterin nur bis 200K testen. Aber vielleicht hat hier ja eh jemand Interesse an meinem Code 🙂
Startkapital 2.000 Euro, Spread 1 Punkt als Einstellung.
Vielen Dank vorab :-)))
// Festlegen der Code-Parameter
DEFPARAM CumulateOrders = False // Kumulieren von Positionen deaktiviert
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen vor einer bestimmten Uhrzeit
noEntryBeforeTime = 010000
timeEnterBefore = time >= noEntryBeforeTime
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen nach einer bestimmten Uhrzeit
noEntryAfterTime = 200000
timeEnterAfter = time < noEntryAfterTime
// =====================================================
// KAPITAL / POSITIONSGRÖSSE
// =====================================================
// Startkapital des Backtests
InitialCapital = 2000
// Aktuelles Strategiekapital
CurrentCapital = InitialCapital + STRATEGYPROFIT
// Positionsgröße abhängig vom aktuellen Kapital
IF CurrentCapital < 2500 THEN
PositionSize = 0.75
ELSIF CurrentCapital < 3000 THEN
PositionSize = 1.0
ELSIF CurrentCapital < 3500 THEN
PositionSize = 1.5
ELSIF CurrentCapital < 4000 THEN
PositionSize = 2.0
ELSIF CurrentCapital < 5000 THEN
PositionSize = 2.5
ELSIF CurrentCapital < 6000 THEN
PositionSize = 3.0
ELSIF CurrentCapital < 7000 THEN
PositionSize = 3.5
ELSIF CurrentCapital < 8000 THEN
PositionSize = 4.0
ELSE
PositionSize = 4.0
ENDIF
// Bedingungen zum Einstieg in Long-Positionen
indicator1 = DIplus[42]
c1 = (indicator1 CROSSES OVER 25)
indicator2 = DIminus[42](close)
c2 = (indicator2 <= 17)
indicator3 = Momentum[42](close)
c3 = (indicator3 >= 0)
indicator4 = Momentum[42](close)
c4 = (indicator4 <= 50)
indicator5 = ADX[42]
c5 = (indicator5 >= indicator5[1])
IF (c1 AND c2 AND c3 AND c4 AND c5) AND timeEnterBefore AND timeEnterAfter THEN
BUY PositionSize CONTRACT AT MARKET
ENDIF
// Bedingungen zum Einstieg in Short-Positionen
indicator6 = DIminus[42](close)
c6 = (indicator6 CROSSES OVER 21)
indicator7 = DIplus[42]
c7 = (indicator7 <= 18)
indicator8 = Momentum[42](close)
c8 = (indicator8 <= 0)
indicator9 = Momentum[42](close)
c9 = (indicator9 >= -30)
indicator10 = ADX[42]
c10 = (indicator10 >= indicator10[1])
IF (c6 AND c7 AND c8 AND c9 AND c10) AND timeEnterBefore AND timeEnterAfter THEN
SELLSHORT 1 CONTRACT AT MARKET
ENDIF
// Stops und Targets
SET STOP pTRAILING 40
SET TARGET pPROFIT 100
Ich habe einen Backtest über 1 Mio. Einheiten durchgeführt, aber leider sieht das Ergebnis nicht besonders gut aus…
Wenn ich Stop-Loss und Take-Profit auf null setze, sieht es etwas besser aus – zumindest ist jedes Jahr im Plus…
Das letzte Bild gehört nicht dazu…
Die ersten beiden Bilder sind ohne Stop-Loss und Take-Profit, und die letzten drei Bilder stammen aus dem ursprünglichen System…
Guten Morgen JS,
vielen Dank für den Test. Ich werde die Parameter noch ausbauen, so dass es sicher weniger Trades, aber dafür mehr Treffer werden. Es ist immer wieder erstaunlich, wie gut so ein Code in einem Jahr funktionieren kann und in anderen überhaupt nicht! 🙂
Ich denke, ich werde die Shorts rauswerfen. Die sind eh schwierig im DAX.
Guten Morgen,
ich habe jetzt die Shorts rausgeworfen und die Longs noch einmal um eine weitere Hürde mit einem Momentum von 14 (indicator11) ergänzt. Damit ist es mir nun gelungen, die gewinnenden Positionen auf 48 % “hochzuschrauben” und die Ratio sogar auf 1,72. Es sind immer noch 142 Trades im 1-Minuten-Dax bei 200k. Damit wären die Monate März bis nun September bisher alle positiv verlaufen. Immerhin… 🙂
// Festlegen der Code-Parameter
DEFPARAM CumulateOrders = False // Kumulieren von Positionen deaktiviert
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen vor einer bestimmten Uhrzeit
noEntryBeforeTime = 010000
timeEnterBefore = time >= noEntryBeforeTime
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen nach einer bestimmten Uhrzeit
noEntryAfterTime = 200000
timeEnterAfter = time < noEntryAfterTime
// =====================================================
// KAPITAL / POSITIONSGRÖSSE
// =====================================================
// Startkapital des Backtests
InitialCapital = 2000
// Aktuelles Strategiekapital
CurrentCapital = InitialCapital + STRATEGYPROFIT
// Positionsgröße abhängig vom aktuellen Kapital
IF CurrentCapital < 2500 THEN
PositionSize = 0.75
ELSIF CurrentCapital < 3000 THEN
PositionSize = 1.0
ELSIF CurrentCapital < 3500 THEN
PositionSize = 1.5
ELSIF CurrentCapital < 4000 THEN
PositionSize = 2.0
ELSIF CurrentCapital < 5000 THEN
PositionSize = 2.5
ELSIF CurrentCapital < 6000 THEN
PositionSize = 3.0
ELSIF CurrentCapital < 7000 THEN
PositionSize = 3.5
ELSIF CurrentCapital < 8000 THEN
PositionSize = 4.0
ELSIF CurrentCapital < 9000 THEN
PositionSize = 4.5
ELSIF CurrentCapital < 10000 THEN
PositionSize = 5.0
ELSIF CurrentCapital < 12000 THEN
PositionSize = 6.0
ELSIF CurrentCapital < 14000 THEN
PositionSize = 7.0
ELSIF CurrentCapital < 16000 THEN
PositionSize = 8.0
ELSE
PositionSize = 8.0
ENDIF
// Bedingungen zum Einstieg in Long-Positionen
indicator1 = DIplus[42]
c1 = (indicator1 CROSSES OVER 25)
indicator2 = DIminus[42](close)
c2 = (indicator2 <= 17)
indicator3 = Momentum[42](close)
c3 = (indicator3 >= 0)
indicator4 = Momentum[42](close)
c4 = (indicator4 <= 50)
indicator5 = ADX[42]
c5 = (indicator5 >= indicator5[1])
indicator11 = Momentum[14](close)
c11 = (indicator11 <= 25 AND indicator11 >= -15)
IF (c1 AND c2 AND c3 AND c4 AND c5 AND c11) AND timeEnterBefore AND timeEnterAfter THEN
BUY PositionSize CONTRACT AT MARKET
ENDIF
//// Bedingungen zum Einstieg in Short-Positionen
//indicator6 = DIminus[42](close)
//c6 = (indicator6 CROSSES OVER 21)
//indicator7 = DIplus[42]
//c7 = (indicator7 <= 18)
//indicator8 = Momentum[42](close)
//c8 = (indicator8 <= 0)
//indicator9 = Momentum[42](close)
//c9 = (indicator9 >= -30)
//indicator10 = ADX[42]
//c10 = (indicator10 >= indicator10[1])
//IF (c6 AND c7 AND c8 AND c9 AND c10) AND timeEnterBefore AND timeEnterAfter THEN
//SELLSHORT 1 CONTRACT AT MARKET
//ENDIF
// Stops und Targets
SET STOP pTRAILING 40
SET TARGET pPROFIT 100
Meiner Meinung nach handelt es sich hier eindeutig um eine Überoptimierung…
Man optimiert ein System über einen bestimmten Zeitraum, wobei sich die Einstellungen der verschiedenen Indikatoren immer stärker an die spezifischen Eigenschaften dieses Zeitraums und der verwendeten Daten anpassen…
Die Gefahr dabei ist, dass das, was in einem bestimmten Zeitraum gut funktioniert, in einem anderen Zeitraum überhaupt nicht oder deutlich schlechter funktionieren muss…
Man hat dann im Grunde ein System geschaffen, das sehr gut auf die historischen Daten abgestimmt ist, auf denen es optimiert wurde…
Es ist jedoch keineswegs selbstverständlich, dass es auch außerhalb dieses Datensatzes weiterhin gut funktioniert…
Eine Möglichkeit, eine mögliche Überoptimierung zu überprüfen, ist die Verwendung einer Walk-Forward-Analyse. Dabei optimiert man die Strategie zunächst über einen bestimmten Teil der historischen Daten (In-Sample) und testet die gefundenen Einstellungen anschließend auf einem darauffolgenden, bisher nicht verwendeten Teil der Daten (Out-of-Sample)…
Danach wird der Zeitraum weiter verschoben und der Prozess wiederholt…
Auf diese Weise kann man besser beurteilen, ob die Performance einer Strategie tatsächlich robust ist oder hauptsächlich darauf zurückzuführen ist, dass sie zu stark an bestimmte historische Daten angepasst wurde…
Wenn die Performance in den Out-of-Sample-Perioden im Vergleich zu den In-Sample-Ergebnissen deutlich zurückgeht, kann dies ein starkes Indiz dafür sein, dass das System zu stark an die historischen Daten angepasst wurde…
Vielen Dank mein Freund für Deine ehrlich Rückmeldung! Ich versuche, diese Code noch einmal zu vereinfachen. Derzeit stelle ich alle Gewinntrades mathematisch den Verlusttrades gegenüber und versuche Besonderheiten in den Verlusten zu finden, die bei den Gewinnen möglichst selten auftreten.
Der Preis wird durch Angebot und Nachfrage bestimmt, also durch Käufer und Verkäufer…
Im Orderbuch wirken zwei Kräfte zusammen, die letztlich den Preis bestimmen…
Mein Ansatz wäre daher: Finde etwas, das diese beiden Kräfte sichtbar macht. Das kann die Price Action sein, ein Indikator oder etwas ganz anderes…
Versuche, die Käufer und Verkäufer sichtbar zu machen…
Du wirst feststellen, dass die Grundlage eines Systems dadurch wesentlich robuster werden kann…
Intraday-Trading ist aufgrund der Markt-Mikrostruktur und der vielen Entscheidungen, die man auf dieser Ebene treffen muss, eine der schwierigsten Formen desTradings… Versuche deshalb auch einmal, mit End-of-Day-(EOD-)Kursen zu arbeiten…
Bei der Arbeit mit EOD-Kursen blendest du einen Teil der kurzfristigen Markt-Mikrostruktur aus…
Ich verstehe Deinen Ansatz sehr gut, allerdings passt der nicht ganz zu meiner Strategie. Ich mache Daytrading derzeit “händisch” und habe da eine Strategie, die schon seit langem sehr gut funktioniert. Diese versuche ich zu automatisieren. Allerdings ist es natürlich so, dass ich mit meiner Methode ohne Autotrader schon etwas flexibler mit meiner Strategie umgehe. Das versuche ich dennoch soweit in einen Code zu packen, dass ich einen Teil der Trades sozusagen ohne mein eigenes Zutun erledigen kann.
Ich habe den Code heute noch einmal ein wenig angepasst und nun auch PRT mit 1 Mio Daten (seit heute Vormittag). Bisher sieht das ganz gut aus. Ich bin jetzt tatsächlich soweit, dass ich alle 3 Jahre im Plus bin. Als ersten Fehler habe ich den fehlenden FlatAfter am Freitag Abend eingebaut. Das bringt enorm viel. Damit bin ich an den Wochenende immer schon einmal Flat. Im nächsten Schritt möchte ich noch eine weitere, kleine Momentumstufe einbauen. Das sieht bisher auch ganz gut aus. Aber ich bin noch nicht ganz zufrieden. Den Drawdown möchte ich noch etwas verbessern. Sobald ich soweit bin, stelle ich den Code hier noch einmal ein 🙂
Hallo zusammen! Das hier ist nun sicher keine Zack-und-Reich-Strategie! Jedoch im Backtest funktioniert sie schon einmal im DAX mit einer Minute!
// Festlegen der Code-Parameter
DEFPARAM CumulateOrders = False // Kumulieren von Positionen deaktiviert
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen vor einer bestimmten Uhrzeit
noEntryBeforeTime = 040000
timeEnterBefore = time >= noEntryBeforeTime
// Verhindert das Platzieren von neuen Ordern zum Markteintritt oder Vergrößern von Positionen nach einer bestimmten Uhrzeit
noEntryAfterTime = 210000
timeEnterAfter = time < noEntryAfterTime
// Freitag: keine neuen Einstiege mehr nach 14:00 Uhr
IF DayOfWeek = 5 THEN
timeEnterAfter = time < 160000
ENDIF
// Startkapital des Backtests
InitialCapital = 2000
// Aktuelles Strategiekapital
CurrentCapital = InitialCapital + STRATEGYPROFIT
// Positionsgröße abhängig vom aktuellen Kapital
IF CurrentCapital < 2000 THEN
PositionSize = 0.5
ELSIF CurrentCapital < 2500 THEN
PositionSize = 0.75
ELSIF CurrentCapital < 3000 THEN
PositionSize = 1.0
ELSIF CurrentCapital < 3500 THEN
PositionSize = 1.5
ELSIF CurrentCapital < 4000 THEN
PositionSize = 2.0
ELSIF CurrentCapital < 5000 THEN
PositionSize = 2.5
ELSIF CurrentCapital < 6000 THEN
PositionSize = 3.0
ELSIF CurrentCapital < 7000 THEN
PositionSize = 3.5
ELSIF CurrentCapital < 8000 THEN
PositionSize = 4.0
ELSIF CurrentCapital < 9000 THEN
PositionSize = 4.5
ELSIF CurrentCapital < 10000 THEN
PositionSize = 5.0
ELSIF CurrentCapital < 12000 THEN
PositionSize = 6.0
ELSIF CurrentCapital < 14000 THEN
PositionSize = 7.0
ELSIF CurrentCapital < 16000 THEN
PositionSize = 8.0
ELSIF CurrentCapital < 18000 THEN
PositionSize = 9.0
ELSIF CurrentCapital < 20000 THEN
PositionSize = 10.0
ELSIF CurrentCapital < 22000 THEN
PositionSize = 11.0
ELSIF CurrentCapital < 24000 THEN
PositionSize = 12.0
ELSIF CurrentCapital < 26000 THEN
PositionSize = 13.0
ELSIF CurrentCapital < 28000 THEN
PositionSize = 14.0
ELSIF CurrentCapital < 30000 THEN
PositionSize = 15.0
ELSIF CurrentCapital < 32000 THEN
PositionSize = 16.0
ELSIF CurrentCapital < 34000 THEN
PositionSize = 17.0
ELSIF CurrentCapital < 36000 THEN
PositionSize = 18.0
ELSIF CurrentCapital < 38000 THEN
PositionSize = 19.0
ELSIF CurrentCapital < 40000 THEN
PositionSize = 20.0
ELSE
PositionSize = 20.0
ENDIF
// Bedingungen zum Einstieg in Long-Positionen
indicator1 = DIplus[42]
c1 = (indicator1 CROSSES OVER 25)
indicator2 = DIminus[42](close)
c2 = (indicator2 <= 20)
indicator3 = Momentum[42](close)
c3 = (indicator3 <= 55)
//1 CONTRACT oder PositionSize
IF (c1 AND c2 AND c3) AND timeEnterBefore AND timeEnterAfter THEN
BUY 1 CONTRACT AT MARKET
ENDIF
IF LONGONMARKET THEN
entryPrice = TradePrice
// Merken, ob +25 Punkte bereits erreicht wurden
IF Close – entryPrice >= 27 THEN
levelReached = 1
ENDIF
// Merken, ob +30 Punkte bereits erreicht wurden
IF Close – entryPrice >= 30 THEN
levelReached = 2
ENDIF
// Aktuellen Stop bestimmen
IF Close – entryPrice >= 55 THEN
// Stufe 3: +30 oder mehr
// Stop = +20
stopPrice = entryPrice + 25
ELSIF Close – entryPrice >= 45 THEN
// Stufe 3: +30 oder mehr
// Stop = +20
stopPrice = entryPrice + 18
ELSIF Close – entryPrice >= 35 THEN
// Stufe 2: +25 bis +29,99
// Stop = +5
stopPrice = entryPrice + 15
ELSIF Close – entryPrice >= 25 THEN
// Stufe 2: +25 bis +29,99
// Stop = +5
stopPrice = entryPrice + 10
ELSE
// +25 wurde noch nie erreicht
// Stop = -40
stopPrice = entryPrice – 45
ENDIF
SELL AT stopPrice STOP
ELSE
// Position geschlossen → Merker zurücksetzen
levelReached = 0
ENDIF
SET TARGET pPROFIT 90
IF DayOfWeek = 5 AND time >= 225500 THEN
IF LONGONMARKET THEN
SELL AT MARKET
ENDIF
ENDIF
Describe what this topic is trying to build, in plain English, and ProRealAI writes the ProRealTime™ indicator, screener or system for you.
Backtest über mehrere Jahre benötigt
This topic contains 25 replies,
has 4 voices, and was last updated by DiBuOL
1 day, 11 hours ago.
| Forum: | ProOrder: Automatischer Handel & Backtesting |
| Language: | German |
| Started: | 08/16/2026 |
| Status: | Active |
| Attachments: | 18 files |
The information collected on this form is stored in a computer file by ProRealCode to create and access your ProRealCode profile. This data is kept in a secure database for the duration of the member's membership. They will be kept as long as you use our services and will be automatically deleted after 3 years of inactivity. Your personal data is used to create your private profile on ProRealCode. This data is maintained by SAS ProRealCode, 407 rue Freycinet, 59151 Arleux, France. If you subscribe to our newsletters, your email address is provided to our service provider "MailChimp" located in the United States, with whom we have signed a confidentiality agreement. This company is also compliant with the EU/Swiss Privacy Shield, and the GDPR. For any request for correction or deletion concerning your data, you can directly contact the ProRealCode team by email at privacy@prorealcode.com If you would like to lodge a complaint regarding the use of your personal data, you can contact your data protection supervisory authority.