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

@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Ce e un doji și ce nu — patru candele cu același high 50.10 și low 49.20.
"""Ce e un doji și ce nu — patru candele cu același high 50.10 și low 49.25.
Citește `gen/strategii/buy_doji_doji_forma.spec.txt` și scrie
`gen/strategii/buy_doji_doji_forma.svg`. E prima imagine din capitol: cine o
@@ -18,21 +18,21 @@ from pathlib import Path
OUT = Path(__file__).with_suffix(".svg")
GREEN, RED, GREY, BLUE = "#188a3e", "#c00", "#555", "#1a5fb4"
H, L = 50.10, 49.20
H, L = 50.10, 49.25
RNG = H - L
# (nume, o, h, l, c, verdict, rânduri de etichetă sub candelă)
CANDLES = [
("A", 49.60, 50.10, 49.20, 49.55, "DA", ["DA: corp 0.05", "= 5,6 % din înălțime"]),
("B", 49.62, 50.10, 49.20, 49.53, "DA", ["DA, la limită:", "corp 0.09 = 10 %"]),
("C", 49.80, 50.10, 49.20, 49.50, "NU", ["NU: corp 0.30", "= 33 %"]),
("D", 50.05, 50.10, 49.20, 50.10, "NU", ["NU: corp mic (5,6 %),", "dar fără fitil sus"]),
("A", 49.60, 50.10, 49.25, 49.55, "DA", ["DA: corp 0.05", "= 5,9 % din înălțime"]),
("B", 49.62, 50.10, 49.25, 49.54, "DA", ["DA, la limită:", "corp 0.08 = 9,4 %"]),
("C", 49.80, 50.10, 49.25, 49.50, "NU", ["NU: corp 0.30", "= 35 %"]),
("D", 50.05, 50.10, 49.25, 50.10, "NU", ["NU: corp mic (5,9 %),", "dar fără fitil sus"]),
]
# --- assert-urile din spec --------------------------------------------------
ratio = {n: round(abs(c - o) / (h - l), 4) for n, o, h, l, c, *_ in CANDLES}
for n, o, h, l, c, *_ in CANDLES:
assert h == H and l == L, (n, h, l) # 1
assert ratio == {"A": 0.0556, "B": 0.1000, "C": 0.3333, "D": 0.0556}, ratio # 2
assert ratio == {"A": 0.0588, "B": 0.0941, "C": 0.3529, "D": 0.0588}, ratio # 2
for n, o, h, l, c, *_ in CANDLES[:2]: # 3
assert ratio[n] <= 0.10 and min(o, c) > l and max(o, c) < h, n
assert ratio["C"] > 0.10 # 4
@@ -85,7 +85,7 @@ def arrow(x1, y1, x2, y2, color, lines, anchor="start"):
text(x1 + dx, y0 + 14 * k, s, color, anchor, bold=(k == 0))
text(24, 30, "Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos", "#333",
text(24, 30, "Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.25 jos", "#333",
bold=True, size=14)
# zonele: A+B sunt doji, C+D nu
@@ -99,7 +99,7 @@ for p in (H, L):
t(f'<line x1="{XS[0] - 100}" y1="{y(p):.1f}" x2="{W - 24}" y2="{y(p):.1f}" '
f'stroke="#bbb" stroke-dasharray="4 3"/>')
text(24, y(H) - 6, "cât de sus a urcat prețul: 50.10")
text(24, y(L) + 14, "cât de jos a coborât: 49.20")
text(24, y(L) + 14, "cât de jos a coborât: 49.25")
for (n, o, h, l, c, verdict, lines), x in zip(CANDLES, XS):
color = GREEN if c >= o else RED
@@ -128,7 +128,7 @@ text(xA + 20, y(cA) + 10, "close 49.55")
# --- săgețile pe contraexemple ----------------------------------------------
xC, xD = XS[2], XS[3]
arrow(xC + 34, y(H) - 112, xC + 14, y(49.78), RED,
lines=["corp prea gros (33 %)", "aici una din tabere a câștigat —", "nu mai e indecizie"])
lines=["corp prea gros (35 %)", "aici una din tabere a câștigat —", "nu mai e indecizie"])
arrow(xD, y(H) - 34, xD, y(H) - 4, RED, anchor="middle",
lines=["fără fitil sus", "regula cere fitil în ambele părți"])