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:
438
gen/radarscreen_5_stele.md.in
Normal file
438
gen/radarscreen_5_stele.md.in
Normal 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
281
gen/radarscreen_5_stele.py
Normal 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
193
gen/radarscreen_subst.py
Normal 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()
|
||||
Reference in New Issue
Block a user