Ewan Li

V2

0DTE level-to-level option scalp

forward logbookforwardstartedSep 30, 2026

What it is

The owner's level-to-level guide without its 1-hour trend filter; the sector breadth filter stays. 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. Its QQQ trades from 2026-10-01 (the log began the session before) are a forward test, evaluated once at 100 trades or at the end of September 2028, whichever comes first; its SPY trades are logged for information.

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: no 1-hour trend filter. A call needs more of the 11 sector SPDRs above their previous close than below it, a put the other way.
  • 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.
NameValueUnitWhere it livesPinned by
tol_atr0.05of the previous session's 14-day ATRodte/rules.py:16tests/test_signals_contracts.py:110
approach_mult3tolerancesodte/rules.py:26tests/test_signals_contracts.py:110
setup_expiry_min30minutesodte/rules.py:27tests/test_signals_contracts.py:110
window_start11:00ETodte/rules.py:29tests/test_signals_contracts.py:110
window_end15:30ETodte/rules.py:30tests/test_signals_contracts.py:110
late_cutoff14:00ETodte/rules.py:31tests/test_signals_contracts.py:110
biasnone—odte/rules.py:87tests/test_signals_contracts.py:126
breadthtrue—odte/rules.py:33tests/test_signals_contracts.py:110
room_morning2USDodte/rules.py:34tests/test_signals_contracts.py:110
room_late1USDodte/rules.py:35tests/test_signals_contracts.py:110
max_entries4—odte/rules.py:36tests/test_signals_contracts.py:110
dte0daysodte/rules.py:38tests/test_signals_contracts.py:110
otm_morning2USDodte/rules.py:40tests/test_signals_contracts.py:110
otm_late1USDodte/rules.py:41tests/test_signals_contracts.py:110
cap_morning0.66USDodte/rules.py:44tests/test_signals_contracts.py:110
cap_late0.4USDodte/rules.py:45tests/test_signals_contracts.py:110
floor0.05USDodte/rules.py:46tests/test_signals_contracts.py:110
stale_min5minutesodte/rules.py:47—
fill_wait_min3minutesodte/rules.py:52—
ladderL1—odte/rules.py:49tests/test_signals_contracts.py:110
stop_frac0.75of the price paidodte/rules.py:51tests/test_signals_contracts.py:110
exit_time15:55ETodte/rules.py:53tests/test_signals_contracts.py:110
costs.base.slip0.01USD a sideodte/backtest.py:24—
costs.base.commission0.65USD a contract a sideodte/backtest.py:24—
MIN_RTH_MINUTES300regular-hours minutesodte/backtest.py:25—

Its read

What is read
V2 on QQQ since 2026-10-01 (the read F1)
Read on
about two years at its past QQQ rate of 4–5 trades a month, so near its hard stop of 2028-09-29
Trades needed
100
Trades logged
3
Hard stop
Sep 29, 2028
Shipped on
—
Deployed commit
bc9b659

Record so far

3 of 100 trades logged. Its record is read once, at that count, and is not added up before then.

Record Forward log
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)SymbolSideOutcomeContractExitExit byNet
09:52SPYputwindow————
09:58SPYputwindow————
10:12SPYcallwindow————
10:26SPYcallwindow————
11:06SPYcallbreadth————
11:48QQQcallbreadth————
12:48QQQputENTRYP741 at 0.2613:39 ETstop+43.1%
12:58SPYputroom————
14:06SPYcallbreadth————
14:18SPYputroom————
14:24SPYputroom————
14:38SPYputroom————
15:46SPYputwindow————
15:52QQQputwindow————

Mon, Oct 12, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
09:54QQQputwindow————
10:06QQQputwindow————
12:14SPYputbreadth————
13:14SPYcallroom————

Fri, Oct 9, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
09:54SPYcallwindow————
10:40QQQputwindow————
10:42QQQputwindow————
11:08SPYputbreadth————
11:30QQQputbreadth————
11:30SPYputbreadth————
11:32SPYputbreadth————
11:34QQQputbreadth————

Thu, Oct 8, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
10:06QQQcallwindow————
12:34SPYputroom————
12:38SPYputroom————
12:48SPYputroom————
13:14SPYcallroom————
13:22SPYputbreadth————
13:54SPYputbreadth————
14:32SPYputbreadth————
14:44SPYputbreadth————

Wed, Oct 7, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
11:00QQQcallbreadth————
11:08QQQcallbreadth————
11:22SPYputENTRYP773 at 0.4711:30 ETstop−29.9%
15:08SPYputENTRYP776 at 0.1315:08 ETstop−42.7%

Tue, Oct 6, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
10:38SPYcallwindow————
13:28SPYcallENTRYC782 at 0.0813:28 ETstop−53.8%

Mon, Oct 5, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
10:08SPYcallwindow————
10:10QQQcallwindow————
10:14QQQcallwindow————
11:08QQQputbreadth————

Fri, Oct 2, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
09:44QQQcallwindow————
09:54SPYputwindow————
09:58SPYputwindow————
10:12QQQputwindow————
10:12SPYputwindow————
10:42QQQcallwindow————
11:34SPYcallENTRYC771 at 0.5411:41 ETstop−29.3%
11:40SPYcallposition_open————
12:24QQQputbreadth————
12:30QQQputbreadth————
13:08QQQputbreadth————

Thu, Oct 1, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
10:20QQQputwindow————
10:34QQQcallwindow————
10:40QQQcallwindow————
10:48QQQputwindow————
10:48SPYputwindow————
10:52QQQputwindow————
10:52SPYputwindow————
11:02QQQputpremium_gate————
11:18QQQcallbreadth————
11:28QQQcallbreadth————
11:32QQQputroom————
12:42QQQputroom————
12:52SPYputENTRYP759 at 0.4313:02 ETstop−30.3%
12:54QQQputENTRYP736 at 0.6213:02 ETstop−28.7%
13:52QQQputENTRYP742 at 0.6114:18 ETstop+122.5%
14:14SPYcallbreadth————
14:24QQQcallbreadth————
14:24SPYcallbreadth————

Wed, Sep 30, 2026

Time (ET)SymbolSideOutcomeContractExitExit byNet
10:00QQQcallwindow————
10:28SPYputwindow————
10:50QQQcallwindow————
10:54QQQcallwindow————
11:16SPYcallbreadth————
11:30SPYcallbreadth————
12:04SPYcallbreadth————
12:42SPYcallbreadth————
13:32QQQcallbreadth————
13:32SPYcallbreadth————
13:40QQQcallbreadth————
13:40SPYcallbreadth————
13:42SPYcallbreadth————
14:06SPYputroom————

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)