# Learning-loop review — 2026-09-11 569 closed trades reviewed, 276 currently open. Proposal only — nothing here is applied automatically (CLAUDE.md §4: the AI review proposes, dan disposes). # 1. Is overall expectancy holding? Pooled expectancy is **+1.00% per trade** across **569 closed trades** (win rate 61.3%, Wilson lower bound 57.3%, profit factor 1.81). The sample is comfortably above the ~20-trade minimum, so the headline number is meaningful — but note it is dominated by `qsr` (462 of 569 trades, expectancy 1.15%), so "overall" here is mostly "QSR is working," not an even blend of all four strategies. `orb-v1` (68 trades) is flat-to-negative and `vwap-mr-v1` (36 trades) is barely positive; both are backtest-only / not live-wired anyway. # 2. Which bucket is the biggest drag? Several buckets clear n≥20. The clearest **entry-attribution** drag is the **RSI 30–40 band**: n=143, expectancy **-0.59%**, PF 0.86 (the only RSI band with both n≥20 and negative expectancy — RSI>70 is negative too but only n=3). Comparing it to the adjacent, similarly-sized RSI 40–50 band (n=210, expectancy +1.90%) gives a gap of **2.49 percentage points** — that is *right at* the 2.48pp noise floor computed for QSR bucket-splitting. This is not a comfortable "clears the floor" result: it beats the floor by 0.01pp, which given five simultaneous RSI-band comparisons (multiple-comparisons inflation) and the fact the floor itself was estimated with its own uncertainty, should be treated as **indistinguishable from noise**, not as a confirmed finding. A bucket can clear the 20-trade bar and still be unresolvable — this is exactly that case. (Separately, the `stop_loss` exit-reason bucket has n=195 and expectancy -5.15%, but that's mechanically tautological — trades that hit their stop lose money by construction — so it isn't an independent "drag" finding, just the definition of a stop firing.) # 3. Entry, exit, or regime problem? The report does not break MAE/MFE out by RSI band, so a band-specific diagnosis isn't possible from the data given. Using the aggregate MAE/MFE as the best available proxy: MAE winners avg **-1.91%**, MAE losers avg **-5.13%**, MFE losers avg **+1.30%**. The MFE-losers figure is modest, not the "was up 3%, exited -2%" signature the doc describes for an exit/take-profit problem — losers generally didn't run up much before failing. That points more toward an entry-quality read than an exit read *if* the RSI 30–40 effect were real. But given point 2's conclusion that the gap is essentially at the noise floor, the honest position is: **we cannot confidently attribute this to entry, exit, or regime — the underlying difference may not exist at all.** # 4. One concrete, small parameter change The RSI 30–40 vs 40–50 gap is an entry-threshold question and its supporting gap (2.49pp) is within noise-floor territory (2.48pp) once multiple-comparison risk is accounted for. Per the rules: **NO CHANGE to any RSI threshold.** Projected revisit: per the power table, resolving even a 1.00% true edge needs 124 symbol-days (have 81, 10 sessions to go, ~**2026-09-25**); the more realistic 0.5% edge needs until **2027-01-18**. Don't touch `maxRsi14` / RSI gates before then. A cheaper alternative already flagged in the docs is the paired anchor/runner QSR comparison, which is not yet significant (-0.26% vs -1.37%, 95% CI crossing zero) — also not actionable yet. Instead, propose a **non-predictive, mechanical** change, justified by a well-sampled deterministic pattern: in the by-exit-reason table (n=195, well above minimum), `stop_loss` trades average **9.7 days** held before losing, versus `take_profit` trades resolving in **5.2 days**. That's a capital-turnover problem, not a signal claim — losing trades tie up capital nearly twice as long as winning ones, for no compensating edge. **Proposed change:** `qsr.maxHoldDays`: **null → 20** (a soft calendar time-stop). This doesn't touch entry criteria, doesn't require out-predicting the market, and directly targets the observed asymmetry in how long losers vs winners are held. Apply, then measure only trades entered after the change. # 5. Notable open-position color (not evidence for #4) QSR has a very large number of open positions relative to closed trades, several aging well past its historical average 8.6-day hold with `maxHoldDays: null`: ETR (~42d, -2.42%), BTI (~31-32d, -3.22%), HON (~30-42d, -3.16%), CI (~35-36d, +1.62%), EBAY (~24-31d, mixed), CARR/NKE (~15-16d, small losses). Several are meaningfully underwater right now (BSX -6.50%, NKE -4.48%, SHOP -4.48%). This is exactly the pattern that motivates the time-stop proposal above, but it is *illustrative only* — none of these are closed outcomes yet. # 6. QSR shadow comparison note The shadow window (2026-08-09 → 2026-08-23) is **closed**, so a fuller outcome backtest can now be requested. Qualitatively: the legacy isTriggered+isBuy method fired only **48** times across **18** tickers, while live `newlyA` produced **289 closed + 263 open** trades across **91** tickers in the same era — an order of magnitude more activity and a much broader universe. Ticker overlap is modest (14 of the legacy method's 18 names also appear under newlyA). This suggests the two selection methods are picking meaningfully different opportunity sets, not just re-timing the same ones — worth a dedicated comparison now that outcomes exist, but not evidence for point 4. # 7. t212-isa vs live-1 `t212-isa` has **0 closed trades**, so there is no outcome data to compare yet — any "which gives the better signal" claim would be pure speculation. The only observable is entry-basis divergence on 3 simultaneously-held tickers (ADBE 1.2%, IBKR 0.9%, GOOG 3.8% apart), driven by t212-isa's lack of a market-hours gate resolving to the prior day's frozen close pre-market. This is a timing/mechanism artifact, not a performance signal. Revisit once `t212-isa` accumulates ~20+ independently-closed QSR trades to compare against `live-1`'s outcomes.