MODUL 5, lectia 1: RadarScreen si tranzactiile de 5 stele

Transcrierile 1 si 2 (extract_audio + transcribe pe MODUL 5, 7/7 lectii).
Sumarizarea lectiei 1: 14 diagrame, audit curat, generatoarele in gen/.

De reparat la verificare: eticheta TP1 119.53 da ca preturi ale cursului o
valoare derivata; cursul rosteste pivotul la 119 (transcrierea 01, linia 221).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
Claude Agent
2026-10-01 21:10:52 +00:00
parent 43236af73e
commit be53a64003
7 changed files with 4381 additions and 0 deletions

View File

@@ -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".
<!--SVG:rand_radar-->
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.
<!--SVG:trinity_stele-->
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.
<!--SVG:range_rvol-->
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.
<!--SVG:trinity_stele_detaliu-->
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".
<!--SVG:bull_rev_da-->
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:
<!--SVG:bull_rev_nu-->
### 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.
<!--SVG:bear_rev-->
### 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.
<!--SVG:buy_doji-->
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ă.
<!--SVG:sell_doji-->
### 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.
<!--SVG:buy_momentum-->
<!--SVG:sell_momentum-->
### 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:
<!--SVG:pivot_culori-->
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:
<!--SVG:stele_long-->
- **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:
<!--SVG:stele_short-->
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.*

281
gen/radarscreen_5_stele.py Normal file
View File

@@ -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
`<!--SVG:nume-->`. 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}")

193
gen/radarscreen_subst.py Normal file
View File

@@ -0,0 +1,193 @@
"""Substituie marcatorii <!--SVG:nume--> 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'<svg viewBox="0 0 {w} 232" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
'<text x="14" y="22" fill="#333" style="font-weight:bold">'
'Un rând de RadarScreen = un grafic întreg, scris ca numere</text>']
for k, (head, val) in enumerate(COLS):
x = x0 + k * cw
parts.append(f'<rect x="{x}" y="36" width="{cw}" height="24" fill="#eef2f7"'
' stroke="#9bb0c7" stroke-width="1"/>')
parts.append(f'<text x="{x + 4}" y="52" fill="#44576e" font-size="10">{head}</text>')
parts.append(f'<rect x="{x}" y="60" width="{cw}" height="26" fill="#fff"'
' stroke="#9bb0c7" stroke-width="1"/>')
col = "#188a3e" if val in ("122%", "167%", "bull rev") else "#555"
parts.append(f'<text x="{x + 4}" y="78" fill="{col}" font-size="10">{val}</text>')
parts += [
'<path d="M 320 92 L 320 112" stroke="#1a5fb4" stroke-width="1.5"/>',
'<path d="M 316 106 L 320 114 L 324 106 Z" fill="#1a5fb4"/>',
'<text x="14" y="134" fill="#1a5fb4">Fiecare celulă e un calcul pe exact'
' aceleași date pe care le-ai citi pe chart:</text>',
'<text x="14" y="152" fill="#555">RANGE = înălțimea candelei față de media'
' ultimelor trei; RVOL = volumul ultimei bare față de media a 10;</text>',
'<text x="14" y="170" fill="#555">TRINITY = verdictul celor trei indicatori'
' proprii; TRIGGER = reversal, doji sau momentum pe candela curentă.</text>',
'<text x="14" y="194" fill="#666" font-size="11">Celulele cu „—" nu sunt'
' rostite în lecție pentru WBD: din el avem range 122%, RVol 167% și</text>',
'<text x="14" y="210" fill="#666" font-size="11">bull reversal, pe 60 de'
' minute. Așa citești 500 de companii fără să deschizi niciun grafic.</text>',
'</svg>']
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'<svg viewBox="0 0 640 {60 + 44 * len(LADDER) + 62}"'
' xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
'<text x="14" y="22" fill="#333" style="font-weight:bold">'
'Cum se adună stelele (numărătoarea e cea din curs)</text>']
for k, (txt, star, col) in enumerate(LADDER):
y = 40 + 44 * k
parts.append(f'<rect x="14" y="{y}" width="470" height="32" fill="#f7f9fb"'
' stroke="#9bb0c7" stroke-width="1"/>')
parts.append(f'<text x="22" y="{y + 21}" fill="#333" font-size="11">{txt}</text>')
parts.append(f'<rect x="496" y="{y}" width="130" height="32" fill="{col}"'
' fill-opacity="0.12" stroke="' + col + '" stroke-width="1"/>')
parts.append(f'<text x="561" y="{y + 21}" fill="{col}" text-anchor="middle"'
f' style="font-weight:bold">{star}</text>')
y = 40 + 44 * len(LADDER) + 18
parts.append(f'<text x="14" y="{y}" fill="#666" font-size="11">Cursul nu dă un'
' barem fix: fiecare confirmare în plus, pe aceeași candelă și în'
' aceeași direcție,</text>')
parts.append(f'<text x="14" y="{y + 16}" fill="#666" font-size="11">crește'
' probabilitatea.</text>')
parts.append('</svg>')
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 = ['<svg viewBox="0 0 640 348" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
'<text x="14" y="22" fill="#333" style="font-weight:bold">Cele șase'
' coloane Trinity: pentru fiecare indicator, starea și vechimea'
' ei</text>',
'<text x="22" y="46" fill="#44576e" font-size="10">INDICATOR</text>',
'<text x="212" y="46" fill="#44576e" font-size="10">COLOANA 1 — starea</text>',
'<text x="332" y="46" fill="#44576e" font-size="10">COLOANA 2 — vechimea</text>',
'<text x="480" y="46" fill="#44576e" font-size="10">IMPORTANȚA</text>',
'<line x1="14" y1="52" x2="626" y2="52" stroke="#9bb0c7" stroke-width="1"/>']
for k, (name, c1, c2, imp) in enumerate(ROWS):
y = 74 + 30 * k
parts.append(f'<text x="22" y="{y}" fill="#333" font-size="11">{name}</text>')
parts.append(f'<text x="212" y="{y}" fill="#1a5fb4" font-size="11">{c1}</text>')
parts.append(f'<text x="332" y="{y}" fill="#555" font-size="10">{c2}</text>')
parts.append(f'<text x="480" y="{y}" fill="#b06000" font-size="10">{imp}</text>')
parts.append('<text x="14" y="186" fill="#333" style="font-weight:bold">'
'Cele două citiri din lecție</text>')
for k, (title, a, b, c, col) in enumerate(READ):
y = 200 + 66 * k
parts.append(f'<rect x="14" y="{y}" width="612" height="56" fill="{col}"'
f' fill-opacity="0.07" stroke="{col}" stroke-width="1"/>')
parts.append(f'<text x="24" y="{y + 18}" fill="{col}"'
f' style="font-weight:bold">{title}</text>')
parts.append(f'<text x="24" y="{y + 36}" fill="#333" font-size="11">{a}</text>')
parts.append(f'<text x="330" y="{y + 36}" fill="#333" font-size="11">{b}</text>')
parts.append(f'<text x="24" y="{y + 50}" fill="#333" font-size="11">{c}</text>')
parts.append('<text x="14" y="342" fill="#666" font-size="11">Trinity numără'
' direcția, nu semnul: la AAPL volumul e negativ, dar în urcare —'
' tot stea e.</text>')
parts.append('</svg>')
return "\n ".join(parts)
def pivot_culori() -> str:
"""Două panouri: preț deasupra pivotului (verde) și sub pivot (roșu)."""
parts = ['<svg viewBox="0 0 640 262" xmlns="http://www.w3.org/2000/svg"'
' style="width:100%;height:auto;font:12px sans-serif">',
'<text x="14" y="22" fill="#333" style="font-weight:bold">Ce spune'
' culoarea de pe coloana de pivot</text>']
for k, (lab, col, py, dy) in enumerate([("preț DEASUPRA pivotului", "#188a3e", 120, -50),
("preț SUB pivot", "#c00", 120, 34)]):
x = 20 + k * 312
parts.append(f'<rect x="{x}" y="40" width="288" height="150" fill="#f7f9fb"'
' stroke="#9bb0c7" stroke-width="1"/>')
parts.append(f'<text x="{x + 10}" y="60" fill="{col}"'
f' style="font-weight:bold">{lab}</text>')
parts.append(f'<rect x="{x + 10}" y="{py - 14}" width="268" height="28"'
' fill="#1a5fb4" fill-opacity="0.08"/>')
parts.append(f'<line x1="{x + 10}" y1="{py}" x2="{x + 278}" y2="{py}"'
' stroke="#1a5fb4" stroke-width="1.5" stroke-dasharray="4 3"/>')
parts.append(f'<text x="{x + 14}" y="{py - 22}" fill="#1a5fb4"'
' font-size="10">pivot + banda de proximitate</text>')
parts.append(f'<circle cx="{x + 60}" cy="{py + dy}" r="5" fill="{col}"/>')
parts.append(f'<text x="{x + 72}" y="{py + dy + 4}" fill="{col}"'
' font-size="11">ultimul preț</text>')
txt = ("coloana e verde: „destul de strong bull”" if k == 0
else "coloana e roșie: „cam strong bear”")
parts.append(f'<text x="{x + 10}" y="182" fill="#333" font-size="11">{txt}</text>')
parts += ['<text x="14" y="212" fill="#333">Banda de proximitate: 0,5%'
' intraday, 2% pe daily. Fond alb cu cifră colorată = ești în'
' bandă.</text>',
'<text x="14" y="232" fill="#666" font-size="11">Coloana RR spune,'
' separat, dacă stai lângă suport (valoare mare) sau lângă'
' rezistență (valoare mică).</text>',
'</svg>']
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"<!--SVG:([a-z_0-9]+)-->", sub, md)
assert not missing, f"marcatori fără diagramă: {missing}"
n_used = len(re.findall(r"<svg ", out))
open(MD, "w", encoding="utf-8").write(out)
print(f"{n_used} diagrame lipite în {MD}")
if __name__ == "__main__":
main()