06_hammer_mbt10: capitol reconstruit dupa sablon

Doua proceduri complet separate, nu una amestecata, pentru ca se fac
altfel: buy hammer e pattern public, desenabil si exersabil retroactiv;
MBT-10 e cutie neagra din care se poate reface o singura conditie.
Nivelul 1 le pune fata in fata, ca cititorul sa stie din prima de ce nu
le poate trata la fel. Cate 5 pasi fiecare, oglinda pe short la hammer,
checklist dublu. Sursele in fise/06_hammer_mbt10_surse.md.

Zece diagrame noi: hammer-ul nu era definit vizual nicaieri, iar hanging
man era doar text — acum e aceeasi bara in doua contexte, cu assert ca e
identica. Cele 7 vechi si-au pierdut trimiterile fisier:linie din
legende; toate le aveau.

Doua serii partajate (bh_ansamblu si mbt_confluente expun serie()), deci
un trade nu poate avea doua variante. Oglinda pe short e trade-ul long
oglindit in jurul lui K=162.30, deci riscul ramane 1.30 in ambele.

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-20 13:05:41 +00:00
parent 668887670e
commit a7785740cc
45 changed files with 4605 additions and 2687 deletions

View File

@@ -90,7 +90,7 @@ def zone(px, p_top, p_bot, label, color, label_at_bottom=False):
PCT_DA, PCT_NU = f"{d_da:.2f}".replace(".", ","), f"{d_nu:.2f}".replace(".", ",")
y_bot = y(SUP_NU)
parts = [
f'<svg viewBox="0 0 {W} {y_bot + 66:.0f}" xmlns="http://www.w3.org/2000/svg" '
f'<svg viewBox="0 0 {W} {y_bot + 80:.0f}" xmlns="http://www.w3.org/2000/svg" '
f'style="width:100%;height:auto;font:12px sans-serif">',
'<text x="24" y="22" fill="#333" style="font-weight:bold">Hammer la un nivel vs. hammer '
'în mijlocul range-ului — daily, exemplu construit</text>',
@@ -110,10 +110,11 @@ parts = [
*level(PX[1], SUP_NU, "baza range-ului 58.00", BLUE, below=True),
body_da, body_nu,
f'<text x="24" y="{y_bot + 34:.0f}" fill="{GREY}">Completare proprie: materialul cere '
'„un nivel major (weekly / monthly / quarterly), nu mijlocul range-ului", dar nu dă un prag '
'numeric.</text>',
f'<text x="24" y="{y_bot + 52:.0f}" fill="{GREY}">Pragul de 1-2 % e împrumutat de la buy '
f'doji, ca să ai ce măsura: aici {PCT_DA} % în stânga, {PCT_NU} % în dreapta.</text>',
'„un nivel major (weekly / monthly / quarterly), nu mijlocul</text>',
f'<text x="24" y="{y_bot + 50:.0f}" fill="{GREY}">range-ului", dar nu dă un prag numeric. '
f'Pragul de 1-2 % e împrumutat de la buy doji, ca să ai ce</text>',
f'<text x="24" y="{y_bot + 66:.0f}" fill="{GREY}">măsura: aici {PCT_DA} % în stânga, '
f'{PCT_NU} % în dreapta.</text>',
"</svg>",
]
svg = "\n ".join(parts).replace("\n </svg>", "\n</svg>")
@@ -121,4 +122,4 @@ assert "\n\n" not in svg, "linie goală în SVG"
for m in re.finditer(r'<text x="([\d.]+)"[^>]*>(.*?)</text>', body_da):
assert float(m.group(1)) < PX[1] - 14, f"text din DA trece în NU: {m.group(2)}"
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT.name} ({W}x{y_bot + 66:.0f}); DA {d_da}% NU {d_nu}% (rezistență {d_rez}%)")
print(f"scris {OUT.name} ({W}x{y_bot + 80:.0f}); DA {d_da}% NU {d_nu}% (rezistență {d_rez}%)")