svg_candles: serie continua, panou de volum, medii mobile, etichete ancorate

Userul a cerut ca diagramele de pret sa arate ca un grafic real (TradingView):
linie continua de pret si volum, ca sa se vada trendul. Candelele izolate cu
spatii mari nu spun nimic despre trend.

Adaugat in svg_candles.py:
- from_closes() / walk(): serii continue, open = close-ul barei anterioare,
  cu structura controlata exact din close-uri
- panou de volum (vol_h), bare colorate pe directia candelei
- MA: medii mobile calculate din close-uri
- Mark: etichete ancorate pe candele anume (la 30 de bare, tag-urile per
  candela se suprapun)
- title, Level.label_at
- selftest extins: volum proportional, serie fara goluri, structura pastrata

STYLE.md: regula noua, cu cele doua stiluri (serie de 25-45 de bare pentru
orice grafic de pret; stilul vechi de 3-6 candele doar pentru definitii de
pattern-uri de o candela) si obligatia de assert in generator.

gen/exemplu_grafic_real.py: referinta de copiat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MtSTyTmt6AbCL9j5ajEDm1
This commit is contained in:
Claude Agent
2026-09-13 07:46:00 +00:00
parent a1c78c1d08
commit 6b2d9eb1e5
4 changed files with 389 additions and 145 deletions

View File

@@ -110,6 +110,38 @@ Verificare automată de pus în orice pagină cu trade-uri: pentru fiecare
diagramă cu trei niveluri (SL / intrare / TP), raportul dintre distanțele în
preț trebuie să fie identic cu raportul dintre distanțele în pixeli.
## Cum trebuie să arate un grafic de preț (cerut de user, 2026-09-13)
Userul citește diagramele ca să vadă **trendul** și să facă analogie cu un
grafic real din TradingView. Candelele izolate, cu spații mari între ele, nu
arată ca un grafic și nu-i spun nimic despre trend. Deci:
**Orice diagramă care arată preț sau volum se desenează ca serie continuă:**
- **25-45 de candele**, lipite (`gap=15-18`, `body_w=9-10`), nu 3-6 candele
izolate. Pattern-ul trebuie să aibă context în stânga și în dreapta lui.
- **Open-ul fiecărei bare = close-ul barei anterioare.** Folosește
`from_closes(...)` (definești close-urile, deci controlezi exact structura)
sau `walk(...)`. Fără goluri artificiale între bare.
- **Panou de volum dedesubt** (`vol_h=70`), cu bare colorate pe direcția
candelei, de fiecare dată când textul vorbește despre volum.
- **Medie mobilă** (`mas=[MA(20, ...)]`) când textul vorbește despre trend
sau despre SMA — se calculează singură din close-uri.
- **Etichetele se ancorează pe candele** cu `marks=[Mark(i, ...)]`, nu cu
`tag` per candelă: la 30 de bare, etichetele per candelă se suprapun.
- `title="SIMBOL — timeframe"` sus, ca pe un chart real.
Stilul vechi (3-6 candele, `gap=92`) rămâne valabil **doar** pentru
definiții de pattern-uri de o candelă (ce e un marubozu, ce e un doji),
unde contează forma barei, nu trendul.
**Verificare obligatorie în generator:** după ce construiești seria, extrage
din ea nivelurile pe care le afirmi în text (`min(c.l for c in cds[a:b])`) și
pune `assert` că se potrivesc — ex. că al doilea picior chiar e mai jos decât
primul, că intrarea e egală cu close-ul ultimei bare, că R-ul din etichetă e
cel calculat. Ochiul nu prinde o structură care contrazice eticheta; calculul
da. (Găsit ca bug real de agenții de verificare, 13.09.2026: o intrare short
descrisă „sub low-ul barei de retest", desenată deasupra lui.)
## Diagrame (obligatorii, nu opționale — userul e vizual learner)
- **Orice paragraf "Exemplu real" cu cifre concrete are nevoie de propria
diagramă chiar acolo, lipită de text** — nu doar undeva mai jos în fișier,