Files
atm-curs-dl/gen/exemplu_grafic_real.py
Claude Agent 6b2d9eb1e5 svg_candles: serie continua, panou de volum, medii mobile, etichete ancorate
Userul a cerut ca diagramele de pret sa arate ca un grafic real (TradingView):
linie continua de pret si volum, ca sa se vada trendul. Candelele izolate cu
spatii mari nu spun nimic despre trend.

Adaugat in svg_candles.py:
- from_closes() / walk(): serii continue, open = close-ul barei anterioare,
  cu structura controlata exact din close-uri
- panou de volum (vol_h), bare colorate pe directia candelei
- MA: medii mobile calculate din close-uri
- Mark: etichete ancorate pe candele anume (la 30 de bare, tag-urile per
  candela se suprapun)
- title, Level.label_at
- selftest extins: volum proportional, serie fara goluri, structura pastrata

STYLE.md: regula noua, cu cele doua stiluri (serie de 25-45 de bare pentru
orice grafic de pret; stilul vechi de 3-6 candele doar pentru definitii de
pattern-uri de o candela) si obligatia de assert in generator.

gen/exemplu_grafic_real.py: referinta de copiat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MtSTyTmt6AbCL9j5ajEDm1
2026-09-13 07:46:00 +00:00

43 lines
2.5 KiB
Python

"""Exemplu de referință pentru stilul „grafic real" cerut de user pe 13.09.2026.
Rulează-l ca să vezi cum se construiește o serie continuă cu volum, medie
mobilă și etichete ancorate. Copiază structura în generatoarele tale.
vezi STYLE.md, secțiunea „Cum trebuie să arate un grafic de preț".
"""
import sys; sys.path.insert(0,"/workspace/atm-curs-dl")
from svg_candles import Chart, Level, Mark, MA, from_closes
# close-urile definesc exact structura; wick-urile fixeaza minimele/maximele
closes = [113.0,111.4,109.9,110.6,108.8,107.4,106.0,106.9,105.2,104.0, # downtrend
104.6,103.2,102.4,103.8,105.0, # picior 1 (low 101.50)
104.2,103.0,101.9,101.1,102.6, # picior 2 (low 100.20)
104.1,105.2,106.8, # breakout peste 105.50
105.9,106.0, # retest
106.6,107.0] # intrare 107.00
wicks = [(0.4,0.4)]*10 + [(0.5,0.5),(0.4,0.6),(0.5,0.90),(0.6,0.4),(0.5,0.4)] \
+ [(0.4,0.5),(0.4,0.6),(0.5,0.5),(0.4,0.90),(0.5,0.4)] \
+ [(0.5,0.3),(0.4,0.3),(0.2,0.3)] + [(0.3,0.6),(0.4,0.4)] + [(0.3,0.3),(0.2,0.3)]
vols = [46,44,41,38,52,47,44,39,48,43, 41,44,39,42,58, 47,44,40,43,70, 86,70,63, 47,44, 58,55]
cds = from_closes(closes, wicks=wicks, vols=vols, start=114.4)
lo1 = min(c.l for c in cds[10:15]); lo2 = min(c.l for c in cds[15:20])
peak = max(c.h for c in cds[13:15]); entry = cds[-1].c
assert lo2 < lo1, (lo1, lo2)
print(f"picior1 {lo1:.2f} picior2 {lo2:.2f} varf {peak:.2f} intrare {entry:.2f}")
risc = entry - 104.60
print(f"risc {risc:.2f} TP1 {(117-entry)/risc:.2f}R TP2 {(124-entry)/risc:.2f}R")
ch = Chart(candles=cds,
levels=[Level(104.60,"SL 104.60","#c00",label_at="left"),
Level(entry,f"intrare {entry:.2f}","#188a3e"),
Level(117.00,"TP1 117.00 = 4.2R","#1a5fb4"),
Level(124.00,"TP2 124.00 = 7.1R","#1a5fb4")],
marks=[Mark(13,f"picior 1: {lo1:.2f}","#c00","below"), Mark(19,f"picior 2: {lo2:.2f} (mai jos)","#c00","below"),
Mark(22,"breakout","#188a3e"), Mark(24,"retest","#b06000","below"),
Mark(26,"intrare","#188a3e")],
mas=[MA(20,"#b06000",dash="4 3",text="SMA-20")],
scale=8.0, gap=15, body_w=9, left=44, width=620, vol_h=70,
vol_label="volum", title="Disney — daily",
caption="Ale lui: pretul de 107 si tintele 117 / 124. Structura si volumul sunt construite de mine, la scara.")
print(ch.render())