diagrame: trei desene care aratau altceva decat spune regula

m2d_exemplu (Riot): eticheta zicea 'close peste bear trail = iesi' pe o bara
care se inchidea SUB linie - doar fitilul trecea, adica exact cazul pe care
capitolul il interzice de trei ori. Seria refacuta, cu assert care recalculeaza
trail-ul din serie si cere ca bara de iesire sa inchida peste el.

mbp_exemplu: candela M se inchidea la 660.50 sub banda de 660.90, iar
generatorul chiar afirma relatia inversa ('assert BAND > c'); desenul arata un
setup invalid ca valid. Plus stopul 662.71, care plutea 1.71 deasupra extremei
celor 4 bare - exact marja pe care capitolul o declara absenta la MBP.
Ambele reparate, cu assert pe fiecare.

atmi_orizont: trei etichete purtau 'fisier:linie' in desen.

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-09-22 20:08:48 +00:00
parent f80fef4e2f
commit c564bf1be5
7 changed files with 265 additions and 111 deletions

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""Orizontul de ținere al ATMI — două descrieri incompatibile, pe aceeași axă.
Pentru `strategii/03_atmi.md`, marcajul `<!-- DIAGRAMA: orizont -->`.
Pentru `strategii/05_atmi.md`, marcajul `<!-- DIAGRAMA: orizont -->`.
Nu e grafic de preț, e o linie de timp comparativă: SVG scris de mână, doar
stdlib — nu se folosește svg_candles / pchart.
@@ -19,6 +19,7 @@ Barele sunt pe o axă comună 0 → 1 an, ca diferența să fie vizibilă; bara
Rulare: python3 gen/strategii/atmi_orizont.py -> gen/strategii/atmi_orizont.svg
"""
import re
from pathlib import Path
from xml.sax.saxutils import escape
@@ -102,8 +103,7 @@ def build():
p.append(line(AX_X1, 164, AX_X1, 226, BLUE, 1.2, "4 3"))
p.append(txt(AX_X1, 244, "TP1 atins — aproximativ un an mai târziu",
13, "400", BLUE, "end"))
p.append(txt(AX_X0, 262, "Sursă: 04_MODUL_3/03_strategia_2_atmi.md:26-29; "
":358-363", 11, "400", GRAY, "start"))
p.append(txt(AX_X0, 262, "Sursă: lecția de ATMI", 11, "400", GRAY, "start"))
# ------- bara de jos: adaptarea pentru prop
p.append(txt(AX_X0, 282, "ATMI ca adaptare pentru prop — Q&A 11.06.2025",
@@ -127,7 +127,7 @@ def build():
"„Ai nevoie de 3 transacții să califici propul.”",
13, "400", BLACK))
p.append(txt(CARD_X + CARD_W / 2, 382,
"Sursă: 09_QA/26_2025-06-11.md:225-227", 11, "400", GRAY))
"Sursă: Q&A 11.06.2025", 11, "400", GRAY))
# ------- cutia de anotare
p.append(f'<rect x="{BOX_X}" y="{BOX_Y}" width="{BOX_W}" height="{BOX_H}" '
@@ -140,7 +140,7 @@ def build():
13, "400", BLACK, "start"))
p.append(txt(BOX_X + 20, 510, "iar la atingere pozițiile se pot închide — chiar în profit.",
13, "400", BLACK, "start"))
p.append(txt(BOX_X + 20, 530, "Sursă: 09_QA/26_2025-06-11.md:216-222",
p.append(txt(BOX_X + 20, 530, "Sursă: Q&A 11.06.2025",
11, "400", GRAY, "start"))
p.append(txt(BOX_X + 20, 560,
"Notă: cele două descrieri nu se rezolvă aici — de clarificat "
@@ -212,11 +212,15 @@ def verify(svg):
"limita zilnică se calculează",
"pozițiile se pot închide",
"nu se rezolvă aici",
"03_strategia_2_atmi.md:26-29",
"09_QA/26_2025-06-11.md:225-227",
"09_QA/26_2025-06-11.md:216-222"):
"Sursă: lecția de ATMI",
escape("Sursă: Q&A 11.06.2025")):
assert cheie in svg, f"lipsește din desen: {cheie!r}"
# 6b. nicio trimitere „fișier:linie” în etichetele SVG: sursele trăiesc
# doar în fișa capitolului (regulă din șablon, curățată și la cap. 06)
assert not re.search(r"\.(md|txt):\d", svg), \
"eticheta SVG nu are voie să conțină trimitere fișier:linie"
# 7. fără cifre de preț inventate
for interzis in ("$", "USD", "SL ", "intrare "):
assert interzis not in svg, f"nu ar trebui să apară preț: {interzis!r}"