17_STRATEGII/07_mdsrt: patru restante aplicate, doua erau deja facute

Raportul verificatorului e din 21.09, iar primele doua probleme fusesera
reparate intre timp in 424ecf2 - in text. Ramasesera insa in generatoare:
docstring-ul lui mdsrt_stop si comentariul STOP_BARS din mdsrt_ansamblu inca
spuneau ca N nu e dat de curs. Un capitol poate fi corect si sa-si contrazica
generatorul.

Reparate acum: tabelul A+ descria "coborare fara nivel dedesubt" pentru un
panou in care pivotul 94.00 chiar e trasat si doar nu tine; layout-ul lui
mdsrt_aplus, unde "picior 1: 94.55" era tiparita sub linia de 94.00 (deci se
citea ca ~93.5) si "close 92.00" statea la inaltimea lui 90.80; doua etichete
taiate de linii in stop si short; si retestul din glosar, 590.05 nu 590.00.

Panourile A+ sunt acum stivuite, 700 px in loc de 1080, deci textul nu se mai
scaleaza la 0,67x. Assert nou: y-ul etichetei "picior 1" trebuie sa cada la
±8 px de unde cade pretul ei fata de linia pivotului - exact regresia
raportata.

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 05:18:02 +00:00
parent f103d9830f
commit 70f5c19574
10 changed files with 841 additions and 777 deletions

View File

@@ -18,6 +18,8 @@ from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
sys.path.insert(0, str(Path(__file__).parent))
from svg_candles import Candle, Chart, Level, Mark, Zone, Arrow # noqa: E402
sys.path.insert(0, "/workspace/atm-curs-dl/gen")
from eticheta_libera import eticheta_libera # noqa: E402
from mdsrt_ansamblu import (serie, SUPORT, LEG1, TRIG, CONF, EXIT_I, # noqa: E402
ENTRY, SL, R, TP1, MARJA, STOP_BARS)
@@ -73,7 +75,10 @@ ch = Chart(
levels=[
Level(REZ, f"pivot daily {REZ:.2f} — zona, sus", BLUE, label_at="left"),
Level(sl, f"SL {sl:.2f} = {MARJA:.2f} peste piciorul 2", RED, "4 3"),
Level(entry, f"intrare short {entry:.2f}", GREEN, "6 3"),
# eticheta coboară sub propria linie, în stânga: la dreapta, pe
# înălțimea ei, o tăia linia pivotului de 100.00 (0.20 mai sus)
Level(entry, f"intrare short {entry:.2f}", GREEN, "6 3",
label_at="left", label_dy=18),
Level(tp1, f"TP1 {tp1:.2f} = 1:1", GREEN, "2 2", label_at="left"),
],
marks=[Mark(ex - S, f"ieșire pe trail {cds[ex].c:.2f} = {r_exit:.2f}R", GREEN, "below")],
@@ -98,5 +103,12 @@ assert "\n\n" not in svg, "linie goală în SVG"
H = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
for x, y in re.findall(r'<text x="([-\d.]+)" y="([-\d.]+)"', svg):
assert 0 <= float(x) <= W and 0 <= float(y) <= H, f"text în afara pânzei la ({x}, {y})"
# etichetele de nivel, verificate pe linii străine (min_px=2: fiecare stă la
# 6 px peste linia ei prin construcție)
eticheta_libera(svg, "short",
{f"pivot daily {REZ:.2f} — zona, sus",
f"SL {sl:.2f} = {MARJA:.2f} peste piciorul 2",
f"intrare short {entry:.2f}", f"TP1 {tp1:.2f} = 1:1"},
min_px=2.0, rects=True)
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT.name} ({W}x{H:.0f})")