"""MP² — ieșirea în două poziții (Pasul 6 din `02_mp2.md`). Aceeași serie, de la bara dinaintea trigger-ului încolo. Poziția 1 iese la TP1 (1:1). Poziția 2 nu are țintă fixă: merge pe bull trail — low-ul fiecărei bare care face un maxim nou — și iese la prima ÎNCHIDERE sub linie. Între timp, când prețul a făcut 60 % din drumul spre TP1, stopul amândurora urcă la break-even, adică la prețul de intrare. Rulare: python3 gen/strategii/mp2_iesire.py """ import re import sys from pathlib import Path sys.path.insert(0, "/workspace/atm-curs-dl") sys.path.insert(0, str(Path(__file__).parent)) from svg_candles import Arrow, Chart, Level # noqa: E402 import mp2_serie as S # noqa: E402 OUT = Path(__file__).with_suffix(".svg") RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000" W, A = 720, 21 cds = S.CDS[A:] # linia de trail contează pentru poziția 2, adică de la TP1 încolo trail = [v if i + A >= S.I_TP1 else None for i, v in enumerate(S.TRAIL[A:])] i_tp1, i_be, i_out, i_tr = S.I_TP1 - A, S.I_BE - A, S.IESIRE - A, S.TRIGGER - A R_OUT = round((S.IES_PRET - S.ENTRY) / S.R, 2) assert trail[i_out] is not None and cds[i_out].c < trail[i_out] assert cds[i_be].h >= S.BE and cds[i_be - 1].h < S.BE, "BE atins în altă bară" assert S.IES_PRET > S.TP1 > S.BE > S.ENTRY ch = Chart( candles=cds, levels=[Level(S.TP1, f"TP1 {S.TP1:.2f} = intrarea + 1R", GREEN, "2 3", "left"), Level(S.BE, f"{S.BE:.2f} = 60 % din drum", ORANGE, "1 3", "left"), Level(S.ENTRY, f"intrarea {S.ENTRY:.2f}", "#333", "4 3", "left"), Level(S.SL, f"stopul inițial {S.SL:.2f}", RED, "6 3", "right")], arrows=[ Arrow(i_tp1, f"poziția 1 (jumătate) iese la {S.TP1:.2f}\nexact cât riscai: 1:1, " f"fără discuție", where="above", price=S.TP1, color=GREEN, dx=-110, dy=-8), Arrow(i_out, f"poziția 2 iese la {S.IES_PRET:.2f}\nprima ÎNCHIDERE sub linia de trail " f"({trail[i_out]:.2f}),\nnu primul fitil care o atinge = +{R_OUT:.2f}R", where="below", color=ORANGE, dx=-74, dy=34), ], scale=17.0, gap=32, body_w=15, left=58, width=W, top=40, title="Pasul 6 — o jumătate la țintă fixă, cealaltă pe trail", caption="Linia portocalie = bull trail: low-ul ultimei bare cu maxim nou. " f"Rezultat: +1R pe o jumătate, +{R_OUT:.2f}R pe cealaltă.") svg = ch.render() off = S.offset(svg, ch) inject = [ f'', ] # bara la care stopul urcă la break-even x = ch._cx(i_be) inject.append(f'') inject.append(f'stopul urcă la break-even') svg = S.injecteaza(svg, inject) h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1)) w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1)) S.scrie(OUT, svg, w, h)