svg_candles: cautarea nivelurilor, scoasa in functie comuna; 11 generatoare reparate

Unsprezece generatoare nu mai rulau deloc la HEAD: cautau <line x1="24", iar
svg_candles scrie x1="24.0" de cand are Level.i0. Un generator mort inseamna
ca diagrama nu mai poate fi regenerata, si nimeni n-ar fi aflat pana cand ar
fi incercat cineva, peste luni.

Cele 11 copii ale aceluiasi regex au disparut: y_niveluri() si offset_render()
se agata acum de semnatura liniei de Level (stroke-width + dasharray), nu de
x-ul ei. Caz nou in selftest, cu Level(i0=) si panou de volum - combinatia la
care varianta veche fie crapa, fie prindea tacut linia de zero a volumului.

41 de SVG-uri regenerate, toate identice cu cele comise dupa normalizarea
x1=24 -> x1=24.0, deci niciun desen n-a sarit. Verificarea asta a prins o
regresie reala: la buy_doji_transe substitutia lasase scaderea veche pe randul
urmator, offsetul se scadea de doua ori si desenul urca 92 px.

Inca doua generatoare moarte din aceeasi familie, gasite pe drum
(intrarea_cazul_lui, intrarea_doua_variante): desenau peste grafic citind
ch._y() fara offset. Nu crapau zgomotos - produceau suprapuneri la 22 px.

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 06:12:32 +00:00
parent d82e1d5ce5
commit 84f933bcfa
60 changed files with 505 additions and 444 deletions

View File

@@ -21,7 +21,8 @@ import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
from svg_candles import Chart, Level, Arrow, Zone, MA, from_closes # noqa: E402
from svg_candles import (Chart, Level, Arrow, Zone, MA, from_closes, # noqa: E402
y_niveluri)
OUT = Path(__file__).resolve().parent / "selectia_proximitate.svg"
@@ -112,8 +113,8 @@ ch = Chart(
svg = ch.render()
# eticheta benzii, pusă în interiorul ei, în stânga
m_band = re.findall(r'<line x1="24" y1="([\d.]+)"', svg)
y_banda_sus, y_suport = float(m_band[1]), float(m_band[0])
m_band = y_niveluri(svg)
y_banda_sus, y_suport = m_band[1], m_band[0]
assert y_suport > y_banda_sus, "banda e desenată invers"
svg = svg.replace("</svg>",
f'<text x="230" y="{(y_banda_sus + y_suport) / 2 + 4:.1f}" fill="{BLUE}" '
@@ -126,9 +127,9 @@ svg, n = re.subn(r'(<text x="\d+" y=")([\d.]+)(" fill="#b06000">SMA-20</text>)',
assert n == 1, f"eticheta SMA-20: {n} potriviri"
# liniile nu au voie să cadă pe marginea cadrului
m_sup = re.findall(r'<line x1="24" y1="([\d.]+)"', svg)
m_sup = y_niveluri(svg)
assert m_sup, "nu găsesc liniile de nivel"
y_sup = float(m_sup[0])
y_sup = m_sup[0]
m_vb = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg)
assert m_vb
h_svg = int(m_vb.group(2))