From 7beb3d42fe72382ef5b62a3e32ebd01e25942193 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sun, 20 Sep 2026 11:42:29 +0000 Subject: [PATCH] buy_doji: graficul TF-ului mic devine lupa pe candelele TF-ului mare Userul nu putea vedea ce bucata din weekly e reprezentata de daily. In perechi_tf si directie, graficul mic nu mai e o serie care vine dupa cel mare, ci descompunerea lui reala: o candela mare = k candele mici, cu open, close, max(high) si min(low) care coincid, verificat bara cu bara prin assert. k per pereche: 5 zile/saptamana, 4 saptamani/luna, 7 bare de 60 min/zi. Corespondenta se vede: caseta de lupa peste exact candelele marite, ghidaje catre colturile cadrului mic, si nivelul-cheie desenat ca aceeasi linie pe ambele panouri, cu acelasi numar de ambele parti. Interdictia "eticheta unui panou nu poate numi pretul celuilalt" capata o exceptie explicita pentru nivelurile comune, cu assert propriu ca numarul apare identic pe ambele panouri. Pullback-ul si momentul intrarii sunt acum etichetate pe desen, nu doar in text. Toate cifrele recalculate din serii. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ --- gen/strategii/buy_doji_directie.py | 248 +++++--- gen/strategii/buy_doji_directie.spec.txt | 134 +++-- gen/strategii/buy_doji_directie.svg | 183 +++--- gen/strategii/buy_doji_perechi_tf.py | 445 +++++++++----- gen/strategii/buy_doji_perechi_tf.spec.txt | 190 +++--- gen/strategii/buy_doji_perechi_tf.svg | 484 +++++++-------- summaries/17_STRATEGII/01_buy_doji.html | 667 +++++++++++---------- summaries/17_STRATEGII/01_buy_doji.md | 667 +++++++++++---------- 8 files changed, 1702 insertions(+), 1316 deletions(-) diff --git a/gen/strategii/buy_doji_directie.py b/gen/strategii/buy_doji_directie.py index 4e46099..ee2da98 100644 --- a/gen/strategii/buy_doji_directie.py +++ b/gen/strategii/buy_doji_directie.py @@ -3,16 +3,27 @@ Citește `gen/strategii/buy_doji_directie.spec.txt` și scrie `gen/strategii/buy_doji_directie.svg`. Două panouri stivuite: sus weekly -(10 bare, Buy Doji confirmat), jos daily (17 bare, uptrend, Sell Doji tehnic -valid, short-ul lovește SL-ul). Coordonatele sunt absolute (fără -), ca audit_diagrams.py să vadă pozițiile reale ale textelor. +(12 bare, Buy Doji confirmat), jos daily (15 bare = ultimele 3 bare weekly +desfăcute zi cu zi, 5 zile pe săptămână). + +Seria weekly 9..11 NU e scrisă de mână: e agregarea reală a celor 15 zile +(open = open-ul primei zile, close = close-ul ultimei, high/low = extremele). +Panoul weekly poartă un dreptunghi peste exact acele 3 bare, plus două +ghidaje către colțurile cadrului daily, iar high-ul și low-ul doji-ului daily +sunt desenate ca aceeași linie punctată, cu același număr, pe ambele panouri. + +Coordonatele sunt absolute (fără ), ca audit_diagrams.py să vadă +pozițiile reale ale textelor. Rulare: python3 gen/strategii/buy_doji_directie.py """ +import re from pathlib import Path OUT = Path(__file__).with_suffix(".svg") W = 900 +GROUP = 5 # zile pe săptămână +ZOOM = 3 # câte bare weekly sunt desfăcute jos def trend(start, closes, wick=0.15): @@ -23,75 +34,97 @@ def trend(start, closes, wick=0.15): return bars -# --- seriile din spec: (open, high, low, close) ----------------------------- +def agg(days): + """Agregă GROUP zile într-o bară weekly.""" + return (days[0][0], max(b[1] for b in days), min(b[2] for b in days), days[-1][3]) + + +# --- seria daily: 15 bare = 3 săptămâni -------------------------------------- +DY = trend(81.30, [81.70, 82.20, 82.00, 82.60, 83.10, 83.50]) + [ + (83.50, 84.30, 83.40, 83.60), # 6: zi cu respingere sus (dă high-ul de referință) + (83.60, 83.90, 83.05, 83.55), # 7: doji daily + (83.55, 83.65, 82.60, 82.70), # 8: confirmare => Sell Doji, intrare short + (82.70, 82.80, 82.00, 82.25), # 9: singura zi de scădere + (82.25, 83.05, 82.15, 82.95), + (82.95, 83.70, 82.85, 83.60), + (83.60, 84.45, 83.50, 84.30), # 12: SL lovit + (84.30, 84.95, 84.20, 84.80), + (84.80, 85.45, 84.70, 85.30)] + +# --- seria weekly: 9 bare de context + cele 3 agregate din daily ------------- WK = trend(89.0, [88.0, 86.2, 84.9, 83.1, 81.6, 80.2, 78.9]) + [ - (78.90, 79.80, 77.60, 78.80), # 7: doji - (78.80, 81.60, 78.60, 81.30), # 8: confirmare => Buy Doji weekly - (81.30, 82.70, 81.10, 82.40)] -DY = trend(81.30, [81.7, 82.2, 82.0, 82.6, 83.1, 83.5, 83.3, 83.9, 84.4]) + [ - (84.40, 84.80, 83.95, 84.35), # 9: doji - (84.35, 84.45, 83.45, 83.60), # 10: confirmare => Sell Doji, intrare short - (83.60, 83.70, 83.00, 83.20), - (83.20, 84.00, 83.10, 83.90), - (83.90, 84.70, 83.80, 84.60), - (84.60, 85.25, 84.50, 85.10), # 14: SL lovit - (85.10, 85.75, 85.00, 85.60), - (85.60, 86.30, 85.50, 86.10)] + (78.90, 79.80, 77.60, 78.80), # 7: doji weekly + (78.80, 81.60, 78.60, 81.30)] # 8: confirmare => Buy Doji weekly +WK += [agg(DY[k:k + GROUP]) for k in range(0, len(DY), GROUP)] +Z0 = len(WK) - ZOOM # prima bară weekly mărită jos def eq(a, b): return abs(a - b) < 0.005 -# --- assert-urile din spec --------------------------------------------------- -assert len(WK) == 10 and len(DY) == 17 +# --- assert-uri: coerență, agregare, poveste --------------------------------- +assert len(DY) == ZOOM * GROUP and len(WK) == 9 + ZOOM for name, bars in (("weekly", WK), ("daily", DY)): for i, (o, h, l, c) in enumerate(bars): assert h >= max(o, c) and l <= min(o, c), f"{name}[{i}] h/l incoerent" if i: assert eq(o, bars[i - 1][3]), f"{name}[{i}] open != close precedent" -for name, (o, h, l, c) in (("doji weekly", WK[7]), ("doji daily", DY[9])): +assert eq(DY[0][0], WK[8][3]), "daily nu începe la close-ul confirmării weekly" +# agregarea, verificată din nou pe valorile finale (nu pe cele care au construit-o) +for k in range(ZOOM): + days = DY[k * GROUP:(k + 1) * GROUP] + o, h, l, c = WK[Z0 + k] + assert eq(o, days[0][0]) and eq(c, days[-1][3]), f"weekly[{Z0+k}] o/c != zile" + assert eq(h, max(b[1] for b in days)), f"weekly[{Z0+k}] high != max(high zile)" + assert eq(l, min(b[2] for b in days)), f"weekly[{Z0+k}] low != min(low zile)" +for name, (o, h, l, c) in (("doji weekly", WK[7]), ("doji daily", DY[7])): assert abs(o - c) <= 0.10 * (h - l) + 1e-9, f"{name} nu e doji" assert WK[8][3] > WK[7][1], "weekly: fără confirmare" -assert DY[10][3] < DY[9][2], "daily: fără confirmare Sell Doji" -ENTRY = DY[10][3] -# stopul: 5 cenți peste high-ul ultimelor 4 candele, ca la pasul 5 (oglindit) -SL = round(max(b[1] for b in DY[7:11]) + 0.05, 2) +assert DY[8][3] < DY[7][2], "daily: fără confirmare Sell Doji" + +DH, DL = DY[7][1], DY[7][2] # nivelurile comune: high/low doji daily +ENTRY = DY[8][3] +SL = round(max(b[1] for b in DY[5:9]) + 0.05, 2) # 5 cenți peste high-ul de 4 candele RISK = round(SL - ENTRY, 2) TP1 = round(ENTRY - RISK, 2) -assert eq(ENTRY, 83.60) and eq(SL, 84.85) and eq(RISK, 1.25) and eq(TP1, 82.35) -LOW_AFTER = min(b[2] for b in DY[11:]) -assert eq(LOW_AFTER, 83.00) and LOW_AFTER > TP1, "TP1 atins" -HIT = next(i for i in range(11, 17) if DY[i][1] >= SL - 1e-9) -assert HIT == 14, f"SL lovit la {HIT}" -assert eq(DY[0][0], WK[8][3]), "daily nu începe la close-ul confirmării weekly" +assert eq(ENTRY, 82.70) and eq(SL, 84.35) and eq(RISK, 1.65) and eq(TP1, 81.05) +assert SL - DH > 0.30, "stopul e prea lipit de high-ul doji-ului (etichete suprapuse)" +assert DL - ENTRY > 0.30, "intrarea e prea lipită de low-ul doji-ului" +LOW_AFTER = min(b[2] for b in DY[9:]) +assert eq(LOW_AFTER, 82.00) and LOW_AFTER > TP1, "TP1 atins" +HIT = next(i for i in range(9, len(DY)) if DY[i][1] >= SL - 1e-9) +assert HIT == 12, f"SL lovit la {HIT}" +assert min(b[2] for b in DY) < DH < max(b[1] for b in WK), "nivel comun în afara scării" # --- desen ------------------------------------------------------------------- -GREEN, RED, ORANGE, GRAY, INK = "#188a3e", "#c00", "#d06a00", "#777", "#333" +GREEN, RED, ORANGE, GRAY, INK, BLUE = "#188a3e", "#c00", "#d06a00", "#777", "#333", "#1a5fb4" BODY_W = 9 -out = [] +out, texts = [], [] +PANEL = "none" -def text(x, y, s, fill=INK, anchor="start", bold=False, size=None): +def text(x, y, s, fill=INK, anchor="start", bold=False, size=None, panel=None): st = (["font-weight:bold"] if bold else []) + ([f"font-size:{size}px"] if size else []) style = f' style="{";".join(st)}"' if st else "" a = f' text-anchor="{anchor}"' if anchor != "start" else "" out.append(f'{s}') + texts.append((panel or PANEL, s)) -def line(x1, y1, x2, y2, color, width=1.5, dash=None, extra=""): +def line(x1, y1, x2, y2, color, width=1.5, dash=None): d = f' stroke-dasharray="{dash}"' if dash else "" out.append(f'') + f'stroke="{color}" stroke-width="{width}"{d}/>') -def rect(x, y, w, h, fill, opacity, stroke="none"): +def rect(x, y, w, h, fill, opacity, stroke="none", dash=None): + d = f' stroke-dasharray="{dash}"' if dash else "" out.append(f'') + f'fill-opacity="{opacity}" stroke="{stroke}" stroke-width="1.5"{d} rx="3"/>') def arrow(x1, y1, x2, y2, color): - """Săgeată de la (x1,y1) la vârful (x2,y2): linie + cap triunghi.""" d = max(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5, 1e-9) ux, uy = (x2 - x1) / d, (y2 - y1) / d bx, by = x2 - 9 * ux, y2 - 9 * uy @@ -114,72 +147,121 @@ text(20, 24, "NU: Sell Doji daily contra unui Buy Doji weekly — exemplu constr bold=True, size=14) # ---- panoul de sus: weekly ---------------------------------------------------- -WX0, WGAP, WS, WT = 60, 16, 12.0, 66 -wmax = max(b[1] for b in WK) +PANEL = "weekly" +WX0, WGAP, WS, WT = 60, 16, 16, 70 +wmax, wmin = max(b[1] for b in WK), min(b[2] for b in WK) yw = lambda p: WT + (wmax - p) * WS # noqa: E731 xw = lambda i: WX0 + i * WGAP # noqa: E731 +w_bottom = yw(wmin) text(20, 50, "weekly: direcția", fill="#555", bold=True) -rect(xw(7) - 8, yw(WK[8][1]) - 4, WGAP + 16, yw(WK[7][2]) - yw(WK[8][1]) + 8, - GREEN, 0.12, GREEN) +rect(xw(7) - 8, yw(WK[8][1]) - 4, WGAP + 16, yw(WK[7][2]) - yw(WK[8][1]) + 8, GREEN, 0.12, GREEN) +# dreptunghiul de corespondență: exact barele weekly desfăcute în panoul daily +ZX1, ZX2, ZY1, ZY2 = xw(Z0) - 8, xw(len(WK) - 1) + 8, WT - 10, w_bottom + 8 +rect(ZX1, ZY1, ZX2 - ZX1, ZY2 - ZY1, BLUE, 0.07, BLUE, "5 4") +text(ZX2 + 12, ZY1 + 14, f"ultimele {ZOOM} săptămâni,", fill=BLUE, size=11) +text(ZX2 + 12, ZY1 + 30, "mărite jos", fill=BLUE, size=11) + +# nivelurile comune, desenate identic pe ambele panouri +COMMON = [(DH, f"{DH:.2f}", "high doji"), (DL, f"{DL:.2f}", "low doji")] candles(WK, WX0, WGAP, yw) -text(xw(7), yw(WK[7][2]) + 16, "doji weekly", fill=ORANGE, anchor="middle", bold=True) -# săgeata weekly: ce + de ce -arrow(300, yw(WK[8][3]) - 6, xw(8) + 12, yw(WK[8][3]) - 6, GREEN) -text(306, yw(WK[8][3]) - 10, f"weekly: Buy Doji confirmat (close {WK[8][3]:.2f}, " - f"peste high-ul doji-ului {WK[7][1]:.2f})", fill=GREEN, bold=True) -text(306, yw(WK[8][3]) + 8, "deci direcția permisă e LONG: pe daily cauți doar Buy Doji", - fill=GREEN) -w_bottom = yw(min(b[2] for b in WK)) +for k, (lvl, lab, _) in enumerate(COMMON): + line(44, yw(lvl), ZX2 + 8, yw(lvl), BLUE, 1.2, "3 3") + text(40, yw(lvl) + (-2 if k == 0 else 11), lab, fill=BLUE, anchor="end", size=10, + panel="common") +for k in range(ZOOM): + text(xw(Z0 + k), ZY2 - 6, f"S{k + 1}", fill=BLUE, anchor="middle", + size=10, bold=True, panel="common") +arrow(470, yw(80.50), xw(8) + 11, yw(80.50), GREEN) +text(476, yw(80.50) - 4, f"weekly: Buy Doji confirmat (close {WK[8][3]:.2f}, peste " + f"high-ul doji-ului {WK[7][1]:.2f})", fill=GREEN, bold=True, size=11) +text(476, yw(80.50) + 14, "deci direcția permisă e LONG: pe daily cauți doar Buy Doji", + fill=GREEN, size=11) +text(xw(7) + 5, ZY2 + 8, "doji weekly", fill=ORANGE, anchor="end", bold=True, size=10) # ---- panoul de jos: daily ----------------------------------------------------- +PANEL = "daily" DX0, DGAP, DS = 60, 18, 40.0 -DT = w_bottom + 110 -dmax = max(b[1] for b in DY) +FT = w_bottom + 92 # marginea de sus a cadrului daily +DT = FT + 14 +dmax, dmin = max(b[1] for b in DY), min(b[2] for b in DY) yd = lambda p: DT + (dmax - p) * DS # noqa: E731 xd = lambda i: DX0 + i * DGAP # noqa: E731 -line(20, w_bottom + 34, W - 20, w_bottom + 34, "#ddd", 1) -text(20, w_bottom + 56, f"daily: zilele de după confirmarea weekly " - f"(open {DY[0][0]:.2f} = close-ul ei)", fill="#555", bold=True) +FX1, FX2 = xd(0) - 14, xd(len(DY) - 1) + 14 +FB = max(yd(dmin), yd(TP1)) + 14 -LX1, LX2, COL = xd(9) - 10, 392, 400 +# ghidajele: colțurile de jos ale dreptunghiului -> colțurile de sus ale cadrului +line(ZX1, ZY2, FX1, FT, BLUE, 1.2, "5 4") +line(ZX2, ZY2, FX2, FT, BLUE, 1.2, "5 4") +out.append(f'') +text(FX2 + 34, ZY2 + 26, f"daily: aceleași {ZOOM} săptămâni, zi cu zi", fill=BLUE, bold=True) +text(FX2 + 34, ZY2 + 44, f"({GROUP} zile = o bară weekly; open, close și extremele coincid)", + fill="#555", size=11) + +rect(xd(7) - 8, yd(DY[7][1]) - 3, DGAP + 16, yd(DY[8][2]) - yd(DY[7][1]) + 6, ORANGE, 0.15, ORANGE) +for k, (lvl, lab, _) in enumerate(COMMON): + line(44, yd(lvl), FX2 + 14, yd(lvl), BLUE, 1.2, "3 3") + text(40, yd(lvl) + 4, lab, fill=BLUE, anchor="end", size=10, panel="common") + +LX2, COL = 340, 348 y_sl, y_e, y_tp = yd(SL), yd(ENTRY), yd(TP1) assert abs((y_sl - y_e) - (y_e - y_tp)) < 1e-6, "SL-intrare != intrare-TP1 în px" -rect(xd(9) - 8, yd(DY[9][1]) - 3, DGAP + 16, yd(DY[10][2]) - yd(DY[9][1]) + 6, ORANGE, 0.15, ORANGE) -line(LX1, y_sl, LX2, y_sl, RED, 1.5, "6 3") -line(xd(10) - 8, y_e, LX2, y_e, ORANGE, 1.5, "6 3") -line(xd(10) - 8, y_tp, LX2, y_tp, GRAY, 1.5, "2 3") -text(COL, y_sl + 4, f"stop {SL:.2f} = 5 cenți peste high-ul de 4 candele", fill=RED, size=11) -text(COL, y_e + 4, f"intrare short {ENTRY:.2f}", fill=ORANGE, size=11) -text(COL, y_tp + 4, f"ținta {TP1:.2f} — neatinsă (a scăzut o zi, la {LOW_AFTER:.2f})", - fill=GRAY, size=11) +line(44, y_sl, LX2, y_sl, RED, 1.5, "6 3") +line(xd(8) - 8, y_e, LX2, y_e, ORANGE, 1.5, "6 3") +line(xd(8) - 8, y_tp, LX2, y_tp, GRAY, 1.5, "2 3") +text(COL, y_sl + 4, f"stop {SL:.2f}", fill=RED, size=11, bold=True) +text(COL, y_e + 4, f"intrare short {ENTRY:.2f}", fill=ORANGE, size=11, bold=True) +text(COL, y_tp + 4, f"ținta {TP1:.2f} = 1R — neatinsă", fill=GRAY, size=11) candles(DY, DX0, DGAP, yd) +for k in range(ZOOM): + text((xd(k * GROUP) + xd(k * GROUP + GROUP - 1)) / 2, FB + 16, f"S{k + 1}", + fill=BLUE, anchor="middle", size=10, bold=True, panel="common") +text((xd(7) + xd(8)) / 2, yd(DY[7][1]) - 6, "doji daily", fill=ORANGE, anchor="middle", + bold=True, size=10) -# SL lovit la bara 14: săgeată din dreapta sus -cx14 = xd(HIT) -out.append(f'') -y_hit = DT - 40 -arrow(560, y_hit + 6, cx14 + 9, y_sl - 9, RED) -text(568, y_hit, f"aici te-a scos: stopul {SL:.2f}, lovit a {HIT - 10}-a zi", fill=RED, bold=True) -text(568, y_hit + 18, "banii mari de pe weekly cumpără mai departe", fill=RED) +arrow(512, y_sl - 26, cx_hit + 9, y_sl - 9, RED) +text(520, y_sl - 30, f"aici te-a scos: stopul {SL:.2f} (5 cenți peste high-ul de 4 candele),", + fill=RED, bold=True, size=11) +text(520, y_sl - 12, f"lovit a {HIT - 8}-a zi — banii mari de pe weekly cumpără mai departe", + fill=RED, size=11) -# intrarea short: săgeată de jos-dreapta spre close-ul confirmării -y_bot = yd(min(b[2] for b in DY)) -x_e = xd(12) + 6 -arrow(x_e, y_tp + 30, xd(10) + 7, y_e + 4, ORANGE) -text(x_e + 6, y_tp + 28, f"aici ai intrat SHORT, la {ENTRY:.2f}: Sell Doji corect ca formă", - fill=ORANGE, bold=True) -text(x_e + 6, y_tp + 46, f"(close sub low-ul doji-ului {DY[9][2]:.2f}) — dar contra weekly-ului", - fill=ORANGE) +arrow(512, y_e + 52, xd(8) + 8, y_e + 4, ORANGE) +text(520, y_e + 48, f"aici ai intrat SHORT, la {ENTRY:.2f}: Sell Doji corect ca formă", + fill=ORANGE, bold=True, size=11) +text(520, y_e + 66, f"(close sub low-ul doji-ului {DL:.2f}) — dar contra weekly-ului", + fill=ORANGE, size=11) +text(520, y_e + 84, f"a scăzut o singură zi, până la {LOW_AFTER:.2f}", fill=ORANGE, size=11) -y0 = max(y_bot, y_tp + 46) + 34 -text(20, y0, "Seria e construită: un singur caz ilustrează regula, nu o dovedește.", fill="#555") -H = y0 + 24 +PANEL = "none" +y0 = FB + 42 +text(20, y0, "Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: " + "high-ul și low-ul doji-ului daily.", fill="#555", size=11) +text(20, y0 + 18, "Seria e construită: un singur caz ilustrează regula, nu o dovedește.", + fill="#555", size=11) +H = y0 + 40 + +# --- niciun număr scris de mână: fiecare preț din etichete vine din serii ------ +WNUM = {f"{v:.2f}" for b in WK for v in b} +DNUM = {f"{v:.2f}" for b in DY for v in b} | {f"{v:.2f}" for v in (SL, ENTRY, TP1, RISK)} +CNUM = {f"{DH:.2f}", f"{DL:.2f}"} +ALLOWED = {"weekly": WNUM, "daily": DNUM, "common": CNUM, "none": set()} +for panel, s in texts: + for n in re.findall(r"\d+\.\d\d", s): + assert n in ALLOWED[panel], f"eticheta {panel} conține prețul străin {n}: {s!r}" +# nivelurile comune apar cu exact același număr pe ambele panouri +com = [s for p, s in texts if p == "common" and re.fullmatch(r"\d+\.\d\d", s)] +for lab in (f"{DH:.2f}", f"{DL:.2f}"): + assert com.count(lab) == 2, f"nivelul comun {lab} nu apare pe ambele panouri: {com}" svg = (f'\n ' + "\n ".join(out) + "\n") assert "\n\n" not in svg OUT.write_text(svg, encoding="utf-8") -print(f"intrare {ENTRY:.2f} SL {SL:.2f} risc {RISK:.2f} TP1 {TP1:.2f} | min după {LOW_AFTER:.2f} | " - f"SL lovit la bara {HIT}") +for k in range(ZOOM): + print(f"S{k+1}: weekly {WK[Z0+k]} = zilele {k*GROUP}..{k*GROUP+GROUP-1}") +print(f"intrare {ENTRY:.2f} SL {SL:.2f} risc {RISK:.2f} TP1 {TP1:.2f} | " + f"doji high {DH:.2f} low {DL:.2f} | min după {LOW_AFTER:.2f} | SL lovit la bara {HIT}") print(f"scris {OUT} ({W}x{H:.0f})") diff --git a/gen/strategii/buy_doji_directie.spec.txt b/gen/strategii/buy_doji_directie.spec.txt index a518fa8..b389627 100644 --- a/gen/strategii/buy_doji_directie.spec.txt +++ b/gen/strategii/buy_doji_directie.spec.txt @@ -1,69 +1,113 @@ SPEC DIAGRAMĂ — buy_doji_directie ================================= -tip: PRET, două panouri stivuite (sus weekly mic, jos daily) +tip: PRET, două panouri stivuite (sus weekly, jos daily) legate prin zoom destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 2, după perechi_tf cheie markdown: titlu SVG: „NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit" -stil: candele lipite (gap 15-18, body_w 9-10), fără volum; open = close anterior. +stil: candele lipite (weekly gap 16, daily gap 18, body_w 9), fără volum; + open = close anterior pe ambele panouri. CE TREBUIE SĂ DEMONSTREZE ------------------------- Pe weekly s-a confirmat un Buy Doji. Pe daily, în uptrend-ul care urmează, -apare un Sell Doji tehnic valid. Ca poziție short e contra direcției -weekly: prețul scade o zi, apoi urcă și lovește SL-ul. Zona „short de 1-2 -zile" e marcată separat, ca să se vadă diferența dintre un short scurt -înăuntrul structurii și o poziție contra ei. +apare un Sell Doji tehnic valid. Ca poziție short e contra direcției weekly: +prețul scade o singură zi, apoi urcă și lovește SL-ul a patra zi. -SERIA — panoul de sus (weekly, 10 bare, (o,h,l,c)) --------------------------------------------------- -Close-uri: 88.0, 86.2, 84.9, 83.1, 81.6, 80.2, 78.9 (bara 0 open 89.0, -fitile 0.15 peste/sub corp), apoi: - 7 doji (78.90, 79.80, 77.60, 78.80) - 8 confirm (78.80, 81.60, 78.60, 81.30) - 9 (81.30, 82.70, 81.10, 82.40) -Mark(7, "doji weekly"), Mark(8, "Buy Doji weekly: direcția = long"). +În plus (cerut de user, 20.09.2026): trebuie să se vadă **care bucată din +weekly e mărită jos**. Deci panoul daily nu e o serie separată, ci +descompunerea reală a ultimelor 3 bare weekly, iar corespondența e desenată. -SERIA — panoul de jos (daily, 17 bare, (o,h,l,c)) -------------------------------------------------- -Barele 0-8, close-uri 81.7, 82.2, 82.0, 82.6, 83.1, 83.5, 83.3, 83.9, 84.4, -open[0] = 81.30, fitile 0.15 peste/sub corp (uptrend de 9 candele). - 9 doji (84.40, 84.80, 83.95, 84.35) -10 confirmare (84.35, 84.45, 83.45, 83.60) close < low doji 83.95 => Sell Doji -11 (83.60, 83.70, 83.00, 83.20) -12 (83.20, 84.00, 83.10, 83.90) -13 (83.90, 84.70, 83.80, 84.60) -14 (84.60, 85.25, 84.50, 85.10) <- high 85.25 >= SL 84.80 -15 (85.10, 85.75, 85.00, 85.60) -16 (85.60, 86.30, 85.50, 86.10) +CORESPONDENȚA PANOURILOR (partea nouă) +-------------------------------------- +1. AGREGARE REALĂ, nu ilustrativă. Seria daily are 15 bare = 3 săptămâni x 5 + zile. Ultimele 3 bare weekly NU sunt scrise de mână: se calculează cu + agg(zile) = (open-ul primei zile, max high, min low, close-ul ultimei zile). + Un al doilea set de assert-uri reverifică relația pe valorile finale. +2. DREPTUNGHI DE ZOOM pe panoul weekly peste exact barele 9..11 (albastru + #1a5fb4, fill 0.07, contur punctat), pe toată înălțimea panoului, cu + eticheta „ultimele 3 săptămâni, mărite jos" în dreapta lui. +3. DOUĂ GHIDAJE punctate de la colțurile de jos ale dreptunghiului la + colțurile de sus ale cadrului panoului daily (cadrul daily e desenat + explicit, punctat, în aceeași culoare) — pâlnia de mărire. +4. ETICHETE S1/S2/S3: pe weekly, sub fiecare din cele 3 bare mărite; pe daily, + sub fiecare grup de 5 zile, centrat. Aceleași etichete, aceeași culoare. +5. NIVELURI COMUNE: high-ul (83.90) și low-ul (83.05) ale doji-ului + daily se desenează ca aceeași linie punctată albastră pe AMBELE panouri, + cu numărul etichetat în gutter-ul din stânga (x=40, anchor end) la aceeași + distanță de marginea stângă pe ambele panouri. + +SERIA — panoul de jos (daily, 15 bare, (o,h,l,c)) — SURSA ADEVĂRULUI +-------------------------------------------------------------------- +Barele 0-5: trend(81.30, [81.70, 82.20, 82.00, 82.60, 83.10, 83.50]), fitile 0.15. + 6 (83.50, 84.30, 83.40, 83.60) zi de respingere sus — dă high-ul de referință + 7 doji (83.60, 83.90, 83.05, 83.55) + 8 confirmare (83.55, 83.65, 82.60, 82.70) close < low doji 83.05 => Sell Doji + 9 (82.70, 82.80, 82.00, 82.25) singura zi de scădere +10 (82.25, 83.05, 82.15, 82.95) +11 (82.95, 83.70, 82.85, 83.60) +12 (83.60, 84.45, 83.50, 84.30) <- high 84.45 >= SL 84.35 +13 (84.30, 84.95, 84.20, 84.80) +14 (84.80, 85.45, 84.70, 85.30) + +SERIA — panoul de sus (weekly, 12 bare) +--------------------------------------- +Barele 0-6: trend(89.0, [88.0, 86.2, 84.9, 83.1, 81.6, 80.2, 78.9]), fitile 0.15. + 7 doji (78.90, 79.80, 77.60, 78.80) + 8 confirm (78.80, 81.60, 78.60, 81.30) => Buy Doji weekly, close 81.30 + 9 S1 = agg(zilele 0..4) = (81.30, 83.25, 81.15, 83.10) +10 S2 = agg(zilele 5..9) = (83.10, 84.30, 82.00, 82.25) +11 S3 = agg(zilele 10..14) = (82.25, 85.45, 82.15, 85.30) +Daily începe exact la close-ul confirmării weekly (81.30 = open-ul zilei 0). NIVELURI (panoul daily) ----------------------- -intrare short 83.60 (portocaliu), stop 84.85 roșu („stop 84.85 = 5 cenți peste -high-ul de 4 candele"), ținta 82.35 punctată („neatinsă — a scăzut o zi, la 83.00"). -Stopul e 5 cenți peste extremă, ca oglinda pasului 5 din capitol (51.60 -> 51.55). -Paranteza „short de 1-2 zile: permis" a fost scoasă (nuanță de nivel 3, încărca -pasul mecanic), la fel și insignele de colț — locul lor îl iau săgețile. +intrare short 82.70 (portocaliu), stop 84.35 roșu, ținta 81.05 = 1R punctată +(neatinsă — a scăzut o zi, până la 82.00). Stopul e 5 cenți peste high-ul +ultimelor 4 candele (max = 84.30 la bara 6), ca oglinda pasului 5 din capitol. +Risc 1.65; SL−intrare și intrare−TP1 sunt egale și în px (assert). +Distanțele stop↔high-doji și intrare↔low-doji sunt ținute > 0.30 printr-un +assert, altfel etichetele lor s-ar suprapune la 40 px/unitate. SĂGEȚI (format tutorial v2: ce ȘI de ce, 1 pe weekly + 2 pe daily) -- weekly, spre confirmare: „weekly: Buy Doji confirmat (close 81.30, peste - high-ul doji-ului 79.80)" / „deci direcția permisă e LONG: pe daily cauți - doar Buy Doji". -- daily, spre close-ul confirmării: „aici ai intrat SHORT, la 83.60: Sell Doji - corect ca formă (close sub low-ul doji-ului 83.95) — dar contra weekly-ului". -- daily, spre bara 14 pe linia stopului: „aici te-a scos: stopul 84.85, lovit a - patra zi" / „banii mari de pe weekly cumpără mai departe". +- weekly: „Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80)" / + „deci direcția permisă e LONG: pe daily cauți doar Buy Doji". +- daily, spre close-ul confirmării: „aici ai intrat SHORT, la 82.70: Sell Doji + corect ca formă" / „(close sub low-ul doji-ului 83.05) — dar contra + weekly-ului" / „a scăzut o singură zi, până la 82.00". +- daily, spre bara 12 pe linia stopului: „aici te-a scos: stopul 84.35 (5 cenți + peste high-ul de 4 candele)," / „lovit a 4-a zi — banii mari de pe weekly + cumpără mai departe". Zone: verde peste doji-ul + confirmarea weekly, portocalie peste Sell Doji-ul -daily (portocaliu, nu roșu, ca să nu se confunde cu linia stopului). -Lățime 900 (textele săgeților stau în dreapta candelelor). +daily. Lățime 900. ASSERT-URI ---------- 1. open[i] == close[i-1] pe ambele panouri; h/l cuprind o/c. -2. Doji weekly și doji daily: abs(o-c) <= 0.10*(h-l). -3. weekly close[8] > high[7]; daily close[10] < low[9]. -4. SL == max(h for bare daily 7..10) + 0.05 == 84.85; risc == 1.25; TP1 == 82.35. -5. min(l for bare daily 11..16) == 83.00 > 82.35 (TP1 neatins). -6. primul i>10 cu high >= 84.85 este 14. +2. Agregarea: pentru fiecare k, weekly[9+k] == agg(daily[5k:5k+5]) — open, + close, max(high), min(low), verificate separat. +3. daily[0].open == weekly[8].close. +4. Doji weekly și doji daily: abs(o-c) <= 0.10*(h-l). +5. weekly close[8] > high[7]; daily close[8] < low[7]. +6. SL == max(h for daily 5..8) + 0.05 == 84.35; risc == 1.65; TP1 == 81.05. +7. SL − high_doji > 0.30 și low_doji − intrare > 0.30 (anti-suprapunere). +8. min(l for daily 9..14) == 82.00 > 81.05 (TP1 neatins). +9. primul i>8 cu high >= 84.35 este 12. +10. SL−intrare == intrare−TP1 în pixeli. +11. NICIUN NUMĂR SCRIS DE MÂNĂ: fiecare text emis e etichetat cu panoul lui + (weekly / daily / common / none); după desen, orice token \d+\.\d\d din + orice etichetă trebuie să fie în mulțimea derivată a panoului respectiv. + Eticheta unui panou nu poate conține prețul celuilalt panou; excepția e + mulțimea „common" (high/low doji daily), permisă pe ambele. +12. Fiecare nivel comun apare cu EXACT același șir de două zecimale de două + ori (o dată pe fiecare panou). +13. Fără linii goale în SVG. + +VERIFICARE VIZUALĂ (20.09.2026) +------------------------------- +Randat cu chrome headless, citit ca imagine: pâlnia de ghidaje arată clar +cele 3 săptămâni mărite; 83.90 și 83.05 sunt aceeași linie, cu același număr, +pe ambele panouri; niciun text nu se suprapune și nimic nu iese din viewBox. +audit_diagrams.py: curat. SURSA ----- diff --git a/gen/strategii/buy_doji_directie.svg b/gen/strategii/buy_doji_directie.svg index 04986e3..a71a129 100644 --- a/gen/strategii/buy_doji_directie.svg +++ b/gen/strategii/buy_doji_directie.svg @@ -1,83 +1,106 @@ - + NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - - - - - - - - - - - - - - - - - - - - - doji weekly - - - weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) - deci direcția permisă e LONG: pe daily cauți doar Buy Doji - - daily: zilele de după confirmarea weekly (open 81.30 = close-ul ei) - - - - - stop 84.85 = 5 cenți peste high-ul de 4 candele - intrare short 83.60 - ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - aici te-a scos: stopul 84.85, lovit a 4-a zi - banii mari de pe weekly cumpără mai departe - - - aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă - (close sub low-ul doji-ului 83.95) — dar contra weekly-ului - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + ultimele 3 săptămâni, + mărite jos + + + + + + + + + + + + + + + + + + + + + + + + + + 83.90 + + 83.05 + S1 + S2 + S3 + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + doji weekly + + + + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) + + + 83.90 + + 83.05 + + + + stop 84.35 + intrare short 82.70 + ținta 81.05 = 1R — neatinsă + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S1 + S2 + S3 + doji daily + + + + aici te-a scos: stopul 84.35 (5 cenți peste high-ul de 4 candele), + lovit a 4-a zi — banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 82.70: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.05) — dar contra weekly-ului + a scăzut o singură zi, până la 82.00 + Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: high-ul și low-ul doji-ului daily. + Seria e construită: un singur caz ilustrează regula, nu o dovedește. \ No newline at end of file diff --git a/gen/strategii/buy_doji_perechi_tf.py b/gen/strategii/buy_doji_perechi_tf.py index 8613e89..1e452df 100644 --- a/gen/strategii/buy_doji_perechi_tf.py +++ b/gen/strategii/buy_doji_perechi_tf.py @@ -1,15 +1,28 @@ #!/usr/bin/env python3 -"""Buy Doji — aceeași regulă pe trei perechi de timeframe-uri. +"""Buy Doji — aceeași regulă pe trei perechi de timeframe-uri, cu lupă. Citește `gen/strategii/buy_doji_perechi_tf.spec.txt` și scrie `gen/strategii/buy_doji_perechi_tf.svg`. Trei rânduri (weekly→daily, -monthly→weekly, daily→60 min); pe fiecare, stânga = TF mare (11 candele, -buy doji + confirmare), dreapta = TF mic (15 candele, pullback de 8 candele -la high-ul dojiului mare, doji acolo, confirmare, intrare). +monthly→weekly, daily→60 min). Pe fiecare rând: stânga = TF mare, dreapta = +TF mic. Graficul mic NU e o serie care vine după cel mare — e +**descompunerea reală** a ultimelor candele mari: fiecare candelă mare din +caseta de lupă se sparge în `k` candele mici, cu open/close/high/low +agregate exact (verificat cu assert). -Rândul A e seria din spec; B și C se CALCULEAZĂ din A prin -p' = round(100 + f*(p - 100), 2), cu f = 2.5 și 0.4. Cifrele din desen ies -din serii, iar assert-urile le compară cu valorile afirmate în spec. +Sursa de adevăr e seria FINĂ (`FINE`). Candelele mari se CALCULEAZĂ din ea +prin agregare pe k bare; barele mari dinaintea lupei (`BASE`) sunt date +separat și se leagă de lupă prin close == open. + + rând TF mare → TF mic k candele mari mărite bare mici + A weekly → daily 5 3 15 + B monthly → weekly 4 3 12 + C daily → 60 min 7 2 14 + +Rândurile B și C se obțin din A prin p' = round(100 + f*(p - 100), 2), cu +f = 2.5 și 0.4. Transformarea e afină, deci agregarea se păstrează; gruparea +(k) diferă însă per rând, deci barele mari se recalculează per rând. + +Toate cifrele din desen ies din serii; niciuna nu e scrisă de mână. Coordonatele sunt absolute (fără ), ca audit_diagrams.py să vadă pozițiile reale ale textelor. @@ -20,39 +33,59 @@ from pathlib import Path OUT = Path(__file__).with_suffix(".svg") W = 720 -# --- seria A din spec: (open, high, low, close) ---------------------------- -BIG_A = [(122.0, 122.6, 119.4, 120.0), (120.0, 120.5, 117.0, 117.5), (117.5, 119.0, 117.1, 118.4), - (118.4, 118.8, 114.3, 114.8), (114.8, 115.3, 111.5, 112.0), (112.0, 113.4, 111.6, 112.9), - (112.9, 113.2, 109.1, 109.6), (109.6, 110.0, 106.3, 106.8), (106.8, 107.2, 103.6, 104.0), - (104.0, 105.2, 101.9, 103.8), # 9: doji - (103.8, 107.4, 103.5, 107.0)] # 10: confirmare -SMALL_A = [(107.0, 107.2, 106.4, 106.6), (106.6, 106.8, 106.0, 106.1), (106.1, 106.6, 105.95, 106.4), - (106.4, 106.5, 105.8, 105.9), (105.9, 106.0, 105.5, 105.6), (105.6, 105.95, 105.5, 105.8), - (105.8, 105.9, 105.4, 105.5), (105.5, 105.6, 105.25, 105.35), - (105.35, 105.75, 105.10, 105.40), # 8: doji la nivel - (105.40, 106.40, 105.30, 106.30), # 9: confirmare => intrare - (106.3, 107.0, 106.2, 106.9), (106.9, 107.5, 106.7, 107.4), (107.4, 107.55, 107.0, 107.2), - (107.2, 108.0, 107.1, 107.9), (107.9, 108.6, 107.8, 108.5)] +# --- seria fină (TF mic), rândul A: (open, high, low, close) --------------- +# 0..7 pullback de 8 candele, în jos, până la nivelul din TF-ul mare +# 8 doji la nivel 9 confirmare => intrare 10..14 drumul spre țintă +FINE_A = [(107.0, 107.2, 106.4, 106.6), (106.6, 106.8, 106.0, 106.1), + (106.1, 106.6, 105.95, 106.4), (106.4, 106.5, 105.8, 105.9), + (105.9, 106.0, 105.5, 105.6), (105.6, 105.95, 105.5, 105.8), + (105.8, 105.9, 105.4, 105.5), (105.5, 105.6, 105.25, 105.35), + (105.35, 105.75, 105.10, 105.40), # 8: doji la nivel + (105.40, 106.40, 105.30, 106.30), # 9: confirmare => intrare + (106.3, 107.0, 106.2, 106.9), (106.9, 107.5, 106.7, 107.4), + (107.4, 107.55, 107.0, 107.2), (107.2, 108.0, 107.1, 107.9), + (107.9, 108.6, 107.8, 108.5)] + +# --- barele TF-ului mare dinaintea casetei de lupă, rândul A --------------- +# 6 = doji mare, 7 = confirmare mare (close 107.0 = open-ul primei bare fine) +BASE_A = [(118.4, 118.8, 114.3, 114.8), (114.8, 115.3, 111.5, 112.0), + (112.0, 113.4, 111.6, 112.9), (112.9, 113.2, 109.1, 109.6), + (109.6, 110.0, 106.3, 106.8), (106.8, 107.2, 103.6, 104.0), + (104.0, 105.2, 101.9, 103.8), # 6: doji mare + (103.8, 107.4, 103.5, 107.0)] # 7: confirmare mare +DOJI_B, CONF_B = 6, 7 +PULLBACK_N = 8 # câte bare mici are pullback-ul (0..7) +FINE_DOJI, FINE_CONF = 8, 9 def scaled(bars, f): return [tuple(round(100 + f * (p - 100), 2) for p in b) for b in bars] -# key, f, TF mare, TF mic, text sub rând, valori așteptate din spec +def aggregate(fine, k, n): + """n candele mari, fiecare din k bare fine consecutive.""" + out_ = [] + for j in range(n): + part = fine[j * k:(j + 1) * k] + out_.append((part[0][0], max(b[1] for b in part), + min(b[2] for b in part), part[-1][3])) + return out_ + + +# key, f, TF mare, TF mic, k, nr. candele mari mărite, text sub rând, valori din spec ROWS = [ - ("A", 1.0, "weekly", "daily", - "stop {p:.2f} % (pe weekly ar fi {pb:.2f} %) · 8 candele = 8 zile de bursă", - dict(dh=105.20, dl=101.90, conf=107.00, sdl=105.10, entry=106.30, sl=105.10, risk=1.20, - pct=1.13, tp=107.50, b_entry=107.00, b_sl=101.90, b_risk=5.10, b_pct=4.77)), - ("B", 2.5, "monthly", "weekly", - "stop {p:.2f} % (pe monthly ar fi {pb:.2f} %) · 8 candele = 8 săptămâni", - dict(dh=113.00, dl=104.75, conf=117.50, sdl=112.75, entry=115.75, sl=112.75, risk=3.00, - pct=2.59, tp=118.75, b_entry=117.50, b_sl=104.75, b_risk=12.75, b_pct=10.85)), - ("C", 0.4, "daily", "60 min", - "stop {p:.2f} % (pe daily ar fi {pb:.2f} %) · 8 candele ≈ 1,2 zile de bursă (7 bare/zi)", - dict(dh=102.08, dl=100.76, conf=102.80, sdl=102.04, entry=102.52, sl=102.04, risk=0.48, - pct=0.47, tp=103.00, b_entry=102.80, b_sl=100.76, b_risk=2.04, b_pct=1.98)), + ("A", 1.0, "weekly", "daily", 5, 3, + dict(dh=105.20, dl=101.90, conf=107.00, entry=106.30, sl=105.10, risk=1.20, + pct=1.13, tp=107.50, b_entry=107.00, b_sl=101.90, b_risk=5.10, b_pct=4.77, + zhi=108.60, zlo=105.10)), + ("B", 2.5, "monthly", "weekly", 4, 3, + dict(dh=113.00, dl=104.75, conf=117.50, entry=115.75, sl=112.75, risk=3.00, + pct=2.59, tp=118.75, b_entry=117.50, b_sl=104.75, b_risk=12.75, b_pct=10.85, + zhi=118.75, zlo=112.75)), + ("C", 0.4, "daily", "60 min", 7, 2, + dict(dh=102.08, dl=100.76, conf=102.80, entry=102.52, sl=102.04, risk=0.48, + pct=0.47, tp=103.00, b_entry=102.80, b_sl=100.76, b_risk=2.04, b_pct=1.98, + zhi=103.20, zlo=102.04)), ] @@ -60,206 +93,292 @@ def eq(a, b): return abs(a - b) < 0.005 -def check(key, big, small, exp): - """Assert-urile obligatorii din spec, pe seriile calculate; întoarce nivelurile.""" - for name, bars in (("mare", big), ("mic", small)): +def check(key, base, zoom, fine, k, nz, exp): + """Assert-urile obligatorii din spec; întoarce nivelurile folosite în desen.""" + big = base + zoom + for name, bars in (("mare", big), ("mic", fine)): for i, (o, h, l, c) in enumerate(bars): assert h >= max(o, c) and l <= min(o, c), f"{key} {name}[{i}] h/l incoerent" if i: assert eq(o, bars[i - 1][3]), f"{key} {name}[{i}] open != close precedent" - assert len(big) == 11 and len(small) == 15 - assert eq(small[0][0], big[10][3]), f"{key}: open mic[0] != close mare[10]" - for name, (o, h, l, c) in (("doji mare", big[9]), ("doji mic", small[8])): + assert len(fine) == k * nz, f"{key}: {len(fine)} bare fine != {k}*{nz}" + assert len(big) == len(BASE_A) + nz + + # (1) AGREGAREA — fiecare candelă mare mărită e exact suma a k candele mici + for j, (o, h, l, c) in enumerate(zoom): + part = fine[j * k:(j + 1) * k] + assert eq(o, part[0][0]), f"{key}: open mare[{j}] != open primei mici" + assert eq(c, part[-1][3]), f"{key}: close mare[{j}] != close ultimei mici" + assert eq(h, max(b[1] for b in part)), f"{key}: high mare[{j}] != max(high mici)" + assert eq(l, min(b[2] for b in part)), f"{key}: low mare[{j}] != min(low mici)" + # lupa se leagă de restul graficului mare: confirmarea mare dă open-ul lupei + assert eq(fine[0][0], base[CONF_B][3]), f"{key}: open fine[0] != close confirmare mare" + + # (2) setup-ul pe TF mare: doji + confirmare + for name, (o, h, l, c) in (("doji mare", base[DOJI_B]), ("doji mic", fine[FINE_DOJI])): assert abs(o - c) <= 0.10 * (h - l) + 1e-9, f"{key}: {name} nu e doji" - assert big[10][3] > big[9][1] and small[9][3] > small[8][1], f"{key}: fără confirmare" - sl = min(b[2] for b in small[6:10]) - assert eq(sl, small[8][2]), f"{key}: SL nu e low-ul dojiului mic" - entry = small[9][3] + assert base[CONF_B][3] > base[DOJI_B][1], f"{key}: fără confirmare pe TF mare" + assert fine[FINE_CONF][3] > fine[FINE_DOJI][1], f"{key}: fără confirmare pe TF mic" + + # (3) trade-ul pe TF mic + sl = min(b[2] for b in fine[FINE_DOJI - 2:FINE_CONF + 1]) + assert eq(sl, fine[FINE_DOJI][2]), f"{key}: SL nu e low-ul dojiului mic" + assert eq(sl, min(b[2] for b in fine)), f"{key}: low-ul dojiului nu e minimul zonei mărite" + entry = fine[FINE_CONF][3] risk = round(entry - sl, 2) tp = round(entry + risk, 2) - first = next(i for i in range(10, 15) if small[i][1] >= tp - 1e-9) + first = next(i for i in range(FINE_CONF + 1, len(fine)) if fine[i][1] >= tp - 1e-9) assert first == 11, f"{key}: TP1 atins la {first}, nu la 11" pct = risk / entry * 100 - b_entry, b_sl = big[10][3], big[9][2] + + # (4) pullback = revenire scurtă fără minim nou sub minimul dojiului mare + pull = fine[:PULLBACK_N] + assert pull[0][3] > pull[-1][3], f"{key}: pullback-ul nu coboară" + assert min(b[2] for b in pull) > base[DOJI_B][2], f"{key}: pullback-ul face minim nou" + + b_entry, b_sl = base[CONF_B][3], base[DOJI_B][2] b_risk = round(b_entry - b_sl, 2) b_pct = b_risk / b_entry * 100 - got = dict(dh=big[9][1], dl=big[9][2], conf=big[10][3], sdl=small[8][2], entry=entry, sl=sl, - risk=risk, pct=pct, tp=tp, b_entry=b_entry, b_sl=b_sl, b_risk=b_risk, b_pct=b_pct) - for k, v in exp.items(): - assert eq(round(got[k], 2), v), f"{key}: {k} = {got[k]:.4f}, spec {v}" - assert abs(small[8][2] - big[9][1]) / big[9][1] <= 0.005, f"{key}: doji mic nu e la nivel" + got = dict(dh=base[DOJI_B][1], dl=base[DOJI_B][2], conf=base[CONF_B][3], entry=entry, + sl=sl, risk=risk, pct=pct, tp=tp, b_entry=b_entry, b_sl=b_sl, + b_risk=b_risk, b_pct=b_pct, + zhi=max(b[1] for b in fine), zlo=min(b[2] for b in fine)) + for kk, v in exp.items(): + assert eq(round(got[kk], 2), v), f"{key}: {kk} = {got[kk]:.4f}, spec {v}" + # (5) zona mărită de pe graficul mare are EXACT extremele graficului mic + assert eq(got["zhi"], max(b[1] for b in zoom)) and eq(got["zlo"], min(b[2] for b in zoom)) + # (6) doji-ul mic chiar atinge nivelul din TF-ul mare (sub pragul strict de 0,5 %) + assert abs(sl - got["dh"]) / got["dh"] <= 0.005, f"{key}: doji mic nu e la nivel" assert 4 <= b_pct / pct <= 5, f"{key}: raport stopuri {b_pct / pct:.2f} nu e 4-5x" return got # --- desen ------------------------------------------------------------------ -GREEN, RED, GRAY, INK = "#188a3e", "#c00", "#888", "#333" -PLOT_H = 160 # înălțimea zonei de preț, egală pe toate graficele -BX0, BGAP = 40, 16 # TF mare: x candele -SX0, SGAP = 392, 15 # TF mic +GREEN, RED, GRAY, INK, BLUE = "#188a3e", "#c00", "#888", "#333", "#1a5fb4" +PLOT_H = 160 +BX0, BGAP = 105, 15 # TF mare +SX0, SGAP = 372, 15 # TF mic BODY_W = 9 -SL_X1, SL_X2 = 380, 614 # liniile de nivel pe graficul mic -COL_X = 620 # coloana cu etichetele de nivel ale graficului mic +FRAME_L = SX0 - 9 # marginea stângă a cadrului graficului mic +COL_X = 597 # coloana de etichete a graficului mic +MIDX = FRAME_L - 20 # granița stânga/dreapta pentru verificarea de panou out = [] -LABELS = [] # (x, text) al fiecărei etichete, pentru verificarea de panou +LABELS = [] # (x0, x1, text) al fiecărei etichete, pentru verificări -def text(x, y, s, fill=INK, anchor="start", bold=False, size=None): - st = [] +def text(x, y, s, fill=INK, anchor="start", bold=False, size=12): + st = [f"font-size:{size}px"] if bold: st.append("font-weight:bold") - if size: - 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'{s}') + w = len(s) * 5.7 if size >= 12 else len(s) * size * 0.5 + x0 = x if anchor == "start" else (x - w / 2 if anchor == "middle" else x - w) + assert 4 <= x0 and x0 + w <= W - 4, f"text iese din viewBox: {s!r} ({x0:.0f}..{x0 + w:.0f})" + LABELS.append((x0, x0 + w, y, s)) + out.append(f'{s}') -def hline(x1, x2, y, color, dash): +def hline(x1, x2, y, color, dash, width=1.5): out.append(f'') + f'stroke="{color}" stroke-width="{width}" stroke-dasharray="{dash}"/>') + + +def line(x1, y1, x2, y2, color, dash="", width=1.2, marker=""): + d = f' stroke-dasharray="{dash}"' if dash else "" + m = f' marker-end="url(#{marker})"' if marker else "" + out.append(f'') + + +def rect(x0_, y0_, x1, y1, color, fill_op=0.10, dash=""): + d = f' stroke-dasharray="{dash}"' if dash else "" + out.append(f'') def candles(bars, x0, gap, yf): for i, (o, h, l, c) in enumerate(bars): cx = x0 + i * gap color = GREEN if c >= o else RED - out.append(f'') - top = yf(max(o, c)) - hh = max(yf(min(o, c)) - top, 1.6) - out.append(f'') -out.append('' - '') -text(20, 22, "Aceeași regulă pe trei perechi — exemplu construit (fără ticker)", bold=True, size=14) - -def zone(x0, y0_, x1, y1, color): - out.append(f'') - - -def bracket(x, ya, yb_, color, label): - """Paranteză verticală între două prețuri, cu eticheta la dreapta.""" - out.append(f'') - text(x + 5, (ya + yb_) / 2 + 4, label, fill=color, bold=True) + text(tip + (4 if side == "right" else -4), (ya + yb_) / 2 + 4, label, fill=color, + anchor="start" if side == "right" else "end", bold=True, size=11) +def stack(items, minsep=14): + """Împinge în jos etichetele coloanei din dreapta ca să nu se suprapună.""" + items = sorted(items, key=lambda t: t[0]) + y_prev = None + for y, s, fill in items: + if y_prev is not None and y < y_prev + minsep: + y = y_prev + minsep + text(COL_X, y, s, fill=fill, size=10) + y_prev = y + return y_prev + + +out.append('' + '') +text(20, 22, "Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mari", + bold=True, size=13) + y0 = 40 -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) +for key, f, tf_big, tf_small, k, nz, exp in ROWS: + fine = scaled(FINE_A, f)[:k * nz] + base = scaled(BASE_A, f) + zoom = aggregate(fine, k, nz) + big = base + zoom + g = check(key, base, zoom, fine, k, nz, 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) - text(BX0 - 16, y0 + 32, f"{tf_big}: direcția", fill="#555") - text(SL_X1, y0 + 32, f"{tf_small}: intrarea", fill="#555") + text(20, y0 + 32, f"{tf_big}: direcția", fill="#555", size=11) + text(FRAME_L, y0 + 32, f"{tf_small}: descompunerea ultimelor {nz} candele {tf_big}", + fill="#555", size=11) top = y0 + 50 # scară proprie pe fiecare grafic, constantă în interiorul lui - bmax = max(b[1] for b in big); bmin = min(b[2] for b in big) - smax = max(b[1] for b in small); smin = min(b[2] for b in small) + bmax, bmin = max(b[1] for b in big), min(b[2] for b in big) + smax, smin = max(b[1] for b in fine), min(b[2] for b in fine) bs, ss = PLOT_H / (bmax - bmin), PLOT_H / (smax - smin) yb = lambda p, t=top, m=bmax, s=bs: t + (m - p) * s # noqa: E731 ys = lambda p, t=top, m=smax, s=ss: t + (m - p) * s # noqa: E731 - # TF mare: zonă peste doji + confirmare, eticheta dedesubt - zx0, zx1 = BX0 + 9 * BGAP - 9, BX0 + 10 * BGAP + 9 - zone(zx0, yb(big[10][1]) - 5, zx1, yb(g["dl"]) + 5, GREEN) - text((zx0 + zx1) / 2, yb(g["dl"]) + 20, "doji + confirmare:", fill=GREEN, anchor="middle", bold=True) - text((zx0 + zx1) / 2, yb(g["dl"]) + 34, "aici se decide direcția", fill=GREEN, - anchor="middle", bold=True) - hline(BX0 - 16, BX0 + 10 * BGAP + 12, yb(g["dh"]), GRAY, "3 3") - text(BX0 - 14, yb(g["dh"]) + 14, f"high doji {tf_big} {g['dh']:.2f}", fill="#666") + # ---- TF mare ----------------------------------------------------------- + # zona verde peste doji + confirmare (acolo se decide direcția) + zx0, zx1 = BX0 + DOJI_B * BGAP - 9, BX0 + CONF_B * BGAP + 9 + rect(zx0, yb(base[CONF_B][1]) - 5, zx1, yb(g["dl"]) + 6, GREEN) + text((zx0 + zx1) / 2, top + 178, "doji + confirmare:", fill=GREEN, anchor="middle", + bold=True, size=11) + text((zx0 + zx1) / 2, top + 192, "aici se decide direcția", fill=GREEN, anchor="middle", + bold=True, size=11) + # caseta de lupă peste exact candelele mari care se sparg în dreapta + lx0, lx1 = BX0 + len(base) * BGAP - 8, BX0 + (len(big) - 1) * BGAP + 9 + ly0, ly1 = yb(g["zhi"]) - 2, yb(g["zlo"]) + 2 + rect(lx0, ly0, lx1, ly1, BLUE, fill_op=0.06) + # nivelul comun: high-ul dojiului mare, aceeași linie punctată pe ambele panouri + hline(BX0 - 15, lx1, yb(g["dh"]), GRAY, "3 3") + text(42, yb(g["dh"]) - 15, f"high doji {tf_big}", fill="#666", size=11) + text(42, yb(g["dh"]) - 2, f"{g['dh']:.2f}", fill="#666", size=11) candles(big, BX0, BGAP, yb) - # săgeata-zoom: de la close-ul confirmării mari la open-ul primei bare mici (același preț) - x1, y1 = BX0 + 10 * BGAP + 8, yb(g["conf"]) - x2, y2 = SX0 - 10, ys(g["conf"]) - out.append(f'') - text(290, y1 + 2, "apoi cobori", fill="#555") - text(290, y1 + 16, "pe graficul mic", fill="#555") + # ---- ghidajele de lupă ------------------------------------------------- + for ya, yb_ in ((ly0, top), (ly1, top + PLOT_H)): + line(lx1, ya, FRAME_L, yb_, BLUE, dash="5 3", width=1.1) + mid = (lx1 + FRAME_L) / 2 + for i, s_ in enumerate(("lupă:", f"ultimele {nz}", f"candele {tf_big}")): + text(mid, top + 86 + i * 13, s_, fill=BLUE, anchor="middle", size=10) - # TF mic: niveluri + # ---- TF mic ------------------------------------------------------------ y_dh, y_e, y_sl, y_tp = ys(g["dh"]), ys(g["entry"]), ys(g["sl"]), ys(g["tp"]) assert abs((y_sl - y_e) / (y_e - y_tp) - 1) < 1e-6, f"{key}: SL-intrare != intrare-TP1 în px" - # zonă peste doji-ul mic + confirmare, eticheta dedesubt - sx0, sx1 = SX0 + 8 * SGAP - 9, SX0 + 9 * SGAP + 9 - zone(sx0, y_e - 6, sx1, y_sl + 5, GREEN) - text((sx0 + sx1) / 2, y_sl + 20, "doji la nivel:", fill=GREEN, anchor="middle", bold=True) - text((sx0 + sx1) / 2, y_sl + 34, "aici intri", fill=GREEN, anchor="middle", bold=True) - hline(SL_X1, SL_X2, y_dh, GRAY, "3 3") - hline(SL_X1, SL_X2, y_e, GREEN, "6 3") - hline(SL_X1, SL_X2, y_sl, RED, "6 3") - 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"nivel din {tf_big}", fill="#666", size=11) - text(COL_X, y_sl + 12, f"stop {g['sl']:.2f}", fill=RED, size=11) + frame_r = SX0 + (len(fine) - 1) * SGAP + 9 + rect(FRAME_L, top, frame_r, top + PLOT_H, BLUE, fill_op=0.03) + # zona verde peste doji-ul mic + confirmare + sx0, sx1 = SX0 + FINE_DOJI * SGAP - 9, SX0 + FINE_CONF * SGAP + 9 + rect(sx0, y_e - 6, sx1, y_sl + 4, GREEN) + line((sx0 + sx1) / 2, top + PLOT_H, (sx0 + sx1) / 2, top + 192, GREEN, width=1) + text((sx0 + sx1) / 2, top + 204, "doji la nivel, apoi confirmare: aici intri", fill=GREEN, + anchor="middle", bold=True, size=11) + hline(FRAME_L, frame_r, y_dh, GRAY, "3 3") + hline(FRAME_L, frame_r, y_e, GREEN, "6 3") + hline(FRAME_L, frame_r, y_sl, RED, "6 3") + hline(FRAME_L, frame_r, y_tp, GREEN, "2 3") + col = [(y_tp + 4, f"ținta 1:1 {g['tp']:.2f}", GREEN), + (y_e + 4, f"intrare {g['entry']:.2f}", GREEN), + (y_dh + 4, f"nivel {tf_big} {g['dh']:.2f}", "#666"), + (y_sl + 4, f"stop {g['sl']:.2f}", RED)] if first: - text(COL_X, y_sl + 25, "sub ultimele", fill=RED, size=11) - text(COL_X, y_sl + 38, "4 candele", fill=RED, size=11) - candles(small, SX0, SGAP, ys) + col.append((y_sl + 17, "sub ultimele 4 bare", RED)) + candles(fine, SX0, SGAP, ys) + stack(col) + + # pullback: paranteză sub cadru, peste primele 8 bare + pxa, pxb = SX0 - 6, SX0 + (PULLBACK_N - 1) * SGAP + 6 + out.append(f'') + text((pxa + pxb) / 2, top + PLOT_H + 22, f"pullback: {PULLBACK_N} candele în jos, fără minim nou", + fill="#555", anchor="middle", size=11) if first: - # paranteză peste pullback-ul de 8 candele (barele 0..7), doar pe primul rând - yb8 = y_tp - 12 - xa, xb = SX0 - 5, SX0 + 7 * SGAP + 5 - out.append(f'') - text((xa + xb) / 2, yb8 - 5, "pullback: 8 candele", fill="#555", anchor="middle") - # parantezele de stop: același setup, măsurat pe TF mare și pe TF mic - bx = zx1 + 8 - bracket(bx, yb(g["b_entry"]), yb(g["b_sl"]), RED, f"stop {g['b_pct']:.2f} %".replace(".", ",")) - kx = SX0 + 9 * SGAP + 14 + # același setup, stopul măsurat pe fiecare TF + bx = 30 + bracket(bx, yb(g["b_entry"]), yb(g["b_sl"]), RED, + f"stop {g['b_pct']:.2f} %".replace(".", ",")) + kx = SX0 + (FINE_CONF + 1) * SGAP - 3 bracket(kx, y_e, y_sl, RED, f"stop {g['pct']:.2f} %".replace(".", ",")) ratio = g["b_pct"] / g["pct"] assert 4 <= ratio < 4.5, f"raportul stopurilor {ratio:.2f} nu e „de 4 ori”" - # săgeata dintre ele, sub rând - ya = top + PLOT_H + 58 - out.append(f'') - text((bx + kx) / 2 + 20, ya + 17, "același setup, stop de 4 ori mai mic", fill=RED, - 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 + ya = top + PLOT_H + 56 + line(bx, ya, kx, ya, RED, width=1.6, marker="pt-red") + text((bx + kx) / 2, ya + 17, + f"același setup, stop de {ratio:.1f} ori mai mic".replace(".", ","), + fill=RED, anchor="middle", bold=True, size=11) + text((bx + kx) / 2, ya + 31, + f"→ de {ratio:.1f} ori mai multe acțiuni la același risc".replace(".", ","), + fill=RED, anchor="middle", bold=True, size=11) + + # --- fiecare preț stă pe panoul lui, cu excepția NIVELURILOR COMUNE ----- + # Nivelurile comune (aici: high-ul dojiului mare) sunt desenate pe ambele + # panouri și au voie să apară de ambele părți — dar OBLIGATORIU cu același + # număr. Restul prețurilor rămân fiecare pe panoul lui: un preț al TF-ului + # mare pe panoul mic se citește greșit, ca trigger al panoului mic. + COMUNE = {"dh"} + MARE = {kk: g[kk] for kk in ("dh", "dl", "conf", "b_sl", "b_entry") if kk not in COMUNE} + MIC = {kk: g[kk] for kk in ("entry", "sl", "tp") if kk not in COMUNE} + for x0_, _x1, _y, s_ in LABELS[lab0:]: + pe_mic = x0_ >= MIDX rau = MARE if pe_mic else MIC - for k, v in rau.items(): + for kk, 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} %)") - y0 += 320 if first else 270 + f"{'mic' if pe_mic else 'mare'} conține prețul {kk}={v:.2f} al celuilalt panou") + # nivelul comun apare pe AMBELE panouri, cu exact același număr + for kk in COMUNE: + v = f"{g[kk]:.2f}" + st_ = [s_ for x0_, _x1, _y, s_ in LABELS[lab0:] if v in s_ and x0_ < MIDX] + dr_ = [s_ for x0_, _x1, _y, s_ in LABELS[lab0:] if v in s_ and x0_ >= MIDX] + assert st_ and dr_, f"{key}: nivelul comun {kk}={v} lipsește de pe un panou ({st_} / {dr_})" + for kk in ("entry", "sl", "tp"): + assert any(f"{g[kk]:.2f}" in s_ and x0_ >= MIDX for x0_, _x1, _y, s_ in LABELS[lab0:]), \ + f"{key}: {kk} nu apare pe panoul mic" + + print(f"{key}: {tf_big}→{tf_small} k={k} ({nz} candele mari = {len(fine)} mici) | " + f"doji mare {g['dh']:.2f}/{g['dl']:.2f} conf {g['conf']:.2f} | lupă {g['zlo']:.2f}-{g['zhi']:.2f} | " + f"intrare {g['entry']:.2f} SL {g['sl']:.2f} risc {g['risk']:.2f} ({g['pct']:.2f} %) " + f"TP1 {g['tp']:.2f} | doar mare: risc {g['b_risk']:.2f} ({g['b_pct']:.2f} %) " + f"= x{g['b_pct'] / g['pct']:.2f}") + y0 = top + (300 if first else 238) if key != "C": out.append(f'') H = y0 - 20 +# nicio pereche de etichete nu se suprapune +for a in range(len(LABELS)): + for b in range(a + 1, len(LABELS)): + xa0, xa1, ya_, sa = LABELS[a] + xb0, xb1, yb_, sb = LABELS[b] + assert not (abs(ya_ - yb_) < 13 and xa0 < xb1 - 4 and xb0 < xa1 - 4), \ + f"etichete suprapuse: {sa!r} / {sb!r}" + assert 0 < LABELS[a][2] < H, f"etichetă în afara înălțimii: {LABELS[a][3]!r}" + svg = (f'\n ' + "\n ".join(out) + "\n") assert "\n\n" not in svg diff --git a/gen/strategii/buy_doji_perechi_tf.spec.txt b/gen/strategii/buy_doji_perechi_tf.spec.txt index f07f8d5..5acc090 100644 --- a/gen/strategii/buy_doji_perechi_tf.spec.txt +++ b/gen/strategii/buy_doji_perechi_tf.spec.txt @@ -1,101 +1,149 @@ SPEC DIAGRAMĂ — buy_doji_perechi_tf ==================================== -tip: PRET (trei rânduri, câte două grafice pe rând) +tip: PRET (trei rânduri, câte două grafice pe rând, legate prin lupă) destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 2 („Alegi perechea…") cheie markdown: -generator: gen/strategii/buy_doji_perechi_tf.py (de scris de agentul de diagrame) -titlu SVG: „Aceeași regulă pe trei perechi — exemplu construit (fără ticker)" +generator: gen/strategii/buy_doji_perechi_tf.py +titlu SVG: „Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele + candele mari" stil: STYLE.md §„Cum trebuie să arate un grafic de preț": candele lipite - (gap 15-18, body_w 9-10), fără volum, open = close-ul precedentului. + (gap 15, body_w 9), fără volum, open = close-ul precedentului. Un singur SVG, 3 rânduri stivuite vertical (lățime 720, mobil). - Pe fiecare rând: stânga = TF mare (11 candele), dreapta = TF mic - (15 candele). Scară proprie pe fiecare grafic, dar UNA singură pe - tot graficul (px/unitate constant în interiorul lui). + Scară proprie pe fiecare panou, dar UNA singură în interiorul lui. + +CE S-A SCHIMBAT (20.09.2026) ȘI DE CE +------------------------------------- +Userul: „ar trebui să aibă corespondență la prețuri, ca să îmi dau seama care +bucată din graficul weekly este reprezentată de graficul daily — adică care +candelă weekly e reprezentată de candelele din graficul daily, cu aceleași +linii de preț." + +Versiunea veche punea în dreapta o serie care VENEA DUPĂ graficul mare (o +săgeată „apoi cobori pe graficul mic"). Nu se vedea nicio corespondență. +Acum graficul mic e **descompunerea reală** a ultimelor candele mari: +caseta de lupă + două ghidaje + nivelul comun cu același număr pe ambele +panouri. CE TREBUIE SĂ DEMONSTREZE ------------------------- -1. Regula e identică pe toate trei perechile: TF mare dă buy doji confirmat - (direcția: long permis), TF mic face pullback de 8 candele până la high-ul - dojiului mare, face un doji acolo, confirmă, intri. -2. Ce se schimbă când cobori: stopul pe TF mic e de 4-5 ori mai mic decât - stopul pe TF mare pentru același setup; „8 candele" înseamnă alt timp. -3. Săgeată/paranteză „zoom" de la ultima candelă a graficului mare spre - graficul mic: graficul mic începe după confirmarea de pe TF mare. +1. Regula e identică pe toate trei perechile: pe TF-ul mare, buy doji + + confirmare dau direcția (long permis); în interiorul ultimelor candele + mari, pe TF-ul mic, se vede pullback-ul de 8 candele până la high-ul + dojiului mare, doji-ul acolo, confirmarea = intrarea, stopul, ținta 1:1. +2. **Agregarea, vizibilă și adevărată**: fiecare candelă mare din casetă se + sparge în k candele mici. Graficul mic nu e „altă serie", e aceeași serie + privită mai de aproape. +3. Ce se schimbă când cobori: stopul pe TF mic e de ~4 ori mai mic decât cel + măsurat pe TF mare pentru același setup → de ~4 ori mai multe acțiuni la + același risc. -SERIA — rândul A (weekly → daily), f = 1.0 ------------------------------------------- -TF mare (weekly), (open, high, low, close), index 0-10: - 0 (122.0,122.6,119.4,120.0) 1 (120.0,120.5,117.0,117.5) 2 (117.5,119.0,117.1,118.4) - 3 (118.4,118.8,114.3,114.8) 4 (114.8,115.3,111.5,112.0) 5 (112.0,113.4,111.6,112.9) - 6 (112.9,113.2,109.1,109.6) 7 (109.6,110.0,106.3,106.8) 8 (106.8,107.2,103.6,104.0) - 9 (104.0,105.2,101.9,103.8) <- doji weekly -10 (103.8,107.4,103.5,107.0) <- confirmare (close 107.0 > high doji 105.2) -TF mic (daily), index 0-14 (open[0] = 107.0 = close-ul barei mari 10): - 0 (107.0,107.2,106.4,106.6) 1 (106.6,106.8,106.0,106.1) 2 (106.1,106.6,105.95,106.4) - 3 (106.4,106.5,105.8,105.9) 4 (105.9,106.0,105.5,105.6) 5 (105.6,105.95,105.5,105.8) +SERIILE — cum se construiesc +---------------------------- +Sursa de adevăr e seria FINĂ (TF mic), 15 bare, rândul A, f = 1.0: + 0 (107.0,107.2,106.4,106.6) 1 (106.6,106.8,106.0,106.1) + 2 (106.1,106.6,105.95,106.4) 3 (106.4,106.5,105.8,105.9) + 4 (105.9,106.0,105.5,105.6) 5 (105.6,105.95,105.5,105.8) 6 (105.8,105.9,105.4,105.5) 7 (105.5,105.6,105.25,105.35) - 8 (105.35,105.75,105.10,105.40) <- doji daily, low-ul atinge nivelul 105.20 + 8 (105.35,105.75,105.10,105.40) <- doji mic, low 105.10 la nivelul 105.20 9 (105.40,106.40,105.30,106.30) <- confirmare => intrare 106.30 -10 (106.3,107.0,106.2,106.9) 11 (106.9,107.5,106.7,107.4) 12 (107.4,107.55,107.0,107.2) -13 (107.2,108.0,107.1,107.9) 14 (107.9,108.6,107.8,108.5) +10 (106.3,107.0,106.2,106.9) 11 (106.9,107.5,106.7,107.4) +12 (107.4,107.55,107.0,107.2) 13 (107.2,108.0,107.1,107.9) +14 (107.9,108.6,107.8,108.5) + barele 0-7 = pullback-ul de 8 candele; 10.. = drumul spre țintă. -SERIA — rândul B (monthly → weekly) și rândul C (daily → 60 min) ----------------------------------------------------------------- -Aceeași formă, scalată: p' = round(100 + f*(p - 100), 2), cu f = 2.5 (B) și -f = 0.4 (C), aplicat pe fiecare o/h/l/c din rândul A. Generatorul calculează -seriile, NU le copiază de mână. Valorile care rezultă (de verificat cu assert): +Barele TF-ului mare DINAINTEA lupei (BASE), 8 bare, rândul A: + 0 (118.4,118.8,114.3,114.8) 1 (114.8,115.3,111.5,112.0) + 2 (112.0,113.4,111.6,112.9) 3 (112.9,113.2,109.1,109.6) + 4 (109.6,110.0,106.3,106.8) 5 (106.8,107.2,103.6,104.0) + 6 (104.0,105.2,101.9,103.8) <- doji mare (high 105.20 = nivelul comun) + 7 (103.8,107.4,103.5,107.0) <- confirmare mare (close 107.00 = open fine[0]) + +Candelele mari din casetă NU se scriu de mână: se CALCULEAZĂ prin agregare +pe k bare fine. Per rând: + rând TF mare → TF mic k candele mari mărite bare fine folosite + A weekly → daily 5 3 15 (0..14) + B monthly → weekly 4 3 12 (0..11) + C daily → 60 min 7 2 14 (0..13) + +Rândurile B și C se obțin din A prin p' = round(100 + f*(p - 100), 2), cu +f = 2.5 (B) și f = 0.4 (C). Transformarea e afină, deci agregarea se +păstrează; gruparea (k) diferă însă per rând, deci barele mari se recalculează. + +VALORI CARE REZULTĂ (verificate cu assert) +------------------------------------------ + A: doji mare h 105.20 / l 101.90; confirmare mare close 107.00; + lupă 105.10-108.60; intrare 106.30; SL 105.10; risc 1.20 (1.13 %); TP1 107.50 + doar pe TF mare: intrare 107.00, SL 101.90, risc 5.10 (4.77 %) → x4.22 B: doji mare h 113.00 / l 104.75; confirmare mare close 117.50; - doji mic l 112.75; intrare 115.75; SL 112.75; risc 3.00 (2.59 %); TP1 118.75 - doar pe TF mare: intrare 117.50, SL 104.75, risc 12.75 (10.85 %) + lupă 112.75-118.75; intrare 115.75; SL 112.75; risc 3.00 (2.59 %); TP1 118.75 + doar pe TF mare: intrare 117.50, SL 104.75, risc 12.75 (10.85 %) → x4.19 C: doji mare h 102.08 / l 100.76; confirmare mare close 102.80; - doji mic l 102.04; intrare 102.52; SL 102.04; risc 0.48 (0.47 %); TP1 103.00 - doar pe TF mare: intrare 102.80, SL 100.76, risc 2.04 (1.98 %) - A (pentru comparație): intrare 106.30; SL 105.10; risc 1.20 (1.13 %); TP1 107.50 - doar pe TF mare: intrare 107.00, SL 101.90, risc 5.10 (4.77 %) + lupă 102.04-103.20; intrare 102.52; SL 102.04; risc 0.48 (0.47 %); TP1 103.00 + doar pe TF mare: intrare 102.80, SL 100.76, risc 2.04 (1.98 %) → x4.24 -NIVELURI (pe fiecare rând) --------------------------- -Pe graficul mare: linie punctată gri la high-ul dojiului mare („high doji -weekly 105.20" / „high doji monthly 113.00" / „high doji daily 102.08"). -Pe graficul mic: aceeași linie, dar etichetată „nivel din ", FĂRĂ -preț: un preț al TF-ului mare pe panoul TF-ului mic se citește ca trigger al -panoului mic. Prețurile de pe panoul mic sunt doar ale lui: -intrare verde; SL roșu; TP1 verde punctat. +LEGĂTURA DINTRE PANOURI (miezul diagramei) +------------------------------------------- +1. **Caseta de lupă** (albastru) pe graficul mare, peste EXACT candelele + mărite, întinsă pe intervalul de preț [low zonă, high zonă]. +2. **Două ghidaje** punctate albastre de la colțurile din dreapta ale casetei + la colțurile din stânga ale cadrului graficului mic — convenția clasică de + zoom. Ghidajele sunt exacte: cadrul mic acoperă exact intervalul de preț al + casetei (assert: max/min din barele mici == max/min din candelele mari + mărite). Între ghidaje, textul „lupă: ultimele N candele ". +3. **Nivelul comun**: high-ul dojiului mare, desenat ca aceeași linie punctată + gri pe AMBELE panouri, cu ACELAȘI număr de ambele părți — stânga + „high doji weekly 105.20", dreapta „nivel weekly 105.20". Scările rămân + proprii fiecărui panou; nivelul comun face legătura. + Extremele zonei mărite sunt repere comune implicite: le arată ghidajele. + (Nu le etichetăm cu cifre: coloana din dreapta s-ar aglomera.) ETICHETE -------- Titlu rând: A „weekly → daily" B „monthly → weekly" C „daily → 60 min" -Pe graficul mare: zonă peste doji + confirmare, etichetată dedesubt - „doji + confirmare: aici se decide direcția". -Pe graficul mic: zonă peste doji + confirmare, etichetată „doji la nivel: - aici intri"; Level „stop " (pe rândul A și „sub ultimele 4 candele"), - Level „ținta 1:1 ", Level „intrare ". -Săgeata-zoom dintre grafice: „apoi cobori pe graficul mic". +Subtitluri: stânga „: direcția"; + dreapta „: descompunerea ultimelor N candele ". +Pe graficul mare: zonă verde peste doji + confirmare, etichetată dedesubt + „doji + confirmare: aici se decide direcția"; nivelul comun la stânga. +Pe graficul mic: zonă verde peste doji-ul mic + confirmare, cu o linie de + legătură spre eticheta „doji la nivel, apoi confirmare: aici intri"; + paranteză sub cadru peste primele 8 bare: „pullback: 8 candele în jos, fără + minim nou"; coloana din dreapta: „ținta 1:1 ", „intrare ", + „nivel ", „stop " (pe rândul A și „sub ultimele 4 bare"). Doar pe rândul A: paranteză de stop pe TF-ul mare („stop 4,77 %") și pe cel -mic („stop 1,13 %"), cu o săgeată între ele: „același setup, stop de 4 ori -mai mic → de 4 ori mai multe acțiuni la același risc". + mic („stop 1,13 %"), cu o săgeată roșie între ele: „același setup, stop de + 4,2 ori mai mic → de 4,2 ori mai multe acțiuni la același risc". Raportul + se calculează, nu se scrie. Restul cifrelor (praguri, „8 candele" pe fiecare pereche, cât ții) stau în tabelul din capitol, nu în SVG: diagrama nu repetă tabelul. ASSERT-URI OBLIGATORII ÎN GENERATOR ----------------------------------- Pe fiecare rând (A, B, C), pe seriile calculate: -1. Fiecare bară: h >= max(o,c) și l <= min(o,c); open[i] == close[i-1] - (pe fiecare grafic separat). -2. open-ul primei bare mici == close-ul barei mari 10. -3. Doji mare (9) și doji mic (8): abs(o-c) <= 0.10*(h-l). -4. close mare[10] > high mare[9]; close mic[9] > high mic[8]. -5. SL == min(l for bare mici 6..9) == low mic[8] (extrema ultimelor 4). -6. risc == intrare - SL; TP1 == intrare + risc; primul i>9 cu high >= TP1 este 11. -7. Valorile din lista „valori care rezultă" de mai sus, egale la 2 zecimale, - inclusiv procentele din textul de sub rând. -8. abs(low mic[8] - high mare[9]) / high mare[9] <= 0.005 (doji mic la nivel, - sub pragul cel mai strict, 0,5 %). -9. Raportul pixeli SL-intrare / intrare-TP1 == 1 pe fiecare grafic mic. -10. Fiecare preț stă pe panoul lui: nicio etichetă din dreapta (x >= SL_X1-20) - nu conține dh/dl/conf/b_sl/b_entry, nicio etichetă din stânga nu conține - entry/sl/tp/sdl; și invers, dh apare pe panoul mare, iar entry/sl/tp pe - cel mic. Asta e assert-ul care prinde „high doji 105.20" pus pe daily. + 1. Fiecare bară: h >= max(o,c) și l <= min(o,c); open[i] == close[i-1] + (pe fiecare grafic separat, inclusiv peste joncțiunea BASE→lupă). + 2. AGREGAREA, per candelă mare mărită j: open == open-ul primei mici, + close == close-ul ultimei mici, high == max(high mici), low == min(low mici). + 3. len(fine) == k * nz; open fine[0] == close-ul confirmării mari. + 4. Doji mare (BASE 6) și doji mic (fine 8): abs(o-c) <= 0.10*(h-l). + 5. Confirmări: close BASE[7] > high BASE[6]; close fine[9] > high fine[8]. + 6. SL == min(l for fine 6..9) == low fine[8] == minimul întregii zone mărite. + 7. risc == intrare - SL; TP1 == intrare + risc; primul i>9 cu high >= TP1 e 11. + 8. Pullback: fine[0].close > fine[7].close (coboară) ȘI min(low 0..7) > + low-ul dojiului mare (deci „fără minim nou"). + 9. Extremele zonei mărite == extremele candelelor mari mărite. +10. abs(low fine[8] - high doji mare) / high doji mare <= 0.005. +11. Raportul pixeli SL-intrare / intrare-TP1 == 1 pe fiecare grafic mic. +12. 4 <= stop% pe TF mare / stop% pe TF mic < 4.5. +13. Valorile din „VALORI CARE REZULTĂ", egale la 2 zecimale. +14. PANOURI. Nicio etichetă din dreapta (x >= FRAME_L-20) nu conține un preț + al TF-ului mare, nicio etichetă din stânga nu conține unul al TF-ului mic. + **Excepție explicită: NIVELURILE COMUNE** (setul COMUNE din generator, + acum {dh} = high-ul dojiului mare). Ele sunt scoase din ambele seturi de + interdicție ȘI au un assert propriu: numărul trebuie să apară pe AMBELE + panouri, formatat identic (2 zecimale). O scutire fără assert ar permite + ca nivelul să dispară de pe un panou sau să apară cu alt număr. +15. Fiecare text încape în viewBox și nicio pereche de texte nu se suprapune + (aceeași regulă ca audit_diagrams.py: |Δy| < 13 și suprapunere pe x). SURSA ----- diff --git a/gen/strategii/buy_doji_perechi_tf.svg b/gen/strategii/buy_doji_perechi_tf.svg index 0efb991..1870813 100644 --- a/gen/strategii/buy_doji_perechi_tf.svg +++ b/gen/strategii/buy_doji_perechi_tf.svg @@ -1,239 +1,247 @@ - - - Aceeași regulă pe trei perechi — exemplu construit (fără ticker) - A. weekly → daily - weekly: direcția - daily: intrarea - - doji + confirmare: - aici se decide direcția - - high doji weekly 105.20 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 107.50 - intrare 106.30 - nivel din weekly - stop 105.10 - sub ultimele - 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - - stop 4,77 % - - stop 1,13 % - - același setup, stop de 4 ori mai mic - → de 4 ori mai multe acțiuni la același risc - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - doji + confirmare: - aici se decide direcția - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 118.75 - intrare 115.75 - nivel din monthly - stop 112.75 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - doji + confirmare: - aici se decide direcția - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 103.00 - intrare 102.52 - nivel din daily - stop 102.04 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mari + A. weekly → daily + weekly: direcția + daily: descompunerea ultimelor 3 candele weekly + + doji + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele weekly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.50 + intrare 106.30 + nivel weekly 105.20 + stop 105.10 + sub ultimele 4 bare + + pullback: 8 candele în jos, fără minim nou + + stop 4,77 % + + stop 1,13 % + + același setup, stop de 4,2 ori mai mic + → de 4,2 ori mai multe acțiuni la același risc + + B. monthly → weekly + monthly: direcția + weekly: descompunerea ultimelor 3 candele monthly + + doji + confirmare: + aici se decide direcția + + + high doji monthly + 113.00 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele monthly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.75 + intrare 115.75 + nivel monthly 113.00 + stop 112.75 + + pullback: 8 candele în jos, fără minim nou + + C. daily → 60 min + daily: direcția + 60 min: descompunerea ultimelor 2 candele daily + + doji + confirmare: + aici se decide direcția + + + high doji daily + 102.08 + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 2 + candele daily + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.00 + intrare 102.52 + nivel daily 102.08 + stop 102.04 + + pullback: 8 candele în jos, fără minim nou \ No newline at end of file diff --git a/summaries/17_STRATEGII/01_buy_doji.html b/summaries/17_STRATEGII/01_buy_doji.html index ee1b726..73bb305 100644 --- a/summaries/17_STRATEGII/01_buy_doji.html +++ b/summaries/17_STRATEGII/01_buy_doji.html @@ -347,88 +347,111 @@ contra unui Sell Doji weekly și nu shortezi contra unui Buy Doji weekly. Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la început îl tratezi ca pe un stop.

-

+

NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - - - - - - - - - - - - - - - - - - - - - doji weekly - - - weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) - deci direcția permisă e LONG: pe daily cauți doar Buy Doji - - daily: zilele de după confirmarea weekly (open 81.30 = close-ul ei) - - - - - stop 84.85 = 5 cenți peste high-ul de 4 candele - intrare short 83.60 - ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - aici te-a scos: stopul 84.85, lovit a 4-a zi - banii mari de pe weekly cumpără mai departe - - - aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă - (close sub low-ul doji-ului 83.95) — dar contra weekly-ului - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + ultimele 3 săptămâni, + mărite jos + + + + + + + + + + + + + + + + + + + + + + + + + + 83.90 + + 83.05 + S1 + S2 + S3 + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + doji weekly + + + + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) + + + 83.90 + + 83.05 + + + + stop 84.35 + intrare short 82.70 + ținta 81.05 = 1R — neatinsă + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S1 + S2 + S3 + doji daily + + + + aici te-a scos: stopul 84.35 (5 cenți peste high-ul de 4 candele), + lovit a 4-a zi — banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 82.70: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.05) — dar contra weekly-ului + a scăzut o singură zi, până la 82.00 + Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: high-ul și low-ul doji-ului daily. + Seria e construită: un singur caz ilustrează regula, nu o dovedește.

@@ -1460,244 +1483,252 @@ asumat cumperi de vreo patru ori mai multe acțiuni.

daily. „MICI" e numele dat de curs variantei ținute luni de zile, pornită dintr-un Buy Doji weekly.

-

- - Aceeași regulă pe trei perechi — exemplu construit (fără ticker) - A. weekly → daily - weekly: direcția - daily: intrarea - - doji + confirmare: - aici se decide direcția - - high doji weekly 105.20 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 107.50 - intrare 106.30 - nivel din weekly - stop 105.10 - sub ultimele - 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - - stop 4,77 % - - stop 1,13 % - - același setup, stop de 4 ori mai mic - → de 4 ori mai multe acțiuni la același risc - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - doji + confirmare: - aici se decide direcția - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 118.75 - intrare 115.75 - nivel din monthly - stop 112.75 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - doji + confirmare: - aici se decide direcția - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 103.00 - intrare 102.52 - nivel din daily - stop 102.04 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

+ + Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mari + A. weekly → daily + weekly: direcția + daily: descompunerea ultimelor 3 candele weekly + + doji + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele weekly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.50 + intrare 106.30 + nivel weekly 105.20 + stop 105.10 + sub ultimele 4 bare + + pullback: 8 candele în jos, fără minim nou + + stop 4,77 % + + stop 1,13 % + + același setup, stop de 4,2 ori mai mic + → de 4,2 ori mai multe acțiuni la același risc + + B. monthly → weekly + monthly: direcția + weekly: descompunerea ultimelor 3 candele monthly + + doji + confirmare: + aici se decide direcția + + + high doji monthly + 113.00 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele monthly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.75 + intrare 115.75 + nivel monthly 113.00 + stop 112.75 + + pullback: 8 candele în jos, fără minim nou + + C. daily → 60 min + daily: direcția + 60 min: descompunerea ultimelor 2 candele daily + + doji + confirmare: + aici se decide direcția + + + high doji daily + 102.08 + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 2 + candele daily + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.00 + intrare 102.52 + nivel daily 102.08 + stop 102.04 + + pullback: 8 candele în jos, fără minim nou

diff --git a/summaries/17_STRATEGII/01_buy_doji.md b/summaries/17_STRATEGII/01_buy_doji.md index 42d4347..89ff13a 100644 --- a/summaries/17_STRATEGII/01_buy_doji.md +++ b/summaries/17_STRATEGII/01_buy_doji.md @@ -334,88 +334,111 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la început îl tratezi ca pe un stop. - + NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - - - - - - - - - - - - - - - - - - - - - doji weekly - - - weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) - deci direcția permisă e LONG: pe daily cauți doar Buy Doji - - daily: zilele de după confirmarea weekly (open 81.30 = close-ul ei) - - - - - stop 84.85 = 5 cenți peste high-ul de 4 candele - intrare short 83.60 - ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - aici te-a scos: stopul 84.85, lovit a 4-a zi - banii mari de pe weekly cumpără mai departe - - - aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă - (close sub low-ul doji-ului 83.95) — dar contra weekly-ului - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + ultimele 3 săptămâni, + mărite jos + + + + + + + + + + + + + + + + + + + + + + + + + + 83.90 + + 83.05 + S1 + S2 + S3 + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + doji weekly + + + + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) + + + 83.90 + + 83.05 + + + + stop 84.35 + intrare short 82.70 + ținta 81.05 = 1R — neatinsă + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S1 + S2 + S3 + doji daily + + + + aici te-a scos: stopul 84.35 (5 cenți peste high-ul de 4 candele), + lovit a 4-a zi — banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 82.70: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.05) — dar contra weekly-ului + a scăzut o singură zi, până la 82.00 + Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: high-ul și low-ul doji-ului daily. + Seria e construită: un singur caz ilustrează regula, nu o dovedește. @@ -1470,244 +1493,252 @@ daily. „MICI" e numele dat de curs variantei ținute luni de zile, pornită dintr-un Buy Doji weekly. - - - Aceeași regulă pe trei perechi — exemplu construit (fără ticker) - A. weekly → daily - weekly: direcția - daily: intrarea - - doji + confirmare: - aici se decide direcția - - high doji weekly 105.20 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 107.50 - intrare 106.30 - nivel din weekly - stop 105.10 - sub ultimele - 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - - stop 4,77 % - - stop 1,13 % - - același setup, stop de 4 ori mai mic - → de 4 ori mai multe acțiuni la același risc - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - doji + confirmare: - aici se decide direcția - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 118.75 - intrare 115.75 - nivel din monthly - stop 112.75 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - doji + confirmare: - aici se decide direcția - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - - apoi cobori - pe graficul mic - - doji la nivel: - aici intri - - - - - ținta 1:1 103.00 - intrare 102.52 - nivel din daily - stop 102.04 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mari + A. weekly → daily + weekly: direcția + daily: descompunerea ultimelor 3 candele weekly + + doji + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele weekly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.50 + intrare 106.30 + nivel weekly 105.20 + stop 105.10 + sub ultimele 4 bare + + pullback: 8 candele în jos, fără minim nou + + stop 4,77 % + + stop 1,13 % + + același setup, stop de 4,2 ori mai mic + → de 4,2 ori mai multe acțiuni la același risc + + B. monthly → weekly + monthly: direcția + weekly: descompunerea ultimelor 3 candele monthly + + doji + confirmare: + aici se decide direcția + + + high doji monthly + 113.00 + + + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 3 + candele monthly + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.75 + intrare 115.75 + nivel monthly 113.00 + stop 112.75 + + pullback: 8 candele în jos, fără minim nou + + C. daily → 60 min + daily: direcția + 60 min: descompunerea ultimelor 2 candele daily + + doji + confirmare: + aici se decide direcția + + + high doji daily + 102.08 + + + + + + + + + + + + + + + + + + + + + + + lupă: + ultimele 2 + candele daily + + + + doji la nivel, apoi confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.00 + intrare 102.52 + nivel daily 102.08 + stop 102.04 + + pullback: 8 candele în jos, fără minim nou