Files
atm-curs-dl/gen/strategii/mp2_iesire.py
Claude Agent 2ea599f265 02_mp2: capitol reconstruit dupa sablon
Nivelurile 1-2-3, cei 6 pasi cu diagrama fiecare, mini-glosar de 34 de
termeni, oglinda pe short cu diagrama ei proprie, checklist. Sursele in
fise/02_mp2_surse.md.

Toate diagramele procedurii ies acum dintr-o singura serie
(mp2_serie.py), deci capitolul nu mai poate avea doua reguli numerice.
Ansamblul folosea NVDA cu stop la swing low absolut (-23 %), adica alta
regula decat procedura celor 4 bare; NVDA a devenit "bottom", la nivelul
3, marcat explicit ca exceptie.

perechi_tf e diagrama cu doua timeframe-uri: panoul mic e descompunerea
reala a ultimelor 2 candele daily (1 zi = 7 bare de 60 min), cu pivotul
weekly pe ambele panouri si conector. Pivotii se calculeaza din serie, nu
sunt scrisi de mana.

Reparate: trail-ul din proza era 600.05, calculul din serie da 600.75;
doua SVG-uri aveau trimiteri fisier:linie desenate pe ele.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
2026-09-20 12:51:58 +00:00

71 lines
3.2 KiB
Python

"""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'<polyline points="{S.trepte(ch, trail, off)}" fill="none" stroke="{ORANGE}" '
f'stroke-width="1.8"/>',
]
# bara la care stopul urcă la break-even
x = ch._cx(i_be)
inject.append(f'<line x1="{x:.1f}" y1="{ch._y(S.BE) + off:.1f}" x2="{x:.1f}" '
f'y2="{ch._y(S.ENTRY) + off:.1f}" stroke="{ORANGE}" stroke-width="1.4" '
f'stroke-dasharray="3 3"/>')
inject.append(f'<text x="{x + 6:.1f}" y="{(ch._y(S.BE) + ch._y(S.ENTRY)) / 2 + off:.1f}" '
f'fill="{ORANGE}" style="font-weight:bold">stopul urcă la break-even</text>')
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)