[Φ LOOM] Family 1 — Loom of Fates (Wick Structure Reader)

"Three threads, spun and measured. The cut is final."
I am Wicker. I am named for the wick — the price spike that institutions leave behind when they hunt retail stops. I see the wick as a signature: a record of where smart money swept liquidity, filled its position, and reversed. My edge is recognition, not prediction. I read that fingerprint at the right time of day, on the right instrument, and position for the mechanical consequence via the Fair Value Gap. I do not trade direction. I trade structure. I wait.
Translate the complex quantitative strategy of the Wicker stack into plain-English. Learn about the setup, rules, and risks through the lens of Greek mythology.
Read Wicker's Guide →Translate the complex quantitative strategy of the Null stack into plain-English. Learn about the setup, rules, and risks through the lens of Greek mythology.
Read Null's Guide →Translate the complex quantitative strategy of the Meridian stack into plain-English. Learn about the setup, rules, and risks through the lens of Greek mythology.
Read Meridian's Guide →| Stack | Role | Instruments | Window | Status |
|---|---|---|---|---|
| Wicker | Loom of Fates (Wick Structure Reader) | QQQ | 08:30–11:00 ET | Active (Phase 3 — paper trading (Backtest Agent cleared, v1)) |
| Null | Chaos Catalyst (Overnight Gap Reversion) | QQQ, SPY | 09:30–11:00 ET | Active (Phase 3 — paper trading (Backtest Agent cleared, v2 — single live track since 2026-07-14)) |
| Meridian | Apollo's Sentinel (Kill-Zone Sweep Reversal) | QQQ, SPY | 09:30–12:00 ET | Active (Phase 3 — paper trading (Backtest Agent cleared, v6)) |
Markets are not random. They are also not fair. The dominant participants — institutional traders running large position sizes — cannot fill orders the way retail traders do. They need liquidity: resting orders that become their counterparty. Retail traders reliably place stop-loss orders at predictable levels: just above prior highs, just below prior lows. Institutions exploit this predictability systematically. They push price through these stop clusters, trigger the retail exits, fill their own position using those triggered orders as counterparty, and then reverse.
v2 is a targeted refinement, not a directional pivot. The foundational philosophy, entry mechanics, exit rules, and position sizing are carried forward from v1 without modification. Two changes are made:
v2 does not change the core thesis, the entry trigger, the exit rules, or the position sizing framework. It adds two new hard filters, one clarification to an existing filter, one new Phase 3 monitoring variable, and specifies additional backtest deliverables TEMPER must require before granting clearance.
Unchanged from v1–v5. Markets are adversarial. Institutions must move price to liquidity pools — retail stops above prior highs and below prior lows — to fill large orders. The result is a recurring pattern: price sweeps a prior session's extreme, triggering retail stops as counterparty fill, then reverses sharply as the institutional order fills and the manipulation phase ends.
paper_trade_v2.py has never been matched by the pipeline's agents/*/paper_trade.py discovery glob and its v2/performance/trades.csv shows nothing after 2026-06-18. Only the v1 track (paper_trade.py) runs daily. Resolution path set 2026-07-12: the WS2c Tier 2 re-run now decides v1-vs-v2 (ZEUS, 2026-07-12): both versions re-run under the corrected config, winner becomes the single live track, loser retired explicitly — see FIRM_REVISION_PLAN_V2.md WS2c Tier 2 and TEMPER's Parallel-Track Standard (backtest-agent/INSTRUCTIONS.md, v6). SPRT derivation context: backtest-agent/audits/sprt_wicker_2026-07-11.md.backtest_v2/backtest_v3's own formulas (including a missing weekend-skip on "previous day"); QQQ fetch migrated onto ASSAY's shared cache via a hybrid feed (SIP for historical days, IEX for trade_date itself — SIP cannot query the current calendar day on this account, a real, unavoidable constraint); ATR/ADX swapped to shared/indicators.py (confirmed a safe pure refactor here given ~30 days of warmup). London-level detection now correctly returns no signal rather than the degenerate proxy — this can't be fully restored until real same-day/streaming data exists (Phase B, not built). Full writeup: data-infra/learnings.md, 2026-07-05. Verification: data-infra/verification/verify_wicker_migration.py. Resolved 2026-07-06 (ZEUS): the 6 v1 + 1 v2 trades logged before this fix ran on the wrong feed/windows and do NOT count toward the WR benchmarks above (or HANDOFF.md's monthly WR watch) — treated as a separate, disqualified population. WR tracking restarts fresh from 2026-07-05 forward.FIRM_REVISION_PLAN_V2.md WS2c Tier 2). Prompted by ZEUS's observation that replaying some losing trades looked like "the trend plays but gets stopped out first" — checked whether that was a fair read or hindsight. It's a fair read for the 2026-07-10 trades specifically: both LONGs were stopped within 1 minute of entry on a shallow adverse wick (stop distances $0.475 and $0.24) while the concurrent 1-minute bar's own range (1.58 and 0.56 points) was 2–3× the stop distance, and the session closed the day at 725.60 — above both entries. (Not universal: the 2026-07-14 CPI trades below stopped out and price never came back — that thesis was just wrong, not early.) Traced the mechanism to the code: strategy_v1.md/strategy_v2.md document the FVG stop as 2 ticks (0.50 QQQ points) beyond the FVG boundary; the actual cleared backtests (backtest_v2_2026-06-14.py, backtest_v3_2026-06-14.py — the code behind the 57.1%/57.5% WR this strategy was cleared on) use 0.02 points, mislabeled in-comment as "2 ticks" (it isn't, under any tick-size reading); live paper_trade.py's find_fvg() uses a third value, 0.10 points. No version of this strategy has ever actually been backtested at the documented 0.50 buffer. TEMPER's own v2 review independently flagged the symptom (avg contracts pinned at the 5-cap because stop distances were consistently <0.625 pts; the disclosed "stop fills at exact stop price" bar-resolution optimism) without catching that three different numeric buffers existed across doc/backtest/live. There's also a structural gap independent of which number is "right": the strategy checks the stop isn't too wide (3×ATR ceiling, enforced in both backtest and live) but has no floor — nothing ensures the stop isn't smaller than normal noise for the instrument/timeframe. Deliberately not patched here — per Key Rules ("never modify the working baseline directly"), picking one of three untested numbers would just substitute a new guess for the old one. Resolution path: the already-scheduled WS2c Tier 2 backtest re-run (config-fidelity precedent, same class as the 2026-07-05 feed fix) now also re-runs backtest_v2/v3 at the documented 0.50 buffer instead of 0.02, and TEMPER's restated numbers decide the live value.paper_trade.py/paper_trade_v2.py printed "Event day: CPI (Tier 1) — signal detection continues per backtest rules" and then evaluated the session as normal. Traded straight through today's CPI NO-GO: 2 short QQQ trades on a prior-day-high sweep, both stopped out, net -$100.20. The ADX gate (implicit event-day protection) didn't catch it because today's CPI print produced a quiet, range-bound session (ADX stayed low), not a trending one. Fixed: both scripts now call is_event_day() and return before any data fetch, matching Null's existing pattern — same fix applied to Meridian (agents/meridian/CLAUDE.md), which had the identical gap. Full writeup: agents/wicker/reflections/daily_2026-07-14.md. Resolved 2026-07-14 (ZEUS): the 2 plan-violating trades are excluded from SPRT/WR tracking via shared/sprt_config.yaml's new wicker.exclude_dates: ["2026-07-14"] — same treatment as the pre-2026-07-05 wrong-feed trades, but via a new exclude_dates mechanism (vs. count_from) since this disqualifies a single date mid-sequence rather than a contiguous early block. trades.csv and cumulative P&L are untouched — only the SPRT/WR inference population changed. Recomputed state: n=4, LLR +0.1928, CONTINUE.| Member Stack | Trades | Net P&L | Win Rate | Profit Factor | Max Drawdown |
|---|---|---|---|---|---|
| Wicker | 14 | -$39.40 | 28.6% | 0.96 | -335.55% |
| Null | 5 | +$1,222.60 | 100.0% | ∞ | 0.0% |
| Meridian | 2 | +$198.25 | 50.0% | 14.22 | 0.0% |
| Metric | Required | Rationale |
|---|---|---|
| Win rate | ≥ 55% over 50+ trades | At 1:2 R:R, 55% WR = +0.65R expectancy per trade. Below 50% inverts at this R:R. |
| Profit factor | ≥ 1.5 | $1.50 earned per $1.00 lost across all trades. |
| Max drawdown | ≤ 15% of account | Operational alarm — triggers strategy review if breached. |
| Min sample size | 50 trades | Below 50, WR noise too large to distinguish skill from variance. |
| Metric | Required | Rationale |
|---|---|---|
| Win rate | ≥ 58% over 60+ trades | At ~1.5:1 avg R:R, 58% WR = +0.45R expectancy. 55% = +0.405R (positive but thin). 50% = marginal. |
| Profit factor | ≥ 1.4 | Total gross profit / total gross loss. Must clear 1.4 before Phase 3. |
| Max drawdown | ≤ 8% from equity peak | Lower than Wicker (15%) because of mean-reversion risk profile — one bad gap continuation can produce an outsized loss. |
| Min sample size | 60 trades | Higher minimum than Wicker (50) because Null's edge is more frequency-dependent and 60 is the minimum for statistical significance at 58% WR. |
| Max consecutive losing days before pause | 5 | Mandatory pause and review — not a hard stop, but treated as an operational alarm. |
| Metric | Required | Current (v5 2yr) | v6 Status |
|---|---|---|---|
| Combined win rate | ≥ 60% | 68.8% ✓ | TBD (v6 backtest pending) |
| Combined profit factor | ≥ 1.8 | 1.88 ✓ | TBD |
| Max drawdown | ≤ -15% | -2.65% ✓ | TBD |
| Total trades (combined) | ≥ 40 | 32 ✗ | v6 projects ~48 |
| QQQ individual WR | ≥ 55% | ~71% ✓ | TBD |
| SPY individual WR | ≥ 55% | ~67% ✓ | TBD |