diff --git a/gen/strategii/mbp_ansamblu.py b/gen/strategii/mbp_ansamblu.py
index ea5a8e5..26b76fd 100644
--- a/gen/strategii/mbp_ansamblu.py
+++ b/gen/strategii/mbp_ansamblu.py
@@ -29,7 +29,9 @@ import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, "/workspace/atm-curs-dl/gen")
from svg_candles import Chart, Level, Mark, from_closes # noqa: E402
+from eticheta_libera import eticheta_libera # noqa: E402
OUT = Path(__file__).resolve().parent / "mbp_ansamblu.svg"
@@ -106,13 +108,19 @@ assert abs((exit_ill - entry) / risc - 4.0) < 0.15, (exit_ill - entry) / risc
# nu există nicio linie de stop desenată deasupra intrării
assert sl < entry
+# `label_dy` ridică eticheta cu 8 px peste linia ei: implicit stă la y − 6, cu
+# coada literelor peste linie. Banda inferioară merge în jos (dy = +22), nu în
+# sus: la 0.05 $ deasupra ei trece linia de intrare, iar la scara asta (150
+# px/$) între cele două linii nu încape un rând de text.
levels = [
- Level(623.90, "623.90 — bandă inferioară", BLUE, dash="4 3", label_at="left"),
- Level(624.70, "624.70 — bandă superioară", BLUE, dash="4 3", label_at="right"),
- Level(624.30, "624.30 — SMA20 / TP1", GRAY, dash="4 3", label_at="left"),
- Level(sl, f"SL {sl:.2f} (lowest low, 4 candele)", RED, label_at="left"),
- Level(entry, f"trigger Buy Momentum → intrare {entry:.2f}", GREEN, label_at="right"),
- Level(625.35, "ieșire ilustrativă ~625.35 (≈ 1:4)", GREEN, dash="2 3", label_at="right"),
+ Level(623.90, "623.90 — bandă inferioară", BLUE, dash="4 3", label_at="left", label_dy=22),
+ Level(624.70, "624.70 — bandă superioară", BLUE, dash="4 3", label_at="right", label_dy=-8),
+ Level(624.30, "624.30 — SMA20 / TP1", GRAY, dash="4 3", label_at="left", label_dy=-8),
+ Level(sl, f"SL {sl:.2f} (lowest low, 4 candele)", RED, label_at="left", label_dy=-8),
+ Level(entry, f"trigger Buy Momentum → intrare {entry:.2f}", GREEN, label_at="right",
+ label_dy=-8),
+ Level(625.35, "ieșire ilustrativă ~625.35 (≈ 1:4)", GREEN, dash="2 3", label_at="right",
+ label_dy=-8),
]
assert all("stop" not in lv.text.lower() or lv.price < entry for lv in levels)
assert all(not ("sl" in lv.text.lower() and lv.price > entry) for lv in levels)
@@ -124,9 +132,15 @@ marks = [
# titlul si eticheta de trend sunt injectate manual (nu prin Chart.title, care
# ar sta lipit de prima candelă, si nici prin Chart.trend, care s-ar bate cu
# titlul) ca sa rămână spațiu liber deasupra seriei.
-ch = Chart(candles=cds, levels=levels, marks=marks,
+# nivel-distanțier fără etichetă: coboară baza graficului cu 15 px, ca marcajul
+# de sub candela M să nu mai fie plafonat exact pe linia SL-ului
+SPACER = [Level(sl - 0.10, "", "none", dash="")]
+ch = Chart(candles=cds, levels=levels + SPACER, marks=marks,
scale=150.0, gap=16, body_w=10, left=48, width=700, top=96)
svg = ch.render()
+# eticheta goală a distanțierului nu are ce căuta în SVG: auditul o citește ca
+# text suprapus peste ce e sub ea
+svg = re.sub(r"\n\s*]*>\s*", "", svg)
TITLE = "SPY — 15 min: bandă + TICUS pe aceeași candelă → trigger → intrare → SL → TP1 → trail"
@@ -137,7 +151,7 @@ m = re.search(r'viewBox="0 0 (\d+) ([0-9.]+)"', svg)
W, H0 = int(m.group(1)), float(m.group(2))
ticus_top = H0 + 34
-y0 = ticus_top + 70 # linia 0
+y0 = ticus_top + 84 # linia 0
px1000 = 50.0 # 1000 unități TICUS = 50 px
def ty(v: float) -> float:
return y0 - v / 1000.0 * px1000
@@ -149,22 +163,22 @@ panel = [
f'TICUS — presiunea pieței (↑ = peste 0)',
# linii de prag
f'',
- f'+1000 — supracumpărare',
+ f'+1000 — supracumpărare',
f'',
- f'+500 (doar referință vizuală)',
+ f'+500 (doar referință vizuală)',
f'',
- f'0',
+ f'0',
f'',
- f'-500 (doar referință vizuală)',
+ f'-500 (doar referință vizuală)',
f'',
- f'-1000 — oversold',
+ f'-1000 — oversold',
# barul TICUS al candelei M, sub -1000 (colorat roșu)
f'',
- f'M: TICUS -1150 (sub -1000)',
+ f'M: TICUS -1150 (sub -1000)',
]
# linia punctată verticală: aceeași candelă sus și jos (pornește sub mark-ul
# lui M, ca să nu taie textul „M: roșie...")
-y_candle_m = ch._y(cds[M_IX].l) + 26
+y_candle_m = ch._y(cds[M_IX].l) + 46
panel.insert(0, f'')
@@ -194,6 +208,17 @@ assert bar_svg in svg, "barul TICUS nu a fost desenat"
assert abs((float(re.search(r'x="([\d.]+)"', bar_svg).group(1)) + 5) - ch._cx(M_IX)) < 1e-9
# aceeași scară px/unitate: SL-intrare și intrare-TP1 sunt egale și vizual (1:1)
assert abs((ch._y(sl) - ch._y(entry)) - (ch._y(entry) - ch._y(tp1))) < 1e-9
+# nicio etichetă de nivel sau de candelă nu are voie să stea pe desen: aici
+# contează mai ales liniile vecine (banda inferioară și intrarea sunt la 0.05 $
+# una de alta, deci etichetele lor se bat cap în cap cu linia celuilalt)
+eticheta_libera(svg, "ansamblu", {lv.text for lv in levels} | {mk.text for mk in marks},
+ rects=True)
+# același tratament pentru etichetele panoului de TICUS, scrise de mână aici
+eticheta_libera(svg, "panoul TICUS",
+ {"+1000 — supracumpărare", "+500 (doar referință vizuală)", "0",
+ "-500 (doar referință vizuală)", "-1000 — oversold",
+ "M: TICUS -1150 (sub -1000)", "TICUS — presiunea pieței (↑ = peste 0)"},
+ rects=True)
assert f'x1="{xm:.1f}"' in svg
OUT.write_text(svg)
print(f"scris {OUT.name}: {len(cds)} candele, entry {entry:.2f}, SL {sl:.2f}, "
diff --git a/gen/strategii/mbp_ansamblu.svg b/gen/strategii/mbp_ansamblu.svg
index 5822b75..4240825 100644
--- a/gen/strategii/mbp_ansamblu.svg
+++ b/gen/strategii/mbp_ansamblu.svg
@@ -1,16 +1,17 @@
-
Tot trade-ul, pe exemplul long din curs:
-
-
- 623.90 — bandă inferioară
-
- 624.70 — bandă superioară
-
- 624.30 — SMA20 / TP1
-
- SL 623.60 (lowest low, 4 candele)
-
- trigger Buy Momentum → intrare 623.95
-
- ieșire ilustrativă ~625.35 (≈ 1:4)
+
+
+ 623.90 — bandă inferioară
+
+ 624.70 — bandă superioară
+
+ 624.30 — SMA20 / TP1
+
+ SL 623.60 (lowest low, 4 candele)
+
+ trigger Buy Momentum → intrare 623.95
+
+ ieșire ilustrativă ~625.35 (≈ 1:4)
+
@@ -163,27 +164,27 @@ găsit nimic; pe toată piața, da.
- M: roșie, close 623.87 sub bandă
+ M: roșie, close 623.87 sub bandă
SPY — 15 min: bandă + TICUS pe aceeași candelă → trigger → intrare → SL → TP1 → trail
trend descendent anterior (14 bare)
-
- TICUS — presiunea pieței (↑ = peste 0)
-
- +1000 — supracumpărare
-
- +500 (doar referință vizuală)
-
- 0
-
- -500 (doar referință vizuală)
-
- -1000 — oversold
-
- M: TICUS -1150 (sub -1000)
- SPY 15 min. Cifre din curs: M close 623.87 (sub bandă 623.90), TICUS -1150 pe aceeași candelă,
- trigger Buy Momentum → entry 623.95, SL 623.60 (lowest low din 4 candele, trigger inclus),
- TP1 624.30 (+0.35, 1:1). Ieșirea ~625.35 = entry + 4R (≈1:4) e ilustrativă — preț derivat din R,
- nu din curs. Structura candelelor (30 bare continue) e construită de mine.
+
+ TICUS — presiunea pieței (↑ = peste 0)
+
+ +1000 — supracumpărare
+
+ +500 (doar referință vizuală)
+
+ 0
+
+ -500 (doar referință vizuală)
+
+ -1000 — oversold
+
+ M: TICUS -1150 (sub -1000)
+ SPY 15 min. Cifre din curs: M close 623.87 (sub bandă 623.90), TICUS -1150 pe aceeași candelă,
+ trigger Buy Momentum → entry 623.95, SL 623.60 (lowest low din 4 candele, trigger inclus),
+ TP1 624.30 (+0.35, 1:1). Ieșirea ~625.35 = entry + 4R (≈1:4) e ilustrativă — preț derivat din R,
+ nu din curs. Structura candelelor (30 bare continue) e construită de mine.
diff --git a/summaries/17_STRATEGII/08_mbp.md b/summaries/17_STRATEGII/08_mbp.md
index 4cd3fd3..e181060 100644
--- a/summaries/17_STRATEGII/08_mbp.md
+++ b/summaries/17_STRATEGII/08_mbp.md
@@ -63,19 +63,20 @@ găsit nimic; pe toată piața, da.
Tot trade-ul, pe exemplul long din curs:
-
-
- 623.90 — bandă inferioară
-
- 624.70 — bandă superioară
-
- 624.30 — SMA20 / TP1
-
- SL 623.60 (lowest low, 4 candele)
-
- trigger Buy Momentum → intrare 623.95
-
- ieșire ilustrativă ~625.35 (≈ 1:4)
+
+
+ 623.90 — bandă inferioară
+
+ 624.70 — bandă superioară
+
+ 624.30 — SMA20 / TP1
+
+ SL 623.60 (lowest low, 4 candele)
+
+ trigger Buy Momentum → intrare 623.95
+
+ ieșire ilustrativă ~625.35 (≈ 1:4)
+
@@ -136,27 +137,27 @@ Tot trade-ul, pe exemplul long din curs:
- M: roșie, close 623.87 sub bandă
+ M: roșie, close 623.87 sub bandă
SPY — 15 min: bandă + TICUS pe aceeași candelă → trigger → intrare → SL → TP1 → trail
trend descendent anterior (14 bare)
-
- TICUS — presiunea pieței (↑ = peste 0)
-
- +1000 — supracumpărare
-
- +500 (doar referință vizuală)
-
- 0
-
- -500 (doar referință vizuală)
-
- -1000 — oversold
-
- M: TICUS -1150 (sub -1000)
- SPY 15 min. Cifre din curs: M close 623.87 (sub bandă 623.90), TICUS -1150 pe aceeași candelă,
- trigger Buy Momentum → entry 623.95, SL 623.60 (lowest low din 4 candele, trigger inclus),
- TP1 624.30 (+0.35, 1:1). Ieșirea ~625.35 = entry + 4R (≈1:4) e ilustrativă — preț derivat din R,
- nu din curs. Structura candelelor (30 bare continue) e construită de mine.
+
+ TICUS — presiunea pieței (↑ = peste 0)
+
+ +1000 — supracumpărare
+
+ +500 (doar referință vizuală)
+
+ 0
+
+ -500 (doar referință vizuală)
+
+ -1000 — oversold
+
+ M: TICUS -1150 (sub -1000)
+ SPY 15 min. Cifre din curs: M close 623.87 (sub bandă 623.90), TICUS -1150 pe aceeași candelă,
+ trigger Buy Momentum → entry 623.95, SL 623.60 (lowest low din 4 candele, trigger inclus),
+ TP1 624.30 (+0.35, 1:1). Ieșirea ~625.35 = entry + 4R (≈1:4) e ilustrativă — preț derivat din R,
+ nu din curs. Structura candelelor (30 bare continue) e construită de mine.