From c15004c62bfba168f5021fb7adef1edd4d6a6e56 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Fri, 2 Oct 2026 05:04:32 +0000 Subject: [PATCH] 17_STRATEGII/08_mbp: noua etichete scoase de pe linii in diagrama de ansamblu Raportata era una singura. eticheta_libera le-a gasit pe toate noua, inclusiv cinci praguri din panoul TICUS scrise de mana in generator, la trei inaltimi diferite fata de linia lor. Doua lucruri pe care nu le vedeam fara unealta: marcajul candelei M era plafonat de Chart exact pe linia SL-ului, iar o mutare de-a corectorului a creat o regresie noua (text peste text), prinsa de audit_diagrams. Verificarea ruleaza acum in generator fara exceptii, deci regresiile se prind singure data viitoare. Cifrele n-au fost atinse. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ --- gen/strategii/mbp_ansamblu.py | 55 ++++++++++++++++++------- gen/strategii/mbp_ansamblu.svg | 65 +++++++++++++++--------------- summaries/17_STRATEGII/08_mbp.html | 65 +++++++++++++++--------------- summaries/17_STRATEGII/08_mbp.md | 65 +++++++++++++++--------------- 4 files changed, 139 insertions(+), 111 deletions(-) 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.