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"