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 @@ - - - 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) + @@ -71,25 +72,25 @@ - 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. \ No newline at end of file diff --git a/summaries/17_STRATEGII/08_mbp.html b/summaries/17_STRATEGII/08_mbp.html index 7617803..086208e 100644 --- a/summaries/17_STRATEGII/08_mbp.html +++ b/summaries/17_STRATEGII/08_mbp.html @@ -90,19 +90,20 @@ avantajul: autorul a testat varianta calculată doar pe indicele S&P și nu 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) + @@ -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.