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

@@ -18,7 +18,8 @@ import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
from svg_candles import Chart, Level, Mark, MA, from_closes # noqa: E402
from svg_candles import (Chart, Level, Mark, MA, from_closes, # noqa: E402
offset_render)
OUT = Path(__file__).resolve().parent / "intrarea_cazul_lui.svg"
@@ -119,16 +120,26 @@ svg = ch.render()
# tăia, așa că eticheta lor stă în golul de lângă candelă (roșia: ▲ chiar sub
# low-urile barelor 16+, peste suport; ieșirea: deasupra barelor 14-19,
# terminată în bara 19, cu linie de legătură).
y19 = ch._y(103.30)
# render() ridică `top` pentru titlu și îl pune la loc: ch._y() de aici e cu
# OFF mai sus decât desenul. Fără asta, legenda de SMA cădea peste titlu și
# „SL 99.90" peste „suport weekly 100.00" — se vedea în SVG-ul regenerat.
OFF = offset_render(svg, ch)
def Y(p):
return ch._y(p) + OFF
y19 = Y(103.30)
extra = [
f'<text x="{ch._cx(15) - 5:.0f}" y="{ch._y(100.20):.1f}" fill="{RED}" '
f'<text x="{ch._cx(15) - 5:.0f}" y="{Y(100.20):.1f}" fill="{RED}" '
f'style="font-weight:bold">▲ roșie mare: −0.68R flotant</text>',
f'<text x="{ch._cx(19) + 4:.0f}" y="{y19:.1f}" fill="{ORANGE}" text-anchor="end" '
f'style="font-weight:bold">ieși aici: 102.60 = +0.23R</text>',
f'<line x1="{ch._cx(19):.1f}" y1="{y19 + 4:.1f}" x2="{ch._cx(19):.1f}" '
f'y2="{ch._y(cds[19].h) - 3:.1f}" stroke="{ORANGE}" stroke-width="1"/>',
f'<text x="30" y="{ch._y(SL) + 15:.1f}" fill="{RED}">SL 99.90 (low 4 candele)</text>',
f'<text x="24" y="{ch.top + 12:.1f}" fill="#555">'
f'y2="{Y(cds[19].h) - 3:.1f}" stroke="{ORANGE}" stroke-width="1"/>',
f'<text x="30" y="{Y(SL) + 15:.1f}" fill="{RED}">SL 99.90 (low 4 candele)</text>',
f'<text x="24" y="{ch.top + OFF + 12:.1f}" fill="#555">'
f'<tspan fill="{MA5_C}">── SMA 5</tspan> / <tspan fill="{MA10_C}">- - SMA 10</tspan> ilustrative</text>',
]
legend = [