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
77 lines
3.7 KiB
Python
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}")
|