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:
@@ -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.",
|
||||
|
||||
Reference in New Issue
Block a user