# Trading bot session summary: Thursday 2026-09-24

The first day of the trade plan live, the mid-day switch to the context rules, a review of every missed opportunity, and the fixes it led to. Paper-trading account. All times are ET. Written after the close; the backtests finished at 02:30 on 9/25.

## At a glance
| Item | Result |
|---|---|
| Live P/L | **−$80.52**, 8 trades (2 winners). Equity $8,838.26, account flat at the close |
| Morning (9:30–11:51, trade plan, context rules **off**) | 7 trades, 1 winner, **−$100.01**: 4 hard stops, 1 deterioration exit, 2 sold at the mid-day restart |
| Afternoon (11:52–15:55, context rules **on**) | 1 trade (DNA pullback), **+$19.49**, sold by the 1/4 giveback |
| Market | Small caps (IWM) slid to **−0.92% by 11:30**, then recovered to flat by 14:00. The morning buys went into the decline |
| 30-minute rescan | Worked all day (13 scans). **5 of the 7 morning buys came from stocks a rescan added** |
| New bug found | Rescans saved "high so far today" as the **premarket high** (58 of 68 stocks), giving the plan fake resistance levels. Fix built, OFF |
| Best fix tested | **Real-level targets**: 5-day 5-slot backtest **+$352 vs +$216**, better on 4 of 5 days |
| Changed live today | Context rules switched **on** at 11:52 (with your approval). Nothing else |

## 1. Live trades and what happened after each exit
| Stock | Time | Setup | P/L | Exit | Price at 15:55 | Holding to 15:55 instead |
|---|---|---|---|---|---|---|
| TAL | 9:58–10:20 | pullback | −$12.42 | hard stop | $12.24 | +$8.97 |
| CTKB | 10:02–10:54 | pullback | −$1.49 | deterioration | $5.74 | +$17.88 |
| HAFN | 10:08–10:40 | breakout | −$20.12 | hard stop (dipped 2¢ under it, then rallied) | $8.85 | +$37.58 |
| RSKD | 10:54–11:51 | breakout | −$1.10 | restart | $7.84 | +$44.00 |
| PRGO | 11:01–11:32 | breakout | −$34.16 | hard stop | $14.78 | +$7.84 |
| RUM | 11:02–11:09 | pullback | −$34.17 | hard stop | $8.61 | +$77.38 |
| SG | 11:16–11:51 | pullback | +$3.45 | restart | $8.19 | +$24.92 |
| DNA | 12:52–13:06 | pullback | +$19.49 | 1/4 giveback at $9.58 | $10.27 (high $10.44) | +$122.13 |

- Yahoo Finance prices matched the bot's fills within 0–4¢.
- **None of the morning trades reached its target, even after the exit.** Four of the five losers never got back to their entry price before the market bottomed around 11:30.
- **Holding every trade to 15:55 would have made +$341 more.** Most of that came from the afternoon market rebound. DNA was sold at $9.58 and ran to $10.44.

## 2. Missed-opportunity review: every stock the bot watched
87 different stocks were on the watchlist at some point (13 scans across two bot runs). For each stock and session, "the move" is its biggest run that started while it was above VWAP and being watched. Two estimates of the money involved:
- **Perfect hindsight:** buy the exact start, sell the exact high.
- **Realistic:** buy 2 bars after the start, stop at 0.25× daily ATR, sell on a 1/4 giveback after +15¢. This is still optimistic, because the start is picked after the fact.

Verdicts:
- **Missed good trade:** realistic result of $15 or more.
- **Correct pass:** the realistic trade would have lost.
- **Nothing there:** a move under 1.5%.

### Morning, 9:30–11:51 (context rules off)
| | Stocks | Estimated $ |
|---|---|---|
| Missed good trade | 22 | **$675** realistic ($1938 perfect-hindsight) |
| Correct pass (buying would have lost) | 18 | $423 of losses avoided |
| Nothing there / small | 27 | — |
| Traded | 7 | — |

**What blocked the missed good trades** (ranked by missed $):

| Blocker | Stocks | Realistic $ missed |
|---|---|---|
| Stage 1: below VWAP | 10 | $297 |
| plan: R:R vs high-of-day/young ceiling | 6 | $155 |
| plan: R:R vs real level | 2 | $142 |
| plan: target not reachable in time | 2 | $33 |
| Stage 1: spread | 1 | $26 |
| Stage 1: not constructive | 1 | $22 |

**Biggest misses:**

| Stock | Move while watched | Realistic capture | Main blocker |
|---|---|---|---|
| SATL | 10:30 $5.55 → 14:39 $6.13 (+10.5%) | $120 | plan: R:R vs real level |
| BNC | 10:44 $6.05 → 12:44 $6.37 (+5.3%) | $67 | Stage 1: below VWAP |
| PHR | 11:43 $9.75 → 15:48 $10.05 (+3.1%) | $41 | Stage 1: below VWAP |
| GRML | 09:59 $13.89 → 10:17 $16.00 (+15.2%) | $41 | plan: R:R vs high-of-day/young ceiling |
| DNA | 10:02 $9.18 → 15:49 $10.44 (+13.7%) | $34 | Stage 1: below VWAP |
| NOK | 09:30 $10.20 → 14:55 $10.54 (+3.3%) | $30 | plan: R:R vs high-of-day/young ceiling |
| SNAP | 11:22 $5.31 → 15:47 $5.41 (+1.9%) | $29 | Stage 1: below VWAP |
| BB | 09:32 $8.27 → 13:14 $8.80 (+6.4%) | $27 | Stage 1: below VWAP |

### Afternoon, 11:52–15:15 (context rules on)
| | Stocks | Estimated $ |
|---|---|---|
| Missed good trade | 23 | **$664** realistic ($1315 perfect-hindsight) |
| Correct pass (buying would have lost) | 3 | $51 of losses avoided |
| Nothing there / small | 24 | — |
| Traded | 1 | — |

**What blocked the missed good trades** (ranked by missed $):

| Blocker | Stocks | Realistic $ missed |
|---|---|---|
| plan: R:R vs real level | 4 | $197 |
| plan: R:R vs high-of-day/young ceiling | 7 | $181 |
| plan: target not reachable in time | 5 | $99 |
| Stage 1: not constructive | 3 | $93 |
| Stage 1: below VWAP | 2 | $42 |
| Stage 1: spread | 1 | $35 |
| re-entry rule | 1 | $16 |

**Biggest misses:**

| Stock | Move while watched | Realistic capture | Main blocker |
|---|---|---|---|
| SATL | 11:53 $5.58 → 14:39 $6.13 (+9.8%) | $120 | plan: R:R vs real level |
| ARHS | 15:13 $9.17 → 15:55 $9.45 (+3.0%) | $49 | Stage 1: not constructive |
| ERAS | 15:00 $14.57 → 15:10 $15.07 (+3.4%) | $38 | plan: R:R vs high-of-day/young ceiling |
| OIG | 12:27 $9.76 → 13:22 $9.95 (+1.9%) | $35 | Stage 1: spread |
| RSKD | 12:26 $7.62 → 14:59 $8.02 (+5.2%) | $33 | plan: R:R vs high-of-day/young ceiling |
| BB | 14:37 $8.46 → 15:53 $8.67 (+2.5%) | $30 | plan: R:R vs real level |
| RCAT | 15:03 $6.64 → 15:41 $6.78 (+2.0%) | $29 | Stage 1: not constructive |
| ONDS | 12:00 $7.41 → 13:59 $7.73 (+4.3%) | $28 | plan: R:R vs high-of-day/young ceiling |

**Takeaways:**
- **The biggest fixable blockers were plan targets**: the high of day or a just-formed ceiling as the target, or a real level close by. The live rescan bug fed some of these, by labelling the high so far today as the "premarket high".
- **"Below VWAP"** also blocked many moves that started above VWAP but spent part of the run under it. That's working as intended, but it's costly on choppy days.
- **The morning had 18 correct passes** (about $423 of losses avoided). The rules were doing their job in a falling market.

## 3. DNA: why the morning run was missed, and the fix
DNA ran from $8.50 to $9.78 by 10:25 (+15%). The scanner added it at 9:58. Stage 1 and the hold were passing, but every plan picked the **high of day, a few cents above the price, as the target** (R:R 0.05–0.39).

**Fixes built (all OFF):**

| Fix | What it does | Result |
|---|---|---|
| a) Real-level targets (`setup_plan.real_level_targets`) | Never target the high of day. A ceiling only counts as a target once it's at least 15 minutes old. Otherwise the target is the next real level, or clear air | **In the replay it bought DNA at 10:05 for $9.30 (+$33) and GRML at 10:00 (+$84)** |
| b) Reclaim breakouts (`setup_plan.reclaim_breakouts`) | A level closed above, dipped under, then closed above again on breakout volume counts as a breakout | **No effect on any day**. Drop it |
| c) Earlier rescan (`scanner.first_rescan_after_open_minutes`, `rescan_interval_first_hour_minutes`) | For example a rescan at 9:40, or every 15 minutes in the first hour | Can't be simulated yet. The opening-window study supports it (see section 6) |
| d) True premarket high (`scanner.true_premarket_high`) | The saved "premarket high" uses only 4:00–9:30 bars | **Bug fix. Recommended ON** |

The simulator can now **replay the intraday rescans** (`--watch-windows`), so each stock is only traded while it was really on the watchlist. The replay of 9/24 reproduced the live trades closely.

## 4. Backtests
### Entry isolation (every signal taken, same exits, 5 days)
| Plan version | Context off | Context on |
|---|---|---|
| Current plan | +$38 (37 trades, +$1.02 each) | +$131 (15 trades, +$8.70 each) |
| **+ real-level targets** | **+$166** (44 trades, +$3.76 each) | — |
| + reclaim breakouts | +$37 (36, no change) | — |
| + both | +$176 (45, +$3.92 each) | +$112 (21, +$5.33 each) |

### Real conditions: 5 slots, all live settings, 5 days
| Config | 09-18 | 09-21 | 09-22 | 09-23 | 09-24 | **Total** | Trades | Per trade |
|---|---|---|---|---|---|---|---|---|
| Context off (9/24 morning version) | +63 | +48 | +60 | +119 | −74 | +$216 | 34 | +$6.35 |
| **Context on (tomorrow as configured)** | +78 | +22 | +65 | +41 | −17 | +$187 | 15 | **+$12.49** |
| **+ real-level targets, context off** | +99 | −7 | +82 | +229 | −51 | **+$352** | 43 | +$8.19 |
| + real-level targets, context on | +104 | +48 | +64 | +46 | −61 | +$201 | 19 | +$10.60 |

- **Real-level targets helped in both versions.** With context off it was better on 4 of 5 days; with context on, on 3 of 5.
- **Context on** gives fewer, better trades and smaller losing days. **Context off** gives more trades and a higher total.

### Exit isolation (same entries, only the exit changes)
| Exit rule | 9/24 (12 trades) | 09-18 to 09-23 (same entries) |
|---|---|---|
| Current: 1/4 giveback after 15¢, stall exit 45 min | −$104 | −$34 without the stall exit / **+$41 with it** |
| No giveback | **−$64** | +$31 (fewer trades) |
| Giveback only after 25¢ / 30¢ | −$64 (30¢) | −$248 / −$210 |
| Giveback ratio 1/2 | −$122 | −$288 |

Holding longer won on 9/24 because of the afternoon rebound, but it lost on the earlier days. **Keep the current giveback**, together with the stall exit.

## 5. Tomorrow (Fri 9/25): current config and decisions
The config **as it stands** runs the trade plan **with the context rules on**, no DNA fixes, the 5-bar slope rule off, stall exit at 45 minutes, the re-entry rule `above_entry`, 5 slots, a 19% cap, and the 30-minute rescan.

**Decisions for you:**
1. **Turn on real-level targets** (`setup_plan.real_level_targets: true`)? **Recommended.** It helped on most days in both versions.
2. **Turn on the true premarket high** (`scanner.true_premarket_high: true`)? **Recommended.** It's a bug fix.
3. **Earlier rescan:** a first rescan at 9:40 (`first_rescan_after_open_minutes: 10`)? Recommended on the evidence from the opening-window study, although it can't be backtested yet.
4. **Context rules:** keep them **on** (fewer, better trades) or turn them **off** (more trades, a higher total in the backtest)?

## 6. Also built: opening-window dataset (report sent separately)
`reports/open_window/`: 20 trading days, the ~300 stocks a day that met the bot's universe rules, with every 1-minute bar from 9:25 to 10:00. **Only 34 of the 107 stocks that ran 5% or more between 9:30 and 10:00 (09-17 to 09-24) were on the bot's 9:28 top-30 list.** The runners had bigger premarket gaps, traded premarket, and had heavier opening volume.

## 7. Files changed (backups taken first)
| File | Change | Backup |
|---|---|---|
| `setup_analyzer.py` | Real-level targets, reclaim breakouts (off) | `.bak-2026-09-24` |
| `monitor.py` | Optional early and first-hour rescans (off) | `.bak-2026-09-24` |
| `scanner.py` | True premarket high (off) | `.bak-2026-09-24` |
| `simulate.py` | `--plan-real-targets`, `--plan-reclaim`, `--watch-windows` (rescan replay), `--plan-no-context` | `.bak-2026-09-24` |
| `config.json` | Context rules ON (11:52 switch); new keys `real_level_targets`, `ceiling_target_min_age_min`, `reclaim_breakouts`, `true_premarket_high`, `first_rescan_after_open_minutes`, `rescan_interval_first_hour_minutes` (all off) | `.bak-2026-09-24-midday`, `-dnafix` |

## 8. Notes on the work
- A test-queue mistake (two queues waiting on each other) stalled the backtests for about 6 hours overnight. It's fixed, and all results above are from complete runs.
- The first 9/24 replays accidentally ran with the context rules on, because the simulator reads the live config. Every later run sets the context rules explicitly.
