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