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

@@ -102,6 +102,7 @@ SL_X1, SL_X2 = 380, 614 # liniile de nivel pe graficul mic
COL_X = 620 # coloana cu etichetele de nivel ale graficului mic
out = []
LABELS = [] # (x, text) al fiecărei etichete, pentru verificarea de panou
def text(x, y, s, fill=INK, anchor="start", bold=False, size=None):
@@ -112,6 +113,7 @@ def text(x, y, s, fill=INK, anchor="start", bold=False, size=None):
st.append(f"font-size:{size}px")
style = f' style="{";".join(st)}"' if st else ""
a = f' text-anchor="{anchor}"' if anchor != "start" else ""
LABELS.append((x, s))
out.append(f'<text x="{x:.1f}" y="{y:.1f}" fill="{fill}"{a}{style}>{s}</text>')
@@ -155,6 +157,7 @@ for key, f, tf_big, tf_small, cap, exp in ROWS:
big, small = scaled(BIG_A, f), scaled(SMALL_A, f)
g = check(key, big, small, exp)
first = key == "A"
lab0 = len(LABELS)
# titlu rând + subtitluri
text(20, y0 + 14, f"{key}. {tf_big} → {tf_small}", bold=True, size=13)
@@ -201,7 +204,7 @@ for key, f, tf_big, tf_small, cap, exp in ROWS:
hline(SL_X1, SL_X2, y_tp, GREEN, "2 3")
text(COL_X, y_tp + 4, f"ținta 1:1 {g['tp']:.2f}", fill=GREEN, size=11)
text(COL_X, y_e + 4, f"intrare {g['entry']:.2f}", fill=GREEN, size=11)
text(COL_X, y_dh - 5, f"high doji {g['dh']:.2f}", fill="#666", size=11)
text(COL_X, y_dh - 5, f"nivel din {tf_big}", fill="#666", size=11)
text(COL_X, y_sl + 12, f"stop {g['sl']:.2f}", fill=RED, size=11)
if first:
text(COL_X, y_sl + 25, "sub ultimele", fill=RED, size=11)
@@ -230,6 +233,24 @@ for key, f, tf_big, tf_small, cap, exp in ROWS:
anchor="middle", bold=True)
text((bx + kx) / 2 + 20, ya + 31, "→ de 4 ori mai multe acțiuni la același risc", fill=RED,
anchor="middle", bold=True)
# fiecare preț stă pe panoul lui: prețurile TF-ului mare nu apar în dreapta
# (SX0) și cele ale TF-ului mic nu apar în stânga. Asta e exact bug-ul care
# a pus „high doji 105.20" (weekly) pe graficul daily.
MARE = {k: g[k] for k in ("dh", "dl", "conf", "b_sl", "b_entry")}
MIC = {k: g[k] for k in ("entry", "sl", "tp", "sdl")}
for x, s_ in LABELS[lab0:]:
pe_mic = x >= SL_X1 - 20
rau = MARE if pe_mic else MIC
for k, v in rau.items():
assert f"{v:.2f}" not in s_, (
f"{key}: eticheta {s_!r} de pe panoul "
f"{'mic' if pe_mic else 'mare'} conține prețul {k}={v:.2f} al celuilalt panou")
# și invers: prețul TF-ului mare chiar e scris pe panoul mare, legat de serie
assert any(f"{g['dh']:.2f}" in s_ and x < SL_X1 - 20 for x, s_ in LABELS[lab0:]), \
f"{key}: high-ul dojiului mare nu apare pe panoul mare"
for k in ("entry", "sl", "tp"):
assert any(f"{g[k]:.2f}" in s_ and x >= SL_X1 - 20 for x, s_ in LABELS[lab0:]), \
f"{key}: {k} nu apare pe panoul mic"
print(f"{key}: doji mare {g['dh']:.2f}/{g['dl']:.2f} conf {g['conf']:.2f} | intrare {g['entry']:.2f} "
f"SL {g['sl']:.2f} risc {g['risk']:.2f} ({g['pct']:.2f} %) TP1 {g['tp']:.2f} | "
f"doar mare: risc {g['b_risk']:.2f} ({g['b_pct']:.2f} %)")