MODUL 5: 24 de reparatii pe cele doua strategii, dupa verificare

Opt erau blocante, adica un cititor ar fi executat gresit pe cont:

- 56% era legat de o intrare la 133 care da de fapt 35,3%; cifra se propaga in
  dimensionarea pozitiei. Acum spune ca 56% e rostit separat si ca raportul nu
  se verifica.
- "2/3 taie jumatate din risc" era fals (29,3% vs 35,3%).
- definitia lui buy doji se contrazicea cu regula de 4 luni din acelasi
  document.
- diagrama de trail arata stopul deasupra pretului: liniile traversau tot
  graficul, deci in stanga stateau peste candele. Acum fiecare porneste din
  swing low-ul care o declanseaza, cu cele patru swing low-uri marcate.
- linia gatului era data ca "media celor doua varfuri", ceea ce nu reproduce
  63.00 pe propriul desen; e din interiorul gatului.
- singura regula mecanica de "nu intra" nu era desenata cu mecanismul ei:
  panoul de volum avea bare egale de la o baza, in loc de histograma cu semn.
- "SL minim 54.17" se citea invers decat intelege textul: e pretul cel mai
  sus permis, nu stopul cel mai stramt.
- lectura "TP2 vine inaintea lui TP1" era prezentata ca geometrie in doua
  diagrame, desi fraza-sursa e neinteligibila si sursa sprijina la fel de bine
  varianta in care se recalculeaza si TP si SL. Acum e marcata ca lectura
  chiar acolo unde e folosita, cu varianta alternativa alaturi.

svg_candles are trei adaugiri optionale (Level.i0, Level.label_dy,
Chart.vol_zero) cerute de reparatiile de mai sus; selftest-ul trece si
diagramele existente nu se schimba daca nu sunt regenerate.

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-10-02 02:35:51 +00:00
parent 0dd358802d
commit c198cd0a7b
7 changed files with 1184 additions and 945 deletions

View File

@@ -134,7 +134,11 @@ SL = round(CAP + H / 3, 2) # 1/3 de la cap: marginea de sus a t
E = CDS[32].c # intrarea, la close-ul candelei de breakout
R = round(E - SL, 2)
TP1 = round(E + R, 2)
GAT = round((hi(CDS, 12, 12) + hi(CDS, 24, 24)) / 2, 2) # media celor două vârfuri
# „măsoară din interiorul gâtului pe aici, iau un average" (`05_7_...txt:1304`):
# nivelul se ia din interiorul gâtului, NU de la cele mai de sus vârfuri. Pe
# desen vârfurile sunt mai sus (barele 13 și 25 ating 63.30), de aceea eticheta
# nu are voie să spună „media celor două vârfuri".
GAT = round((hi(CDS, 12, 12) + hi(CDS, 24, 24)) / 2, 2)
H_HS = round(GAT - CAP, 2)
TP2 = round(GAT + H_HS, 2)
@@ -151,6 +155,10 @@ assert hi(CDS, 38, 42) >= TP1 > TP2, \
assert lo(CDS, 13, 18) < lo(CDS, 6, 9) and lo(CDS, 13, 18) < lo(CDS, 25, 31), \
"capul trebuie să fie mai jos decât ambii umeri"
assert VL[32] > max(VL[25:32]), "candela de breakout nu are volumul cel mai mare"
# regresia de prins: eticheta gâtului spune „din interiorul gâtului, nu de la
# vârfuri", deci nivelul trebuie să stea strict sub cel mai de sus vârf al zonei
assert GAT < max(hi(CDS, 10, 13), hi(CDS, 24, 25)), \
f"gâtul {GAT} nu e sub vârfurile zonei: eticheta ar minți"
print(f"construit: cap {CAP} umeri {UMS}/{UMD} H {H} SL {SL} intrare {E}"
f" R {R} TP1 {TP1} gât {GAT} (h {H_HS}) TP2 {TP2}")
@@ -167,7 +175,7 @@ deco(Chart(
Mark(17, "capul", "#6a3d9a", "below", dy=16),
Mark(31, "doji", "#b06000", "below", dy=8),
Mark(32, "buy doji = trigger", "#188a3e", dy=-40),
Mark(34, "retest", "#b06000", "below", dy=22),
Mark(34, "pullback la nivelul de breakout", "#b06000", "below", dy=22),
Mark(41, "apoi trail", "#1a5fb4", dy=-8)],
zones=[Zone(25, 31, "umărul drept", "#188a3e")],
mas=[MA(20, "#b06000", dash="4 3")],
@@ -301,28 +309,52 @@ X_CL = ([55.00, 56.50, 58.00, 59.50, 61.00, 62.20, 63.00]
+ [64.40] # 18 breakout, dar fără volum
+ [62.00, 60.00, 57.50, 55.00]) # 19-22 breakdown
X_WK = T_WK
X_VL = vols(23, 44, 10, i4=78, i8=52, i9=48, i10=40, i11=38, i12=34, i13=32,
i14=30, i15=28, i16=26, i17=24, i18=36, i19=54, i20=66, i21=74)
# Regula de „nu intra" din sursă e despre o histogramă CU SEMN care cade sub
# swing low-ul ei („histograma asta cade sub swing low-ul de aici […] iar prețul
# încă nu e acolo"), nu despre bare brute pornite de la o bază: pe bare
# nesemnate „minime tot mai joase" nu înseamnă nimic vizual. De aceea panoul de
# jos al acestei diagrame e desenat în jurul unui zero (`vol_zero`), cu trei
# minime tot mai joase, iar bara candelei de breakout fals e mică și sub zero.
ZERO = 50.0
X_VL = [60.0, 64.0, 68.0, 74.0, 80.0, 72.0, 66.0, # 0-6 urcarea
56.0, 50.0, 42.0, # 7-9 minimul 1
48.0, 46.0, 38.0, # 10-12 minimul 2
44.0, 42.0, 34.0, 40.0, # 13-16 minimul 3
36.0, # 17 doji
44.0, # 18 breakout fals
30.0, 24.0, 20.0, 16.0] # 19-22 breakdown
XC = from_closes(X_CL, wicks=X_WK, vols=X_VL, start=54.00)
assert abs(XC[17].c - XC[17].o) <= 0.15 * (XC[17].h - XC[17].l), "bara 17 nu e doji"
assert XC[18].c > hi(XC, 7, 17), "breakout-ul de preț există și aici"
assert X_VL[18] < X_VL[4], "volumul de breakout NU trebuie să treacă swing high-ul"
assert X_VL[17] == min(X_VL), "volumul minim trebuie să cadă pe doji"
assert X_VL[18] < ZERO, \
"pe candela de breakout histograma trebuie să fie deja sub zero"
_SW = (9, 12, 15)
for _i in _SW:
assert X_VL[_i - 1] > X_VL[_i] < X_VL[_i + 1], \
f"bara {_i} nu e un minim local al histogramei"
assert X_VL[_i] < ZERO, f"minimul de la bara {_i} trebuie să fie sub zero"
assert X_VL[_SW[0]] > X_VL[_SW[1]] > X_VL[_SW[2]], \
f"minimele histogramei nu coboară: {[X_VL[i] for i in _SW]}"
assert XC[22].c < lo(XC, 7, 17), "după breakout-ul fals prețul rupe consolidarea"
deco(Chart(
candles=XC,
levels=[Level(lo(XC, 7, 17), f"baza {lo(XC, 7, 17):.2f}", "#c00",
label_at="left")],
marks=[Mark(17, "doji", "#b06000", "below", dy=26),
Mark(18, "închide peste consolidare, dar volumul e praf", "#c00", dy=-10),
Mark(12, "volumul face minime tot mai joase", "#c00", "below", dy=26),
Mark(18, "închide peste consolidare, dar volumul e deja sub zero",
"#c00", dy=-10),
Mark(11, "histograma rupe sub propriul swing low, de trei ori",
"#c00", "below", dy=46),
Mark(22, "breakdown", "#c00", "below", dy=14)],
zones=[Zone(7, 17, "aceeași consolidare de 11 bare", "#c00")],
mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
scale=14.0, gap=26, body_w=11, left=58, width=700, top=46, vol_h=80,
vol_label="volum", title="Pasul 2, NU — breakout de preț fără breakout de volum",
caption="Exemplu construit (fără ticker). Prețul arată identic cu diagrama "
"de deasupra; diferă panoul de volum. False breakout."), "pas2_nu")
vol_zero=ZERO,
vol_label="histogramă de volum, cu semn (stil on balance volume)",
title="Pasul 2, NU — breakout de preț fără breakout de volum",
caption="Exemplu construit. Prețul e identic cu al diagramei de deasupra; "
"panoul de jos e histograma cu semn, nu volumul brut."), "pas2_nu")
# ================================================== 6. pasul 3 — stopul, treimea de jos
deco(Chart(
@@ -330,7 +362,7 @@ deco(Chart(
levels=[Level(UMD, f"umăr drept {UMD:.2f}", "#6a3d9a"),
Level(CAP, f"cap {CAP:.2f} — baza lui H", "#6a3d9a",
label_at="left"),
Level(SL, f"SL minim {SL:.2f} = cap + H/3", "#c00"),
Level(SL, f"SL cel mai sus permis: {SL:.2f} = cap + H/3", "#c00"),
Level(E, f"intrare {E:.2f}; distanța până la SL e R", "#188a3e",
label_at="left")],
marks=[Mark(12, "capul", "#6a3d9a", "below", dy=16),
@@ -344,11 +376,13 @@ deco(Chart(
# ========================================================= 7. pasul 4 — cele două ținte
deco(Chart(
candles=CDS[18:],
levels=[Level(SL, f"SL {SL:.2f}", "#c00", label_at="left"),
levels=[Level(CAP, f"capul {CAP:.2f} = baza înălțimii HS", "#6a3d9a"),
Level(SL, f"SL {SL:.2f}", "#c00", label_at="left"),
Level(E, f"intrare {E:.2f}", "#188a3e", label_at="left"),
Level(GAT, f"linia gâtului {GAT:.2f}, media celor două vârfuri",
"#6a3d9a", label_at="left"),
Level(TP2, f"TP2 {TP2:.2f} = gât + înălțimea HS", "#1a5fb4",
Level(GAT, f"linia gâtului {GAT:.2f}, din interiorul gâtului "
f"(nu de la vârfuri)", "#6a3d9a", label_at="left"),
Level(TP2, f"TP2 {TP2:.2f} = gât + înălțimea HS "
f"({GAT:.2f} − {CAP:.2f} = {H_HS:.2f})", "#1a5fb4",
label_at="left"),
Level(TP1, f"TP1 {TP1:.2f} = intrare + R", "#1a5fb4",
label_at="left")],
@@ -369,7 +403,9 @@ Y_CL = ([50.00, 51.20, 52.40, 53.00, 52.20, 53.40, 52.60, 53.20,
Y_WK = ([(0.30, 0.30)] * 10 + [(0.20, 0.20)]
+ [(0.30, 0.30), (0.30, 0.30), (0.30, 0.30)]
+ [(0.60, 0.50)] + [(0.30, 0.30)] * 4)
Y_VL = vols(19, 44, 10, i10=96, i11=52, i12=48, i13=46, i14=56, i15=88, i16=82)
# barele de retest trebuie să fie mai mici decât ale consolidării: legenda
# spune „volum mic pe retest, mare pe repornire"
Y_VL = vols(19, 44, 10, i10=96, i11=30, i12=26, i13=24, i14=28, i15=88, i16=82)
YC = from_closes(Y_CL, wicks=Y_WK, vols=Y_VL, start=49.00)
C_HI, C_LO = hi(YC, 0, 9), lo(YC, 0, 9)
JUM = round((C_HI + C_LO) / 2, 2)
@@ -377,14 +413,22 @@ assert YC[10].c > C_HI, "bara 10 trebuie să facă breakout peste consolidare"
assert JUM < lo(YC, 11, 14) < C_HI, \
"retestul trebuie să intre în consolidare, dar să se oprească peste jumătate"
assert YC[18].c > YC[10].c, "după retest prețul trebuie să plece mai sus"
assert max(Y_VL[11:15]) < min(Y_VL[0:10]), \
"barele de retest trebuie să fie sub toate barele consolidării"
assert Y_VL[15] > max(Y_VL[0:15]) * 0.9, "repornirea trebuie să vină cu volum"
# dreptunghiul consolidării e ancorat exact de cele două cifre din etichete,
# fără cei 8 px de padding impliciți: altfel capacul nu cade pe 53.70
assert JUM == round((C_HI + C_LO) / 2, 2), "jumătatea nu e a intervalului declarat"
deco(Chart(
candles=YC,
levels=[Level(C_HI, f"vârful consolidării {C_HI:.2f} = locul crimei", "#6a3d9a"),
Level(JUM, f"jumătatea consolidării {JUM:.2f}", "#b06000")],
Level(JUM, f"jumătatea consolidării {JUM:.2f} "
f"= ({C_HI:.2f} + {C_LO:.2f}) / 2", "#b06000"),
Level(C_LO, f"baza consolidării {C_LO:.2f}", "#6a3d9a")],
marks=[Mark(10, "breakout", "#188a3e", dy=-10),
Mark(13, "retest, se oprește peste jumătate", "#188a3e", "below", dy=20),
Mark(14, "doji aici: a doua intrare", "#188a3e", "below", dy=38)],
zones=[Zone(0, 9, "consolidarea", "#6a3d9a")],
zones=[Zone(0, 9, "consolidarea", "#6a3d9a", p_top=C_HI, p_bot=C_LO)],
scale=22.0, gap=30, body_w=12, left=58, width=700, top=46, vol_h=70,
vol_label="volum", title="Retestul, DA — se oprește în jumătatea de sus",
caption="Exemplu construit (fără ticker). Volum mic pe retest, mare pe "
@@ -412,7 +456,7 @@ deco(Chart(
marks=[Mark(10, "același breakout", "#188a3e", dy=-10),
Mark(13, "retestul trece sub jumătate", "#c00", "below", dy=52),
Mark(17, "volum în creștere pe coborâre", "#c00", "below", dy=16)],
zones=[Zone(0, 9, "aceeași consolidare", "#6a3d9a")],
zones=[Zone(0, 9, "aceeași consolidare", "#6a3d9a", p_top=C_HI, p_bot=C_LO)],
scale=15.0, gap=30, body_w=12, left=58, width=700, top=46, vol_h=70,
vol_label="volum", title="Retestul, NU — trece sub jumătate și rupe baza",
caption="Exemplu construit (fără ticker). Același breakout; diferă cât de "