HANDLEIDING.md

← dashboard  ·  bron: /home/ubuntu/projects/tornado-trading/HANDLEIDING.md
# Tornado Trading — Handleiding / Start Hier

_Laatste update: 2026-10-12 (grote upgrade: tracker fixes, snapshot features, signal-feedback UI, daytrade switch). Lees dit als je een tijd niet getrade hebt en wil weten "hoe zat het ook alweer"._

**Belangrijk — architectuur is veranderd:** scanner, tracker en DB draaien nu op **EC2** (24/7 cron). Flask trade-creator draait **lokaal op Mac** als UI-dock-icoon. Deze constructie staat beschreven in de sectie "Architectuur 2026-10-12".

---

## In één oogopslag

**Dagelijkse routine:**

1. Macro-analyse in `PlanATrade/03_Weekly_Daily_4H_45m.xlsx` → tab **SPY-BTC-Imp**: SP500 (weekly 2×/week, daily elke dag), VIX, BTC, BTC.D
2. NH-NL noteren in tab **NH-NL 1M** (van Barchart, 1-Month rij, Overall kolom)
3. BTC.D-regel voor alts: **stijgt → geen/short alts · daalt → geen/long alts**
4. **Divergence scanner draaien** (1×/dag of vaker, kies je timeframe — zie hieronder)
5. Eventuele setups op de chart nakijken, dan trade plaatsen via Flask trade-creator

**Wekelijks (Elder-scan, zo/ma):**

1. Scan downloaden uit je privé-Gmail
2. Opslaan in `OneDrive/TornadoTrading/ElderScans/` (naam: `YYYYMMDD ...`)
3. Terminal: `cd ~/projects/tornado-trading && ./scripts/run_elder.sh`
4. `ElderWatchlists/Elder_<datum>_full.txt` importeren in TradingView → setups markeren met icoontjes

**Per trade:**

1. Dock-icoon **Tornado Trade** → nieuwe trade scaffolden (template, ticker, TF, richting)
2. Analyse invullen (Flask edit-form of direct in Excel)
3. Trade plaatsen via broker (IB / Kraken)
4. **Copy as TradesViz note** knop → plakken in TradesViz Notes
5. Na sluiten: review in TradesViz

---

## De tools

### 1. Divergence scanner (NYSE / NASDAQ / LSE / Kraken × meerdere timeframes)

**Wat het is:** vindt verse MACD-Histogram divergences op alle liquide aandelen van NYSE, NASDAQ, LSE (FTSE 350), en alle USD-quoted crypto-pairs op Kraken. Alle markten op 1h/4h/1d/1w. Volgt jouw Elder-regels: beide MACD-H pivot-waardes aan de juiste kant van nul, nullijn-kruising tussendoor, en de histogram moet net z'n turn hebben gemaakt (niet nog dalen/stijgen). Ook een aparte "Missing Right Shoulder"-categorie voor de geavanceerde setups (zoals OPTU was).

**Data-bronnen:** yfinance (Yahoo Finance) voor stocks, Kraken REST API voor crypto. De detectie zit in Python — TradingView is alleen de viewer aan het eind.

**Architectuur:** twee bestanden, that's it.

```
_scripts/
├── divergence_scanner.py    # alle markten + alle modes
└── run_scan.sh              # venv-helper + python invocatie
```

`run_scan.sh` regelt de venv (eenmalig per Mac, ~30s) en geeft alle args door aan `divergence_scanner.py`. Twee modes:

**Single-market mode** (`--market` expliciet):

```bash
cd ~/Library/CloudStorage/OneDrive-Personal/TornadoTrading/_scripts
./run_scan.sh --market nyse                 # NYSE 4h (default tf)
./run_scan.sh --market nasdaq --tf 1d       # NASDAQ daily
./run_scan.sh --market lse --tf 1w          # LSE weekly
./run_scan.sh --market crypto --tf 4h       # Kraken (crypto) 4h
```

**Multi-market mode** (`--market` weglaten — orchestrator):

```bash
./run_scan.sh                               # alles (4 markten × toepasselijke TFs)
./run_scan.sh --crypto                      # alleen crypto (3 scans)
./run_scan.sh --tradfi                      # alleen stocks (NYSE+NASDAQ+LSE, 12 scans)
./run_scan.sh --tf 1d                       # alle markten, alleen daily (4 scans)
./run_scan.sh --crypto --tf 4h              # crypto 4h (1 scan)
./run_scan.sh --tradfi --tf 1w              # alle stocks weekly (3 scans)
```

Multi-market is sequentieel (~20-30 min voor alle 15 scans), parallel zou tegen rate-limits aanlopen. Eén combo faalt → rest gaat door, samenvatting aan het einde. `--crypto --tf 1h` geeft een nette foutmelding (crypto ondersteunt geen 1h).

**Help** (toont docstring + alle opties + geldige timeframes):

```bash
./run_scan.sh -h
```

**Andere flags** (werken in beide modes):

```bash
./run_scan.sh --rebuild-universe                 # herbouw universe(s) — wekelijks, lang
./run_scan.sh --market nasdaq --rebuild-universe # herbouw alleen NASDAQ-universe
./run_scan.sh --limit 100                        # snel testen op eerste 100 tickers
```

`--tf` is de korte variant; `--timeframe` en `-t` werken ook. `--market` heeft `-m` als alias.

**Output** (in `Scans/`):

```
watchlist_NYSE_4h_<timestamp>.txt        ← importeren in TradingView
watchlist_NASDAQ_1d_<timestamp>.txt
watchlist_LSE_1w_<timestamp>.txt
watchlist_CRYPTO_4h_<timestamp>.txt
scan_NYSE_4h_<timestamp>.csv             ← details: bars_ago, p_from/to, h_from/to
scan_CRYPTO_1d_<timestamp>.csv
...
```

Watchlist heeft per scan vier secties: `Bullish Div`, `Bullish Div — Missing Right Shoulder`, `Bearish Div`, `Bearish Div — Missing Right Shoulder`. TradingView-tickers hebben de juiste beurs-prefix (`NYSE:`, `NASDAQ:`, `LSE:`, `KRAKEN:`).

**Importeren in TradingView:** Watchlist-menu rechtsboven → Import list → kies de `.txt`. Loop de hits langs op de chart. Let op: Kraken gebruikt `XBT` (niet BTC) voor Bitcoin — `KRAKEN:XBTUSD` is je BTC-USD chart.

**Wanneer draaien:** voor stocks liefst na een 4H bar-close (~18:00 en ~22:00 NL voor US-markten). Voor weekly: één keer per week na vrijdag-close. Crypto draait 24/7 — 2-3×/dag is voldoende voor 4h+ TFs. Mis je een moment, dan mis je de turn-signalen van die batch.

**Universe-build timing:** NYSE ~5-10 min, NASDAQ ~10-15 min, LSE ~3-5 min, Kraken ~13 min (rate-limit ~1 req/sec). Caches blijven staan tot je `--rebuild-universe` draait — wekelijks rebuilden is voldoende.

### 2. Elder watchlist generator (wekelijks)

**Input:** Elder-scan uit privé-Gmail → opslaan in `ElderScans/` (naam: `YYYYMMDD ...`)

**Draaien:**

```bash
cd ~/projects/tornado-trading && ./scripts/run_elder.sh
```

**Output:** `ElderWatchlists/Elder_<weekrange>_full.txt` — importeren in TradingView (Watchlist-menu → Import list). Je shortlist maak je met TradingView's icoontjes.

**Thuis automatisch:** als de Mac mini aan staat met Cowork open pakt de scheduled task `elder-scan-watcher` (zo/ma elk uur) nieuwe scans vanzelf op.

**Wat als Elder de datum vergeet bij te werken:** de parser detecteert dit nu zelf. Als de datum-cel in de XLSX ouder is dan de scan-datum (kwam voor in Jun 20 2026 scan), kiest hij de Mon-Fri week ná de scan-datum en print een waarschuwing. Output krijgt dan automatisch de juiste week-naam.

### 3. Flask trade-creator (de UI)

**Starten:** Dock-icoon **Tornado Trade**, of in terminal:

```bash
cd ~/projects/tornado-trading/trade_creator && ./start.sh
```

Opent automatisch http://localhost:5050. Stoppen: Ctrl-C in de terminal.

**Nieuwe trade:** kies trade-type (swing/day), template, richting (bullish/bearish), ticker, timeframe → maakt het bestand in `Trades/<jaar>/<maand>/` met correcte naam, vult Yahoo-data (volume, short float, ticker-info) + zet de richting goed.

**Analyse invullen:** op de "aangemaakt"-pagina klik **Open in Flask form** (alleen Divergence-templates). Het form heeft alle analyse-velden, V/X-knoppen voor de divergence-counter, live R/R-berekening, en TradingView chart-URL velden.

**Naar TradesViz:** knop **Copy as TradesViz note** → hele analyse als markdown op je klembord → plak in het Notes-veld van de trade in TradesViz.

### 4. Macro-analyse Excel

`PlanATrade/03_Weekly_Daily_4H_45m.xlsx` — je dagelijkse werkbestand.

- Tab **SPY-BTC-Imp**: SP/VIX/BTC/BTC.D analyses
- Tab **NH-NL 1M**: dagelijks twee getallen van Barchart (1-Month rij, Overall kolom), Diff rekent zichzelf, chart update vanzelf. Nieuwste bovenaan (rechtermuis rij 2 → Insert).

### 5. TradesViz

- **Execution-data** (entries/exits): auto-sync vanuit Kraken + IBKR (eenmalig te configureren in TradesViz Import-pagina, als nog niet gedaan).
- **Analyse/redenering:** via de Copy-as-note knop in Flask → plakken in trade-Notes.

### 6. Fear & Greed

Geen tooling meer — check online op CoinMarketCap of TradingView wanneer je het wil weten.

---

## Trade-workflow stap-voor-stap

1. **Setup gevonden** via Elder-scan of divergence-scanner (zie chart in TradingView)
2. **Flask starten** (Dock-icoon of `./start.sh`)
3. **Nieuwe trade** → kies:
   - Trade-type: swing of day
   - Template: bv. `Bullish_Bearish_Divergence`
   - Richting: bullish of bearish
   - Ticker: ticker-symbool
   - Timeframe: bv. `4h`
4. Flask scaffoldt het bestand in `Trades/<jaar>/<maand>/<filename>.xlsx` met Yahoo-data al ingevuld
5. **Open in Flask form** → analyse-velden invullen:
   - Divergence-counter (V/X)
   - R/R rekenmachine
   - TradingView chart-URL's plakken
6. **Trade plaatsen** bij IB of Kraken (apart, Flask doet dit niet)
7. **Copy as TradesViz note** knop → klembord
8. In **TradesViz** open de trade (kwam binnen via IB/Kraken sync) → Notes-veld → plakken
9. **Na sluiten:** review in TradesViz, screenshots, lessen noteren

---

## Commando-cheatsheet

```bash
# Divergence scanner (één script, alle markten)
./run_scan.sh                              # alles (~20-30 min, 15 scans)
./run_scan.sh --crypto                     # alleen crypto
./run_scan.sh --tradfi                     # alleen stocks
./run_scan.sh --tf 1d                      # alle markten, daily
./run_scan.sh --market nyse --tf 4h        # single: NYSE 4h
./run_scan.sh --market crypto --tf 1d      # single: Kraken daily
./run_scan.sh --rebuild-universe           # universes opnieuw (wekelijks, lang)
./run_scan.sh -h                           # help

# Elder watchlist
cd ~/projects/tornado-trading && ./scripts/run_elder.sh

# Flask trade-creator
cd ~/projects/tornado-trading/trade_creator && ./start.sh

# Code updaten op een machine
cd ~/projects/tornado-trading && git pull
```

---

## Waar staat wat

**Code** (git, private repo `jurgen/tornado-trading`):

```
~/projects/tornado-trading/          (op je Macs, via git clone)
├── scripts/
│   ├── run_elder.sh                 Elder watchlist
│   ├── elder_to_watchlist.py        Elder parser
│   ├── run_scan.sh                  Divergence scanner (alle markten)
│   └── divergence_scanner.py        Scanner-core (NYSE/NASDAQ/LSE/Crypto)
└── trade_creator/
    ├── start.sh
    ├── app.py
    └── templates/
```

**Data** (OneDrive, synct tussen je Macs):

```
~/Library/CloudStorage/OneDrive-Personal/TornadoTrading/
├── _scripts/                                live kopie van scanner-scripts
│                                            (kan ook van git via ~/projects/...)
├── ElderScans/                              scans erin (jij dropt)
├── ElderWatchlists/                         watchlists eruit (script schrijft)
│   └── elder_to_watchlist.py                de parser (live kopie)
├── Scans/                                   divergence-scanner output
│   ├── nyse_liquid_universe.csv             gecachete universes
│   ├── nasdaq_liquid_universe.csv
│   ├── ftse350_liquid_universe.csv
│   ├── watchlist_<MARKT>_<TF>_<ts>.txt      TradingView watchlists
│   └── scan_<MARKT>_<TF>_<ts>.csv           details
├── PlanATrade/
│   ├── 03_Weekly_Daily_4H_45m.xlsx          macro-analyse
│   ├── Swing-Trade-Setup/                   templates
│   └── Day-Trade-Setup/                     templates
└── Trades/<jaar>/<maand>/                   per-trade analyses
```

**Venv** (lokaal per Mac, niet via OneDrive — anders breekt sync hem):

```
~/.tornado-trading-venv/                     wordt auto-gebouwd door run_*.sh
```

---

## Trading-methode (jouw systeem, ter herinnering)

- Alex Elder: twee timeframes + impulse-systeem
- Specialisatie: bullish/bearish divergences (Classic én Missing Right Shoulder)
- Divergence-eisen die ik in de scanner gebakken heb:
  - Beide MACD-H pivot-waardes aan de juiste kant van nul (Classic) — voor bullish: H[a]<0 en H[b]<0
  - MACD-H heeft tussen de twee pivots de nullijn gekruist
  - MACD-H heeft net z'n turn gemaakt (binnen TURN_WINDOW=2 bars)
  - Prior pivot 'a' = laagste/hoogste in lookback (= structureel niveau dat markt respecteert, geen consolidatie-dip)
  - MRS: prior bodem onder nul, vormende bodem komt niet onder nul (rechter trough mist) — en koers moet nog in het bottoming-gebied tussen de twee pivots zitten
- Timeframes: daily + 4h actief, weekly voor langer-lopend, 1h voor scalp-confirmaties
- Altcoin-regel: BTC.d stijgt → geen/short alts · BTC.d daalt → geen/long alts (analyseer altijd eerst BTC + BTC.d)
- Crypto: traden via Kraken (USD-pairs), zelfde divergence-regels als stocks

---

## Troubleshooting

- **Flask start niet / pip-fout:** `start.sh` maakt zelf een venv aan; eerste run duurt ~30 sec. Werkt het niet, check `python3 --version`.
- **"Open in Excel" knop doet niks:** herstart Flask (Ctrl-C + `./start.sh`).
- **run_elder vindt geen scan:** check dat de scan in `OneDrive/TornadoTrading/ElderScans/` staat én OneDrive klaar is met syncen.
- **Elder output heeft verkeerde week-naam:** de parser detecteert dit nu zelf (zie de waarschuwing in de output). Als 't toch fout gaat: rename de output handmatig en `sed -i 's/(oude datum)/(nieuwe datum)/g' Elder_*.txt`.
- **TradingView "Invalid data format" bij import:** je probeert waarschijnlijk een lege `_attractive.txt` te importeren — gebruik `_full.txt`.
- **Divergence scanner: yfinance-fouten ("getaddrinfo failed", "Could not resolve host"):** netwerkhapering. Het script retried al 3× per batch, maar bij massale uitval (bv. tijdelijk geen internet) opnieuw draaien. Stabiele cache-locatie is buiten OneDrive geforceerd, dus SQLite-fouten zouden niet meer voor mogen komen.
- **Divergence scanner: te weinig hits per scan:** check of de turn-trigger niet te streng staat (`TURN_WINDOW=2` is default; verhoog naar 3 voor losser/vroeger). Of pas `MIN_PRICE_MOVE_PCT` per timeframe aan.
- **Divergence scanner: foute hits (geen echte divergence):** noteer ticker + waarom, dan tunen we het filter. Was eerder o.a. nodig voor "structurele bodem"-detectie (laagste prior pivot ipv recente) en MRS rally-range check.
- **Dock-icoon update niet:** `killall Finder Dock` in terminal.

---

## Niet meer in gebruik (zodat je niet gaat zoeken)

- **~~EC2 / cloud-automatisering uitgezet~~** — INMIDDELS TERUGGEBRACHT. EC2 draait weer, zie "Architectuur 2026-10-12". Scanner + tracker + DB staan daar; Flask-UI blijft op Mac.
- **F&G automatische refresh** — uitgeschakeld; check online.
- **`_attractive.txt` watchlists** als enige bron — niet meer nodig, je markeert in TradingView. `_full.txt` is de hoofdimport.
- **`04_SPY-BTC-trend-impulse.xlsx`** — verlaten; alle macro zit nu in `03_Weekly_Daily_4H_45m.xlsx`.

---

## Open / komende dingen

- **Scheduler voor divergence scanner**: 2×/dag automatisch draaien (na de twee US 4H closes, ~18:00 en ~22:00 NL). Lokaal via Cowork scheduled task, of cron. Nog niet ingericht — draait voorlopig handmatig.
- **EC2 + git publishing van scan-output**: scans onafhankelijk van de Macs draaien, output naar private git, lokale Macs pullen. Taak #11, later.
- **Fine-tuning detectie-params per timeframe**: 1h/1d/1w zijn niet zo intensief gevalideerd als 4h. Bij rotzooi in de lijsten: meld een paar voorbeelden, dan stem ik bij.

---

## Het allerbelangrijkste

De tooling is er om het traden makkelijker te maken — niet andersom. Als je twijfelt tussen "infrastructuur verbeteren" en "een trade plaatsen": plaats de trade. De edge zit in de uitvoering, niet in de tools.

---

## Architectuur 2026-10-12

### Verdeling tussen EC2 en Mac

| Component | Waar | Hoe |
|-----------|------|-----|
| Scanner (`alert.py` + `divergence_scanner.py`) | **EC2** | Cron (1h / 4h / 1d / 1w + optioneel 5m / 15m) |
| Signal-DB (`signals.db`) | **EC2** | `~/tornado-data/signals.db` |
| Tracker (`tracker.py`, `tracker_extended.py`) | **EC2** | Dagelijkse cron (nog toe te voegen) |
| Email-dispatch | **EC2** | SMTP via noscosanti@gmail.com |
| Flask trade-creator (`trade_creator/app.py`) | **Mac** | Dock-icoon, localhost:5050 |
| Dashboard (signals.html) | **EC2** gegenereerd → **Mac** gezien | SCP via `/dashboard` route |

**Repo:** `~/projects/tornado-trading` op zowel Mac als EC2. Mac werkt via git push, EC2 via git pull. Secrets (`mail_config.py`, `ec2_config.py`) zijn gitignored en per machine lokaal.

**Cron (op EC2):**
```
# Reguliere scans
5  * * * *               run_alert.sh --tf 1h          # alle markten, elk uur
15 0,4,8,12,16,20 * * *  run_alert.sh --tf 4h
30 0 * * *               run_alert.sh --tf 1d
0  6 * * 6               run_alert.sh --tf 1w          # zaterdag 06:00 UTC
0  2 * * 1               run_scan.sh --rebuild-universe # maandag 02:00 UTC

# Daytrade scans — altijd triggerend, exit <200ms als flag af
*/5  * * * *             run_alert.sh --tf 5m
*/15 * * * *             run_alert.sh --tf 15m
```

### Belangrijke code-constanten (voor latere evaluatie)

| Constant | Waarde | Rationale |
|----------|--------|-----------|
| `BRUTAL_EFI_BAND_TOL` | **0.25** | 2026-10-12 van 0.5 → 0.25 gehalveerd. User zag band te vaak boven nul. Verder zakken als nog te los. |
| `BRUTAL_LOW_RECENT` | 3 | V-shape mag al herstellen |
| `BRUTAL_ATR_MULT_TARGET` | 2.0 | TP = 2 × trade-TF ATR |
| `SL_MULTIPLIER` | 2.0 | SL = 2 × shorter-TF ATR |
| `TP_MULTIPLIER` | 1.0 (div) / 2.0 (brutal) | TP = 1× resp. 2× trade-TF ATR |
| `HORIZON_BARS` | 12 (alle TFs) | Tracker-timeout |
| `IMPULSE_FORMING_MIN_PROGRESS` | 0.7 | Forming HTF preview trigger |

### Timeframe + HTF mapping

```
5m   → HTF 15m   (factor 3)
15m  → HTF 1h    (factor 4)
1h   → HTF 4h    (factor 4)
4h   → HTF 1d    (factor 6)
1d   → HTF 1w    (factor 7)
1w   → HTF 1mo   (factor 4-5, native yfinance; crypto via 1w-resample)
```

SL-ATR TF (factor ~5 korter):
```
5m → 5m (zelfde)   1d → 4h
15m → 5m           1w → 1d
1h → 1h (zelfde)
4h → 1h
```

### Signal-DB schema (uitgebreid 2026-10-12)

Basis-kolommen in `signals` tabel: id, signal_time, market, timeframe, ticker, type, category, quality, htf, htf_impulse, entry_price, atr_tf, atr_value, sl_price, tp_price, horizon_bars, status, outcome_*, max_fav_pct, max_adv_pct, r_multiple.

**Nieuwe snapshot-kolommen** (16 stuks, vanaf 2026-10-12 bij nieuwe signals ingevuld; oude = NULL):
```
dist_to_ema10_pct, dist_to_ema20_pct, bar_range_pct, volume_ratio,
macd_h, macd_h_delta, efi13, stoch_k, stoch_d, stoch_k_delta,
htf_macd_h, htf_efi13, htf_ema10_slope, regime_trend,
brutal_efi_lower, bars_since_pivot
```

**Nieuwe aanverwante tabellen:**
- `feature_registry`: welke snapshot-features actief zijn (soft-delete via `active=0`)
- `signal_feedback`: per-signal user-oordeel (decision + concerns_json + note)
- `feedback_pulldown`: organisch groeiende library van concern-tags
- `feature_requests`: user-ingevoerde requests voor nieuwe features
- `extended_outcomes`: tracker_extended resultaten (pure directional edge, geen horizon)

### R-multiple berekening

**Verbeterd 2026-10-12:** R-multiple was eerder gefixeerd op +0.5 (win) / -1 (loss). Nu correct:
- `loss` → `r_multiple = -1.0` (SL afstand = 1R per definitie)
- `win` → `r_multiple = TP_dist / SL_dist` (variabel, meestal 1.0-2.4)
- `timeout` → `r_multiple = favorable_move / SL_dist` (deels gereed)

Oude signals in DB zijn met SQL update doorgerekend (69k win-records). Resultaat: avg_R van -0.27 → -0.03 voor Brutal (grofweg break-even i.p.v. ramp).

### Signal-feedback workflow

**Email-flow:** elke scan-mail krijgt per rij een `[📝]` link naar `/feedback-lookup?market=X&tf=Y&ticker=Z&...`. Lookup redirect naar `/feedback/<signal_id>`.

**UI:** `/feedback/<id>` toont signal-details + 3 radio-knoppen (ja/twijfel/nee) + vrije concerns-regels (met +pulldown checkbox voor organisch groeiende tag-library) + opmerking-veld. Werkt pas na SCP van `signals.db` naar Mac (handmatig) óf na migratie van Flask naar EC2 (parked).

**Workflow weekly review:** elke zondag 20:00 (Google Agenda reminder), ik draai `feature_analysis.py` + lees `signal_feedback.note` velden. Rapporteer kandidaten voor auto-filters. User approved → ik encodeer in scanner. Zie `/features` voor toggle-UI.

### Daytrade switch

Flag-file `~/tornado-data/daytrade_active.json` op EC2. Flask `/daytrade` route (op Mac) SSH't naar EC2 om flag te schrijven. 5m/15m cron-entries draaien altijd maar exiten binnen 200ms als flag off. Vinkbaar per markt (crypto/nyse/nasdaq/lse/aex); duur 1/2/4/8u of unlimited.

### Mail-routing

Scanner mailt via `smtp.gmail.com` met **noscosanti@gmail.com** (App Password). Alle alerts gaan naar noscosanti. Blurgen@ is uit de scanner-flow verwijderd (parked oud spoor, kan verwijderd bij volgende cleanup).

### Weekend-guard

Stock-markten (NYSE/NASDAQ/LSE/AEX) skippen op zaterdag en zondag UTC. Crypto draait 24/7 door. Loguitvoer: `→ market tf: overgeslagen (weekend, markt dicht)`.

### Scripts op EC2

```
scripts/alert.py              Hoofd-scanner + mail dispatcher
scripts/divergence_scanner.py Detectors (classic, MRS, brutal) + HTF enricher
scripts/signals_db.py         SQLite layer + migrations
scripts/tracker.py            Dagelijkse win/loss check (horizon=12 bars)
scripts/tracker_extended.py   Pure directional edge (no-horizon)
scripts/quality_stats.py      Analytics per quality-tier
scripts/log_stats.py          Volume-analyse uit log-bestanden
scripts/diagnose_brutal.py    Debug: waarom triggerde Brutal (niet)?
scripts/run_alert.sh          Venv-wrapper voor alert.py
scripts/run_scan.sh           Venv-wrapper voor scanner standalone
scripts/trade_creator/        Flask app (draait op Mac, SSH-call paths naar EC2)
```

### Analyse-scripts cheatsheet

```bash
# Op EC2:
source ~/.tornado-trading-venv/bin/activate

python3 scripts/quality_stats.py                # overall per tier
python3 scripts/quality_stats.py --by-category  # tier × categorie
python3 scripts/quality_stats.py --by-category --by-tf  # alles uitgesplitst
python3 scripts/quality_stats.py --extended     # zonder 12-bars horizon
python3 scripts/quality_stats.py --days 30      # recent

python3 scripts/log_stats.py --summary          # distributie uit logs
python3 scripts/diagnose_brutal.py ARBUSD 1d    # waarom (niet) getriggerd
python3 scripts/tracker.py                      # update open signals
python3 scripts/tracker_extended.py --limit 100 # klein testen eerst
```

### Historische beslissingen 2026-10-12 (deze sessie)

1. **r_multiple bug**: TP_dist/SL_dist i.p.v. hardcoded 0.5
2. **Brutal detector bug**: iloc[-2] (closed bar) i.p.v. iloc[-1] (forming) — ARBUSD miste triggers door forming-bar-check
3. **Brutal EFI_BAND_TOL**: 0.5 → 0.25 (user vond band vaak boven nul)
4. **Mail-naming**: "div" → "signals" + inline legenda (div/brutal onderscheid)
5. **1W → HTF=1M**: Elder impulse op maandbar + factor-3 forming preview
6. **tracker_extended**: no-horizon analyse voor pure directional edge
7. **16 snapshot-features**: ingevuld vanaf nu bij elke nieuwe signal
8. **Feature-registry**: toggle actief/inactief + feature-request veldje op dashboard
9. **Signal-feedback UI**: per-mail link `[📝]`, 3-knops oordeel + concerns + organisch pulldown-library
10. **Daytrade switch**: 5m/15m via Flask-knop, SSH'ed flag-file op EC2

### Open items (parked)

- **#8 feature_analysis.py**: analyseer snapshot-features vs outcomes, suggereer thresholds voor auto-filters
- **#9 Nginx public endpoint**: Flask op EC2 met reverse proxy, zodat feedback-links vanaf mobiel ook werken
- **MFE/MAE -inf bug** voor ★★ brutal in avg_MFE/avg_MAE (deling-door-nul of entry=0 ergens)
- **HTF-classifier heroverwegen**: huidige impulse-tier (★★★/★★/★) laat geen edge zien; mogelijk anders definiëren
- **Lose eind: `blurgen@gmail.com` SMTP-sender vervangen door noscosanti volledig in `mail_config.py`** (al deels gedaan)

### Review-cadence

Elke zondag 20:00 (Google Agenda reminder): weekly feedback-review met Claude. Workflow:
1. Jij draait `python3 scripts/quality_stats.py --by-category --extended`
2. Ik haal signal_feedback uit DB, cluster notes, rapporteer concern-tags met statistisch verschil in outcomes
3. Jij approve't welke filter-kandidaten we encoderen
4. Ik encodeer in `detect_divergence()` / `detect_brutal()` met commentaar + datum
5. Documentatie-update onder "Historische beslissingen"