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
This commit is contained in:
42
gen/exemplu_grafic_real.py
Normal file
42
gen/exemplu_grafic_real.py
Normal file
@@ -0,0 +1,42 @@
|
||||
"""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())
|
||||
Reference in New Issue
Block a user