"""Substituie marcatorii din capitolul de RadarScreen. Diagramele de candele vin din gen/radarscreen_5_stele.py (output JSON); cele schematice (fără candele) sunt scrise aici. Rulează: .venv/bin/python gen/radarscreen_subst.py /cale/rs.json """ import json import re import sys SRC = "/workspace/atm-curs-dl/gen/radarscreen_5_stele.md.in" # textul cu marcatori MD = "/workspace/atm-curs-dl/summaries/06_MODUL_5/01_radarscreen_5_stele.md" COLS = [("SIMBOL", "WBD"), ("INTERVAL", "60 min"), ("LAST", "—"), ("OFF HIGH", "—"), ("NET CHG", "—"), ("RANGE", "—"), ("RVOL", "167%"), ("TRINITY", "—"), ("TRIGGER", "bull rev")] def rand_radar() -> str: w, x0, cw = 640, 14, 68 parts = [f'', '' 'Un rând de RadarScreen = un grafic întreg, scris ca numere'] for k, (head, val) in enumerate(COLS): x = x0 + k * cw parts.append(f'') parts.append(f'{head}') parts.append(f'') col = "#188a3e" if val in ("167%", "bull rev") else "#555" parts.append(f'{val}') parts += [ '', '', 'Fiecare celulă e un calcul pe exact' ' aceleași date pe care le-ai citi pe chart:', 'RANGE = înălțimea candelei față de media' ' ultimelor trei; RVOL = volumul ultimei bare față de media a 10;', 'TRINITY = verdictul celor trei indicatori' ' proprii; TRIGGER = reversal, doji sau momentum pe candela curentă.', 'Celulele cu „—" nu sunt' ' rostite în lecție pentru WBD: din el avem RVol 167% și un', 'bull reversal, pe 60 de' ' minute. Așa citești 500 de companii fără să deschizi niciun grafic.', ''] 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'', '' 'Cum se adună stelele (numărătoarea e cea din curs)'] for k, (txt, star, col) in enumerate(LADDER): y = 40 + 44 * k parts.append(f'') parts.append(f'{txt}') parts.append(f'') parts.append(f'{star}') y = 40 + 44 * len(LADDER) + 18 parts.append(f'Cursul nu dă un' ' barem fix: fiecare confirmare în plus, pe aceeași candelă și în' ' aceeași direcție,') parts.append(f'crește' ' probabilitatea.') parts.append('') 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 = ['', 'Cele șase' ' coloane Trinity: pentru fiecare indicator, starea și vechimea' ' ei', 'INDICATOR', 'COLOANA 1 — starea', 'COLOANA 2 — vechimea', 'IMPORTANȚA', ''] for k, (name, c1, c2, imp) in enumerate(ROWS): y = 74 + 30 * k parts.append(f'{name}') parts.append(f'{c1}') parts.append(f'{c2}') parts.append(f'{imp}') parts.append('' 'Cele două citiri din lecție') for k, (title, a, b, c, col) in enumerate(READ): y = 200 + 66 * k parts.append(f'') parts.append(f'{title}') parts.append(f'{a}') parts.append(f'{b}') parts.append(f'{c}') parts.append('Trinity numără' ' direcția, nu semnul: la AAPL volumul e negativ, dar în urcare —' ' tot stea e.') parts.append('') return "\n ".join(parts) def pivot_culori() -> str: """Două panouri: preț deasupra pivotului (verde) și sub pivot (roșu).""" parts = ['', 'Ce spune' ' culoarea de pe coloana de pivot'] 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'') parts.append(f'{lab}') parts.append(f'') parts.append(f'') parts.append(f'pivot + banda de proximitate') parts.append(f'') parts.append(f'ultimul preț') txt = ("coloana e verde: „destul de strong bull”" if k == 0 else "coloana e roșie: „cam strong bear”") parts.append(f'{txt}') parts += ['Banda de proximitate: 0,5%' ' intraday, 2% pe daily. Fond alb cu cifră colorată = ești în' ' bandă.', 'Coloana RR spune,' ' separat, dacă stai lângă suport (valoare mare) sau lângă' ' rezistență (valoare mică).', ''] return "\n ".join(parts) HAND = {"rand_radar": rand_radar, "trinity_stele": trinity_stele, "trinity_stele_detaliu": trinity_stele_detaliu, "pivot_culori": pivot_culori} def main() -> None: charts = json.load(open(sys.argv[1], encoding="utf-8")) md = open(SRC, encoding="utf-8").read() missing = [] def sub(m: re.Match) -> str: name = m.group(1) if name in charts: return charts[name] if name in HAND: return HAND[name]() missing.append(name) return m.group(0) out = re.sub(r"", sub, md) assert not missing, f"marcatori fără diagramă: {missing}" n_used = len(re.findall(r"