"""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'']
return "\n ".join(parts)
LADDER = [("Trinity: volum + relative strength + power, toți în aceeași direcție",
"3 stele", "#188a3e"),
("+ un trigger: bull reversal, buy doji sau buy momentum", "4", "#188a3e"),
("+ locul: suport, pivot sau rezistență sub pragul de proximitate",
"5 stele", "#188a3e"),
("+ o divergență bull pe unul din indicatori", "„aproape 7”", "#1a5fb4")]
def trinity_stele() -> str:
parts = [f'')
return "\n ".join(parts)
ROWS = [("volum (indicatorul propriu)", "A+ / A− / D+ / D−",
"candele peste/sub 0", "1 (cel mai important)"),
("relative strength", "cadranul 1-4", "candele în cadran", "2"),
("power", "cadranul 1-4", "candele în cadran", "3 (reacționează primul)")]
READ = [("AAPL — 3 stele", "relative strength în cadranul 2 (se îmbunătățește)",
"power în cadranul 1", "volum A− (sub 0, dar în acumulare, 29 de candele)",
"#188a3e"),
("ABV — 3 stele cu minus", "relative strength în cadranul 3 (se înrăutățește)",
"power în cadranul 4", "volum D− (sub 0 și în distribuție)", "#c00")]
def trinity_stele_detaliu() -> str:
parts = ['')
return "\n ".join(parts)
def pivot_culori() -> str:
"""Două panouri: preț deasupra pivotului (verde) și sub pivot (roșu)."""
parts = ['']
return "\n ".join(parts)
HAND = {"rand_radar": rand_radar, "trinity_stele": trinity_stele,
"trinity_stele_detaliu": trinity_stele_detaliu,
"pivot_culori": pivot_culori}
def main() -> None:
charts = json.load(open(sys.argv[1], encoding="utf-8"))
md = open(SRC, encoding="utf-8").read()
missing = []
def sub(m: re.Match) -> str:
name = m.group(1)
if name in charts:
return charts[name]
if name in HAND:
return HAND[name]()
missing.append(name)
return m.group(0)
out = re.sub(r"", sub, md)
assert not missing, f"marcatori fără diagramă: {missing}"
n_used = len(re.findall(r"