← hub

# STRATEGIA QFL — warianty, mechanika wyjść, optymalizatory (dokument do REVIEW)
**2026-07-16 v2 · Satoshi ⚡ · dla audytu zewnętrznego.** Fakty #948–959, skrypty `faza-siatka/`, raport HTML `monitor/badanie-siatka-qfl.html`, paper: `faza-siatka/paper/`, dashboard publiczny: https://qfl-paper.pages.dev
Cel nadrzędny (#745): zysk PO KOSZTACH na danych NIEWIDZIANYCH, bijący hold-BTC, przeżywający reżimy.

---

## 1. Zdarzenia (triggery) — definicje DOKŁADNE

### 1.1 Crack bazy (QFL) — trigger główny
- **Baza LONG** = ostatni POTWIERDZONY pivot low na 1h: `low[i] == min(low[i−w … i+w])`; potwierdzenie dopiero w barze `i+w` (kauzalność: bot widzi bazę z opóźnieniem w godzin; zero repaintu). `w ∈ {12,24}`. Baza SHORT = lustro na pivot high (opór).
- **Crack** = pierwszy `close` 1h `< baza×(1−crack%)` (long) / `> baza×(1+crack%)` (short) w segmencie życia bazy; po cracku gramy dopiero od NOWEJ potwierdzonej bazy (bez zombie-poziomów). `crack ∈ {1,2,3}%`.
- Dedup: max 1 zdarzenie / dzień / (moneta, strona, w, crack). Live: max 1 OTWARTA pozycja / (wariant, moneta).
- Implementacje: backtest `s2q_bases.py` (wektorowa) ≡ live `paper/qfl_paper.py::detect` (inkrementalna, okno 100 barów). **R1 dla audytora: behawioralna zgodność obu.**

### 1.2 Ruch procentowy (trigger pomocniczy, warianty F/G)
- |zwrot z 4 ostatnich barów 1h| ≥ 10%; debounce 1 zdarzenie/dzień/monetę/stronę.

## 2. Wejście i budowa pozycji
- Pozycja **KONTRA** zdarzeniu (long po cracku wsparcia, short po cracku oporu). Uzasadnienie pomiarowe: crack = zdarzenie rewersyjne (tuż po nim rynek statystycznie odbija — S1/S5, 15 mln symulacji pościgu za crackiem dało −0,5…−2,4%/trade).
- **Drabinka kotwiczona do BAZY**: piętra `base×(1 ∓ (f + k·s)/100)`, k=0…L−1. Zwycięskie: f=5–6% (pierwsze piętro GŁĘBOKO pod bazą — czekamy na prawdziwą panikę), s=3%, L=5.
- Piętro „nad" ceną w chwili zdarzenia = fill natychmiast po close zdarzenia (taker); pozostałe = spoczywające limity (maker) — fill **wyłącznie przy PRZEBICIU** poziomu (strict: `low < level` dla long).
- Samoskalowanie: wypełnia się średnio 19–31% pięter — płytka panika = mała pozycja, kapitulacja = duża pozycja po świetnych cenach. Zero prognozowania rozmiaru.
- Rozmiar: `notional = min(slot, cap_monety) × (wypełnione_piętra / L)`; slot = 4×kapitał/40 = 1 000 USDT; cap z krzywej pojemności S6 (10% głębokości książki @25 bps, p25, ×0,82 panika).

## 3. WYJŚCIA — pełny cykl życia pozycji (przykład liczbowy)
Przykład: long, baza 24h = 100,00; crack 2% (close < 98). Drabinka f=6/s=3/L=5: **94,00 · 91,18 · 88,36 · 85,54 · 82,72**. Panika schodzi do 90 → wypełnione 2 piętra → śr. wejścia **92,59**, rozmiar 2/5 slotu.

Cztery wyjścia, sprawdzane co 5 minut na DOMKNIĘTEJ świecy, w tej kolejności (od najgorszego — konserwatywnie):
1. **STOP-LOSS −8% (agregat, taker+slippage):** jeśli cena adwersyjna ≤ śr.wejścia×0,92 (tu: 85,18) → zamknięcie CAŁEJ pozycji po 85,18. Jedyne wyjście, które przeżyło test monet-trupów — twardy sufit straty na trade.
2. **TAKE-PROFIT pod złamaną bazą (maker):** limit na `base×(1−tpδ)`, tpδ=0,5–1% (tu: 99,00). Logika: złamane wsparcie działa potem jak opór — celujemy TUŻ PRZED nim, nie w niego. Fill gdy `high > 99,00`. Zysk: 92,59 → 99,00 = **+6,9%** na wypełnionym notional. To jest wyjście główne (~83–86% trade'ów kończy tu lub na trailingu z zyskiem).
3. **TRAILING 1% (taker):** od momentu wejścia w zysk śledzimy najlepszą cenę; jeśli close cofnie się o ≥1% od szczytu ORAZ pozycja nadal w zysku → zamykamy po close. Chroni zysk, gdy odbicie gaśnie poniżej TP (np. szczyt 97,5 → wyjście ~96,5 = +4,2% zamiast czekania na 99 które nie przyjdzie).
4. **TIME-STOP 72h (taker):** cokolwiek żyje po 3 dobach — zamknięte po bieżącym close. Teza strategii to SZYBKIE odbicie; po 72h teza jest sfalsyfikowana, kapitał wraca do puli. Zero pozycji-zombie.
Reguły intra-bar (przeciw optymizmowi świec, #864): SL sprawdzany PRZED TP w tej samej świecy (świeca łapie oba → liczymy gorszy); TP i trailing NIE odpalają w świecy, w której była dokładka (kolejność wewnątrz świecy nieznana).
Po zamknięciu: PnL = kierunek×(wyjście/średnia−1) − prowizje (maker 0,015% / taker 0,065% z poślizgiem) ± funding pro-rata (long płaci, short zbiera ~8,7% APY); cooldown wariantu na monecie (0 lub 2 dni). **Drabinka bez ŻADNEGO fillu przez 72h → anulowana** (koszt zero).
Wyjątek F/G: TP = +3% od ŚREDNIEJ wejścia (nie od bazy — tam nie ma bazy), reszta wyjść identyczna.

## 4. Portfel (paper = 1:1 z walk-forwardem)
Per wariant: wirtualne 10 000 USDT · 40 slotów · dźwignia 4× („więcej pozycji, nie większe") · 1 pozycja/monetę · bezpiecznik **−6%/dzień** (nowe wejścia wstrzymane do końca dnia) · księgowość stałego kapitału (bez reinwestycji — składanie bez limitu pojemności = miraż, wykryty i odrzucony) · uniwersum: top-250 perpów COIN wg wolumenu (bez tokenizowanych akcji/ETF).

## 5. WARIANTY — jak działa każdy, po ludzku
- **A — samooptymalizowany (store):** jak B, ale parametry (f, tpδ, w, crack) per GRUPA płynności monety, wybierane przez optymalizator i odświeżane automatycznie. Hipoteza: adaptacja > sztywne parametry (+335% vs +328% w backteście).
- **B — globalny zwycięzca (baseline):** long: bazy 24h, crack 2%, drabinka od −6% co 3%×5, TP 1% pod bazą; short: crack 3%, f=5%. Parametry z ostatniego okna walk-forwardu — zamrożone.
- **C — B z cooldownem 2 dni:** po zamknięciu pozycji moneta odpoczywa 2 dni. Kosztuje ~15 p.p./rok zwrotu, ale ścina maxDD z 16 do 12,4 pkt. Test: czy spokojniejszy profil wart jest ceny.
- **D — płytsza drabinka (f=3%):** pierwsze piętro bliżej bazy → więcej trade'ów (fill łatwiejszy), niższy zysk/trade. Test kompromisu częstość↔jakość.
- **E — TP dokładnie na bazie (tpδ=0,1%):** kanoniczny QFL celuje w sam poziom. Backtest mówi „tuż pod" wygrywa; E to kontrola, czy live to potwierdzi.
- **F — kontra-krach %-move (long):** trigger bez bazy: spadek ≥10% w 4h → drabinka 3 pięter co 2% od ceny zdarzenia, TP +3% od średniej. Niezależne źródło sygnału (walidacja rodziny poza mechaniką baz).
- **G — fade-pompa %-move (short):** lustro F: wzrost ≥10%/4h → short. Testuje stronę euforii.
Wspólne: sekcje 3–4. Werdykt turnieju po ≥4 tyg.: zysk netto, maxDD, **zbieżność z backtestem** (fill-rate i zysk/trade w paśmie ±30%).

## 6. OPTYMALIZATORY — architektura (dwa daemony + bramkarz zbieżności)
```
[fapi Binance] → (co 1h) s8_incremental → świeże klines 1h/5m (790+ monet)
      │
      ▼  (po każdych 24h nowych danych)
s2q_bases → s3_trades_full → s7_percoin_optimizer(+histereza 5%) → s7_config_store.parquet
      │                                                                  │ (mtime)
      ▼                                                                  ▼
optimizer_daemon.py  ──(co 10 min: kontrola zbieżności 7d)──▶   qfl_paper.py (trader, 7 portfeli)
      │                                                                  │
      ▼ optimizer-qfl.json                                               ▼ paper-qfl.json
   [dashboard :8101 + Cloudflare Pages (deploy co 1h)]
```
1. **Funkcja celu:** `score(θ) = mean_net(train) − 0,5·|p5_net(train)|` (średnia z karą za lewy ogon). Progi wiarygodności: moneta ≥100 trade'ów, tier ≥300, global ≥200 — poniżej progu fallback wyżej (hierarchia coin→tier→global; dziś dane wystarczają na tier).
2. **Walk-forward:** selekcja ZAWSZE na oknie train 365 d; werdykty na oddzielnym teście (w backtestach 22 foldy 2021–26; w live: ostatnie 365 d → parametry na przód).
3. **Histereza 5% (anty-churn):** nowy config zastępuje obecny TYLKO, gdy jego score na wspólnym oknie train jest ≥5% lepszy. Bez tego optymalizator „miota" ustawieniami od szumu; z tym — zmienia je tylko na dowód.
4. **Kontrola zbieżności (bramkarz):** co 10 min porównanie rolling-7d papera z referencją backtestu per wariant (zysk/trade ±1 p.p., trafność ±20 p.p., min 30 trade'ów) → status `ok / DIVERGENCE-NET / DIVERGENCE-WIN` w `optimizer-qfl.json`. Rozjazd = sygnał „backtest kłamie albo rynek się zmienił" — eskalacja do przeglądu, nie automatyczne kręcenie parametrami.
5. **Anty-overfit:** twarde progi n; werdykt wyłącznie OOS; liczba testowanych konfiguracji logowana (multiple testing); zdarzenia klastrują się w dniach — uczciwa próba to dni.
6. **Model egzekucji (#864):** fill limitu tylko przy przebiciu; SL przed TP; TP/trailing nie w świecy dokładki; wyjścia przymusowe taker+slippage; w wynikach referencyjnych stress +10/+25 pb.

## 7. Wyniki referencyjne (szczegóły: raport HTML + RESULTS-*.md)
Walk-forward V2: **+328%/rok stały kapitał, 22/22 foldów bije BTC, 22/22 dodatnie**, maxDD 16 pkt, worst-day −6,6%. Stress 25 pb: +252%. Pojemność: 246%/rok @2,5k USDT → sufit ~204k USDT/rok. Bramki zaliczone: trupy (264 delisted), walk-forward, pojemność. Odrzucone pomiarem: piramida-za-zyskiem (−0,31%), pościg za crackiem (−0,5…−2,4%), wybicie-% na dniach (−0,65%), duet DCA+piramida (+66% vs +111% czystego DCA).

## 8. Znane ograniczenia (dla audytora — tu bijcie)
1. Świece 5 m ≠ książka zleceń → VenueSim replay przed micro-live. 2. Pojemność mierzona na głębokości Binance; egzekucja docelowo HL (cieńsze książki, ~200 monet) → pomiar HL w burn-inie. 3. MC bootstrap iid zaniża ogony (brak dnia COVID w próbie). 4. Referencja zbieżności (0,65%/83%) wspólna dla wariantów QFL — F/G mają inny profil (do rozdzielenia po 2 tyg. danych). 5. Live otwiera drabinkę na close 1h; backtest od 1. bara 5 m po close — drobna różnica timingu. 6. Funding uproszczony do stałej 8,7% APY. 7. Uniwersum live top-250 vs backtest 790 (rozszerzenie po burn-inie). 8. Delisted bez capów wykluczone z krzywej pojemności (konserwatywnie).

## 9. Pytania do review
R1: zgodność detektora live vs backtest (behawioralnie, na wspólnym okresie)? R2: funkcja celu z karą 0,5·|p5| vs CVaR/Calmar? R3: progi n (100/300/200) przy 4,4 tys. testowanych θ — wystarczające? R4: partycypacja 10% książki dla drabinek limitowych w panice — konserwatywna? R5: pasma zbieżności (±1 p.p. / ±20 p.p. / 30 trade'ów) — właściwie skalibrowane? R6: co pominęliśmy w drodze paper→micro-live?