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:
81
gen/strategii/hammer_mbt10_mbt_close.py
Normal file
81
gen/strategii/hammer_mbt10_mbt_close.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""MBT-10 — „în formare" nu e semnal: exemplul care s-a dus în cealaltă parte.
|
||||
|
||||
Cazul din material: în timpul zilei prețul era la 55.30 și semnalul se vedea
|
||||
în formare; ziua s-a închis la 52.90, deci semnalul n-a existat, iar a doua zi
|
||||
prețul a închis la 51.50, sub locul crimei 52.10 — sub structura pe care se
|
||||
sprijinea ideea. Cifrele 55.30, 52.90 și 51.50 și nivelul 52.10 sunt din
|
||||
exemplul materialului; structura barelor din jur e construită.
|
||||
|
||||
Rulare: python3 gen/strategii/hammer_mbt10_mbt_close.py
|
||||
"""
|
||||
import re
|
||||
import sys; sys.path.insert(0, "/workspace/atm-curs-dl")
|
||||
from pathlib import Path
|
||||
from svg_candles import Arrow, Candle, Chart, Level, Zone, from_closes
|
||||
|
||||
OUT = Path(__file__).with_suffix(".svg")
|
||||
GREEN, RED, BLUE, ORANGE, GREY = "#188a3e", "#c00", "#1a5fb4", "#b06000", "#555"
|
||||
|
||||
CRIMEI = 52.10 # fostul vârf spart, structura pe care stă ideea
|
||||
INTRADAY, CLOSE_ZI, A_DOUA_ZI = 55.30, 52.90, 51.50
|
||||
|
||||
CLOSES = [57.60, 58.20, 58.90, 58.10, 57.20, 56.40, 55.60, 54.80, 53.90,
|
||||
53.20, 52.60, 53.40, 54.10]
|
||||
cds = from_closes(CLOSES, wicks=[(0.25, 0.30)] * len(CLOSES), start=57.00)
|
||||
I_ZI = len(cds) # bara „în formare"
|
||||
cds.append(Candle(54.10, 55.40, 52.70, CLOSE_ZI))
|
||||
cds.append(Candle(CLOSE_ZI, 53.00, 51.30, A_DOUA_ZI))
|
||||
vols = [44, 48, 52, 46, 50, 54, 58, 60, 64, 68, 72, 55, 58, 96, 88]
|
||||
for c, v in zip(cds, vols):
|
||||
c.vol = v
|
||||
|
||||
# --- verificări -------------------------------------------------------------
|
||||
assert len(cds) == len(vols) == 15
|
||||
for i in range(1, len(cds)):
|
||||
assert abs(cds[i].o - cds[i - 1].c) < 1e-9, f"open[{i}] != close[{i-1}]"
|
||||
for i, c in enumerate(cds):
|
||||
assert c.l <= min(c.o, c.c) and c.h >= max(c.o, c.c), f"bara {i}: h/l nu cuprind o/c"
|
||||
zi = cds[I_ZI]
|
||||
assert zi.h > INTRADAY > zi.c, "ziua trebuie să treacă peste 55.30 intraday și să închidă sub"
|
||||
assert round(zi.c, 2) == CLOSE_ZI and zi.c > CRIMEI, \
|
||||
"ziua se închide sub 55.30, dar tot deasupra locului crimei"
|
||||
assert round(cds[I_ZI + 1].c, 2) == A_DOUA_ZI < CRIMEI, \
|
||||
"a doua zi trebuie să închidă sub locul crimei"
|
||||
assert max(c.c for c in cds[:I_ZI]) > CRIMEI, "toată coborârea vine de deasupra structurii"
|
||||
|
||||
ch = Chart(
|
||||
candles=cds,
|
||||
levels=[Level(INTRADAY, "intraday 55.30", GREY),
|
||||
Level(CRIMEI, "locul crimei 52.10 — structura ideii", BLUE, label_at="left")],
|
||||
zones=[Zone(I_ZI, I_ZI + 1, "cele două zile care contează", ORANGE)],
|
||||
arrows=[
|
||||
Arrow(I_ZI, "la 55.30, în timpul zilei, semnalul\nse vedea „în formare\" — dar ziua "
|
||||
"nu se\nterminase, deci nu exista nimic",
|
||||
price=INTRADAY, where="above", color=RED, dx=-330, dy=78),
|
||||
Arrow(I_ZI, "s-a închis la 52.90: semnalul\nnu s-a produs niciodată",
|
||||
where="below", color=RED, dx=-150, dy=40),
|
||||
Arrow(I_ZI + 1, "a doua zi: 51.50, sub 52.10 —\nstructura a cedat, ideea a murit",
|
||||
where="below", color=RED, dx=-70, dy=92),
|
||||
],
|
||||
scale=34.0, gap=26, body_w=13, left=64, width=700, top=58, vol_h=60, vol_label="volum",
|
||||
title="MBT-10 — „în formare\" nu e semnal (cifrele exemplului din material)",
|
||||
)
|
||||
svg = ch.render()
|
||||
m = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg)
|
||||
W, H = int(m.group(1)), int(m.group(2))
|
||||
linii = [
|
||||
("Te uiți la semnal o singură dată pe zi, la închidere. Cine a cumpărat la 55.30 a "
|
||||
"cumpărat un semnal", "#333"),
|
||||
("care nu s-a produs, și a doua zi era deja sub structura pe care se sprijinea ideea.", "#333"),
|
||||
("Reale sunt 55.30, 52.90, 51.50 și faptul că 51.50 e sub locul crimei; barele din jur "
|
||||
"sunt construite.", GREY),
|
||||
]
|
||||
add = 16 * len(linii) + 10
|
||||
svg = svg.replace(f'viewBox="0 0 {W} {H}"', f'viewBox="0 0 {W} {H + add}"')
|
||||
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"
|
||||
OUT.write_text(svg, encoding="utf-8")
|
||||
print(f"scris {OUT.name} ({W}x{H + add})")
|
||||
Reference in New Issue
Block a user