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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user