"""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)