Inhaltsverzeichnis
1. Einführung
Die OptionOmega-Backtest-DSL ist eine typsichere Kotlin-basierte Sprache zum Definieren von Options-Backtests. Sie wird zur Laufzeit über Kotlin-Scripting (JSR-223) ausgewertet und an die OptionOmega-Plattform übergeben.
Ein Backtest besteht aus einem einzigen Aufruf der Top-Level-Funktion backtest { … } oder – für Parameter-Sweeps – backtestGrid { … }.
Hinweis: Eingaben werden in der OptionOmegaView mit 500 ms Debounce validiert. Fehler werden rot unter dem Editor angezeigt.
2. Grundstruktur
backtest ("Mein Backtest" ) {
dates { // Zeitraum (Pflicht) }
ticker (Ticker.SPX) // Underlying (Pflicht)
strategy { // Option-Legs (Pflicht) }
entry { // Eintritt (Pflicht) }
allocation { // Kapital, Limits (Pflicht) }
exit { // Exit-Regeln (optional) }
misc { // Kommissionen etc. (optional) }
}
Block Pflicht Beschreibung
datesja Start- und Enddatum
tickerja Underlying-Symbol
strategyja Option-Legs & Strike-Selektion
entryja Einstiegsbedingungen und Filter
allocationja Kapital- und Positions-Grenzen
exitnein Gewinnziel, Stop-Loss, Exit-Filter
miscnein Kommission, Slippage, Sonstiges
3. dates – Zeitraum
dates {
from ("2023-01-01" ) // String oder LocalDate
to ("2023-12-31" )
}
Funktion Typ Beschreibung
from(x)String | LocalDate Startdatum
to(x)String | LocalDate Enddatum
4. ticker – Underlying
ticker (Ticker.SPX)
Verfügbare Werte: SPX, SPY, QQQ, IWM, AAPL, TSLA, MSFT.
5. strategy – Option-Legs
Jedes Leg wird mit Infix-Operatoren gebaut: action optionType strike dte N [quantity N].
Strike-Selektion
Funktion Parameter Beispiel
delta(v)Int / Double delta(20) oder delta(0.20)
percentageOTM(v)Double percentageOTM(5.0)
fixedPremium(v)Double fixedPremium(1.50)
strikeOffset(v)Int strikeOffset(-2)
Infix-Operatoren
Operator Bedeutung
sell / buyLong / Short
put / callOptions-Typ
dte NTage bis Verfall
quantity NAnzahl Kontrakte (Default = 1)
Konfiguration
Funktion Typ Default
useExactDte(b)Boolean true
roundStrikesToNearest(n)Int null
Beispiel: Iron Condor
strategy {
sell put delta (20 ) dte 1
buy put delta (5 ) dte 1
sell call delta (20 ) dte 1
buy call delta (5 ) dte 1
useExactDte (true )
}
6. entry – Eintrittsbedingungen
Grund-Parameter
Funktion Beschreibung
at("10:00")Einstiegszeit (String oder LocalTime)
timezone(NY)Zeitzone: NY, CHICAGO, UTC
frequency(Frequency.DAILY)DAILY, WEEKLY, MONTHLY
floatingEntryTime(b)Flexible Einstiegszeit
blackoutDays(...)Tage ohne Handel
reEnterAfterExit(b)Wiedereintritt nach Exit
Filter-Blöcke
vix
vix { min = 15.0 ; max = 30.0 }
technicalIndicators
technicalIndicators {
rsiMin = 30.0 ; rsiMax = 70.0
smaCondition = "price>sma(50)"
}
gaps
gaps {
gapUpMin = 0.5 ; gapUpMax = 1.0
gapDownMin = 0.5 ; gapDownMax = 1.0
}
intradayMovement
intradayMovement {
moveUpMin = 0.0 ; moveUpMax = 0.5
moveDownMin = 0.0 ; moveDownMax = 0.5
}
squeezeMetrics
squeezeMetrics {
dixMin = 10.0 ; dixMax = 30.0
gexMin = -100.0 ; gexMax = 0.0
}
openingRangeBreakout
openingRangeBreakout {
rangeMinutes = 5
direction = BreakoutDirection.UP // UP | DOWN | EITHER
}
minMaxPremium
minMaxPremium { min = 2.0 ; max = 15.0 }
7. allocation – Kapital & Limits
Funktion Typ Default
startingFunds(n)Int Pflicht
marginPercent(n)Int 100
maxOpenPositions(n)Int 1
maxContractsPerTrade(n)Int null
maxAllocationAmount(n)Int null
pruneOldestTrades(b)Boolean false
ignoreMarginRequirements(b)Boolean false
allocation {
startingFunds (25_000 )
marginPercent (80 )
maxOpenPositions (3 )
}
8. exit – Austrittsregeln
Funktion Parameter Beschreibung
profitTarget(v, unit)Double, PnlUnit Gewinnziel
stopLoss(v, unit)Double, PnlUnit Stop-Loss
exitDte(n)Int Exit bei DTE-Schwelle
daysInTrade(n)Int Exit nach N Tagen
profitActions(b)Boolean Gewinn-Aktionen aktivieren
PnlUnit
PERCENT, DOLLAR, FIXED_PROFIT, CLOSING_ORDER
Filter-Blöcke
earlyExit
earlyExit {
exitTime ("15:45" )
exitDaysBeforeExpiration = 1
}
underlyingPriceMovement
underlyingPriceMovement {
moveUpPercent = 3.0
moveDownPercent = 3.0
}
exitDelta
exitDelta { deltaThreshold = 50 }
exitVix / exitTechnicalIndicators
Analog zu entry-Filtern .
exit {
profitTarget (50.0 , PnlUnit.PERCENT)
stopLoss (100.0 , PnlUnit.PERCENT)
earlyExit { exitTime ("15:45" ) }
}
9. misc – Sonstiges
Funktion Typ Default
commissions { }Block null
slippage(v)Double null
ignoreWideBidAskSpread(b)Boolean false
closeOpenTradesOnCompletion(b)Boolean false
misc {
commissions {
perContract = 0.65
perTrade = 1.50
}
slippage (0.05 )
}
10. backtestGrid – Parameter-Sweeps
backtestGrid erzeugt das kartesische Produkt aller varierten Parameter und gibt eine Liste von BacktestConfig zurück.
backtestGrid ("Strategy Sweep" ) {
dates { from ("2023-01-01" ); to ("2024-12-31" ) }
tickers (Ticker.SPY, Ticker.SPX)
strategies {
combo { sell put delta (20 ) dte 1 }
combo { sell put delta (25 ) dte 1 }
}
entry {
frequency (Frequency.DAILY)
varying {
at ("10:00" , "10:30" , "11:00" ) timezone NY
gapUpMax (null , 0.01 )
}
}
allocation { startingFunds (10_000 ); maxOpenPositions (1 ) }
exit {
varying { stopLoss (null , 1.0 , 2.0 , 3.0 ) }
}
}
// 2 × 2 × 3 × 2 = 24 Konfigurationen
Achtung: Die Anzahl der Kombinationen wächst multiplikativ. Plane Rechenzeit und Browser-Sessions entsprechend.
11. Enums & Konstanten
Enum Werte
TickerSPX, SPY, QQQ, IWM, AAPL, TSLA, MSFT
TimezoneNY, CHICAGO, UTC
FrequencyDAILY, WEEKLY, MONTHLY
ActionBUY, SELL
OptionTypeCALL, PUT
BreakoutDirectionUP, DOWN, EITHER
PnlUnitPERCENT, DOLLAR, FIXED_PROFIT, CLOSING_ORDER
12. Vollständige Beispiele
0-DTE Short Put auf SPX
backtest ("0-DTE Short Put SPX" ) {
dates { from ("2023-01-01" ); to ("2024-12-31" ) }
ticker (Ticker.SPX)
strategy {
sell put delta (15 ) dte 0
}
entry {
at ("10:00" ) timezone NY
frequency (Frequency.DAILY)
vix { min = 12.0 ; max = 35.0 }
}
allocation {
startingFunds (25_000 )
maxOpenPositions (1 )
}
exit {
profitTarget (50.0 , PnlUnit.PERCENT)
stopLoss (200.0 , PnlUnit.PERCENT)
earlyExit { exitTime ("15:45" ) }
}
misc {
commissions { perContract = 0.65 }
slippage (0.05 )
}
}
Iron Condor 45-DTE auf SPY
backtest ("Iron Condor 45-DTE" ) {
dates { from ("2022-01-01" ); to ("2024-12-31" ) }
ticker (Ticker.SPY)
strategy {
sell put delta (16 ) dte 45
buy put delta (5 ) dte 45
sell call delta (16 ) dte 45
buy call delta (5 ) dte 45
}
entry {
at ("10:00" ) timezone NY
frequency (Frequency.WEEKLY)
}
allocation {
startingFunds (50_000 )
maxOpenPositions (4 )
}
exit {
profitTarget (50.0 , PnlUnit.PERCENT)
exitDte (21 )
}
}