0DTE forward logs
B0
0DTE level-to-level option scalp
What it is
The owner's level-to-level guide as written, with its 1-hour trend filter and its sector breadth filter. On SPY and QQQ, a 0DTE option is bought when a 5-minute bar touches a level zone and closes back on its side, and a 2-minute close then breaks that bar's high (a call) or low (a put). The nightly log prices each trade on the real 1-minute option bars; no order is sent. Logged beside V2 and F2 for information; it will not be evaluated as a test.
The rule
- Levels: the previous session's high and low from 04:00 to 19:59 ET, its 09:30 open and its last regular-hours close, this session's pre-market high and low, and up to four spike-and-reverse wicks on the last 10 sessions' 1-hour bars. Taken in order of price, a level joins a zone while it is within one tolerance of the zone's lowest level, and the zone sits at the mean of its levels. The tolerance is 0.05 times the 14-day average true range as of the previous session.
- Setup: a 5-minute bar comes down to within one tolerance of a zone and closes above it, after one of the six 5-minute closes before it was at least three tolerances above the zone. That sets up a call; a put mirrors it from below.
- Trigger: a 2-minute close above the setup bar's high buys a call (below its low, a put), within 30 minutes of the setup bar's close. A close beyond the bar's other side cancels the setup, and a newer setup on the same side replaces it.
- Filters: a call needs the 2-minute close above the 1-hour EMA20 and more of the 11 sector SPDRs above their previous close than below it; a put needs both the other way. The EMA20 is computed over the extended-hours 1-hour bars.
- Entries: decided from 11:00 to 15:30 ET, with at least $2 of room to the next zone in the trade's direction before 14:00 and $1 after. On each underlying, one position at a time, at most 4 a session, and one per zone and side.
- Contract: 0DTE, at the $1 strike nearest the price $2 out of the money before 14:00 and $1 after. Its last trade must be at most 5 minutes old and from $0.05 to $0.66, or to $0.40 after 14:00.
- Fill: bought at the open of the contract's first 1-minute bar from the decision, if it starts within 3 minutes.
- Exit: a stop at 75% of the price paid. At twice the price paid, half is sold and the stop moves to the price paid; at three times, half the rest is sold and the stop moves to twice the price paid; each further multiple raises the stop to the one below it. Only the stop is checked on the entry bar, and a raised stop applies from the next bar. A stop sells at the lower of the stop and the bar's open. What is left is sold at 15:55, at the open of the contract's 15:55 bar or its last trade before then.
- Costs: bought $0.01 above the bar's price and sold $0.01 below it, and $0.65 a contract a side; a ladder sale is at its level, once a bar's high is $0.01 above it.
- Sessions: none on a session that closes early, or when the underlying's bars cover fewer than 300 regular-hours minutes of the session, or of the session before it unless that one closed early.
| Name | Value | Unit | Where it lives | Pinned by |
|---|---|---|---|---|
| tol_atr | 0.05 | of the previous session's 14-day ATR | odte/rules.py:16 | tests/test_signals_contracts.py:110 |
| approach_mult | 3 | tolerances | odte/rules.py:26 | tests/test_signals_contracts.py:110 |
| setup_expiry_min | 30 | minutes | odte/rules.py:27 | tests/test_signals_contracts.py:110 |
| window_start | 11:00 | ET | odte/rules.py:29 | tests/test_signals_contracts.py:110 |
| window_end | 15:30 | ET | odte/rules.py:30 | tests/test_signals_contracts.py:110 |
| late_cutoff | 14:00 | ET | odte/rules.py:31 | tests/test_signals_contracts.py:110 |
| bias | ema20 | — | odte/rules.py:32 | tests/test_signals_contracts.py:110 |
| breadth | true | — | odte/rules.py:33 | tests/test_signals_contracts.py:110 |
| room_morning | 2 | USD | odte/rules.py:34 | tests/test_signals_contracts.py:110 |
| room_late | 1 | USD | odte/rules.py:35 | tests/test_signals_contracts.py:110 |
| max_entries | 4 | — | odte/rules.py:36 | tests/test_signals_contracts.py:110 |
| dte | 0 | days | odte/rules.py:38 | tests/test_signals_contracts.py:110 |
| otm_morning | 2 | USD | odte/rules.py:40 | tests/test_signals_contracts.py:110 |
| otm_late | 1 | USD | odte/rules.py:41 | tests/test_signals_contracts.py:110 |
| cap_morning | 0.66 | USD | odte/rules.py:44 | tests/test_signals_contracts.py:110 |
| cap_late | 0.4 | USD | odte/rules.py:45 | tests/test_signals_contracts.py:110 |
| floor | 0.05 | USD | odte/rules.py:46 | tests/test_signals_contracts.py:110 |
| stale_min | 5 | minutes | odte/rules.py:47 | — |
| fill_wait_min | 3 | minutes | odte/rules.py:52 | — |
| ladder | L1 | — | odte/rules.py:49 | tests/test_signals_contracts.py:110 |
| stop_frac | 0.75 | of the price paid | odte/rules.py:51 | tests/test_signals_contracts.py:110 |
| exit_time | 15:55 | ET | odte/rules.py:53 | tests/test_signals_contracts.py:110 |
| costs.base.slip | 0.01 | USD a side | odte/backtest.py:24 | — |
| costs.base.commission | 0.65 | USD a contract a side | odte/backtest.py:24 | — |
| MIN_RTH_MINUTES | 300 | regular-hours minutes | odte/backtest.py:25 | — |
Its read
Record so far
This rule is logged for information: its record is shown only as rows, never added up.
Cost model
$0.01 a side and $0.65 a contract a side, on 1-minute OPRA bars; a ladder sale is at its level
Signals
Each signal as the log wrote it, a table a session. Nothing here is added up.
Tue, Oct 13, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 09:52 | SPY | put | window | — | — | — | — |
| 09:58 | SPY | put | window | — | — | — | — |
| 10:12 | SPY | call | window | — | — | — | — |
| 10:26 | SPY | call | window | — | — | — | — |
| 11:06 | SPY | call | bias | — | — | — | — |
| 11:48 | QQQ | call | bias | — | — | — | — |
| 12:48 | QQQ | put | ENTRY | P741 at 0.26 | 13:39 ET | stop | +43.1% |
| 12:58 | SPY | put | room | — | — | — | — |
| 14:06 | SPY | call | bias | — | — | — | — |
| 14:18 | SPY | put | bias | — | — | — | — |
| 14:24 | SPY | put | room | — | — | — | — |
| 14:38 | SPY | put | bias | — | — | — | — |
| 15:46 | SPY | put | window | — | — | — | — |
| 15:52 | QQQ | put | window | — | — | — | — |
Mon, Oct 12, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 09:54 | QQQ | put | window | — | — | — | — |
| 10:06 | QQQ | put | window | — | — | — | — |
| 12:14 | SPY | put | bias | — | — | — | — |
| 13:14 | SPY | call | bias | — | — | — | — |
Fri, Oct 9, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 09:54 | SPY | call | window | — | — | — | — |
| 10:40 | QQQ | put | window | — | — | — | — |
| 10:42 | QQQ | put | window | — | — | — | — |
| 11:08 | SPY | put | bias | — | — | — | — |
| 11:30 | QQQ | put | breadth | — | — | — | — |
| 11:30 | SPY | put | bias | — | — | — | — |
| 11:32 | SPY | put | bias | — | — | — | — |
| 11:34 | QQQ | put | breadth | — | — | — | — |
Thu, Oct 8, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 10:06 | QQQ | call | window | — | — | — | — |
| 12:34 | SPY | put | room | — | — | — | — |
| 12:38 | SPY | put | room | — | — | — | — |
| 12:48 | SPY | put | room | — | — | — | — |
| 13:14 | SPY | call | bias | — | — | — | — |
| 13:22 | SPY | put | breadth | — | — | — | — |
| 13:54 | SPY | put | breadth | — | — | — | — |
| 14:32 | SPY | put | breadth | — | — | — | — |
| 14:44 | SPY | put | breadth | — | — | — | — |
Wed, Oct 7, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 11:00 | QQQ | call | bias | — | — | — | — |
| 11:08 | QQQ | call | bias | — | — | — | — |
| 11:22 | SPY | put | ENTRY | P773 at 0.47 | 11:30 ET | stop | −29.9% |
| 15:08 | SPY | put | bias | — | — | — | — |
Tue, Oct 6, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 10:38 | SPY | call | window | — | — | — | — |
| 13:28 | SPY | call | ENTRY | C782 at 0.08 | 13:28 ET | stop | −53.8% |
Mon, Oct 5, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 10:08 | SPY | call | window | — | — | — | — |
| 10:10 | QQQ | call | window | — | — | — | — |
| 10:14 | QQQ | call | window | — | — | — | — |
| 11:08 | QQQ | put | bias | — | — | — | — |
Fri, Oct 2, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 09:44 | QQQ | call | window | — | — | — | — |
| 09:54 | SPY | put | window | — | — | — | — |
| 09:58 | SPY | put | window | — | — | — | — |
| 10:12 | QQQ | put | window | — | — | — | — |
| 10:12 | SPY | put | window | — | — | — | — |
| 10:42 | QQQ | call | window | — | — | — | — |
| 11:34 | SPY | call | ENTRY | C771 at 0.54 | 11:41 ET | stop | −29.3% |
| 11:40 | SPY | call | position_open | — | — | — | — |
| 12:24 | QQQ | put | bias | — | — | — | — |
| 12:30 | QQQ | put | bias | — | — | — | — |
| 13:08 | QQQ | put | bias | — | — | — | — |
Thu, Oct 1, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 10:20 | QQQ | put | window | — | — | — | — |
| 10:34 | QQQ | call | window | — | — | — | — |
| 10:40 | QQQ | call | window | — | — | — | — |
| 10:48 | QQQ | put | window | — | — | — | — |
| 10:48 | SPY | put | window | — | — | — | — |
| 10:52 | QQQ | put | window | — | — | — | — |
| 10:52 | SPY | put | window | — | — | — | — |
| 11:02 | QQQ | put | premium_gate | — | — | — | — |
| 11:18 | QQQ | call | bias | — | — | — | — |
| 11:28 | QQQ | call | bias | — | — | — | — |
| 11:32 | QQQ | put | room | — | — | — | — |
| 12:42 | QQQ | put | room | — | — | — | — |
| 12:52 | SPY | put | ENTRY | P759 at 0.43 | 13:02 ET | stop | −30.3% |
| 12:54 | QQQ | put | ENTRY | P736 at 0.62 | 13:02 ET | stop | −28.7% |
| 13:52 | QQQ | put | bias | — | — | — | — |
| 14:14 | SPY | call | bias | — | — | — | — |
| 14:24 | QQQ | call | breadth | — | — | — | — |
| 14:24 | SPY | call | breadth | — | — | — | — |
Wed, Sep 30, 2026
| Time (ET) | Symbol | Side | Outcome | Contract | Exit | Exit by | Net |
|---|---|---|---|---|---|---|---|
| 10:00 | QQQ | call | window | — | — | — | — |
| 10:28 | SPY | put | window | — | — | — | — |
| 10:50 | QQQ | call | window | — | — | — | — |
| 10:54 | QQQ | call | window | — | — | — | — |
| 11:16 | SPY | call | breadth | — | — | — | — |
| 11:30 | SPY | call | breadth | — | — | — | — |
| 12:04 | SPY | call | breadth | — | — | — | — |
| 12:42 | SPY | call | breadth | — | — | — | — |
| 13:32 | QQQ | call | breadth | — | — | — | — |
| 13:32 | SPY | call | breadth | — | — | — | — |
| 13:40 | QQQ | call | breadth | — | — | — | — |
| 13:40 | SPY | call | breadth | — | — | — | — |
| 13:42 | SPY | call | breadth | — | — | — | — |
| 14:06 | SPY | put | bias | — | — | — | — |
Where the research is
- The guide's rules, pre-registered (findings tr-odte-option-scalp/DESIGN/00)
- The forward protocol (findings tr-odte-option-scalp/DESIGN/10)