OptionOmega Backtest DSL

Vollständige Referenz für die Konfiguration von Backtests im Lab of Trades

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) }
}
BlockPflichtBeschreibung
datesjaStart- und Enddatum
tickerjaUnderlying-Symbol
strategyjaOption-Legs & Strike-Selektion
entryjaEinstiegsbedingungen und Filter
allocationjaKapital- und Positions-Grenzen
exitneinGewinnziel, Stop-Loss, Exit-Filter
miscneinKommission, Slippage, Sonstiges

3. dates – Zeitraum

dates {
    from("2023-01-01")      // String oder LocalDate
    to("2023-12-31")
}
FunktionTypBeschreibung
from(x)String | LocalDateStartdatum
to(x)String | LocalDateEnddatum

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

FunktionParameterBeispiel
delta(v)Int / Doubledelta(20) oder delta(0.20)
percentageOTM(v)DoublepercentageOTM(5.0)
fixedPremium(v)DoublefixedPremium(1.50)
strikeOffset(v)IntstrikeOffset(-2)

Infix-Operatoren

OperatorBedeutung
sell / buyLong / Short
put / callOptions-Typ
dte NTage bis Verfall
quantity NAnzahl Kontrakte (Default = 1)

Konfiguration

FunktionTypDefault
useExactDte(b)Booleantrue
roundStrikesToNearest(n)Intnull

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

FunktionBeschreibung
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

FunktionTypDefault
startingFunds(n)IntPflicht
marginPercent(n)Int100
maxOpenPositions(n)Int1
maxContractsPerTrade(n)Intnull
maxAllocationAmount(n)Intnull
pruneOldestTrades(b)Booleanfalse
ignoreMarginRequirements(b)Booleanfalse
allocation {
    startingFunds(25_000)
    marginPercent(80)
    maxOpenPositions(3)
}

8. exit – Austrittsregeln

FunktionParameterBeschreibung
profitTarget(v, unit)Double, PnlUnitGewinnziel
stopLoss(v, unit)Double, PnlUnitStop-Loss
exitDte(n)IntExit bei DTE-Schwelle
daysInTrade(n)IntExit nach N Tagen
profitActions(b)BooleanGewinn-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

FunktionTypDefault
commissions { }Blocknull
slippage(v)Doublenull
ignoreWideBidAskSpread(b)Booleanfalse
closeOpenTradesOnCompletion(b)Booleanfalse
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

EnumWerte
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)
    }
}