17_STRATEGII/06_hammer_mbt10: toate cele 9 restante, plus cele 3 cosmetice

Cea mai grava, si cea care a cerut refacerea seriei: exemplul central de
MBT-10 era luat de pe 60 de minute si bagat in procedura de daily, cu barele
numite "zile", desi sursa spune explicit de ce nu merge pe daily. Pe langa
asta, suportul fusese schimbat din 88.00 (testat de trei ori, cu compresie,
cum e in sursa) in 87.50 cu un double bottom si o divergenta de volum
imprumutate din alt exemplu.

Seria e refacuta pe exemplul materialului, cu assert pe cele trei atingeri ale
lui 88.00 si pe compresia varfurilor. Adaosurile au fost scoase, nu doar
marcate: cu ele in desen, suportul din sursa n-ar fi avut sens. Aritmetica a
supravietuit neatinsa.

Restul: stopul de 60.40 sta acum sub o structura reala; pivotul daily nu mai e
o linie fixa peste tot graficul, ci un segment peste ziua intrarii; SL-ul de
pe LABU respecta regula proprie de 5 centi; citatul de la A2 nu mai e dat ca
al autorului; pragul de 1-2% isi spune originea (cursul da 0,5%, pe 60 min);
o singura conventie de distanta, impartirea la nivel; swing low definit la fel
in pas si in glosar.

eticheta_libera a prins 7 suprapuneri reale. La bh_aplus a trebuit rulat pe
fiecare panou separat: wrapper-ul le muta cu <g transform>, pe care unealta
nu-l citeste - de notat pentru data viitoare.

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:29:33 +00:00
parent 80624653dc
commit f60d32cb34
20 changed files with 1156 additions and 987 deletions

View File

@@ -20,7 +20,8 @@ cu două excepții impuse de exemplu:
o=c=66.40, wu=0.30 => high 66.70, wd=0.30 => low 66.10.
Wick-urile speciale: bara 16 wd=0.20 (low 64.60), bara 18 wd=0.20 (low
63.20), bara 21 wd=0.20 (low 62.00); restul (0.30, 0.40).
63.20), bara 21 wd=1.60 (low 60.60 = noul low al coborârii, ca SL-ul 60.40 din
material să stea sub o structură desenată); restul (0.30, 0.40).
Rulează: python3 gen/strategii/hammer_mbt10_mbt_gapdown.py
Scrie: gen/strategii/hammer_mbt10_mbt_gapdown.svg
@@ -30,6 +31,8 @@ import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
sys.path.insert(0, "/workspace/atm-curs-dl/gen")
from eticheta_libera import eticheta_libera # noqa: E402
from svg_candles import Candle, Chart, Level, Mark, from_closes # noqa: E402
OUT = Path(__file__).resolve().parent / "hammer_mbt10_mbt_gapdown.svg"
@@ -62,7 +65,10 @@ WICKS[13] = (0.40, 0.00) # high 71.00, low 70.60
WICKS[14] = (0.30, 0.30) # high 66.70, low 66.10 (bara de gap)
WICKS[16] = (0.30, 0.20) # low 64.60
WICKS[18] = (0.30, 0.20) # low 63.20
WICKS[21] = (0.30, 0.20) # low 62.00
# bara lui MBT-10 #2 face și noul low al coborârii: flush la 60.60, închidere
# înapoi la 62.20. Fără el, SL-ul 60.40 din material (`mbt`:729-732) ar pluti
# sub orice structură desenată — exact reproșul din verificare.
WICKS[21] = (0.30, 1.60) # low 60.60 = noul low; SL 60.40 stă sub el
# Volume relative, alese de generator (materialul nu dă volum aici):
# în scădere pe piciorul coborârii după gap (14 -> 21), apoi recuperare.
@@ -104,6 +110,12 @@ intrare2, sl2 = 62.20, 60.40
assert abs(cds[21].c - intrare2) < 1e-9, f"close[21]={cds[21].c} != 62.20"
assert abs(sl2 - 60.40) < 1e-9
assert not any(c.l <= sl2 for c in cds[22:]), "un low atinge SL2 după bara 21"
# stopul #2 numește o structură: e sub cel mai jos low al coborârii de după gap
nou_low = min(c.l for c in cds[14:22])
assert abs(nou_low - cds[21].l) < 1e-9, "noul low nu e al barei lui MBT-10 #2"
assert sl2 < nou_low <= sl2 + 0.30, \
f"SL2 {sl2} nu stă chiar sub noul low {nou_low:.2f}: nu mai numește o structură"
assert nou_low < min(c.l for c in cds[14:21]), "low-ul barei 21 nu e cel mai jos"
# 4. riscuri
risc1 = intrare1 - sl1 # 1.60
@@ -141,7 +153,7 @@ ch = Chart(
Level(intrare1, "#1 intrare 64.80", GRAY, label_at="right"),
Level(sl1, "#1 SL 63.20", GRAY, label_at="right"),
Level(intrare2, "#2 intrare 62.20", GRAY, label_at="right"),
Level(sl2, "#2 SL 60.40", GRAY, label_at="right"),
Level(sl2, "#2 SL 60.40, sub noul low 60.60", GRAY, label_at="right"),
Level(TP, "TP 70.60 = 4.7R (gap închis)", BLUE, label_at="right"),
],
marks=[
@@ -149,7 +161,7 @@ ch = Chart(
Mark(14, "gap down", RED, "above", dy=-22),
Mark(16, "MBT-10 #1", GRAY, "above", dy=-25),
Mark(18, "stop #1 atins", RED, "below", dy=30),
Mark(21, "MBT-10 #2", GREEN, "below", dy=25),
Mark(21, "MBT-10 #2: flush la 60.60, închidere 62.20", GREEN, "below", dy=25),
],
scale=28.0, gap=15, body_w=9, left=44, width=820, vol_h=70,
vol_label="volum",
@@ -159,13 +171,18 @@ ch = Chart(
svg = ch.render()
assert "<svg" in svg and "\n\n" not in svg, "linie goală în SVG"
eticheta_libera(svg, "mbt_gapdown",
{"MBT-10 #2: flush la 60.60, închidere 62.20",
"#2 SL 60.40, sub noul low 60.60", "stop #1 atins", "gap down",
"MBT-10 #1"}, rects=True, segmente=False)
# --- blocul de text de jos: cine are același risc + legenda -----------------
m = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg)
W, H = int(m.group(1)), int(m.group(2))
linii = [
"MBT-10 #1: intrare 64.80 / SL 63.20 — risc 1R în bani",
"MBT-10 #2: intrare 62.20 / SL 60.40 — risc 1R în bani (mărime ajustată)",
"MBT-10 #2: intrare 62.20 / SL 60.40, sub noul low 60.60 — risc 1R în bani "
"(mărime ajustată)",
"Exemplu construit: #1 și #2 au același risc în bani; "
"#2 singur dă 4.7R.",
"De aceea mărimea se împarte pe 2-3 încercări.",