diff --git a/gen/radarscreen_5_stele.md.in b/gen/radarscreen_5_stele.md.in
new file mode 100644
index 0000000..259a946
--- /dev/null
+++ b/gen/radarscreen_5_stele.md.in
@@ -0,0 +1,438 @@
+# Modul 5 / #1 — RadarScreen: cum găsești tranzacțiile de 5 stele
+
+## TLDR
+RadarScreen e al treilea scanner din TradeStation (lângă scannerul clasic și
+Hot List), iar lecția asta îl încarcă cu indicatorii personalizați ATM. Ideea
+centrală: **un rând din tabel = un grafic întreg**, deci poți citi 500 de
+companii fără să deschizi niciun chart. Sistemul de stele vine din indicatorul
+**Trinity** (relative strength + power + volum): când toți trei arată în
+aceeași direcție ai **3 stele**; peste ele adaugi **trigger-e** (bull/bear
+reversal, buy/sell doji, buy/sell momentum) și **locul** (suport, pivot,
+rezistență) — așa ajungi la 5 stele, iar cu o divergență în plus cursul
+numește situația „aproape șapte stele". Regula care închide totul: trigger-ul
+clipocește **în timpul formării candelei**, dar nu intri până candela nu s-a
+închis.
+
+Lecția e un tutorial de unealtă, nu o strategie completă: cursul spune explicit
+că strategiile pe RadarScreen vin într-un material următor. Pentru mecanica
+trigger-elor, capitolele dedicate sunt
+[Bull/Bear Reversal în scaner](../04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md),
+[Determinarea trend-ului](../03_MODUL_2/07_determinare_trend.md) și
+[Buy Doji](../17_STRATEGII/01_buy_doji.md).
+
+## Mini-glosar
+- **RadarScreen** — tabel în care fiecare rând e un simbol, cu coloane care
+ sunt indicatori calculați pe un timeframe ales. Un rând are exact aceleași
+ date ca un grafic, doar că scrise ca numere.
+- **Board** — un workspace de RadarScreen gata făcut, primit de la autorul
+ cursului. Lecția folosește două: board-ul de 60 de minute și board-ul daily.
+- **Trinity** — indicatorul care pune cap la cap cei trei indicatori
+ personalizați ai cursului (relative strength, power, volum) și le dă un
+ verdict comun, afișat ca număr de stele.
+- **Cadran** — relative strength și power sunt citiți pe 4 cadrane:
+ 1 = supraperformanță, 2 = se îmbunătățește, 3 = a fost bun și se
+ înrăutățește, 4 = subperformanță.
+- **A+ / A− / D+ / D−** — cele patru stări ale indicatorului de volum
+ personalizat: acumulare pozitivă (histograma deasupra liniei de 0),
+ acumulare negativă (sub linia de 0, dar în urcare), și simetric distribuția.
+- **Bull reversal** — prima candelă care se închide **peste high-ul** candelei
+ precedente. Bear reversal e oglinda: închidere **sub low-ul** precedentei.
+- **Buy doji / sell doji** — doji (open și close aproape identice) apărut la un
+ suport, respectiv la o rezistență; coloana HDTR îl aprinde.
+- **Buy / sell momentum** — semnalul indicatorului propriu care marchează cu o
+ săgeată momentul în care prețul trece cu forță printr-un nivel vechi. Buy
+ momentum = săgeată verde, sell momentum = săgeată galbenă.
+- **RVol (relative volume)** — volumul ultimei bare raportat la media
+ ultimelor 10 bare, în procente. 167% = cu 67% peste medie.
+- **Range** — înălțimea candelei (high minus low) raportată la media
+ înălțimilor ultimelor trei candele, în procente.
+- **Off high (% of high)** — unde stă ultimul preț față de maximul zilei.
+- **RR (risk reward)** — unde stă prețul între suport și rezistență.
+- **Ld (loaded)** — coloana care confirmă că datele s-au încărcat. Orice
+ altceva decât „Ld" înseamnă eroare de încărcare.
+
+## Un rând = un grafic
+Asta e tot avantajul uneltei. În loc să deschizi 500 de grafice ca să vezi
+cine stă lângă suport cu volum în creștere, te uiți la 500 de rânduri. Cursul
+insistă pe faptul că poți face tabelul mare, fără niciun chart în față, și tot
+iei decizia: „dintr-o singură privire, deja fără să văd graficul".
+
+
+
+Pe board-ul de 60 de minute, coloanele arată 60 de minute — plus câteva
+coloane care îți arată, în paralel, ce face daily-ul. Asta e a doua idee tare
+a lecției: **vezi două timeframe-uri în același rând**, fără să schimbi
+graficul.
+
+## Sistemul de stele: ce înseamnă 3, 5 și „aproape 7"
+Cele 3 stele nu sunt o notă de calitate dată de om — sunt strict cei trei
+indicatori Trinity care arată în aceeași direcție. Trei stele scrise cu negru
+pe fond verde = toți trei pozitivi; „3−" (trei în paranteză, pe fond roșu) =
+toți trei negativi. Peste cele trei stele se adună confirmările, fiecare un
+motiv independent să crezi în mișcare.
+
+
+
+Enumerarea e a cursului, cuvânt cu cuvânt ca listă: „am un bull reversal, am
+un buy momentum, sunt la un support sau la un pivot și poate am și o
+divergență bull, asta înseamnă aproape șapte stele". Deci numărătoarea e
+intenționat relaxată — ideea de fond e că **mai multe semnale în aceeași
+direcție, pe aceeași candelă, înseamnă probabilitate mai mare**, nu că există
+un barem oficial de 5.
+
+**Completare proprie:** folosește stelele ca filtru de listă, nu ca mărime de
+poziție. Trei stele îți spune că fundalul (volum, performanță relativă,
+momentum) nu lucrează împotriva ta; trigger-ul îți dă momentul; locul îți dă
+stopul. Dacă îți lipsește locul, nu ai de unde să calculezi riscul, oricâte
+stele ai.
+
+## Pasul 1 — Încarci lista și accepți limita de simboluri
+**Deschizi board-ul primit, mergi la Data → Add Symbol List și adaugi
+companiile din S&P 500.** Apoi îl lași să încarce; viteza depinde de
+procesorul tău.
+
+Limita practică: **400-500 de simboluri** cu indicatorii personalizați
+încărcați, pentru că ei au nevoie de istoric de date. Fără indicatori care cer
+istoric, RadarScreen-ul duce vreo 2000 de simboluri; universul întreg, de
+circa 13.000 de acțiuni, nu se poate scana aici (pentru asta ai scannerul
+clasic). Dacă depășești pragul, pe coloana Trinity apare `E` — *History Limit
+Exceeded*. Remediul arătat în lecție: ștergi indicatorul, îl adaugi din nou de
+pe plus (Trinity V1 ATM), îl muți cu Move Up / Move Down în fața lui Trend and
+Triggers, iar dacă eroarea persistă reîncarci lista de simboluri.
+
+Două setări care te scutesc de confuzie mai târziu:
+
+- click dreapta pe tabel → Settings → General → bifează **Reference Rows**, ca
+ să vezi numărul rândului în fața simbolului;
+- coloana **Ld** trebuie să scrie „Ld" (loaded). Orice altceva = eroare de
+ încărcare.
+
+Capcana de început: dacă pe coloana de pivot nu apare nicio valoare (celulă
+neagră), **datele nu s-au încărcat** — și atunci coloanele de distanță scot
+aberații, de genul 200% față de suport sau 40% față de rezistență. Verifici în
+View → Messages → Download Schedule, unde vezi coada de simboluri; te asiguri
+că prioritatea e **ASAP** (pe simbolurile selectate: click dreapta → schedule
+ASAP) și lași platforma deschisă o oră-două. Dacă o deschizi zilnic, problema
+apare doar prima dată.
+
+Încă două lucruri de ritm, din lecție: nu folosești RadarScreen-ul **în timp
+ce rulează scannerele** (riști erori de memorie), iar indicatorul de *next
+earnings date* încarcă încet — în lecție board-ul daily s-a încărcat vizibil
+mai repede după ce a fost scos, și a fost adăugat la final. Când e pe ecran,
+arată ora publicării și câte zile mai sunt, iar sub 5 zile colorează celula
+portocaliu.
+
+**Treci mai departe doar dacă** pe coloana de pivot apar valori și pe Ld scrie
+„Ld" — altfel citești cifre inventate de o încărcare incompletă.
+
+## Pasul 2 — Citești coloanele de context
+**Înainte de orice semnal, te uiți unde stă prețul în ziua lui și dacă e
+susținut de volum.** Patru coloane, în ordinea din tabel:
+
+- **Off high (% of high)** — unde e ultimul preț față de maximul zilei.
+ Parametrul din lecție e 0,05%: sub el, celula se colorează roșu (preț căzut
+ mult față de maximul zilei), iar albastru deschis înseamnă aproape de maxim.
+ Motivul pentru care contează: dacă prețul stă aproape de maximul zilei spre
+ închidere, traderii cu bani au reușit să-l ducă acolo și au interesul să-l
+ ducă mai departe — șansele de continuare în ziua următoare cresc. Simetric
+ pentru închiderea lângă minimul zilei. Cursul spune explicit că nu se
+ întâmplă de fiecare dată.
+- **Net change** — cât la sută a urcat sau a scăzut prețul față de închiderea
+ zilei precedente (exemplul din lecție: 5,03%).
+- **Range** — înălțimea candelei curente ca procent din media ultimelor trei
+ candele. Peste 100% înseamnă volatilitate peste normal; în lecție, pe WBD
+ (Warner Bros), o candelă verde plină de bull reversal arată **122%**.
+- **RVol** — volumul ultimei bare față de media ultimelor 10 (input 10). Pe
+ același WBD: **167%**, adică volum cu 67% peste medie. Range mare *plus*
+ volum mare = mișcarea are susținere, nu e doar un fitil.
+
+
+
+Lângă RVol pe 60 de minute, board-ul are și **Daily Volume** — relative volume
+calculat pe daily, deși tu stai pe 60 de minute. Exemplul din lecție: medie
+24,19 față de volum curent 26,74 (adică 24 de milioane față de 26 de
+milioane), deci **110%**. Parametrii: lungime 10 candele, threshold 1,2 — peste
+100% celula devine albastră, peste 120% devine aurie.
+
+Filtrarea se face din bara de sus: alegi coloana, apoi condiția. Atenție la
+unitate — în lecție filtrul a trebuit scris **120**, nu 1,2, ca să prindă
+„peste 120%"; cu el pus, au rămas 388 de companii din cele 503.
+
+**Treci mai departe doar dacă** mișcarea are și range și volum peste medie.
+Altfel ai o candelă subțire care arată bine în tabel și nu ține în piață.
+
+## Pasul 3 — Trinity: cele trei stele de bază
+**Te uiți la cele șase coloane Trinity: cadranul și vechimea lui, pentru
+fiecare dintre cei trei indicatori.** Fiecare pereche de coloane spune „în ce
+stare e" și „de câte candele".
+
+- **Relative strength** — cadranele 1-4 (1 supraperformanță, 2 îmbunătățire,
+ 3 înrăutățire după supraperformanță, 4 subperformanță), plus de câte candele
+ e în cadranul ăla. Exemplul verificat în lecție: ABT, cadranul 1 de 7
+ candele, confirmat prin numărare pe graficul de 60 de minute.
+- **Power** — aceleași 4 cadrane și același contor. Exemplu: ABNB (Airbnb),
+ cadranul 3, de o candelă.
+- **Volum (indicatorul propriu)** — A+ / A− / D+ / D−, plus de câte candele e
+ deasupra sau sub linia de 0 (verde = deasupra, roșu = sub). Exemplu: AAPL,
+ acumulare negativă — sub linia de 0, dar în urcare — de 29 de candele.
+
+Ordinea de importanță dată explicit în lecție: **volum, apoi relative
+strength, apoi power**. Ordinea de sensibilitate e alta: **power reacționează
+primul**. Practic, power îți dă semnalul devreme, volumul îți dă verdictul.
+
+
+
+Cele două exemple de citire, din lecție:
+
+- **AAPL — 3 stele:** relative strength în îmbunătățire, power în cadranul 1,
+ volum în acumulare negativă. Negativ, dar **acumulare** — toți trei arată în
+ aceeași direcție, deci trei stele.
+- **ABV — 3 stele cu minus:** relative strength în cadranul 3, power în
+ cadranul 4, volum în distribuție negativă (sub linia de 0 și în scădere).
+
+Observă ce face Apple-ul aici: valoarea absolută e negativă, dar **direcția** e
+pozitivă. Trinity numără direcția, nu semnul.
+
+**Treci mai departe doar dacă** ai 3 stele în direcția în care vrei să intri.
+Cu Trinity împărțit (doi pozitivi, unul negativ) lipsește exact motivul pentru
+care ai pus indicatorii pe ecran.
+
+## Pasul 4 — Trigger-ele: de la 3 stele la 5
+**Cauți pe rând coloanele de trigger: reversal, HDTR (doji) și MTGR
+(momentum).** Fiecare e un motiv în plus, iar ele se pot aprinde pe aceeași
+candelă.
+
+### Bull reversal — DA și NU
+Bull reversal = prima candelă care închide **peste high-ul** candelei
+precedente. Exemplul din lecție e ABNB, pe 60 de minute: „s-a închis deasupra
+high-ului acestei candele".
+
+
+
+Capcana e o candelă verde care urcă, dar nu depășește high-ul precedent — arată
+aproape identic la prima vedere și nu e trigger:
+
+
+
+### Bear reversal
+Oglinda: prima candelă care închide **sub low-ul** precedentei. În tabel sunt
+două nuanțe de roșu, iar bull reversal-ul are două nuanțe de verde/turcoaz.
+NU-ul e simetric cu cel de mai sus: o candelă roșie care rămâne peste low-ul
+precedent nu aprinde coloana.
+
+
+
+### Buy doji / sell doji (coloana HDTR)
+HDTR = *hammer and doji trigger*. Cursul spune că trigger-ul de **buy hammer**
+e pe listă, dar **încă nu e implementat** — deocamdată coloana dă doar buy doji
+(verde, long) și sell doji (roșu, short). Exemplele din lecție: CHD pentru buy
+doji, AMT pentru sell doji, ambele pe 60 de minute.
+
+
+
+Important, și e **completarea mea** peste lecție: coloana se aprinde pe
+**doji** — adică pe setup, nu pe intrare. Procedura din
+[Buy Doji](../17_STRATEGII/01_buy_doji.md) cere o închidere peste high-ul
+doji-ului, în maximum 3 candele, ca să intri. Doji-ul singur spune doar că
+scăderea a făcut o pauză.
+
+
+
+### Buy / sell momentum (coloana MTGR)
+Buy momentum e săgeata verde, sell momentum săgeata galbenă. Nuanța utilă din
+lecție: **buy momentum îți arată și schimbarea de trend** — pe COP
+(ConocoPhillips) clipoceau simultan trei coloane: MTGR, coloana de trend
+(trecut în ascendent) și numărul de candele de trend.
+
+
+
+
+
+### Mai multe trigger-e pe aceeași candelă
+Exemplele din lecție, în ordine crescătoare de forță: ABT cu sell doji și sell
+momentum (două); GM cu bear reversal și sell momentum pe 60 de minute, cu bull
+flag pe daily; MDT (Medtronic) cu **bear reversal, sell doji și sell momentum
+pe aceeași candelă** — trei. Formularea cursului: „cu cât sunt mai multe
+trigger-e pe o candelă, cu atât avantajul tău este mai mare". Cursul promite un
+material separat despre care trigger-e au probabilitate mare și care medie —
+deci **ierarhia între ele nu e dată aici**.
+
+**Treci mai departe doar dacă** ai cel puțin un trigger în direcția celor 3
+stele. Trinity fără trigger e context, nu semnal.
+
+## Pasul 5 — Locul: suport, pivot, rezistență, risk/reward
+**Te uiți cât de departe e prețul de suport, pivot și rezistență, și pe ce
+parte a pivotului stai.** Astea sunt coloanele care îți dau stopul și ținta.
+
+Pe board-ul de 60 de minute, indicatorul de trend și trigger-e lucrează cu
+`pivot interval 2` = **pivoți weekly**, iar pragul de proximitate recomandat
+intraday e **0,5%**. Pe board-ul daily, cursul recomandă **2%**, pentru că te
+uiți pe un timeframe mai mare. Celula clipocește când intri în prag.
+
+Coloana de pivot îți spune și pe ce parte ești, prin culoare:
+
+
+
+Exemplele din lecție: **WYNN** (Wynn Resorts) la **0,16%** de suportul weekly,
+sub pivot, deci celula pivotului roșie; **XEL** (Xcel Energy) cu pivotul sub
+preț, deci verde; **ZBRA** la **9,92%** de suport, adică departe de orice
+decizie. Regula de interpretare dată de curs: preț deasupra pivotului =
+„destul de strong bull", căzut sub pivot = „cam strong bear".
+
+Coloana **RR** măsoară unde stai între suport și rezistență. O valoare mare
+(exemplul din lecție: 23) înseamnă aproape de suport și departe de rezistență;
+o valoare mică înseamnă invers, aproape de rezistență și departe de suport.
+Pentru long, mare e bine; pentru short, mic.
+
+**Treci mai departe doar dacă** ești în pragul de proximitate (0,5% intraday,
+2% pe daily) față de un nivel. Altfel stopul tău e la 9% distanță, ca la ZBRA,
+și tranzacția nu are cum să fie rentabilă.
+
+## Pasul 6 — Alinierea pe timeframe-uri: cele două board-uri
+**Alegi board-ul după ora la care te uiți.** Cursul e explicit: board-ul de 60
+de minute e pentru intraday, board-ul daily e pentru final de zi, de săptămână
+și de lună.
+
+| Board | Timeframe principal | Ce vezi în plus, în coloane | Pivoți |
+|---|---|---|---|
+| 60 de minute | 60 min | daily (reversal, doji, trend, distanța față de SMA 10/20/50/200) | weekly (interval 2) + monthly (S/R cu 3) |
+| Daily | daily | weekly și monthly (reversal, doji, momentum, trend, număr de candele) | monthly + quarterly (S/R cu 4) |
+
+Detaliile de parametri, din lecție: distanța față de SMA-uri e afișată pe
+board-ul daily cu pragul de **5%** (recomandarea e să-l lași așa, nu 2%), iar
+restul input-urilor nu se umblă. Pe board-ul weekly **nu există** coloană de
+distanță față de SMA-uri — indicatorul se poate pune pe mai multe
+timeframe-uri și nu avea sens să o afișeze; cursul spune că e pe lista de
+update-uri. Pivoții quarterly se pot adăuga, dar costă din limita de
+simboluri, deci nu sunt recomandați.
+
+Graficele de sub tabel: pe board-ul de 60 de minute sunt monthly, weekly,
+daily, 60, 15 și 5 minute; pe board-ul daily, cursul le-a schimbat în 240, 60
+și 15 minute, pentru că privești de pe daily în jos.
+
+Exemplul de aliniere mixtă din lecție (simbolul e pronunțat „RBMB" în
+transcriere și nu se poate identifica sigur): monthly clipocește **buy**, dar
+luna e abia începută, deci semnalul e **în formare, nu încheiat**; weekly e în
+uptrend de 7 candele; daily e în bear de 2 candele și a dat un sell doji.
+
+**Completare proprie — ce faci cu un rând care arată așa:** nu e o tranzacție,
+e o listă de așteptare. Cele trei timeframe-uri spun lucruri diferite pentru că
+măsoară ferestre diferite: monthly abia a început (deci statistic nu înseamnă
+nimic încă), weekly e trendul dominant, iar daily e un pullback de 2 candele
+în interiorul lui. Varianta coerentă cu trendul dominant e să aștepți ca
+daily-ul să termine pullback-ul și să dea un trigger de *buy* în direcția
+weekly-ului. A intra short pe sell doji-ul de pe daily înseamnă să tranzacționezi
+împotriva a două timeframe-uri mai mari.
+
+**Treci mai departe doar dacă** timeframe-ul pe care intri și cel imediat
+superior arată în aceeași direcție.
+
+## Pasul 7 — Intri abia după ce candela s-a închis
+Avantajul RadarScreen-ului e că arată trigger-ele **în timpul formării
+candelei**. Exact de aici vine și capcana, iar cursul o spune direct: „nu
+cumva să intri până ce candela nu s-a finalizat, pentru că dacă ești pe daily,
+tu trebuie să intri la finalul zilei". Un trigger care clipocește la mijlocul
+candelei poate dispărea până la close.
+
+Ce poți face în schimb cu informația care clipocește, din lecție: **sortezi
+după sector**. Dacă într-un sector se aprind multe semnale de buy, banii intră
+în sectorul ăla; dacă în alt sector se aprind multe sell-uri și multe companii
+sunt în downtrend, banii pleacă de acolo. Când intri în direcția sectorului
+dominant, șansele cresc. Aceeași idee la nivel de piață: dacă pe toată lista
+(S&P 500, iar în viitor o listă de 400+ companii din Russell 3000, promisă în
+lecție) predomină buy-urile sau sell-urile, aia îți spune cât de puternică e
+piața — același lucru pe care cursul îl face zilnic în predeschidere, uitându-se
+la câte semnale noi de buy și de sell apar.
+
+## Exemplul complet, long — XOM
+Singurul set de prețuri reale din lecție e cel de pe XOM (Exxon Mobil), citit
+pe graficul daily de pe board-ul de 60 de minute, cu pivoții monthly: suportul
+**S1 = 113.03** (proiecție bull), prețul închis la **115.02**, deci coloana
+arată **1,76%** distanță față de suport; pivotul este afișat la 119 și ceva,
+la **3,92%** deasupra prețului (din cele două cifre rostite rezultă 119.53 —
+asta e valoarea desenată), iar rezistența e la unsprezece și ceva la sută.
+Celula pivotului e roșie, pentru că prețul e sub pivot.
+
+Cursul se oprește la citirea coloanelor. Trigger-ul, stopul și ținta de mai jos
+sunt **completarea mea**, construite pe nivelurile lui reale:
+
+
+
+- **Intrarea 115.02** — close-ul candelei de bull reversal, care e exact
+ prețul rostit în lecție. Intri la close, nu în timpul candelei (Pasul 7).
+- **Stopul 112.20** — sub suportul de 113.03 și sub minimele ultimelor patru
+ candele. Motivul: dacă prețul recoboară acolo, suportul monthly nu a ținut,
+ iar motivul intrării a dispărut. Un stop pus *la* 113.03 ar fi scos de
+ zgomotul normal din jurul nivelului.
+- **Ținta 119.53 (pivotul monthly)** — primul nivel calculat pe care prețul îl
+ întâlnește în sus. Iese 1,60R, adică riști 2.82 ca să câștigi 4.51.
+- **Stelele:** 3 stele Trinity în direcția long + bull reversal + prețul la
+ 1,76% de suport = cinci motive; o divergență bull pe power ar face „aproape
+ șapte", cum zice cursul.
+
+De ce ținta la pivot și nu mai sus: pivotul e nivelul la care se uită toți cei
+care au indicatorul pe ecran, deci acolo apar ordine de vânzare din partea
+celor care au cumpărat mai jos. Dacă îl rupe cu volum, poziția poate rula mai
+departe spre rezistență — dar ca țintă *planificată* pivotul e nivelul pe care
+îl ai calculat înainte de intrare.
+
+## Oglinda, short — trei trigger-e pe aceeași candelă
+Lecția dă varianta short ca enumerare (MDT: bear reversal + sell doji + sell
+momentum, aceeași candelă), fără prețuri. Diagrama de mai jos e construită de
+mine pe acel model, ca să vezi tranzacția întreagă și nu doar lista de
+coloane:
+
+
+
+Citirea rândului, coloană cu coloană: Trinity 3− (toți trei negativi), HDTR
+sell doji confirmat prin închiderea sub low-ul doji-ului, MTGR sell momentum,
+coloana de trend trecută în descendent, distanța față de rezistență sub pragul
+de 2% (board daily), RR mic — adică aproape de rezistență și departe de suport,
+exact ce vrei pentru un short. Stopul stă deasupra rezistenței, pentru că peste
+ea ideea de short e moartă; ținta e pivotul monthly de dedesubt.
+
+## Gotchas
+- **Celula de pivot goală = cifre de aruncat.** Distanțele de 200% față de
+ suport sau 40% față de rezistență nu sunt oportunități, sunt date
+ neîncărcate. Verifică pivotul înainte să citești orice procent din rândul
+ respectiv.
+- **Nu intra pe un trigger care clipocește.** RadarScreen-ul arată trigger-ul
+ în timpul candelei; până la close poate să dispară. Pe daily, decizia se ia
+ la finalul zilei.
+- **Nu urca pragul de proximitate ca să ai mai multe rânduri colorate.**
+ Pragul (0,5% intraday, 2% daily) e ceea ce face ca stopul tău să fie aproape.
+ La 9% de suport, ca ZBRA din lecție, semnalul poate fi perfect și tranzacția
+ tot nu merită riscul. (Completarea mea, pe logica pragurilor din lecție.)
+- **Nu rula RadarScreen-ul în timpul scannerelor** și scoate indicatorul de
+ earnings cât încarci lista — altfel aștepți zeci de minute sau primești erori
+ de memorie.
+
+## Ce rămâne neconfirmat
+- **Ierarhia trigger-elor.** Cursul spune că urmează un material despre care
+ trigger-e au probabilitate mare și care medie; până atunci, „mai multe
+ trigger-e = mai bine" e tot ce avem, fără ponderi.
+- **Formula exactă a Trinity-ului**, a cadranelor de power și a indicatorului
+ de volum personalizat nu e dată aici; lecția trimite la training-urile
+ separate pentru fiecare.
+- **Strategiile pe RadarScreen** sunt promise explicit pentru un material
+ următor. Lecția asta e unealta, nu planul de tranzacționare.
+- **Simbolul pronunțat „RBMB"** în exemplul de aliniere monthly/weekly/daily nu
+ poate fi identificat din transcriere; cifrele acelui exemplu (7 candele
+ uptrend weekly, 2 candele bear daily) sunt rostite, tickerul nu.
+
+## Referințe
+- [TradeStation Help — About RadarScreen & Quotes](https://help.tradestation.com/10_00/eng/TradeStationHelp/rs/about_radarscreen.htm) — documentația oficială: fiecare rând e echivalentul unui grafic, până la 2000 de simboluri într-o fereastră (limita de 400-500 din lecție vine din indicatorii care cer istoric).
+- [IG — What is the relative volume indicator and how do you use it?](https://www.ig.com/en/trading-strategies/what-is-the-relative-volume-indicator-and-how-do-you-use-it-when-230904) — RVol: volum curent împărțit la media perioadei, și de ce volumul peste medie contează la breakout.
+- [IG — How to trade using pivot points](https://www.ig.com/za/trading-strategies/how-to-trade-using-pivot-points-200717) — pivoți, S1-S3 și R1-R3, inclusiv folosirea pivoților weekly și monthly pe timeframe-uri mai mici.
+
+---
+*Notă: din curs vin descrierile coloanelor, parametrii (0,05% la off high, 10
+și 1,2 la volum, 0,5% intraday și 2% pe daily la proximitate, 5% la SMA-uri),
+cifrele exemplelor (range 122%, RVol 167%, 110% pe daily volume, 388 din 503,
+ABT cadranul 1 de 7 candele, AAPL 29 de candele sub linia de 0, WYNN 0,16%,
+ZBRA 9,92%, RR 23, XOM 113.03 / 115.02 / 1,76% / 3,92%) și regula de intrare
+după închiderea candelei. Completările mele, marcate și în text: trigger-ul,
+stopul și ținta din exemplul XOM; întreg exemplul short; distincția
+setup/trigger la buy doji; ce faci cu un rând cu timeframe-uri contradictorii;
+gotcha cu pragul de proximitate. Toate seriile de candele din diagrame sunt
+construite de mine la scară — din curs nu avem capturi de ecran.*
diff --git a/gen/radarscreen_5_stele.py b/gen/radarscreen_5_stele.py
new file mode 100644
index 0000000..4982baa
--- /dev/null
+++ b/gen/radarscreen_5_stele.py
@@ -0,0 +1,281 @@
+"""Diagramele pentru summaries/06_MODUL_5/01_radarscreen_5_stele.md.
+
+Rulează: .venv/bin/python gen/radarscreen_5_stele.py out.json
+Scrie un dict nume -> SVG, care se substituie în markdown peste marcatorii
+``. Vezi STYLE.md, „Cum trebuie să arate un grafic de preț".
+"""
+import json
+import sys
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+from svg_candles import MA, Arrow, Chart, Level, Mark, Zone, from_closes
+
+CH = {}
+COMMON = dict(gap=16, body_w=10, width=640, left=44)
+
+
+# ---------------------------------------------------------------- bull reversal
+# scădere de 27 de candele, apoi o candelă care închide peste high-ul precedentei
+BR = [100.0, 99.4, 98.7, 99.1, 98.2, 97.5, 96.9, 97.2, 96.3, 95.6,
+ 95.9, 95.0, 94.4, 94.8, 93.9, 93.2, 92.8, 93.1, 92.4, 91.8,
+ 91.5, 92.0, 91.3, 90.9, 91.4, 90.8, 91.1]
+BRW = [(0.30, 0.30)] * 27
+BRV = [44, 41, 38, 35, 46, 42, 39, 34, 43, 40, 36, 45, 41, 36, 47,
+ 43, 38, 35, 44, 48, 42, 37, 45, 41, 36, 43, 39]
+
+cds = from_closes(BR + [92.60], wicks=BRW + [(0.25, 0.20)],
+ vols=BRV + [78], start=100.6)
+prev, last = cds[-2], cds[-1]
+assert last.c > prev.h, (last.c, prev.h) # definiția bull reversal-ului
+assert abs(prev.h - 91.40) < 0.001, prev.h
+CH["bull_rev_da"] = Chart(
+ candles=cds,
+ levels=[Level(prev.h, f"high-ul candelei precedente {prev.h:.2f}",
+ "#b06000", label_at="left")],
+ arrows=[Arrow(27, f"DA — close {last.c:.2f}, peste {prev.h:.2f}:\n"
+ "RadarScreen aprinde Bull Reversal", color="#188a3e",
+ where="above", dx=-104)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=26, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Bull reversal = prima candelă care închide peste high-ul precedentei."
+ " Serie construită de mine.").render()
+
+cds = from_closes(BR + [91.30], wicks=BRW + [(0.25, 0.20)],
+ vols=BRV + [40], start=100.6)
+prev, last = cds[-2], cds[-1]
+assert prev.c < last.c < prev.h, (prev.c, last.c, prev.h)
+CH["bull_rev_nu"] = Chart(
+ candles=cds,
+ levels=[Level(prev.h, f"high-ul candelei precedente {prev.h:.2f}",
+ "#b06000", label_at="left")],
+ arrows=[Arrow(27, f"NU — close {last.c:.2f}, verde,\ndar sub {prev.h:.2f}:"
+ " coloana rămâne stinsă", color="#c00", where="below", dx=-96)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=26, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Aceeași serie, alt close: o candelă verde sub high-ul precedent nu e"
+ " bull reversal.").render()
+
+
+# ---------------------------------------------------------------- bear reversal
+UP = [100.0, 100.6, 101.3, 100.9, 101.8, 102.5, 103.1, 102.8, 103.7, 104.4,
+ 104.1, 105.0, 105.6, 105.2, 106.1, 106.8, 107.2, 106.9, 107.6, 108.2,
+ 108.5, 108.0, 108.7, 109.1, 108.6, 109.2, 108.9]
+UPW = [(0.30, 0.30)] * 27
+UPV = [40, 43, 46, 36, 44, 47, 42, 35, 45, 48, 38, 46, 43, 36, 47,
+ 44, 39, 35, 43, 46, 41, 37, 44, 42, 36, 41, 38]
+cds = from_closes(UP + [108.30], wicks=UPW + [(0.20, 0.25)],
+ vols=UPV + [80], start=99.4)
+prev, last = cds[-2], cds[-1]
+assert last.c < prev.l, (last.c, prev.l)
+assert abs(prev.l - 108.60) < 0.001, prev.l
+CH["bear_rev"] = Chart(
+ candles=cds,
+ levels=[Level(prev.l, f"low-ul candelei precedente {prev.l:.2f}",
+ "#b06000", label_at="left")],
+ arrows=[Arrow(27, f"DA — close {last.c:.2f}, sub {prev.l:.2f}:\n"
+ "RadarScreen aprinde Bear Reversal", color="#c00",
+ where="below", dx=-104)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=26, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Bear reversal = prima închidere sub low-ul precedentei. Serie"
+ " construită de mine.").render()
+
+
+# -------------------------------------------------------------------- buy doji
+DJ = [104.0, 103.4, 102.7, 103.1, 102.2, 101.5, 100.9, 101.2, 100.3, 99.6,
+ 99.9, 99.0, 98.4, 98.8, 97.9, 97.2, 96.8, 97.1, 96.4, 95.8,
+ 95.5, 96.0, 95.3, 95.35] # 95.30 -> 95.35 = doji
+DJW = [(0.30, 0.30)] * 23 + [(0.35, 0.55)]
+DJV = [44, 41, 38, 35, 46, 42, 39, 34, 43, 40, 36, 45, 41, 36, 47,
+ 43, 38, 35, 44, 48, 42, 37, 45, 52]
+cds = from_closes(DJ + [96.40, 96.90], wicks=DJW + [(0.25, 0.25), (0.25, 0.25)],
+ vols=DJV + [71, 64], start=104.6)
+doji, trig = cds[23], cds[24]
+assert abs(doji.c - doji.o) <= 0.10 * (doji.h - doji.l), (doji.o, doji.c)
+assert trig.c > doji.h, (trig.c, doji.h)
+assert abs(doji.h - 95.70) < 0.001, doji.h
+CH["buy_doji"] = Chart(
+ candles=cds,
+ levels=[Level(95.00, "suport 95.00", "#1a5fb4", label_at="left"),
+ Level(doji.h, f"high-ul doji-ului {doji.h:.2f}", "#b06000")],
+ arrows=[Arrow(23, "buy doji: open ≈ close, pe suport —\n"
+ "aici se aprinde coloana HDTR", color="#188a3e",
+ where="below", dx=-96),
+ Arrow(24, f"confirmarea: close {trig.c:.2f},\npeste high-ul doji-ului",
+ color="#188a3e", where="above", dx=-74)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=24, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Coloana HDTR se aprinde pe doji; intrarea cere încă o candelă. Serie"
+ " construită de mine.").render()
+
+
+# ------------------------------------------------------------------- sell doji
+SD = [96.0, 96.6, 97.3, 96.9, 97.8, 98.5, 99.1, 98.8, 99.7, 100.4,
+ 100.1, 101.0, 101.6, 101.2, 102.1, 102.8, 103.2, 102.9, 103.6, 104.2,
+ 104.5, 104.0, 104.7, 104.65] # 104.70 -> 104.65 = doji
+SDW = [(0.30, 0.30)] * 23 + [(0.55, 0.35)]
+cds = from_closes(SD + [103.60, 103.10], wicks=SDW + [(0.25, 0.25), (0.25, 0.25)],
+ vols=DJV + [74, 66], start=95.4)
+doji, trig = cds[23], cds[24]
+assert abs(doji.c - doji.o) <= 0.10 * (doji.h - doji.l), (doji.o, doji.c)
+assert trig.c < doji.l, (trig.c, doji.l)
+assert abs(doji.l - 104.30) < 0.001, doji.l
+CH["sell_doji"] = Chart(
+ candles=cds,
+ levels=[Level(105.00, "rezistență 105.00", "#1a5fb4"),
+ Level(doji.l, f"low-ul doji-ului {doji.l:.2f}", "#b06000")],
+ arrows=[Arrow(23, "sell doji: open ≈ close, sub rezistență —\n"
+ "coloana HDTR se aprinde roșu", color="#c00",
+ where="above", dx=-110),
+ Arrow(24, f"confirmarea: close {trig.c:.2f},\nsub low-ul doji-ului",
+ color="#c00", where="below", dx=-30)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=24, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Oglinda pe short: trigger pe închiderea sub low-ul doji-ului. Serie"
+ " construită de mine.").render()
+
+
+# ------------------------------------------------------- buy / sell momentum
+MM = [98.0, 97.4, 96.8, 97.1, 96.2, 95.6, 95.9, 95.1, 94.6, 94.9,
+ 94.2, 93.7, 94.0, 93.4, 93.8, 93.2, 93.6, 94.1, 94.0, 94.6,
+ 96.30, 96.9, 97.6, 97.4, 98.3, 99.0, 99.6, 100.4]
+MMW = [(0.30, 0.30)] * 20 + [(0.30, 0.25)] + [(0.30, 0.30)] * 7
+MMV = [42, 39, 36, 33, 44, 40, 35, 43, 38, 34, 41, 37, 33, 42, 38,
+ 34, 40, 44, 39, 46, 92, 74, 68, 55, 62, 58, 54, 60]
+cds = from_closes(MM, wicks=MMW, vols=MMV, start=98.6)
+brk = cds[20]
+assert brk.c > 95.90, brk.c # trece peste nivelul vechi
+assert min(c.l for c in cds[10:20]) < 93.00
+CH["buy_momentum"] = Chart(
+ candles=cds,
+ levels=[Level(95.90, "nivel vechi 95.90", "#1a5fb4")],
+ zones=[Zone(20, 27, "trend ascendent: 8 candele (coloana Trend numără)",
+ "#188a3e")],
+ arrows=[Arrow(20, f"buy momentum (săgeată verde):\nclose {brk.c:.2f}, cu forță"
+ " peste 95.90", color="#188a3e", where="below", dx=22)],
+ mas=[MA(10, "#b06000", dash="4 3", text="SMA-10")],
+ **COMMON, scale=22, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Pe candela de buy momentum clipocesc trei coloane: MTGR, Trend și"
+ " numărul de candele.").render()
+
+SM = [100.0, 100.6, 101.2, 100.9, 101.8, 102.4, 102.1, 102.9, 103.4, 103.1,
+ 103.8, 104.3, 104.0, 104.6, 104.2, 104.8, 104.4, 103.9, 104.0, 103.4,
+ 101.70, 101.1, 100.4, 100.6, 99.7, 99.0, 98.4, 97.6]
+cds = from_closes(SM, wicks=[(0.30, 0.30)] * 20 + [(0.25, 0.30)] + [(0.30, 0.30)] * 7,
+ vols=MMV, start=99.4)
+brk = cds[20]
+assert brk.c < 102.10, brk.c
+CH["sell_momentum"] = Chart(
+ candles=cds,
+ levels=[Level(102.10, "nivel vechi 102.10", "#1a5fb4")],
+ zones=[Zone(20, 27, "trend descendent: 8 candele", "#c00")],
+ arrows=[Arrow(20, f"sell momentum (săgeată galbenă):\nclose {brk.c:.2f}, rupe"
+ " 102.10 în jos", color="#c00", where="above", dx=26)],
+ mas=[MA(10, "#b06000", dash="4 3", text="SMA-10")],
+ **COMMON, scale=22, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Oglinda: săgeată galbenă pe MTGR, trend-ul trece în descendent. Serie"
+ " a mea.").render()
+
+
+# ------------------------------------------------------------- range + RVol
+RG = [60.0, 59.4, 58.7, 59.2, 58.3, 57.6, 58.1, 57.2, 56.6, 57.0,
+ 56.2, 55.6, 56.0, 55.2, 55.7, 54.9, 54.3, 54.8, 54.0, 54.5,
+ 53.8, 54.3, 53.6, 54.1, 53.9, 54.4, 53.3]
+RGW = [(0.22, 0.22)] * 24 + [(0.45, 0.45), (0.45, 0.45), (0.05, 0.45)]
+RGV = [31, 29, 27, 25, 33, 30, 28, 24, 32, 29, 26, 33, 30, 25, 34,
+ 31, 27, 25, 32, 35, 30, 26, 33, 29, 25, 31, 28]
+cds = from_closes(RG + [54.67], wicks=RGW + [(0.15, 0.15)],
+ vols=RGV + [49], start=60.6)
+last = cds[-1]
+rng3 = sum(c.h - c.l for c in cds[-4:-1]) / 3
+pct = (last.h - last.l) / rng3 * 100
+avg10 = sum(c.vol for c in cds[-11:-1]) / 10
+rvol = last.vol / avg10 * 100
+assert 121 <= pct <= 123, pct # cifra cursului: 122%
+assert 160 <= rvol <= 174, rvol # textul spune ~167%
+assert last.c > cds[-2].h, (last.c, cds[-2].h)
+CH["range_rvol"] = Chart(
+ candles=cds,
+ arrows=[Arrow(27, f"range {pct:.0f}% din media ultimelor 3 candele\n"
+ f"+ bull reversal (close {last.c:.2f} peste {cds[-2].h:.2f})",
+ color="#188a3e", where="above", dx=-128)],
+ marks=[Mark(27, f"RVol {rvol:.0f}%", "#1a5fb4", "below")],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=40, vol_h=70, vol_label="volum (ultima bară vs. media a 10)",
+ title="Exemplu construit (fără ticker) — 60 de minute",
+ caption="Cifrele cursului pentru WBD: range 122%, RVol 167%. Seria care le"
+ " produce e a mea.").render()
+
+
+# ------------------------------------------------- 5 stele, long (XOM, real)
+XOM = [120.8, 120.1, 119.4, 119.8, 118.9, 118.2, 117.6, 117.9, 117.0, 116.4,
+ 116.8, 115.9, 115.3, 115.6, 114.7, 114.1, 113.8, 114.2, 113.5, 113.9,
+ 113.2, 113.6, 113.25, 113.30, 115.02]
+XW = [(0.30, 0.30)] * 22 + [(0.25, 0.28), (0.25, 0.30), (0.20, 0.25)]
+XV = [38, 36, 34, 31, 39, 36, 33, 30, 38, 35, 32, 40, 36, 32, 41,
+ 38, 34, 31, 39, 43, 37, 33, 40, 44, 76]
+cds = from_closes(XOM, wicks=XW, vols=XV, start=121.4)
+entry, sl, s1, piv = 115.02, 112.20, 113.03, 119.53
+last, doji = cds[-1], cds[-2]
+assert abs(last.c - entry) < 0.001, last.c
+assert abs((entry / s1 - 1) * 100 - 1.76) < 0.02 # cifra din curs: 1,76%
+assert abs((piv / entry - 1) * 100 - 3.92) < 0.02 # cifra din curs: 3,92%
+assert last.c > doji.h, (last.c, doji.h) # bull reversal
+assert sl < min(c.l for c in cds[-4:]), (sl, min(c.l for c in cds[-4:]))
+R = (piv - entry) / (entry - sl)
+print(f"XOM: risc {entry - sl:.2f}, câștig {piv - entry:.2f} = {R:.2f}R")
+CH["stele_long"] = Chart(
+ candles=cds,
+ levels=[Level(s1, f"suport monthly S1 {s1:.2f}", "#1a5fb4", label_at="left"),
+ Level(sl, f"SL {sl:.2f}", "#c00", label_at="left"),
+ Level(entry, f"intrare {entry:.2f} (close)", "#188a3e"),
+ Level(piv, f"TP1 {piv:.2f} = pivot monthly ({R:.2f}R)", "#1a5fb4")],
+ arrows=[Arrow(24, "bull reversal pe suport, cu volum —\nintri la close, nu în"
+ " timpul candelei", color="#188a3e", where="above", dx=-118)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=30, vol_h=70, vol_label="volum",
+ title="XOM — daily, pivoți monthly",
+ caption="Ale cursului: 115.02, S1 113.03, 1,76%, pivot la 3,92% (= 119.53)."
+ " SL-ul si trigger-ul sunt ale mele.").render()
+
+
+# ------------------------------------------------- 5 stele, short (construit)
+SH = [78.0, 78.5, 79.1, 78.8, 79.6, 80.2, 79.9, 80.7, 81.2, 80.9,
+ 81.6, 82.1, 81.8, 82.5, 82.2, 82.9, 83.4, 83.1, 83.8, 84.2,
+ 84.6, 84.3, 84.9, 84.85, 83.10]
+SHW = [(0.30, 0.30)] * 22 + [(0.28, 0.25), (0.45, 0.25), (0.25, 0.20)]
+cds = from_closes(SH, wicks=SHW, vols=XV, start=77.4)
+entry_s, sl_s, rez, piv_s = 83.10, 85.60, 85.00, 79.40
+last, doji = cds[-1], cds[-2]
+assert abs(last.c - entry_s) < 0.001
+assert last.c < doji.l, (last.c, doji.l)
+assert sl_s > max(c.h for c in cds[-4:]), (sl_s, max(c.h for c in cds[-4:]))
+Rs = (entry_s - piv_s) / (sl_s - entry_s)
+print(f"short: risc {sl_s - entry_s:.2f}, câștig {entry_s - piv_s:.2f} = {Rs:.2f}R")
+CH["stele_short"] = Chart(
+ candles=cds,
+ levels=[Level(rez, f"rezistență monthly {rez:.2f}", "#1a5fb4", label_at="left"),
+ Level(sl_s, f"SL {sl_s:.2f}", "#c00"),
+ Level(entry_s, f"intrare {entry_s:.2f} (close)", "#c00", label_at="left"),
+ Level(piv_s, f"TP1 {piv_s:.2f} = pivot monthly ({Rs:.2f}R)", "#1a5fb4")],
+ arrows=[Arrow(24, "bear reversal + sell doji confirmat + sell momentum",
+ color="#c00", where="below", dx=-96)],
+ mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
+ **COMMON, scale=48, vol_h=70, vol_label="volum",
+ title="Exemplu construit (fără ticker) — daily, pivoți monthly",
+ caption="Cifre construite de mine, pe modelul MDT din curs: trei trigger-e pe"
+ " aceeași candelă.").render()
+
+
+if __name__ == "__main__":
+ out = sys.argv[1] if len(sys.argv) > 1 else "/tmp/radarscreen.json"
+ with open(out, "w", encoding="utf-8") as f:
+ json.dump(CH, f, ensure_ascii=False)
+ print(f"{len(CH)} diagrame -> {out}")
diff --git a/gen/radarscreen_subst.py b/gen/radarscreen_subst.py
new file mode 100644
index 0000000..862650d
--- /dev/null
+++ b/gen/radarscreen_subst.py
@@ -0,0 +1,193 @@
+"""Substituie marcatorii din capitolul de RadarScreen.
+
+Diagramele de candele vin din gen/radarscreen_5_stele.py (output JSON);
+cele schematice (fără candele) sunt scrise aici.
+
+Rulează: .venv/bin/python gen/radarscreen_subst.py /cale/rs.json
+"""
+import json
+import re
+import sys
+
+SRC = "/workspace/atm-curs-dl/gen/radarscreen_5_stele.md.in" # textul cu marcatori
+MD = "/workspace/atm-curs-dl/summaries/06_MODUL_5/01_radarscreen_5_stele.md"
+
+COLS = [("SIMBOL", "WBD"), ("INTERVAL", "60 min"), ("LAST", "—"),
+ ("OFF HIGH", "—"), ("NET CHG", "—"), ("RANGE", "122%"),
+ ("RVOL", "167%"), ("TRINITY", "—"), ("TRIGGER", "bull rev")]
+
+
+def rand_radar() -> str:
+ w, x0, cw = 640, 14, 68
+ parts = [f'']
+ return "\n ".join(parts)
+
+
+LADDER = [("Trinity: volum + relative strength + power, toți în aceeași direcție",
+ "3 stele", "#188a3e"),
+ ("+ un trigger: bull reversal, buy doji sau buy momentum", "4", "#188a3e"),
+ ("+ locul: suport, pivot sau rezistență sub pragul de proximitate",
+ "5 stele", "#188a3e"),
+ ("+ o divergență bull pe unul din indicatori", "„aproape 7”", "#1a5fb4")]
+
+
+def trinity_stele() -> str:
+ parts = [f'')
+ return "\n ".join(parts)
+
+
+ROWS = [("volum (indicatorul propriu)", "A+ / A− / D+ / D−",
+ "candele peste/sub 0", "1 (cel mai important)"),
+ ("relative strength", "cadranul 1-4", "candele în cadran", "2"),
+ ("power", "cadranul 1-4", "candele în cadran", "3 (reacționează primul)")]
+READ = [("AAPL — 3 stele", "relative strength în cadranul 2 (se îmbunătățește)",
+ "power în cadranul 1", "volum A− (sub 0, dar în acumulare, 29 de candele)",
+ "#188a3e"),
+ ("ABV — 3 stele cu minus", "relative strength în cadranul 3 (se înrăutățește)",
+ "power în cadranul 4", "volum D− (sub 0 și în distribuție)", "#c00")]
+
+
+def trinity_stele_detaliu() -> str:
+ parts = ['')
+ return "\n ".join(parts)
+
+
+def pivot_culori() -> str:
+ """Două panouri: preț deasupra pivotului (verde) și sub pivot (roșu)."""
+ parts = ['']
+ return "\n ".join(parts)
+
+
+HAND = {"rand_radar": rand_radar, "trinity_stele": trinity_stele,
+ "trinity_stele_detaliu": trinity_stele_detaliu,
+ "pivot_culori": pivot_culori}
+
+
+def main() -> None:
+ charts = json.load(open(sys.argv[1], encoding="utf-8"))
+ md = open(SRC, encoding="utf-8").read()
+ missing = []
+
+ def sub(m: re.Match) -> str:
+ name = m.group(1)
+ if name in charts:
+ return charts[name]
+ if name in HAND:
+ return HAND[name]()
+ missing.append(name)
+ return m.group(0)
+
+ out = re.sub(r"", sub, md)
+ assert not missing, f"marcatori fără diagramă: {missing}"
+ n_used = len(re.findall(r"