"""MDSRT, Pasul 2 — al doilea picior: cine vinde acolo și cine cumpără înapoi. Aceeași serie ca diagrama de ansamblu (importată din `mdsrt_ansamblu`), tăiată în jurul celor două picioare. Diagrama arată unde stau stopurile celor care au cumpărat la piciorul 1, de ce ruperea nivelului atrage vânzare, și de ce întoarcerea e bruscă: shorturile intrate pe rupere ies cu buy to cover. Mecanica short squeeze-ului e a cursului (`09_QA/19_2025-09-08.md:158-196`); nivelurile sunt cele construite în `mdsrt_ansamblu`. Rulează: python3 gen/strategii/mdsrt_picior.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 Chart, Level, Zone, Arrow # noqa: E402 from mdsrt_ansamblu import (serie, SUPORT, LEG1, TRIG, CONF, ENTRY, SL, # noqa: E402 R, TP1, MARJA) OUT = Path(__file__).with_suffix(".svg") GREEN, RED, BLUE, GRAY, ORANGE = "#188a3e", "#c00", "#1a5fb4", "#555", "#b06000" S, E = 4, 23 # fereastra arătată din serie W = 700 cds = serie()[S:E] l1, l2, cf = LEG1 - S, TRIG - S, CONF - S leg1_l, leg2_l = cds[l1].l, cds[l2].l STOPURI = round(leg1_l - 0.05, 2) # unde stau, tipic, stopurile de sub piciorul 1 # ----------------------------------------------------------------- assert-uri assert leg1_l == 590.10 and leg2_l == 589.50, (leg1_l, leg2_l) assert leg2_l < SUPORT < leg1_l, "povestea diagramei cere picior 1 peste nivel, picior 2 sub" assert leg2_l < STOPURI, "piciorul 2 nu ajunge la stopurile de sub piciorul 1" assert cds[l2].c > leg2_l and cds[l2].c < SUPORT, cds[l2].c assert cds[cf].c == ENTRY > cds[l2].h, (ENTRY, cds[l2].h) assert round(leg2_l - MARJA, 2) == SL # ruperea ține o singură candelă: nicio bară de după intrare nu mai coboară sub nivel assert all(c.l > SUPORT for c in cds[cf + 1:]), "prețul recade sub nivel după intrare" assert min(c.l for c in cds[cf + 1:]) > SL, "stopul ar fi fost atins după intrare" # distanța dintre picioare, peste minimul de 5 candele cerut de curs assert l2 - l1 == 8 print(f"picior: 1 = {leg1_l:.2f} (peste {SUPORT:.2f}), 2 = {leg2_l:.2f}, " f"stopuri la {STOPURI:.2f}, intrare {ENTRY:.2f}, SL {SL:.2f}") ch = Chart( candles=cds, levels=[ Level(SUPORT, f"pivot daily {SUPORT:.2f}", BLUE, label_at="left"), Level(SL, f"SL {SL:.2f}", RED, label_at="left"), ], zones=[Zone(l2, cf, "aici se schimbă mâna", RED)], arrows=[ Arrow(l1, f"piciorul 1: low {leg1_l:.2f} — nivelul ține\n" f"cine cumpără aici își pune stopul chiar sub {leg1_l:.2f}", where="below", price=leg1_l, color=GRAY, dx=-30, dy=34), Arrow(l2, f"piciorul 2: low {leg2_l:.2f}\n1) mătură stopurile de sus\n" f"2) cei care shortează ruperea intră aici", where="below", price=leg2_l, color=RED, dx=150, dy=44), Arrow(cf, "close înapoi peste nivel: shorturile\nprinse cumpără ca să iasă (buy to cover)\n" "de aici urcarea e bruscă, nu treptată", where="above", color=GREEN, dx=40, dy=-30), ], scale=62.0, gap=22, body_w=12, left=64, width=W, top=54, title="Pasul 2 — al doilea picior, sub nivel (SPY 5 min, exemplu construit)", caption="Vânzarea de sub nivel se epuizează într-o singură candelă: nu mai are cine vinde.", ) svg = ch.render() assert "\n\n" not in svg, "linie goală în SVG" for x, y in re.findall(r'