SPEC DIAGRAMĂ — buy_doji_perechi_tf ==================================== tip: PRET (trei rânduri, câte două grafice pe rând, legate prin lupă) destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 2 („Alegi perechea…") cheie markdown: generator: gen/strategii/buy_doji_perechi_tf.py titlu SVG: „Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mari" stil: STYLE.md §„Cum trebuie să arate un grafic de preț": candele lipite (gap 15, body_w 9), fără volum, open = close-ul precedentului. Un singur SVG, 3 rânduri stivuite vertical (lățime 720, mobil). Scară proprie pe fiecare panou, dar UNA singură în interiorul lui. CE S-A SCHIMBAT (20.09.2026, runda 2 — după verificare) -------------------------------------------------------- 1. STOPUL respectă regula capitolului: cu 5 cenți sub cel mai jos low al ultimelor 4 bare, nu exact pe low-ul doji-ului. Se recalculează riscul, procentele, ținta 1:1 și raportul. Aceeași marjă se aplică și stopului măsurat pe TF-ul mare (aceeași regulă, alt timeframe). 2. Scara graficului mic acoperă intervalul [stop, maximul zonei] cu 6 % aer sus și jos, ca linia de stop să nu mai cadă pe marginea cadrului (se citea ca bordură, iar fitilul doji-ului părea tăiat). Cadrul mic și caseta de lupă încadrează ACELAȘI interval de preț — ghidajele rămân exacte. 3. Eticheta pullback-ului nu mai spune „fără minim nou" (desenul arată minime tot mai joase, deci se contrazicea singură): spune că pullback-ul coboară spre nivel fără să rupă low-ul doji-ului de pe TF-ul mare, „bifa din stânga". Referința NU se desenează pe panoul mic: e cu mult sub scara lui, iar coborând scara ghidajele ar deveni false și s-ar pierde ~jumătate din magnificare. Trăiește pe panoul mare, ca BIFĂ — o linie scurtă punctată („2 3", #555) de la marginea din stânga a graficului până exact la low-ul doji-ului mare, SUB paranteza de stop, nu în interiorul ei — plus un rând sub grafic: „bifa de sub doji =
", „intrare", „retest: high doji ", „stop" (pe rândul A, plus „5 cenți sub minimul ultimelor 4 bare"). Pe graficul mare, în plus: bifa low-ului doji-ului mare + rândul explicativ de sub grafic (vezi „runda 2", punctul 3). Cifra „8 candele" din eticheta pullback-ului vine din PULLBACK_N, nu din degete; dacă se schimbă numărul de bare, se schimbă și eticheta. Doar pe rândul A: paranteză de stop pe TF-ul mare („stop 4,81 %", eticheta DEDESUBT, ca să nu înghită eticheta nivelului) și pe cel mic („stop 1,18 %", într-un gol dintre candele), cu o săgeată roșie între ele: „același setup, stop de 4,1 ori mai mic → de 4,1 ori mai multe acțiuni la același risc". Raportul se calculează, nu se scrie. Doar pe rândul C, sub grafic: „(șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate — ultima bară a zilei e de 30 min)". Restul cifrelor (praguri, „8 candele" pe fiecare pereche, cât ții) stau în tabelul din capitol, nu în SVG: diagrama nu repetă tabelul. ASSERT-URI OBLIGATORII ÎN GENERATOR ----------------------------------- Pe fiecare rând (A, B, C), pe seriile calculate: 1. Fiecare bară: h >= max(o,c) și l <= min(o,c); open[i] == close[i-1] (pe fiecare grafic separat, inclusiv peste joncțiunea BASE→lupă). 2. GRANIȚELE candelelor mari peste poveste (NU refacerea agregării: `zoom` vine chiar din `aggregate`, deci un assert care o recalculează nu poate pica). Peste câte candele mari se întinde pullback-ul (2, pe toate trei perechile — deci NU încape într-una singură) și în a câta candelă mare cade doji-ul mic (A: 1, B: 2, C: 1); low-ul acelei candele mari e chiar low-ul doji-ului mic. 3. len(fine) == k * nz; open fine[0] == close-ul confirmării mari. 4. Doji mare (BASE 6) și doji mic (fine 8): abs(o-c) <= 0.10*(h-l). 5. Confirmări: close BASE[7] > high BASE[6]; close fine[9] > high fine[8]. 6. min(l for fine 6..9) == low fine[8] == minimul zonei mărite; SL == acel minim − 0,05 (marja de 5 cenți). La fel pe TF-ul mare: b_SL == low-ul doji-ului mare − 0,05. 7. risc == intrare - SL; TP1 == intrare + risc; primul i>9 cu high >= TP1 e 11. 8. Pullback: fine[0].close > fine[7].close (coboară) ȘI min(low 0..7) > low-ul dojiului mare (referința pe care nu are voie s-o rupă). 9. Extremele zonei mărite == extremele candelelor mari mărite. 10. abs(low fine[8] - high doji mare) / high doji mare <= 0.005. 11. Raportul pixeli SL-intrare / intrare-TP1 == 1 pe fiecare grafic mic; linia de stop e la > 6 px de marginea de jos a cadrului și sub minimul barelor; paranteza de stop nu atinge nicio candelă. 12. 3,9 <= stop% pe TF mare / stop% pe TF mic <= 4,5. 13. Conectorul nivelului comun stă la > 10 px de ambele ghidaje, iar numărul lui apare EXACT o dată, între caseta de lupă și cadrul mic (în cot). 13. Valorile din „VALORI CARE REZULTĂ", egale la 2 zecimale. 14. PANOURI. Nicio etichetă din dreapta (x >= FRAME_L-20) nu conține un preț al TF-ului mare, nicio etichetă din stânga nu conține unul al TF-ului mic. **Excepție explicită: NIVELURILE COMUNE** (setul COMUNE = {dh, conf}). Ele sunt scoase din ambele seturi de interdicție (după VALOARE, nu după cheie: b_entry are aceeași valoare ca conf) ȘI au assert propriu: dh trebuie să apară pe AMBELE panouri cu același format, conf exact o dată, în cotul conectorului. O scutire fără assert ar permite ca nivelul să dispară de pe un panou sau să apară cu alt număr. 15. Fiecare text încape în viewBox și nicio pereche de texte nu se suprapune (aceeași regulă ca audit_diagrams.py: |Δy| < 13 și suprapunere pe x). SURSA ----- - Rolurile TF: weekly/monthly = direcția; daily = trigger de swing; 60 min doar în direcția swing-ului de pe daily: summaries/08_ANALIZA_ZILNICA/01_buy_doji_si_strategia_mici.md:32-40. - Pullback-ul la high-ul dojiului ca retest ideal (MICI weekly): triaj/DECIZII.md:118 (citat în summaries/17_STRATEGII/A3_intrarea.md:245-246). - Stopul se numără pe TF-ul deciziei: summaries/09_QA/20_2025-08-25.md:9-15. - Perechile swing/position (60×daily, daily×weekly, weekly×monthly): summaries/03_MODUL_2/14_strategia_1_m2d.md:461-466 (M2D, corelație). - Seria e CONSTRUITĂ. Succesiunea „buy doji pe TF mare → buy doji pe TF mic la pullback" e completarea capitolului, nu o procedură rostită în curs.