Files
atm-curs-dl/gen/strategii/mdsrt_picior.py
Claude Agent f8dd2f7bd0 07_mdsrt: capitol reconstruit dupa sablon
Nivelurile 1-2-3, cei 6 pasi cu diagrama fiecare, mini-glosar de 33 de
termeni, oglinda pe short cu diagrama ei, checklist. Sursele in
fise/07_mdsrt_surse.md.

Capitolul avea TREI reguli numerice diferite in acelasi loc: stop fix pe
low in ansamblu, 0.10 sub low in aplus si exemplu, plus doua reguli de
intrare. Acum mdsrt_ansamblu.py tine seria si regulile, iar picior,
trigger, stop, iesire si short le importa — nu mai pot diverge.

Noi: zona (daily -> 60 min ca descompunere reala, 2 candele daily = 14
bare, cu caseta, ghidaje si pivotul pe ambele panouri), picior, trigger,
stop, iesire, short (seria long rasturnata, deci fiecare cifra are
perechea ei).

Verificare numerica text-diagrama: trei nepotriviri reparate, inclusiv o
cifra din proza care nu exista pe niciun desen.

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

77 lines
3.7 KiB
Python

"""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'<text x="([-\d.]+)" y="([-\d.]+)"', svg):
h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
assert 0 <= float(x) <= W and 0 <= float(y) <= h, f"text în afara pânzei la ({x}, {y})"
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT.name}")