Hallo, ist es möglich ein System zu schreiben, sodass 10 Trades an 10 zufälligen Tagen / Datum innerhalb eines bestimmten Zeitraums eröffnen würden.
Die 10 Trades sollen per Zufall im Zeitraum vom 01.01.2024 – 30.06.2025 eröffnet werden.
Ist so etwas machbar??
Vielen Dank
Ja, das ist möglich. Hier ein Beispiel:
DEFPARAM CumulateOrders = False
startDate = 20240101
endDate = 20250630
ONCE tradesTotal = 0
IF Date >= startDate AND Date <= endDate AND tradesTotal < 10 THEN
diceRoll = RANDOM(1, 20)
IF diceRoll = 1 AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
tradesTotal = tradesTotal + 1
ENDIF
ENDIF
IF ONMARKET THEN
SELL AT MARKET
ENDIF
Wichtig: Die Funktion RANDOM() generiert bei jedem Backtest andere Zufallszahlen. Das bedeutet, dass die Einstiegstage bei jeder Ausführung unterschiedlich sein werden.
Die Exit-Logik im Beispiel schließt die Position am nächsten Tag. Sie können dies nach Bedarf anpassen (z.B. Stop-Loss, Take-Profit, oder längere Haltedauer).
Hallo,und Wow, vielen Dank!!!
ich hätte noch die Frage, welche Funktion hat die Zahl 20 in Ihrem code?
diceRoll = RANDOM(1, 20)
Wenn ich den Zeitraum von Wann bis Wann es zufällige Trades geben soll, vergrößern will, muss ich auch die Zahl 20 vergrößern??!!
Wie wäre der Code wenn ich 100 zufällige Trades in einem Zeitraum von 01.01.2008 – Heute haben will??
Die Zahl 20 bestimmt die tägliche Wahrscheinlichkeit: RANDOM(1,20) bedeutet, dass jeden Tag eine Chance von 1/20 = 5% besteht, einen Trade zu eröffnen.
Der Trick ist: Wir verwenden eine relativ hohe Wahrscheinlichkeit und lassen den Zähler (tradesTotal < 10) die Trades auf genau 10 begrenzen.
Wenn Sie den Zeitraum vergrößern und die Zahl 20 nicht ändern, werden die Trades schneller erreicht und konzentrieren sich am Anfang des Zeitraums. Wenn Sie möchten, dass die Trades gleichmäßiger über einen längeren Zeitraum verteilt werden, können Sie die Zahl erhöhen (z.B. 30 oder 40).
Für 100 Trades von 2008 bis heute:
DEFPARAM CumulateOrders = False
startDate = 20080101
ONCE tradesTotal = 0
IF Date >= startDate AND tradesTotal < 100 THEN
diceRoll = RANDOM(1, 30)
IF diceRoll = 1 AND NOT ONMARKET THEN
BUY 1 CONTRACT AT MARKET
tradesTotal = tradesTotal + 1
ENDIF
ENDIF
IF ONMARKET THEN
SELL AT MARKET
ENDIF
Hinweis: Sie können mit der Zahl 30 experimentieren. Eine kleinere Zahl (z.B. 20) konzentriert die Trades mehr am Anfang, eine größere Zahl (z.B. 40-50) verteilt sie gleichmäßiger über den gesamten Zeitraum.
Toll, das hat gut funktioniert.
Können sie mir noch sagen, wie die Ausstiegsbedingung lauten muss, jeder Trade auch zufällig nach einer zufälligen Anzahl von Tagen schließen soll, die im Bereich von 2 – 30 Tagen liegt.
Vielen Dank
Hier ist der Code mit zufälligem Ausstieg nach 2-30 Tagen:
DEFPARAM CumulateOrders = False
startDate = 20080101
ONCE tradesTotal = 0
// Random entry
IF Date >= startDate AND tradesTotal < 100 AND NOT ONMARKET THEN
diceRoll = RANDOM(1, 30)
IF diceRoll = 1 THEN
BUY 1 CONTRACT AT MARKET
tradesTotal = tradesTotal + 1
exitDays = RANDOM(2, 30)
ENDIF
ENDIF
// Random exit after 2-30 days
IF ONMARKET THEN
barsInTrade = barsInTrade + 1
IF barsInTrade >= exitDays THEN
SELL AT MARKET
ENDIF
ELSE
barsInTrade = 0
ENDIF
Bei jedem Trade wird eine zufällige Haltedauer zwischen 2 und 30 Tagen generiert. Der Zähler barsInTrade zählt die Tage im Trade und wird beim Ausstieg automatisch zurückgesetzt.
Hallo Ivan,, Danke Dir das ist toll