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
81 lines
3.8 KiB
Python
81 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
"""MBT-10 — stopul sub structură și mărimea poziției (exemplu construit).
|
|
|
|
Zoom pe barele 8-21 din seria pasului „unde" (importată). Stopul 87.30 nu e
|
|
ales la distanță, ci sub amândouă picioarele double bottom-ului și sub
|
|
suportul weekly 87.50. Riscul iese 2.60 $ pe acțiune, iar mărimea din regula
|
|
de 2 % pe același cont de 10.000 $ folosit în Partea A: 200 / 2.60 = 76 de
|
|
acțiuni.
|
|
|
|
Rulare: python3 gen/strategii/hammer_mbt10_mbt_stop.py
|
|
"""
|
|
import re
|
|
import sys; sys.path.insert(0, "/workspace/atm-curs-dl")
|
|
sys.path.insert(0, "/workspace/atm-curs-dl/gen/strategii")
|
|
from pathlib import Path
|
|
from hammer_mbt10_mbt_confluente import (CLOSE_I, FUND1, FUND2, INTRARE, SL,
|
|
SUP_W, serie)
|
|
from svg_candles import Arrow, Chart, Level, Zone
|
|
|
|
OUT = Path(__file__).with_suffix(".svg")
|
|
GREEN, RED, BLUE, ORANGE, GREY = "#188a3e", "#c00", "#1a5fb4", "#b06000", "#555"
|
|
|
|
cds = serie()
|
|
I0, I1 = 8, 21
|
|
w = cds[I0:I1 + 1]
|
|
sh = lambda i: i - I0 # noqa: E731
|
|
RISC = round(INTRARE - SL, 2)
|
|
CONT, PROCENT = 10_000, 0.02
|
|
RISC_LEI = CONT * PROCENT
|
|
ACTIUNI = int(RISC_LEI // RISC)
|
|
|
|
# --- verificări -------------------------------------------------------------
|
|
assert RISC == 2.60, RISC
|
|
assert ACTIUNI == 76 and ACTIUNI * RISC <= RISC_LEI, (ACTIUNI, ACTIUNI * RISC)
|
|
assert SL < SUP_W < min(cds[FUND1].l, cds[FUND2].l), \
|
|
"stopul trebuie să stea sub suport, iar suportul sub amândouă picioarele"
|
|
assert SL < min(c.l for c in w), "linia stopului trebuie să stea sub toate fitilele"
|
|
assert round(cds[CLOSE_I].c, 2) == INTRARE
|
|
assert I0 <= FUND1 and FUND2 <= I1 and CLOSE_I <= I1, "fereastra nu prinde tot ce trebuie"
|
|
|
|
ch = Chart(
|
|
candles=w,
|
|
levels=[Level(INTRARE, "intrare 89.90 (close-ul zilei)", GREEN, label_at="left"),
|
|
Level(SUP_W, "suport weekly 87.50", BLUE),
|
|
Level(SL, "SL 87.30", RED, label_at="left")],
|
|
zones=[Zone(sh(FUND1), sh(FUND2), "structura care ține ideea", ORANGE)],
|
|
arrows=[
|
|
Arrow(sh(FUND2), "sub 87.30 nu mai e double bottom:\nideea de la pasul 1 a murit,\nnu mai ai ce aștepta",
|
|
price=SL, where="below", color=RED, dx=-40, dy=34),
|
|
],
|
|
scale=40.0, gap=26, body_w=13, left=64, width=680, vol_h=0,
|
|
title="MBT-10 — stopul sub structură (exemplu construit)",
|
|
)
|
|
svg = ch.render()
|
|
m = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg)
|
|
W, H = int(m.group(1)), int(m.group(2))
|
|
OFF = (float(re.search(r'<line x1="24" y1="([\d.]+)"', svg).group(1)) - ch._y(ch.levels[0].price))
|
|
y_in, y_sl = ch._y(INTRARE) + OFF, ch._y(SL) + OFF
|
|
xp = ch._cx(len(w) - 2)
|
|
brk = (f'<polyline points="{xp - 6:.1f},{y_in:.1f} {xp:.1f},{y_in:.1f} {xp:.1f},{y_sl:.1f} '
|
|
f'{xp - 6:.1f},{y_sl:.1f}" fill="none" stroke="{RED}" stroke-width="1.5"/>'
|
|
f'<text x="{xp + 6:.1f}" y="{(y_in + y_sl) / 2 + 4:.1f}" fill="{RED}" '
|
|
f'style="font-weight:bold">1R = 2.60 $</text>')
|
|
linii = [
|
|
(f"Mărimea, cu aceeași regulă ca la buy hammer: 2 % dintr-un cont de 10.000 $ = 200 $;",
|
|
"#333"),
|
|
(f"200 / 2.60 = {RISC_LEI / RISC:.1f} → {ACTIUNI} de acțiuni, pierdere maximă "
|
|
f"{ACTIUNI * RISC:.2f} $.", "#333"),
|
|
("87.30 e cifra materialului, nu marja mea de 5 cenți; suportul weekly 87.50 e construit "
|
|
"de mine ca stopul", GREY),
|
|
("acela să aibă sub ce sta. Materialul nu dă niciun procent fix de stop pentru MBT-10.", 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>", brk + "".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}); risc {RISC}, {ACTIUNI} acțiuni")
|