diagrame: trei desene care aratau altceva decat spune regula

m2d_exemplu (Riot): eticheta zicea 'close peste bear trail = iesi' pe o bara
care se inchidea SUB linie - doar fitilul trecea, adica exact cazul pe care
capitolul il interzice de trei ori. Seria refacuta, cu assert care recalculeaza
trail-ul din serie si cere ca bara de iesire sa inchida peste el.

mbp_exemplu: candela M se inchidea la 660.50 sub banda de 660.90, iar
generatorul chiar afirma relatia inversa ('assert BAND > c'); desenul arata un
setup invalid ca valid. Plus stopul 662.71, care plutea 1.71 deasupra extremei
celor 4 bare - exact marja pe care capitolul o declara absenta la MBP.
Ambele reparate, cu assert pe fiecare.

atmi_orizont: trei etichete purtau 'fisier:linie' in desen.

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:08:48 +00:00
parent f80fef4e2f
commit c564bf1be5
7 changed files with 265 additions and 111 deletions

View File

@@ -1,10 +1,11 @@
"""Diagrama din `gen/strategii/mbp_exemplu.spec.txt` (TIP: PRET).
Trade-ul short complet din material (SPY, 15 min, 25.11.2025): ~12 candele
de urcare violentă spre vârful ~661, candela M (verde, peste bandă + TICUS
≥ +1000), trigger Sell Momentum → intrare short 660.00, SL 662.71
(risc 0.41 %), TP1 657.29 (1:1) atins în prima candelă, apoi trail pe 7
candele de 15 min până la ieșirea la 646.80 = 2 % = ~4.9R.
de urcare violentă spre vârful 662.71, candela M (verde, close 660.50 peste
banda superioară + TICUS ≥ +1000), trigger Sell Momentum → intrare short
660.00, SL 662.71 = chiar maximul ultimelor 4 candele (risc 0.41 %), TP1
657.29 (1:1) atins în prima candelă, apoi trail pe 7 candele de 15 min până
la ieșirea la 646.80 = 2 % = ~4.9R.
Serie continuă de 32 de candele (`from_closes`, open = close anterior), cu
context înainte de urcare, panou TICUS dedesubt (bar ilustrativ la candela M)
@@ -28,7 +29,7 @@ ENTRY = 660.00 # 09_QA/11_2025-11-25.md:565, 632-636
SL = 662.71 # risc 0.41 % → (sl-entry)/entry*100
TP1 = 657.29 # entry - (sl - entry) = 1:1
EXIT = 646.80 # ieșire pe trail = 2 % = ~4.9R
BAND = 660.90 # bandă superioară schematică (peste close-ul lui M)
BAND = 660.20 # bandă superioară schematică (sub close-ul lui M)
W, GAP, BODY_W, LEFT = 660, 15, 9, 40
SCALE = 20.0
@@ -54,7 +55,7 @@ assert len(closes) == 32, len(closes)
wicks = [(0.35, 0.35)] * 12 # context
wicks += [(0.30, 0.25)] * (M_I - 12) # urcarea (idx 12..22)
wicks += [(0.50, 0.20)] # M: high = 661.00 (vârful)
wicks += [(SL - closes[M_I], 0.20)] # M: high = 662.71 = SL (vârful)
wicks += [(0.20, 0.40), # trigger
(0.25, 0.51), # TP1: low = 657.80-0.51 = 657.29
(0.30, 0.30), (0.30, 0.30), (0.30, 0.30),
@@ -80,7 +81,14 @@ assert abs((entry - exit_) / entry * 100 - 2.0) < 0.05, (entry - exit_) / entry
assert abs((entry - exit_) / (sl - entry) - 4.9) < 0.1, (entry - exit_) / (sl - entry)
assert EXIT_I - E_I == 7, EXIT_I - E_I
assert sl > entry > tp1, "short: SL deasupra intrării, TP1 sub intrare"
assert BAND > cds[M_I].c, "banda schematică nu e deasupra close-ului lui M"
assert cds[M_I].c > BAND, "candela M nu se închide peste banda superioară"
# stopul stă FIX pe cel mai înalt high al ultimelor 4 candele (trigger inclus)
FEREASTRA = cds[E_I - 3:E_I + 1]
assert len(FEREASTRA) == 4 and FEREASTRA[-1] is cds[E_I], "fereastra de stop nu are 4 bare"
assert abs(max(c.h for c in FEREASTRA) - sl) < 1e-9, \
f"stopul {sl:.2f} nu e fix pe maximul celor 4 bare " \
f"({max(c.h for c in FEREASTRA):.2f})"
# structura care susține afirmațiile din text
assert cds[M_I].c > cds[M_I].o, "candela M trebuie să fie verde"
@@ -96,13 +104,13 @@ assert all(cds[i].c > cds[i - 1].c for i in range(13, M_I + 1)), "urcarea nu e m
levels = [
Level(SL, "SL 662.71 (risc 0.41 %)", "#c00", label_at="right"),
Level(ENTRY, "intrare short 660.00", "#188a3e", label_at="left"),
Level(BAND, "bandă superioară (schematic)", "#777", dash="2 4", label_at="left"),
Level(BAND, "bandă superioară (schematic)", "#777", dash="2 4", label_at="right"),
Level(TP1, "TP1 657.29 (1:1)", "#1a5fb4", label_at="left"),
Level(EXIT, "ieșire trail 646.80 = 2 % = ~4.9R", "#1a5fb4", label_at="left"),
]
marks = [
Mark(M_I, "M: candelă verde peste bandă + TICUS ≥ +1000", "#188a3e", "above"),
Mark(M_I, "M: close peste bandă", "#188a3e", "above"),
]
cds[M_I].note = ("M: valori exacte NEACOPERIT în material (bandă + TICUS); "
@@ -118,7 +126,7 @@ ch = Chart(
marks=marks,
mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
scale=SCALE, width=W, gap=GAP, body_w=BODY_W, left=LEFT,
title="SPY — 15 min: MBAP short 25.11.2025 (risc 0.41 % → ieșire 4.9R)",
title="SPY — 15 min: MBAP short 25.11.2025",
caption="",
)
price_svg = ch.render()
@@ -158,14 +166,14 @@ ticus = [
]
# ── legenda (cifrele/sursele) ───────────────────────────────────────────────
# Fără trimiteri „fișier:linie" în etichetele SVG: sursele trăiesc doar în
# fisa capitolului (STYLE.md, secțiunea Referințe).
legend = [
"Legendă: procentele (risc 0.41 %, ieșire 2 %) sunt ale instructorului.",
"Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator —",
"09_QA/11_2025-11-25.md:716-719.",
"Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator.",
"Structura de reținut: risc mic → TP1 (1:1) atins imediat → trail lung (7 candele de 15 min).",
"Valoarea exactă a benzii și a TICUS la candela M nu e dată în sesiune; bara ~+1000 e ilustrativă.",
"„Taurii urcă pe scări, urșii sar de la etaj\" — de ce short-ul se consumă în ore.",
"(09_QA/11_2025-11-25.md:643-648).",
]
cap_top = Y0 + TICUS_H + 20
H = cap_top + 16 * (len(legend) - 1) + 14