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

@@ -1,15 +1,17 @@
"""Diagrama din `gen/strategii/mdsrt_exemplu.spec.txt` (TIP: PRET).
Exemplul real din Q&A 15.07.2025 (`09_QA/24_2025-07-15.md`): SPY pe 5 min,
double bottom cu al doilea picior mai jos (MDSRT pe 5 min, suportul = pivotul
daily). Downtrend → picior 1 la 622.40 → revenire → picior 2 la 621.40 (rupe
pivotul 622.00) → Buy Hammer care închide la 622.60, înapoi peste pivot. După
trigger, un plan construit de mine (marcat) duce trade-ul până la TP1.
Sesiunea de Q&A 15.07.2025 (`09_QA/24_2025-07-15.md`): SPY pe 5 min, double
bottom cu al doilea picior mai jos (MDSRT pe 5 min, suportul = pivotul daily).
Downtrend → picior 1 la 622.40 → revenire → picior 2 la 621.40 (rupe pivotul
622.00) → Buy Hammer care închide la 622.60, înapoi peste pivot. După trigger,
un plan construit de mine (marcat) duce trade-ul până la TP1.
Reale din curs: nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 bare
dintre picioare. Construcția mea: entry 622.60, SL 621.30, TP1 623.90 (1:1) —
materialul nu le dă (transcrierea planului se întrerupe). Volumele sunt
relative, alese de generator.
Nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 bare dintre picioare
sunt reconstruite după ilustrația sumarului Q&A — NU sunt rostite în
transcriere: sumarul însuși le dă ca „ale mele", construite
(`09_QA/24_2025-07-15.md:601-602`). Construcția mea: entry 623.00, SL 621.30,
TP1 624.70 (1:1) — materialul nu le dă (transcrierea planului se întrerupe).
Volumele sunt relative, alese de generator.
Rulează:
python3 gen/strategii/mdsrt_exemplu.py
@@ -26,11 +28,11 @@ OUT = Path(__file__).resolve().parent / "mdsrt_exemplu.svg"
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
# ── nivelurile reale din curs + planul construit (marcat) ──────────────────
PIVOT = 622.00 # pivot daily, suportul
LEG1 = 622.40 # swing low picior 1
LEG2 = 621.40 # picior 2 (mai jos, rupe pivotul)
HAMMER_C = 622.60 # close-ul Buy Hammer — cifră reală, din sesiunea Q&A
# ── nivelurile reconstruite din ilustrația sumarului + planul construit ────
PIVOT = 622.00 # pivot daily, suportul (reconstruit după ilustrație)
LEG1 = 622.40 # swing low picior 1 (reconstruit)
LEG2 = 621.40 # picior 2 (mai jos, rupe pivotul; reconstruit)
HAMMER_C = 622.60 # close-ul Buy Hammer — reconstruit după ilustrația sumarului
ENTRY = 623.00 # close-ul candelei care sparge high-ul hammer-ului (construit)
SL = 621.30 # 0.10 sub low-ul piciorului 2 (construit)
TP1 = 624.70 # entry + risc = 1:1 (construit)
@@ -112,9 +114,9 @@ assert risk == 1.70, risk
# 7. TP1 simetric 1:1
assert abs((ENTRY - SL) - (TP1 - ENTRY)) < 1e-9
# 8. după trigger, primul close care atinge 623.90 e bara 21 (nu mai devreme).
# 8. după trigger, primul high care atinge TP1 624.70 e bara 25 (nu mai devreme).
# Seria pornește la 627.00, deci „atinge" se citește de jos în sus, din zona
# picioarelor: barele 10-20 rămân sub TP1, bara 21 îl atinge.
# picioarelor: barele 19-24 rămân sub TP1, bara 25 îl atinge.
assert max(c.h for c in cds[19:25]) < TP1, [c.h for c in cds[19:25]]
assert cds[25].h >= TP1 > cds[25].o, (cds[25].h, cds[25].o)
TP_BAR = 25
@@ -162,11 +164,12 @@ ch = Chart(
)
svg = ch.render()
# ── legenda de onestitate (assert 11): ce e real, ce e construit ───────────
# ── legenda de onestitate (assert 11): ce e reconstruit, ce e construit ────
legend = [
"Legendă: nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 candele dintre",
"picioare sunt reale, din curs. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70",
"sunt construcția mea — materialul nu le dă.",
"picioare sunt reconstruite după ilustrația sumarului Q&amp;A, nu valori rostite în",
"transcriere. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70 sunt construcția mea —",
"materialul nu le dă.",
]
m = re.search(r'viewBox="0 0 (\d+) ([0-9.]+)"', svg)
W, H0 = int(m.group(1)), float(m.group(2))
@@ -178,8 +181,16 @@ svg = re.sub(r'(viewBox="0 0 \d+ )[0-9.]+(")',
svg = svg.replace("\n</svg>", "\n " + "\n ".join(legend_svg) + "\n</svg>")
assert svg.count("\n\n") == 0, "linie goală în SVG rupe blocul din markdown"
assert "sunt reale, din curs" in svg and "construcția mea" in svg, \
"legenda nu spune explicit ce e real și ce e construit"
assert "reconstruite după ilustrația sumarului Q&amp;A" in svg, \
"legenda trebuie să spună că nivelurile sunt reconstruite după sumarul Q&amp;A"
assert "nu valori rostite în" in svg, \
"legenda trebuie să nege că nivelurile ar fi rostite în transcriere"
assert "construcția mea" in svg, \
"legenda nu spune explicit ce e construit"
# defectul vechi: legenda pretindea că nivelurile ar fi „reale, din curs",
# deși vin din ilustrația sumarului, nu din transcriere.
assert "reale, din curs" not in svg, \
"legenda veche pretindea că nivelurile sunt reale, din curs"
# toate etichetele cerute de specificație sunt prezente
for eticheta in ("pivot daily 622.00", "picior 1 = 622.40",