17_STRATEGII/07_mdsrt: patru restante aplicate, doua erau deja facute

Raportul verificatorului e din 21.09, iar primele doua probleme fusesera
reparate intre timp in 424ecf2 - in text. Ramasesera insa in generatoare:
docstring-ul lui mdsrt_stop si comentariul STOP_BARS din mdsrt_ansamblu inca
spuneau ca N nu e dat de curs. Un capitol poate fi corect si sa-si contrazica
generatorul.

Reparate acum: tabelul A+ descria "coborare fara nivel dedesubt" pentru un
panou in care pivotul 94.00 chiar e trasat si doar nu tine; layout-ul lui
mdsrt_aplus, unde "picior 1: 94.55" era tiparita sub linia de 94.00 (deci se
citea ca ~93.5) si "close 92.00" statea la inaltimea lui 90.80; doua etichete
taiate de linii in stop si short; si retestul din glosar, 590.05 nu 590.00.

Panourile A+ sunt acum stivuite, 700 px in loc de 1080, deci textul nu se mai
scaleaza la 0,67x. Assert nou: y-ul etichetei "picior 1" trebuie sa cada la
±8 px de unde cade pretul ei fata de linia pivotului - exact regresia
raportata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
Claude Agent
2026-10-02 05:18:02 +00:00
parent f103d9830f
commit 70f5c19574
10 changed files with 841 additions and 777 deletions

View File

@@ -6,9 +6,11 @@ Jos: același trade, cu o continuare construită în care prețul retestează
nivelul. Stopul „la ochi", pus sub candela de intrare, e măturat de retest;
stopul din regulă ține, iar trade-ul ajunge la țintă.
Cursul lasă două variante de stop (extrema ultimelor N candele sau ATR) și nu
dă valoarea lui N; N = 4 e valoarea folosită la celelalte strategii mecanice
ale cursului, iar marja de 0.10 e regula acestui capitol.
Cursul lasă două variante de stop (extrema ultimelor N candele sau ATR), iar
N = 4 e al lui: transcrierea MDSRT spune „în loc de SL-ul minim în patru
candele, se poate folosi stop loss bazat pe ATR"
(`transcripts/05_MODUL_4/02_3_STRATEGIA_5_MDSRT.txt:71`). Doar marja de 0.10
e regula acestui capitol.
Rulează: python3 gen/strategii/mdsrt_stop.py
"""
@@ -19,6 +21,8 @@ from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
sys.path.insert(0, str(Path(__file__).parent))
from svg_candles import Candle, Chart, Level, Zone, Arrow # noqa: E402
sys.path.insert(0, "/workspace/atm-curs-dl/gen")
from eticheta_libera import eticheta_libera # noqa: E402
from mdsrt_ansamblu import (serie, SUPORT, TRIG, CONF, ENTRY, SL, R, TP1, # noqa: E402
MARJA, STOP_BARS)
@@ -85,7 +89,9 @@ gata = Chart(
candles=jos,
levels=[Level(TP1, f"ținta 1:1: {TP1:.2f}", GREEN, "2 2", label_at="left"),
Level(ENTRY, f"intrarea: {ENTRY:.2f}", GRAY, "4 3", label_at="left"),
Level(OCHI, f"stop pus la ochi: {OCHI:.2f}", ORANGE, "4 3"),
# linia „la ochi" pornește de la bara de intrare: pe toată lățimea
# tăia eticheta „stopul din regulă: 589.40" din stânga (0.25 mai jos)
Level(OCHI, f"stop pus la ochi: {OCHI:.2f}", ORANGE, "4 3", i0=cf),
Level(SL, f"stopul din regulă: {SL:.2f}", RED, "4 3", label_at="left")],
zones=[Zone(cf + 1, cf + 1, "", RED, p_top=OCHI, p_bot=SL)],
arrows=[
@@ -105,7 +111,7 @@ def panou(ch, sus_de=0.0):
ch.top += sus_de
svg = ch.render()
h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
off = float(re.search(r'<line x1="24" y1="([\d.]+)"', svg).group(1)) - ch._y(ch.levels[0].price)
off = float(re.search(r'<line x1="24(?:\.0)?" y1="([\d.]+)"', svg).group(1)) - ch._y(ch.levels[0].price)
return svg[svg.index(">") + 1:svg.rindex("</svg>")].strip(), h, off
@@ -134,5 +140,12 @@ svg = "\n ".join([
assert "\n\n" not in svg, "linie goală în SVG"
for x, y in re.findall(r'<text x="([-\d.]+)" y="([-\d.]+)"', svg):
assert 0 <= float(x) <= W and 0 <= float(y) <= H, f"text în afara pânzei la ({x}, {y})"
# nicio etichetă de nivel tăiată de linia unui alt nivel (min_px=2: eticheta
# stă la 6 px peste linia ei prin construcție, deci se prind doar cele străine)
eticheta_libera(svg, "stop",
{f"pivot daily {SUPORT:.2f}", f"stopul din regulă: {SL:.2f}",
f"ținta 1:1: {TP1:.2f}", f"intrarea: {ENTRY:.2f}",
f"stop pus la ochi: {OCHI:.2f}"},
min_px=2.0)
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT.name} ({W}x{H:.0f})")