"""MP² pe short — aceeași procedură, întoarsă (oglinda din `02_mp2.md`).
Alt simbol, altă scară de preț (în jur de 128 $, nu 590 $): structura e
aceeași serie, întoarsă cu p' = 246.40 − 0.2·p. Transformarea e afină și
descrescătoare, deci agregarea zilnică, pivoții și linia de trail se
păstrează exact — bull trail-ul devine bear trail fără să recalculez nimic.
Ce se schimbă față de long:
M pivotul mic e SUB cel mare, nu peste;
crossing pivotul mic coboară prin cel mare;
trigger prima bară care ÎNCHIDE sub pivotul mic;
stopul cel mai SUS high din ultimele 4 bare;
ținta la aceeași distanță, în jos.
Rulare: python3 gen/strategii/mp2_short.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, Zone # noqa: E402
import mp2_serie as S # noqa: E402
OUT = Path(__file__).with_suffix(".svg")
A, F = 246.40, 0.2
RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
W = 720
def m(p):
return round(A - F * p, 2)
cds, ppw, ppd, ppd_bara = S.oglinda(A, F)
entry = cds[S.TRIGGER].c
sl = max(c.h for c in cds[S.TRIGGER - S.BARE_STOP + 1:S.TRIGGER + 1])
r = round(sl - entry, 2)
tp1 = round(entry - r, 2)
trail = [None if v is None or i < S.I_TP1 else m(v) for i, v in enumerate(S.TRAIL)]
ies = cds[S.IESIRE].c
zi4a = S.ZI4 * S.BARE_ZI
# tot ce scriu pe desen iese din serie
assert (entry, sl, tp1, r) == (128.00, 129.20, 126.80, 1.20), (entry, sl, tp1, r)
assert all(ppd[d] > ppw for d in range(S.ZI4)) and ppd[S.ZI4] < ppw, ppd
assert cds[S.TRIGGER].c < ppd_bara[S.TRIGGER] and cds[S.TRIGGER].c < cds[S.TRIGGER].o
assert S.TRIGGER == next(i for i in range(zi4a, zi4a + S.BARE_ZI)
if cds[i].c < ppd_bara[i]), "nu e prima închidere sub pivotul mic"
assert cds[S.IESIRE].c > trail[S.IESIRE] and min(c.l for c in cds[S.TRIGGER:S.I_TP1 + 1]) <= tp1
assert round((entry - ies) / r, 2) == 1.30
ch = Chart(
candles=cds,
levels=[Level(ppw, f"pivot weekly (mare) {ppw:.2f}", GRAY, "8 4", "right"),
Level(sl, f"stopul {sl:.2f}", RED, "6 3", "right"),
Level(entry, f"intrarea (short) {entry:.2f}", "#333", "4 3", "right"),
Level(tp1, f"TP1 {tp1:.2f} = intrarea − 1R", GREEN, "2 3", "left")],
zones=[Zone(zi4a, len(cds) - 1, "pivotul mic e deja SUB cel mare", BLUE)],
arrows=[
Arrow(S.TRIGGER, f"aici intri short: {entry:.2f}\nprima bară care ÎNCHIDE "
f"sub pivotul mic",
where="below", color=RED, dx=-108, dy=26),
Arrow(S.I_TP1, f"poziția 1 iese la {tp1:.2f} (1:1)", where="right", price=tp1,
color=GREEN, dx=78, dy=30),
Arrow(S.IESIRE, f"poziția 2 iese la {ies:.2f},\nprima închidere peste trail",
where="right", color=ORANGE, dy=-34),
],
scale=55.0, gap=15, body_w=9, left=52, width=W, top=40,
title="Oglinda — Sell / short: alt simbol, altă scară, aceleași reguli",
caption="Albastru în trepte = pivotul daily (mic); portocaliu = bear trail, "
"high-ul ultimei bare cu minim nou.")
svg = ch.render()
off = S.offset(svg, ch)
svg = S.injecteaza(svg, [
f'',
f'',
f'{ppd[S.ZI4]:.2f}: crossing bear',
])
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)