update to where files are stored

This commit is contained in:
2026-08-24 14:27:53 -04:00
parent 2076abcf0c
commit dd8e4cca0c
14 changed files with 561 additions and 183 deletions

View File

@@ -0,0 +1,41 @@
# SPY Iron Condor Debrief — 2026-08-11
## Trade Summary
- **Ticker:** SPY
- **Structure:** Iron Condor (8/14 expiry)
- 770P/760P (put side)
- 780C/785C (call side)
- **Credit:** $2.44/contract
- **Entry:** ~$773.70 at ~10:29 AM ET
- **Exit:** ~11:30 AM ET (time exit)
- **Result:** -$6 net loss
## Plan
- **Target:** 25% profit ($1.83 buyback)
- **Time Exit:** 11:30 AM ET
- **Guard:** Close if approaching breakevens ($768.44 / $782.44)
## Observations
- **Asymmetric Structure:** 10-wide put side, 5-wide call side
- Riskier put wing got more buffer
- Better credit optimization on the closer strike
- **NL3 Feed Issue:** Institutional prints showing zero throughout session
- Feed likely stale/disconnected
- Normal SPY volume should show dozens of prints by 10:30 AM
- **Price Action:** SPY drifted from $773.70 to around exit
- Put side was always the danger zone ($3.70 vs $6.30 to calls)
- Theta grind on 3-day 0DTE can be unforgiving
## Key Takeaways
1. **Asymmetric IC Design:** Good structure — wider put side matched the closer risk
2. **Time Management:** Respected the 11:30 exit window cleanly
3. **NL3 Reliability:** Feed issues need monitoring — toggle off/on when zero prints show
4. **Small Losses:** -$6 on a $2.44 credit is noise, not strategy failure
## Next Time
- Consider waiting for more theta decay before entry
- Monitor NL3 feed health at session start
- Stick to the plan — execution was clean, just unfavorable drift
---
*Auto-debrief generated at exit*

View File

@@ -0,0 +1,58 @@
# SPY Bull Put Credit Spread — 2026-07-31 1:30 PM ET
**Date:** 2026-07-31
**Session time:** 1:30 PM ET
**Asset:** SPY
**Expiration:** July 31, 2026 (0DTE)
**Direction:** Bullish — slow grind higher
---
## Trade specs
| Field | Value |
|---|---|
| Strategy | Bull Put Credit Spread |
| Short put (sell) | $740 |
| Long put (buy) | $738 |
| Width | $2 |
| Credit target | ~$0.40–$0.60 |
| Max profit | credit received (20-30%+ of width with 0DTE theta) |
| Breakeven | $739.40–$739.60 |
| SPY price at time | $744.72 |
| Day range | $737.68 – $746.30 |
| Time remaining | ~2h 50m |
## Thesis
SPY is holding the upper 80% of today's range on low volume (39% of average). Low volume + upper register holding often prints a slow grind higher rather than rejection. A credit spread is preferred because theta works in our favor — every minute of 0DTE decay adds to profit. We don't need SPY to rally; we just need it to stay above $740.
## Key levels
- **Resistance:** $746.30 (today's high), $748 (mid-week), $750 (psychological)
- **Support:** $741.69 (yesterday's close), $737.68 (today's low)
## Entry
- Sell $740 / Buy $738 put spread
- Target credit: $0.40–$0.60 (20-30%+ of width)
## Exit plan
- **20% profit:** credit of ~$0.50 → sell 50% at 20% back (~$0.10 credit retained)
- **Runner:** trail remaining 50%, close if bid drops toward breakeven
- **Stop / defense:** SPY closes below $739 → consider early exit or roll
- **Max risk:** width minus credit (~$1.40–$1.60/contract)
## Why credit spread over debit spread
- **Theta works for us** — 0DTE decay accelerates all day, especially after ~3:30 PM
- Higher probability — spread is well OTM below yesterday's close ($741.69)
- We profit from the grind *and* from the standstill
- Debit spread needed active upside; credit spread profits from not failing
## Notes
- Low volume today may cap upside speed but also reduces downside momentum
- Theta accelerates sharply in final 2 hours — monitor decay rate after 3:30 PM
- If volume spikes downward, reassess the $740 support level

View File

@@ -0,0 +1,237 @@
# HANDOFF — scan-watchlist-for-equities: mechanical data-fetch script
Written: Tue 2026-08-18 9:37 PM ET. Purpose: a fresh session can resume this
build without re-deriving anything. All API facts below were LIVE-VERIFIED
this session (not from memory).
## 1. What the member asked for
Gump: "I want to create scripts to do some of the work you're doing now and
stitch these into the workflow to avoid the inference work these stages
undertake on each run."
Follow-up approval: "yes build it and include Benzinga news pull" — then,
after the flaky Benzinga endpoint (HTTP 500) and dropped tool payloads:
"can you continue without benzinga angle?"
=> DECISION: **v1 script = price/volume/bars/S-R only (no Benzinga).**
News stays an optional agent MCP call at stage 01, exactly as before.
Benzinga re-add can be v2 once the endpoint proves stable.
## 2. Goal / design
One stdlib-only Python 3.11 script:
`workflows/scan-watchlist-for-equities/shared/scripts/fetch_scan_data.py`
CLI: python3 fetch_scan_data.py <watchlist.csv> [--out DIR]
[--regime SPY,QQQ] [--bars-days 80] [--news-since YYYY-MM-DD]
(news args drop in v2; ignore for v1)
It fetches, per watchlist ticker, DIRECTLY from TTG real-time data API
(via streamable-HTTP MCP JSON-RPC — see section 5):
- stocks_snapshot_ticker
- stocks_aggs_custom_bars daily (from = today-100d, to = today,
multiplier=1, timespan=day, limit=90)
- stocks_aggs_custom_bars 3-min (from/to = last trading day,
multiplier=3, timespan=minute, limit=400)
- calculate_support_resistance {ticker, timeframe: "daily"}
- calculate_support_resistance {ticker, timeframe: "3min"}
Plus SPY/QQQ regime snapshots.
It computes (mechanical, zero interpretation):
- session split of 3-min bars: PM (<09:30 ET), RS (09:30-16:00),
AH (>16:00 ET) — per session: o/h/l/c/v and vwap=sum(c*v)/sum(v)
- intraday high/low timestamps; volume by RS hour; first-15-min and
last-30-min RS moves
- MA20 / MA50 from daily closes + distance % (n/a if <20 bars: IPOs)
- period high/low from fetched daily bars
- vol vs prev-day volume (snapshot day.v / prevDay.v)
It writes into `stages/01_broad_filter/output/`:
- data_brief.md — formatted tables, the mechanical half of shortlist.md
- raw_data.json — every raw payload, audit trail
stdout: compact fetch summary + output paths. Exit 0/1.
Per-call: 1 retry, 2s backoff. Timestamps in bars are MILLISECONDS UTC —
convert to America/New_York (zoneinfo; fall back to local tz on error).
"Last trading day" for the 3-min fetch = max bar date from the daily bars
(handles weekend/pre-market runs).
Credentials: read at RUNTIME from env var MARI_MCP_CONFIG (machine-local
JSON; see section 4). NEVER hardcode keys or write them into the workflow
folder — the Cell syncs to Fleet.
## 3. Environment facts (verified this session)
- cwd = C:\Users\Eric\AppData\Roaming\MARI Desktop\localCell\accounts\
acct-c6fef984c60eb59b9c1c4202ababa059\workspace (git-bash paths use /c/...)
- Python 3.11.15 (pyenv) reachable from MARI bash; stdlib urllib HTTPS works
(proven by live calls below). Node is UNREACHABLE from MARI bash — use Python.
- MCP config: env var MARI_MCP_CONFIG ->
C:\Users\Eric\AppData\Roaming\MARI Desktop\mcp\acct-c6fef984...json
Shape: {"servers": {"ttg-stocks": {"transport":"streamablehttp",
"url":"https://rt.data.ttg.ai/stocks/mcp",
"auth":{"type":"header","headers":{"Authorization":"Bearer ***",
"X-User-ID":"27930"}}}, "ttg-benzinga": {...benzinga/mcp...}, ...}}
(Do not print the real bearer key in chat/output.)
- Workflow root: .mari/scratchpad/workflows/scan-watchlist-for-equities/
(Layer-3 scripts belong in shared/scripts/ per ICM Table 2; ICM.md is at
workflows/ICM.md — re-read on exec per member's predicate.)
- Watchlist CSVs live in shared/ (e.g. 260818.csv = "XOS, AMLX" one per line).
Script should resolve the CSV relative to shared/ (script_dir.parent).
## 4. MCP-over-HTTP protocol (proven working from Python)
Stateless on these servers: no Mcp-Session-Id returned. Sequence:
1) POST url {"jsonrpc":"2.0","id":1,"method":"initialize","params":
{"protocolVersion":"2025-03-26","capabilities":{},
"clientInfo":{"name":"fetch_scan_data","version":"1.0"}}}
2) POST {"jsonrpc":"2.0","method":"notifications/initialized"} (best-effort)
3) POST {"jsonrpc":"2.0","id":N,"method":"tools/call","params":
{"name":<tool>,"arguments":{...}}}
Headers for every POST: Content-Type: application/json,
Accept: application/json, text/event-stream, plus the server's auth headers.
Responses came back plain application/json (not SSE) in testing, but the
parser MUST handle both: if CT starts with text/event-stream, scan lines
starting "data:" and JSON-parse until one has the matching id.
Result text = d["result"]["content"][0]["text"] -> json.loads (it's a
JSON string). On JSON-RPC error object, raise with the message.
Minimal proven client (this exact code worked):
cfg = json.load(open(os.environ['MARI_MCP_CONFIG']))
srv = cfg['servers']['ttg-stocks']
headers = {'Content-Type':'application/json',
'Accept':'application/json, text/event-stream'}
headers.update(srv['auth']['headers'])
req = urllib.request.Request(srv['url'], data=json.dumps(payload).encode(),
headers=headers, method='POST')
body = urllib.request.urlopen(req, timeout=60).read().decode()
## 5. Verified response shapes (live, 8/18 evening)
stocks_snapshot_ticker {ticker:"SPY"} ->
{"ticker":{"ticker":"SPY","todaysChangePerc":-0.675,"todaysChange":-5.22,
"updated":1787097600000000000,"day":{"dv":43920901.2,"o":768.7,"h":769.5,
"l":766.92,"c":767.45,"v":...,"vw":768.52,...}, ...}}
(also has prevDay with c/v — code defensively with .get; the exact AH
sub-fields were not captured: rely on 3-min AH bars for after-hours shape,
not the snapshot.)
stocks_aggs_custom_bars {ticker,from,to,multiplier,timespan,limit} ->
{"ticker":...,"results":[{"v":22219.6,"vw":768.25,"o":769.21,"c":768.37,
"h":769.73,"l":767.8,"t":1787040000000,"n":446}],"next_url":...}
NOTE: 'multiplier' IS REQUIRED (missing it = "Missing required params").
Daily: multiplier=1 timespan=day. Intraday: multiplier=3 timespan=minute.
t = MILLISECONDS UTC.
calculate_support_resistance {ticker, timeframe:"daily"|"3min"} ->
{"timeframe":"daily","current_price":4.44,
"support_levels":{"minor":[{"price":1.92,"touches":1,
"description":"Swing low 3 weeks ago, 1 touch"}],
"major":[{"price":3.04,"touches":3,"description":"..."}, ...],
"key_references":{"pdl":4.01,"pdc":4.44,"period_low":1.65}},
"resistance_levels":{"minor":[...],"major":[...],
"key_references":{"pdh":4.95,"period_high":...}}}
benzinga_news (V2 ONLY — endpoint flaky, 500'd once this session):
ttg-benzinga execute {endpoint:"benzinga_news",
params:{"stocks":"AMLX","published.gte":"2026-08-18"}} ->
{"status":"OK","results":[{"benzinga_id":...,"author":"benzinga newsdesk",
"published":"2026-08-18T20:02:46Z","title":"Amylyx Pharmaceuticals
Announces $350M Common Stock Offering","url":"...","channels":[...],...}]}
Use ONLY minimal params (stocks + published.gte) — extra params
(limit/sort) coincided with the 500; retry once on failure.
## 6. data_brief.md format (mirror the mechanical sections of tonight's
shortlist.md so stage agents can drop them straight in)
# Data Brief — scan-watchlist-for-equities
Generated: <ts ET> | Watchlist: <file> | Tickers: ... | Regime: SPY, QQQ
(Mechanical fetch + compute only — interpretation is stage work.)
## 1. Market regime (SPY/QQQ)
| Ticker | Close | Chg % | O | H | L | VWAP | Vol | Vol vs prev | Closed vs VWAP |
## 2. Watchlist snapshot
| Ticker | Close | Chg % | O | H | L | VWAP(all-day) | VWAP(RS) |
| Vol | Vol vs prev | | | | | | |
## 3. Intraday shape — <ticker> (3-min bars, <date>)
Sessions PM/RS/AH: o/h/l/c/v/vwap each; high & low timestamps;
volume by RS hour; first-15-min and last-30-min moves.
## 4. Daily structure — <ticker>
Close | MA20 (dist%) | MA50 (dist%) | period high/low
## 5. Support/Resistance — <ticker>
daily + 3-min: major/minor levels w/ touches, key references
(pdh/pdl/pdc/period high-low).
## 6. (v2) Catalyst feed — Benzinga per ticker, ET-sorted, with
offering/dilution auto-flag (regex on title: offering|ATM|S-3|
underwrit|registered direct|share sale|financing|capital raise).
Format rules: prices 2dp (3dp if <2.0); volumes in M (1dp); facts only —
"closed below VWAP" is allowed (arithmetic), "risk-off" is NOT (judgment).
## 7. Stitching into CONTEXT.md (pending edits, after script works)
- stages/01_broad_filter/CONTEXT.md: replace the manual fetch steps with
"run `python3 shared/scripts/fetch_scan_data.py <watchlist csv from
user_preferences.md>`; read output/data_brief.md; do NOT re-pull data the
brief contains (fallback to MCP calls only if the script fails)".
Agent keeps: regime interpretation, triage, shortlist.md.
(Benzinga: keep the existing agent news step for v1, unchanged.)
- stages/02_confluence_analysis/CONTEXT.md: add input
../01_broad_filter/output/data_brief.md — factors read from brief.
- stages/03_trade_plan/CONTEXT.md: add same input — levels from brief.
- Root CONTEXT.md "Shared Resources": update shared/ line to mention
scripts/fetch_scan_data.py. CLAUDE.md: one-line note under shared/.
- Stages 00 and 04: UNTOUCHED (pure conversation/synthesis).
## 8. Verification targets (tonight 8/18 run — script output must match)
SPY 767.45 -0.68% VWAP 768.52 vol 43.9M | QQQ 717.51 -1.88% VWAP 719.73 vol 49.0M
XOS 4.44 +96.65% O4.53 H4.95 L4.01 VWAP 4.4281(vol 110.1M) AH last ~4.11
3-min SR: resistance cluster 4.25/4.30/4.32 | daily SR: 3.04/2.70/2.11,
res 8.27, pdl 4.01 pdc 4.44 period_low 1.65
AMLX 35.11 +63.42% O29.91 H35.39(ATH) L28.00 VWAP 31.4446 vol 24.0M AH ~35.02
3-min SR: support 35.02(48t)/34.90(28t), congestion 33.26/33.53
daily SR: 17.00/12.44 support, pdh 35.39
## 9. Pitfalls / failure modes learned this session
- file_write (and bash) DROP the payload when a single tool call carries a
very large content (~10KB+ observed failing). Symptom: "missing required
positional argument: 'content'". FIX: write in chunks of <= ~3KB
(file_write, or bash `cat > f <<'EOF'` then `cat >> f <<'EOF'`). Verified:
3 chunks landed cleanly.
- ttg-stocks execute: 'multiplier' param is REQUIRED (500-ish error w/o it).
- ttg-benzinga: HTTP 500 (HTML error page) occurred once; retry with
minimal params worked. Treat as flaky — never block the script on it.
- 3-min bar timestamps: MILLISECONDS (not nanoseconds/seconds).
- Node is unreachable from MARI bash (PATH isolation) — Python only.
- Weekend/pre-market: daily bars may lack today; 3-min fetch should target
the last trading day found in daily bars, and brief must say so.
- ICM standing rules (member's predicates): re-read ICM.md fresh every exec;
clear each stage's output/ before re-running the workflow; the workflow
folder is equities-only (options work was stripped 8/18 — do not re-add).
## 10. Resume checklist (fresh session)
1. Read this doc; read workflows/ICM.md (member predicate).
2. Build fetch_scan_data.py per section 2 spec, using the client from
section 4 and shapes from section 5. Write via chunked bash heredocs.
Keep it stdlib-only. v1 has NO Benzinga.
3. Run: python3 .../fetch_scan_data.py 260818.csv
4. Diff its data_brief.md numbers against section 8 targets (must match).
Inspect raw_data.json to confirm snapshot field extraction (esp.
prevDay.v) — adjust .get() chains if fields differ.
5. Make the CONTEXT.md stitch edits in section 7.
6. Report to Gump with: script path, brief preview, stage-edit list,
and the Benzinga-v2 note (why it was deferred: flaky 500).
7. Standing member rules: plan-first for consequential multi-step work;
visible progress updates; re-run = clear output/ first.
## 11. Current state
- Workflow folder: options work fully stripped (5 files edited 8/18,
verified clean). 8/18 evening run completed: all 5 stage outputs exist
in stages/*/output/ (shortlist, confluence, plans, summary card) with
AMLX primary / XOS conditional plans for Wed 8/19.
- fetch_scan_data.py: NOT YET WRITTEN (all large file_write attempts
dropped). Probes above are the only code verified this session.
- Nothing in the workflow folder is dirty beyond what 8/18 run wrote.

View File

@@ -0,0 +1,55 @@
AAPL
UPS
UBER
TSM
TSLS
TSLA
TGT
TAN
SQQQ
SPY
SPX
SOXL
SEDG
SBUX
RUN
ROKU
RIVN
RBLX
QQQ
PYPL
PLTR
PINS
PANW
NVDA
NKE
NFLX
MU
MSFT
META
KRE
INTC
HOOD
HD
GOOGL
GOOG
FSLR
FDX
ETSY
ENPH
DIS
DE
DDOG
CRWD
CRM
COST
COIN
CAT
BITO
BABA
BA
ARKK
AMZN
AMD
AFRM
ADBE
1 AAPL
2 UPS
3 UBER
4 TSM
5 TSLS
6 TSLA
7 TGT
8 TAN
9 SQQQ
10 SPY
11 SPX
12 SOXL
13 SEDG
14 SBUX
15 RUN
16 ROKU
17 RIVN
18 RBLX
19 QQQ
20 PYPL
21 PLTR
22 PINS
23 PANW
24 NVDA
25 NKE
26 NFLX
27 MU
28 MSFT
29 META
30 KRE
31 INTC
32 HOOD
33 HD
34 GOOGL
35 GOOG
36 FSLR
37 FDX
38 ETSY
39 ENPH
40 DIS
41 DE
42 DDOG
43 CRWD
44 CRM
45 COST
46 COIN
47 CAT
48 BITO
49 BABA
50 BA
51 ARKK
52 AMZN
53 AMD
54 AFRM
55 ADBE

View File

@@ -0,0 +1,26 @@
```
Iron Condor 45dte Trade Plan
```
Trade plan request:
Execute an iron condor on SPX through my Schwab broker session.
Underlying: SPX Broker: Schwab Strategy: Iron Condor (4 legs) Entry DTE: ~45 days Wing width: 30 points Spread legs:
Short put: [strike]
Long put: [strike]
Short call: [strike]
Long call: [strike] Net credit: $[] Max loss: $[]
Exit rules:
Profit target: Close all 4 legs at 25% of net credit
Stop loss: Close all 4 legs at 50% loss of max loss
Time exit: Close all 4 legs unconditionally on [date — 21 calendar days from entry]
Broker hard stop: Set a Schwab-side stop order at 50% loss as offline protection. Cancel automatically once MARI closes the position.
Monitoring cadence: Swing pace — check net position P&L multiple times per trading day. No intra-second polling needed.
Close all 4 legs together. Do not roll or manage legs individually.
Review the plan with me before execution. Confirm buying power and order preview before placing.

16
sources/servers.md Normal file
View File

@@ -0,0 +1,16 @@
- chrome-devtools
- mari-cell
- ttg-benzinga
- ttg-chat
- ttg-crypto
- ttg-economy
- ttg-finviz-elite
- ttg-forex
- ttg-futures
- ttg-holygrail
- ttg-indices
- ttg-options
- ttg-platform
- ttg-stocks
- ttg-uw

View File

@@ -0,0 +1,90 @@
# XPON Short Squeeze — Premarket Signal Reconstruction (2026-08-24)
## The Setup: What a Pre-Open Scanner Would Have Flagged
### 1. Extreme Float Restriction
- **Free float: 10,684,515 shares** (93.4% of share class)
- **Total shares outstanding: ~962,335** (weighted: 953,191)
- **Market cap: $3.27M** — deep micro-cap
- **22 employees**, listed 2022-04-01, NASDAQ (XNAS)
- **1-for-12 reverse split** (effective ~2026 Q2) to regain Nasdaq compliance
- A ~$3.30M market cap with 10.7M free float = tiny tradable universe. Any meaningful buy-side interest moves the tape fast.
### 2. 8/19 Volume Blowout — The "Accumulation Day"
| Metric | 8/19 (Thu) | Prior days (typical) |
|--------|-----------|---------------------|
| Close | $4.43 | $3.30–$3.74 |
| High | $4.90 | $3.30–$3.74 |
| Volume | **83,482 shares** | ~300–1,000 shares |
| $ Volume | $7.37M | <$5K |
- Volume was **~80–250x** the prior 10-day average (~300–700 shares/day).
- Price went from a 3-week range of $3.18–$3.89 to a **$4.90 intraday high** — a break above the established range.
- Close at $4.43 held well above the prior range — this is an **accumulation/reversal bar**, not a failed spike.
- The 8/20–8/22 follow-through: volume stayed elevated (3.8K, 1K, 680) vs. the prior 1K baseline, and price held above $3.60 — confirming the 8/19 move wasn't a one-day fluke.
### 3. Premarket 8/24: The Trigger
- **Pre-market high: $4.80** (09:24 ET, first 5-min bar: o:3.56 c:4.10 h:4.80 l:3.40, v:1,047,600)
- That's a **+8.5% gap** above the 8/23 close of $3.435.
- **Pre-market volume: ~1.94M shares in the first hour** (vs. 83K the prior full day) — **23x the prior day's total volume before the open**.
- The quote tape shows **bid/ask sizes at 100 shares** throughout pre-market — no institutional size was visible. This was **retail/momentum-driven**, not institutional.
- The 09:30 open printed at **$7.77** — a **126% gap** above prior close. The open was already 1.7x the premarket high.
### 4. The Squeeze Mechanics (First 2 Hours)
| Time (ET) | Price | Volume | Notes |
|-----------|-------|--------|-------|
| 09:25 | 3.40 → 4.80 | 1.0M | Pre-market trigger |
| 09:30 | 4.10 → 5.88 | 4.4M | Open + first 5 min |
| 09:35 | 5.90 → 6.45 | 3.3M | Acceleration |
| 09:40 | 6.17 → 6.18 | 1.7M | Consolidation |
| 09:45 | 6.18 → 7.58 | 3.8M | Second wave |
| 09:50 | 7.58 → 8.64 | 3.4M | **High: $9.03** |
| 09:55 | 8.67 → 8.18 | 2.0M | First fade |
| 10:00 | 8.20 → 8.70 | 1.6M | Retest |
| 10:05 | 8.70 → 9.84 | 2.4M | **High: $9.99** |
| 10:10 | 9.83 → 8.45 | 2.1M | Sharp reversal |
| 10:15 | 8.43 → 8.18 | 0.7M | Consolidation |
- **Intraday high: $9.99** (+191% from prior close) at ~10:05 AM ET
- **First 15 min volume: ~13M shares** — 150x the prior day's total
- The 10:05 high at $9.99 was a **psychological round number** — classic momentum exhaustion
- After 10:15, price faded to $6.31 by mid-morning (low of $6.31 at ~11:30)
- **Closed at $7.36** (+114% from prior close) — gave back ~26% of the gains
### 5. Why Mike Edwards Would Have Flagged This
A short-squeeze scanner (or discretionary premarket review) would have scored XPON high on:
1. **Float size**: $3.3M market cap, 10.7M free float — one of the most restricted floats in the market
2. **Volume spike**: 8/19 was 80–250x normal — the "something changed" signal
3. **Price range break**: 8/19 broke the 3-week $3.18–$3.89 range with a $4.90 high
4. **Follow-through**: 8/20–8/22 held above the prior range with elevated volume
5. **Premarket gap**: +8.5% gap to $4.80 before the open — confirming momentum
6. **Premarket volume**: 1.94M shares pre-market = 23x prior day — "the market is paying attention"
7. **Thin liquidity**: 100-share bid/ask sizes = no institutional selling wall, retail/momentum can drive price
8. **Reverse split**: Fresh off a 1-for-12 reverse split — stock was recently reset, new float, new retail interest
9. **Nasdaq compliance regained**: The reverse split was to fix compliance — "clean bill of health" for short-sellers (reduced short borrow risk)
10. **No options market**: No listed options = no hedging mechanism for short-sellers → they can only cover
### 6. What Went Wrong (Post-Open Fade)
- The 10:05 high at $9.99 was a **blow-off top** — no follow-through, sharp reversal
- $9.99 → $6.31 in ~90 minutes = **-37% from the high**
- The close at $7.36 held above the open ($7.77) — "strong" close for a +114% day, but gave back 26%
- **No fundamental catalyst**: Q2 revenue down 32% YoY, net loss, declining cash — this was pure momentum/squeeze, not a fundamental move
- The 8/19 volume spike may have been **positioning by a single entity or small group** rather than broad institutional interest
### 7. Risk Assessment for a Pre-Open Entry
- **Entry**: ~$4.10 (first 5-min close) to ~$5.88 (end of first 5 min)
- **Target**: $9.99 (10:05 high) = +70% to +140% from entry
- **Stop**: $3.40 (pre-market low) = -17% to -42% risk
- **R:R at $4.10 entry**: 70%/17% = 4.1:1 (excellent)
- **R:R at $5.88 entry**: 70%/42% = 1.7:1 (marginal)
- **Risk**: Squeeze stocks can reverse 50%+ in minutes. The 10:05→10:10 fade was $9.84→$8.45 = -14% in 5 minutes.
### 8. Key Takeaway
XPON was a **textbook micro-cap short squeeze setup**:
- Tiny float + volume spike + range break + premarket gap + thin liquidity
- The squeeze worked (191% intraday gain) but faded hard
- The **premarket signals were strong** — a scanner would have ranked this in the top 5-10 premarket names
- The **risk/reward was excellent** at pre-market prices but degraded fast once price ran
- **No fundamental catalyst** = the move was purely mechanical (short covering + momentum)