Sell weekly, hold to expiry — systematic strategy backtester
Strike = (1 − offset%) × Close(entry)
Expiry-only
Off
BE = Strike − Premium
Off
Strike = (1 + offset%) × Close(entry)
Stay Out of Market — EMA Filters
Combine filters using:
Summary Statistics
Visualizations
Trade Log
Skipped Entries (0)
Recovery Long Positions (0)
No data loaded
Upload a CSV file with columns: date, open, high, low, close, volume
Definitions & Methodology
Put Strike (K)
K = (1 − 0.0500) × Close(entry date), where d is the selected strike offset. Current d = 5.0%. The put is 5.0% out-of-the-money at entry.
Call Strike (Kc)
Kc = (1 + 0.0500) × Close(entry date). Current offset = 5.0%. The call is 5.0% out-of-the-money at entry.
Expiry Resolution
Target expiry = entry date + 7 calendar days. If that date exists in the dataset, it is used. Otherwise, the next available date after the target is used. If no later date exists, the last date in the dataset is used.
Put Payoff & PnL
Payoff (USD) = max(K − Close(expiry), 0). This is the intrinsic value of the put at expiry. PnL = Premium − Payoff.
Call Payoff & PnL
Payoff (USD) = max(Close(expiry) − Kc, 0). PnL = Call Premium − Call Payoff. When EMA stay-out is active and call selling is enabled, a weekly call is sold instead of skipping the entry.
Max Intra-Trade Drawdown
For puts: max over window of max(K − Low(day), 0). For calls: max over window of max(High(day) − Kc, 0). Recovery = Drawdown − Payoff.
Breach Mode Toggle
Expiry-only: Breach is flagged only if Close(expiry) < K (puts) or Close(expiry) > Kc (calls). Intraday-aware: Additionally flags if any daily Low < K (puts) or any daily High > Kc (calls). Payoff calculation is unchanged in both modes.
Call Breach
Expiry-only: Breach if Close(expiry) > Kc. Intraday-aware: Additionally flags if any daily High in the window exceeds Kc.
Call Max Drawdown
For each day in the trade window, compute max(High(day) − Kc, 0). The maximum is the worst-case adverse excursion for the short call.
Recovery Long
When enabled, after a put expires breached (Close < Strike), a 1 BTC long position is opened at the expiry close price. Breakeven target: BE = Strike − Premium. The long is closed when price reaches BE (either daily High or Close, depending on selected method). While a recovery long is open, no new puts are opened. If BE is never reached, the long is force-closed on the last dataset date.