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
71 lines
3.2 KiB
Python
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)
|