buy_doji: reparatiile de diagrame din verificare (11 puncte)

doji_forma nu mai foloseste 49.20 ca low al dojiului — era fix pretul
stopului, in prima diagrama pe care o vede un incepator. Bara e pe
50.10/49.25, cu procentele recalculate.

LABU: stopul e etichetat "pe cel mai jos dintre cele trei minime", nu
"sub minime"; zonele arata doua teste ale pivotului, cu "revenire peste
pivot 88.90" intre ele; numarul barei a iesit din desen, nota spune
"a 6-a bara dupa intrare", derivat din serie.

perechi_tf nu mai pune pretul TF-ului mare pe panoul TF-ului mic. aplus
nu mai numeste un nivel care nu e desenat. directie nu mai zice
"saptamanile" pe un panou daily. sell acopera toata cresterea, 14 bare.

transe: cele trei sageti nu mai converg intr-un ghem — fiecare are linia
ei cu pretul la capat; linia de intrare e desenata, ca parantezele de
risc sa plece de undeva. locatie arata 49.25, cifra din care iese 0,51 %.
stop si iesire: linii si sageti care taiau texte, mutate.

Jumatate din probleme erau aceeasi greseala: un pret scris de mana intr-o
eticheta, ramas in urma cand se schimba seria. Sunt acum aserttiuni care
o fac imposibila; PROGRESS.md spune care merita generalizata.

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-19 21:33:15 +00:00
parent f71cbf5a86
commit a92a12a65c
31 changed files with 888 additions and 658 deletions

View File

@@ -8,7 +8,7 @@ Același pattern (trend → doji → confirmare), context opus:
ultimelor 10 bare — acumulare;
- dreapta (NU): uptrend 70 → 76.80, gap-up la open 78.20, doji lipit de
rezistența 78.50, confirmare close 79.30 pe volum sub medie („varză"), apoi
prețul cade înapoi sub 78.00.
prețul cade înapoi sub rezistența 78.50, de unde plecase.
Nivelurile 42.00 / 78.50 și cifrele de preț sunt construite de mine ca să
susțină etichetele și assert-urile din spec (materialul nu dă prețuri pentru
@@ -31,6 +31,8 @@ GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
DOJI_A, CONF_A = 10, 11 # indicii în panoul A+
DOJI_N, CONF_N = 14, 15 # indicii în panoul NU
SUPORT_A = 42.00 # singurele prețuri DESENATE ca nivel; etichetele
REZIST_N = 78.50 # se scriu din ele, ca textul să nu ia altă cifră
# ============================================================ PANOUL A+ (24 bare)
# 10 bare de downtrend de la 52.00 spre 42.60, apoi doji, apoi confirmare.
@@ -56,7 +58,7 @@ doji_a, conf_a = cds_a[DOJI_A], cds_a[CONF_A]
# ============================================================ PANOUL NU (24 bare)
# uptrend 70 → 76.80 (14 bare), gap-up la open 78.20 + doji, confirmare 79.30
# pe volum slab, apoi cădere înapoi sub 78.00. Lista e manuală pentru că gap-ul
# pe volum slab, apoi cădere înapoi sub rezistența 78.50. Lista e manuală pentru că gap-ul
# (open > high-ul barei precedente) nu iese din `from_closes`.
BARE_NU = [
# o, h, l, c, vol
@@ -105,8 +107,12 @@ for tag, d in (("A+", doji_a), ("NU", doji_n)):
# suplimentare: structura promisă de spec
assert min(c.l for c in cds_a[:10]) > doji_a.l, "low-ul dojiului A+ nu e minimul"
assert cds_a[9].c < cds_a[0].c - 8, "downtrend A+ prea mic"
assert cds_n[CONF_N].c > 78.50 and cds_n[-1].c < 78.00, "NU nu cade sub 78.00 la final"
assert cds_n[13].c < 78.00 < cds_n[DOJI_N].o, "NU: uptrendul nu se oprește sub 78.00"
assert cds_n[CONF_N].c > REZIST_N, "NU: confirmarea nu iese peste rezistență"
assert cds_n[-1].c < REZIST_N, "NU: prețul nu cade înapoi sub rezistență la final"
assert cds_n[13].c < REZIST_N <= doji_n.h, "NU: uptrendul nu se oprește sub rezistență"
# bara pe care stă săgeata „cade înapoi sub …" trebuie chiar să fie sub nivel
CADE_N = next(i for i in range(CONF_N + 1, len(BARE_NU)) if cds_n[i].c < REZIST_N)
assert CADE_N == 17 and cds_n[18].c < REZIST_N, f"prima cădere sub nivel e bara {CADE_N}"
print(f"A+ doji {doji_a.h:.2f}/{doji_a.l:.2f} conf {conf_a.c:.2f} "
f"vol {VOLS_A[CONF_A]} > medie {media_a:.1f}")
@@ -117,7 +123,7 @@ print(f"NU doji {doji_n.h:.2f}/{doji_n.l:.2f} conf {conf_n.c:.2f} "
PW = 560 # lățimea fiecărui panou
ch_a = Chart(
candles=cds_a,
levels=[Level(42.00, "suport 42.00", GREEN, label_at="left")],
levels=[Level(SUPORT_A, f"suport {SUPORT_A:.2f}", GREEN, label_at="left")],
zones=[Zone(DOJI_A, DOJI_A, "", GREEN, p_top=43.2, p_bot=41.7)],
arrows=[Arrow(DOJI_A, "doji chiar pe nivel:\nvânzarea s-a oprit pe suport",
where="below", color=GREEN, dx=-40),
@@ -128,13 +134,14 @@ ch_a = Chart(
)
ch_n = Chart(
candles=cds_n,
levels=[Level(78.50, "rezistență 78.50", RED, label_at="right")],
levels=[Level(REZIST_N, f"rezistență {REZIST_N:.2f}", RED, label_at="right")],
# eticheta zonei ar urca peste titlul panoului (zona e chiar în vârf):
# textul stă pe săgeata din stânga
zones=[Zone(DOJI_N - 1, CONF_N, "", RED, p_top=79.62)],
arrows=[Arrow(DOJI_N, "gap-up în rezistență:\naici cumpără cei întârziați",
where="left", color=RED, dx=-30, dy=30),
Arrow(18, "cade înapoi sub 78.00:\nsemnalul a mințit", where="below", color=RED, dx=40)],
Arrow(18, f"cade înapoi sub rezistența {REZIST_N:.2f}:\nsemnalul a mințit",
where="below", color=RED, dx=40)],
mas=[], scale=22.0, gap=15, body_w=9, left=44, width=PW, vol_h=60,
vol_label="volum", title="Mediocru — gap-up în rezistență, volum varză",
)
@@ -268,13 +275,21 @@ for i in range(len(all_txt)):
# etichetele cerute de spec există în desen
assert "Surse" not in wrapper and ".md:" not in wrapper, "trimiteri la surse în SVG"
for cheie in ("suport 42.00", "doji chiar pe nivel", "vânzarea s-a oprit", "volum în creștere = acumulare",
"rezistență 78.50", "gap-up în rezistență", "cei întârziați",
for cheie in (f"suport {SUPORT_A:.2f}", "doji chiar pe nivel", "vânzarea s-a oprit", "volum în creștere = acumulare",
f"rezistență {REZIST_N:.2f}",
f"cade înapoi sub rezistența {REZIST_N:.2f}", "gap-up în rezistență", "cei întârziați",
"semnalul a mințit", "volum slab: nimeni mare nu cumpără",
"A+ — doji la suport, volum în acumulare",
"Mediocru — gap-up în rezistență, volum varză"):
assert cheie in wrapper, f"lipsește din desen: {cheie!r}"
# nicio etichetă nu are voie să numească un preț care nu e desenat ca nivel —
# exact bug-ul „cade înapoi sub 78.00" lângă singurul nivel desenat, 78.50
NIVELURI = {f"{SUPORT_A:.2f}", f"{REZIST_N:.2f}"}
for _, _, _, t in all_txt:
for n in re.findall(r"\d+\.\d\d", t):
assert n in NIVELURI, f"eticheta {t!r} numește prețul {n}, nedesenat ca nivel"
OUT.write_text(wrapper, encoding="utf-8")
print(f"scris {OUT.name}: {TOTAL_W}x{TOTAL_H:.0f}, "
f"{len(all_txt)} etichete, verificare OK")