etichete: doua defecte vechi la mdsrt, trei la mp2, si verdictul pe restul

La mdsrt_aplus eticheta spunea "primul low 94.60" pentru o bara al carei low
era 94.50. Reparatia a mutat low-ul, nu eticheta: regula capitolului numara
piciorul dupa low, iar specul spune tot 94.60 - doar umbra de 0.10 o
contrazicea. Nicio cifra tiparita nu se schimba, iar nivelul isi ia acum
eticheta din date, cu assert, ca sa nu mai poata minti.

Cele trei de la mp2 aveau toate aceeasi cauza fizica: text colorat peste un
corp de candela de aceeasi culoare. Acolo caracterele nu se incaleca, dispar -
"intrare 577.00" se citea "intrare 577. 0", "crossing" se citea "crossi g".

VERDICT pe restul de ~94: nu merita un lot. Din 20 de suprapuneri vazute
efectiv pe ecran, doar 3 schimbau ce citesti, si toate trei din cauza aia.
Celelalte 17 - text peste fitil, peste linie de nivel, peste chenar, peste
coada de sageata - raman lizibile, fiindca fundalul e o linie subtire, nu o
suprafata plina. Filtrul util nu e tiparul geometric, ci: eticheta cu cifra,
peste un <rect> de aceeasi culoare.

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-02 06:00:45 +00:00
parent 29dc93dfad
commit 602419c93a
14 changed files with 194 additions and 164 deletions

View File

@@ -25,6 +25,8 @@ from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
from svg_candles import Candle, Chart, Level, Mark, from_closes # noqa: E402
sys.path.insert(0, "/workspace/atm-curs-dl/gen")
from eticheta_libera import eticheta_libera # noqa: E402
OUT = Path(__file__).resolve().parent / "mp2_aplus.svg"
@@ -133,13 +135,19 @@ ch_a = Chart(
candles=cds_a,
levels=[Level(SUP_A, f"suport quarterly {SUP_A:.2f}", GRAY, label_at="left"),
Level(SL_A, f"SL {SL_A:.2f} (peste suport)", RED, label_at="right"),
Level(entry_a, f"intrare {entry_a:.2f}", GREEN, label_at="left"),
# label_dy: intrarea 577.00 și neckline-ul 578.00 sunt la 1.00
# (7.5 px) una de alta, iar linia portocalie trecea exact prin
# zecimala etichetei verzi; eticheta coboară sub linia ei
Level(entry_a, f"intrare {entry_a:.2f}", GREEN, label_at="left",
label_dy=18),
Level(NECK_A, f"neckline {NECK_A:.2f}", ORANGE, label_at="right"),
Level(TP1_A, f"TP1 {TP1_A:.2f} = 1:1", BLUE, label_at="right")],
marks=[Mark(LS_A, f"umăr stâng {ls_a:.0f}", GRAY, "above", dy=-4),
Mark(HEAD_A, f"head {head_a:.0f} / double bottom", RED, "below", dy=8),
Mark(RS_A, f"umăr drept {rs_a:.0f}", GRAY, "above", dy=-4),
Mark(ENTRY_A, "crossing", GREEN, "above", dy=-6)],
# dx: pe candela ei, eticheta cădea peste corpul verde de
# alături și se citea „crossi g" (verde pe verde, 02.10.2026)
Mark(ENTRY_A, "crossing", GREEN, "above", dy=-6, dx=-32)],
scale=7.5, gap=15, body_w=9, left=44, width=PW, vol_h=64,
vol_label="volum", title="A+ — crossing la confluență (SPY, aprilie)",
trend="down",
@@ -152,7 +160,9 @@ ch_m = Chart(
Level(SL_M, f"SL {SL_M:.2f}", RED, label_at="right"),
Level(entry_m, f"intrare {entry_m:.2f}", GREEN, label_at="right"),
Level(TP1_M, f"TP1 {TP1_M:.2f}", BLUE, label_at="right")],
marks=[Mark(ENTRY_M, "crossing (mijloc)", GREEN, "above", dy=-4)],
# idem: „(mijloc)" intra sub corpul verde următor; mai sus nu e loc,
# candelele urcă, deci eticheta pleacă lateral
marks=[Mark(ENTRY_M, "crossing (mijloc)", GREEN, "above", dy=-4, dx=-50)],
scale=34.0, gap=15, body_w=9, left=44, width=PW, vol_h=64,
vol_label="volum", title="Mediocru — crossing în mijlocul range-ului (construit)",
caption="exemplu construit, nu date reale — SL nu stă pe niciun pivot",
@@ -268,6 +278,11 @@ for cheie in ("suport quarterly 554.00", f"SL {SL_A:.2f} (peste suport)", "intra
"crossing (mijloc)", "exemplu construit, nu date reale"):
assert cheie in wrapper, f"lipsește din desen: {cheie!r}"
# cele două etichete mutate pe 02.10.2026: verificarea rămâne pornită ca
# o mutare viitoare să nu le bage înapoi sub corpurile verzi
eticheta_libera(wrapper, "aplus-crossing", {"crossing", "crossing (mijloc)"},
rects=True)
OUT.write_text(wrapper, encoding="utf-8")
print(f"scris {OUT.name}: {TOTAL_W}x{TOTAL_H:.0f}, "
f"{len(all_txt)} etichete, verificare OK")