diagrame: ultimele patru etichete ramase in urma textului corectat

selectia_rvol: 'sub jumatate fata de normal' pentru 0,61 -> '61 % dintr-o zi
normala'. mdsrt_exemplu: legenda spunea ca nivelurile SPY sunt 'reale, din
curs'; sunt reconstruite dupa ilustratia unui sumar Q&A. mbt_iesire: 2.04R ->
2,0R, cifra sursei, prin rotunjire la afisare, fara sa se atinga nicio serie;
assert-ul verifica acum textul din SVG-ul randat, nu doar valoarea bruta.
atmi_exemplu: '13 luni mai tarziu' era citit ca fapt al materialului - acum
spune ca 13 e cifra desenului, materialul da 'aproximativ un an'; si cele
patru marcaje de completare din desenele atmi sunt uniformizate.

Plus cei trei agenti opencode scrisi pentru rundele astea: verif_strat,
corector_strat, reparator_grafic.

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-09-22 20:13:12 +00:00
parent 424ecf2ef4
commit 76011566ee
28 changed files with 374 additions and 97 deletions

View File

@@ -27,7 +27,10 @@ prim_tp = next(i for i in range(CLOSE_I + 1, len(cds)) if cds[i].h >= TP)
# --- verificări -------------------------------------------------------------
assert round(cds[VARF].h, 2) == TP, "ținta nu e high-ul vârfului"
assert max(c.h for c in cds[VARF + 1:prim_tp]) < TP, "structura e depășită înainte de țintă"
assert prim_tp == 26 and R_TINTA == 2.04, (prim_tp, R_TINTA)
# cifra din material/fișă e 2,0R (summaries/08_ANALIZA_ZILNICA/02_mbt10.md:451):
# raportul exact e 2.038, dar se rotunjește la o zecimală la 2.0 — verificăm
# exact ce se afișează pe desen, nu valoarea brută.
assert prim_tp == 26 and round(R_TINTA, 1) == 2.0, (prim_tp, R_TINTA)
assert min(c.l for c in cds[CLOSE_I:]) > SL, "stopul ar fi fost atins înainte de țintă"
assert cds[VARF].h > cds[CLOSE_I].c > SL, "ordinea vârf / intrare / stop e greșită"
zile = prim_tp - CLOSE_I
@@ -41,7 +44,7 @@ ch = Chart(
zones=[Zone(VARF, VARF, "de aici a pornit coborârea", ORANGE, p_top=95.9),
Zone(CLOSE_I, prim_tp, "drumul până la structură: 7 bare", GREEN)],
arrows=[
Arrow(prim_tp, f"ieși la 95.20 (+{R_TINTA:.2f}R):\nprima structură care a oprit\nprețul "
Arrow(prim_tp, f"ieși la 95.20 (+{R_TINTA:.1f}R):\nprima structură care a oprit\nprețul "
"ultima dată",
price=TP, where="below", color=BLUE, dx=-200, dy=54),
],
@@ -56,7 +59,7 @@ linii = [
"exemplele lui e că", "#333"),
("ținta e o structură vizibilă în stânga: un vârf anterior, ultimul maxim mai jos, sau "
"închiderea unui gap.", "#333"),
(f"Aici: 89.90 → 95.20 = {R_TINTA:.2f}R, în {zile} bare. Cifrele trade-ului sunt din "
(f"Aici: 89.90 → 95.20 = {R_TINTA:.1f}R, în {zile} bare. Cifrele trade-ului sunt din "
"exemplul construit al materialului.", GREY),
]
add = 16 * len(linii) + 10
@@ -65,5 +68,9 @@ svg = svg.replace("</svg>", "".join(
f'<text x="24" y="{H + 10 + 16 * i}" fill="{c}">{t}</text>'
for i, (t, c) in enumerate(linii)) + "</svg>")
assert "\n\n" not in svg, "linie goală în SVG"
# ce se vede pe desen: ambele etichete trebuie să spună 2,0R, ca în material
assert f"(+{R_TINTA:.1f}R)" in svg and f"= {R_TINTA:.1f}R," in svg, \
"eticheta de ieșire nu afișează 2,0R"
assert "2.04R" not in svg, "a rămas eticheta veche cu 2.04R"
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT.name} ({W}x{H + add}); ținta atinsă la bara {prim_tp} = +{R_TINTA}R")
print(f"scris {OUT.name} ({W}x{H + add}); ținta atinsă la bara {prim_tp} = +{R_TINTA:.1f}R")