From 383a900eaa0b617b6346bd624fbf23d4e3b91293 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Sun, 20 Sep 2026 12:14:33 +0000 Subject: [PATCH] buy_doji: reparatiile din verificare (21 de puncte) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verificarea cu agent separat a gasit doua contradictii de continut pe care auditul mecanic nu le prinde: - textul spunea ca pullback-ul "incape intr-o singura candela a TF-ului mare"; pe desen se intinde peste doua, iar prima e o saptamana rosie vizibila. Rescris: pe TF-ul mare vezi candelele, dar nu vezi ce e in ele — unde s-a oprit coborarea si doji-ul care o termina, deci n-ai unde intra si n-ai de unde masura stopul. Asta face lupa. - definitia pullback-ului zicea "nu mai face minim nou", absolut, dar desenul arata minime tot mai joase — asa face orice pullback care coboara spre un nivel. Ancorata de minimul de plecare; eticheta de pe desen numeste referinta si trimite la panoul unde e marcata. Restul: perechi_tf punea stopul fix pe low, fara marja de 5 centi pe care o cere Pasul 5 si o respecta directie — aliniat, cu cifrele recalculate; "nivel weekly" devine "retest", pentru ca high-ul unui doji nu e suport si Pasul 3 cere altceva; conector intre nivelul comun al celor doua panouri (nu se pot alinia — sunt scari diferite, e o lupa); leader lines in coloana de etichete; assert-ul de agregare, care era tautologic, verifica acum granitele candelelor mari fata de pullback si doji — exact locul unde textul se rupsese. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ --- gen/strategii/buy_doji_directie.py | 27 +- gen/strategii/buy_doji_directie.spec.txt | 16 +- gen/strategii/buy_doji_directie.svg | 30 +- gen/strategii/buy_doji_perechi_tf.py | 278 ++++++---- gen/strategii/buy_doji_perechi_tf.spec.txt | 140 +++-- gen/strategii/buy_doji_perechi_tf.svg | 507 +++++++++--------- summaries/17_STRATEGII/01_buy_doji.html | 594 +++++++++++---------- summaries/17_STRATEGII/01_buy_doji.md | 592 ++++++++++---------- 8 files changed, 1229 insertions(+), 955 deletions(-) diff --git a/gen/strategii/buy_doji_directie.py b/gen/strategii/buy_doji_directie.py index ee2da98..3fd36e6 100644 --- a/gen/strategii/buy_doji_directie.py +++ b/gen/strategii/buy_doji_directie.py @@ -156,10 +156,12 @@ 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) # 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 +ZX1, ZX2 = xw(Z0) - 8, xw(len(WK) - 1) + 8 +ZY1 = yw(max(b[1] for b in WK[Z0:])) - 8 # exact intervalul de preț al celor +ZY2 = yw(min(b[2] for b in WK[Z0:])) + 8 # 3 bare mărite, nu tot panoul 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) +text(ZX2 + 12, ZY1 + 12, f"ultimele {ZOOM} săptămâni,", fill=BLUE, size=11) +text(ZX2 + 12, ZY1 + 28, "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")] @@ -169,14 +171,18 @@ for k, (lvl, lab, _) in enumerate(COMMON): 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", + text(xw(Z0 + k), ZY2 + 14, 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 " +# săgeata verde intră în bara de confirmare pe sub dreptunghiul albastru +AP = round((WK[7][1] + WK[8][2]) / 2, 2) +assert WK[8][2] < AP < WK[8][1], "săgeata verde nu cade în bara de confirmare" +assert yw(AP) > ZY2 + 10, "săgeata verde traversează dreptunghiul S1-S3" +arrow(470, yw(AP), xw(8) + 11, yw(AP), GREEN) +text(476, yw(AP) - 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", +text(476, yw(AP) + 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) +text(xw(7) + 8, w_bottom + 16, "doji weekly", fill=ORANGE, bold=True, size=10) # ---- panoul de jos: daily ----------------------------------------------------- PANEL = "daily" @@ -194,8 +200,9 @@ 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)", +text(FX2 + 34, w_bottom + 12, f"daily: aceleași {ZOOM} săptămâni, zi cu zi", + fill=BLUE, bold=True) +text(FX2 + 34, w_bottom + 30, 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) diff --git a/gen/strategii/buy_doji_directie.spec.txt b/gen/strategii/buy_doji_directie.spec.txt index b389627..71ff700 100644 --- a/gen/strategii/buy_doji_directie.spec.txt +++ b/gen/strategii/buy_doji_directie.spec.txt @@ -24,8 +24,10 @@ CORESPONDENȚA PANOURILOR (partea nouă) 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. + #1a5fb4, fill 0.07, contur punctat), întins pe INTERVALUL DE PREȚ al + acelor bare (nu pe toată înălțimea panoului: altfel săgeata verde de + adnotare îl traversează orizontal), cu eticheta „ultimele 3 săptămâni, + mărite jos" în dreapta lui. Etichetele S1/S2/S3 stau sub dreptunghi. 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. @@ -70,7 +72,12 @@ 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: „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". + „deci direcția permisă e LONG: pe daily cauți doar Buy Doji". Săgeata intră + în bara de confirmare la un preț calculat, (high doji + low confirmare) / 2, + care cade sub dreptunghiul albastru (assert: y-ul ei e sub marginea lui de + jos, deci nu-l traversează). + Blocul albastru „daily: aceleași 3 săptămâni, zi cu zi" stă sub panoul + weekly, nu în dreptul săgeții verzi. - 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". @@ -92,7 +99,8 @@ ASSERT-URI 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. +10. SL−intrare == intrare−TP1 în pixeli; săgeata verde trece pe sub + dreptunghiul de zoom și cade în interiorul barei de confirmare weekly. 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. diff --git a/gen/strategii/buy_doji_directie.svg b/gen/strategii/buy_doji_directie.svg index a71a129..21ced32 100644 --- a/gen/strategii/buy_doji_directie.svg +++ b/gen/strategii/buy_doji_directie.svg @@ -2,9 +2,9 @@ NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - ultimele 3 săptămâni, - mărite jos + + ultimele 3 săptămâni, + mărite jos @@ -33,19 +33,19 @@ 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 - - + 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) + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) 83.90 diff --git a/gen/strategii/buy_doji_perechi_tf.py b/gen/strategii/buy_doji_perechi_tf.py index 1e452df..9e2d3c1 100644 --- a/gen/strategii/buy_doji_perechi_tf.py +++ b/gen/strategii/buy_doji_perechi_tf.py @@ -7,7 +7,7 @@ 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). +agregate exact. 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 @@ -32,9 +32,10 @@ from pathlib import Path OUT = Path(__file__).with_suffix(".svg") W = 720 +MARJA = 0.05 # 5 cenți sub cel mai jos low (regula capitolului, Pasul 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 +# 0..7 pullback de 8 candele, în jos, spre 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), @@ -42,7 +43,7 @@ FINE_A = [(107.0, 107.2, 106.4, 106.6), (106.6, 106.8, 106.0, 106.1), (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), + (106.3, 107.0, 106.2, 106.9), (106.9, 107.7, 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)] @@ -56,6 +57,7 @@ BASE_A = [(118.4, 118.8, 114.3, 114.8), (114.8, 115.3, 111.5, 112.0), DOJI_B, CONF_B = 6, 7 PULLBACK_N = 8 # câte bare mici are pullback-ul (0..7) FINE_DOJI, FINE_CONF = 8, 9 +STOP_BARS = 4 # stopul se măsoară sub ultimele 4 bare (doji + 3 dinainte) def scaled(bars, f): @@ -72,20 +74,20 @@ def aggregate(fine, k, n): return out_ -# key, f, TF mare, TF mic, k, nr. candele mari mărite, text sub rând, valori din spec +# key, f, TF mare, TF mic, k, nr. candele mari mărite, valori din spec ROWS = [ ("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)), + dict(dh=105.20, dl=101.90, conf=107.00, entry=106.30, sl=105.05, risk=1.25, + pct=1.18, tp=107.55, b_entry=107.00, b_sl=101.85, b_risk=5.15, b_pct=4.81, + zhi=108.60, zlo=105.10, first=11, span=2, doji_big=1)), ("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)), + dict(dh=113.00, dl=104.75, conf=117.50, entry=115.75, sl=112.70, risk=3.05, + pct=2.63, tp=118.80, b_entry=117.50, b_sl=104.70, b_risk=12.80, b_pct=10.89, + zhi=119.25, zlo=112.75, first=11, span=2, doji_big=2)), ("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)), + dict(dh=102.08, dl=100.76, conf=102.80, entry=102.52, sl=101.99, risk=0.53, + pct=0.52, tp=103.05, b_entry=102.80, b_sl=100.71, b_risk=2.09, b_pct=2.03, + zhi=103.20, zlo=102.04, first=11, span=2, doji_big=1)), ] @@ -104,15 +106,20 @@ def check(key, base, zoom, fine, k, nz, exp): 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)" + # (1) UNDE CAD GRANIȚELE candelelor mari peste poveste. Nu reface calculul + # agregării (ar fi tautologic: zoom vine chiar din aggregate) — afirmă ce + # spune textul capitolului și poate fi fals: peste câte candele mari se + # întinde pullback-ul și în a câta candelă mare cade doji-ul mic. + span = len({i // k for i in range(PULLBACK_N)}) + assert span == exp["span"], f"{key}: pullback-ul se întinde peste {span} candele mari" + assert span >= 2, f"{key}: pullback-ul ar încăpea într-o singură candelă mare" + doji_big = FINE_DOJI // k + assert doji_big == exp["doji_big"], f"{key}: doji-ul mic cade în candela mare {doji_big}" + assert doji_big < nz, f"{key}: doji-ul mic cade în afara zonei mărite" # 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" + assert eq(zoom[doji_big][2], fine[FINE_DOJI][2]), \ + f"{key}: low-ul candelei mari cu doji-ul nu e low-ul doji-ului mic" # (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])): @@ -120,51 +127,60 @@ def check(key, base, zoom, fine, k, nz, exp): 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" + # (3) trade-ul pe TF mic: stopul e cu MARJA sub minimul ultimelor 4 bare + low4 = min(b[2] for b in fine[FINE_CONF - STOP_BARS + 1:FINE_CONF + 1]) + assert eq(low4, fine[FINE_DOJI][2]), f"{key}: minimul celor 4 bare nu e low-ul dojiului" + assert eq(low4, min(b[2] for b in fine)), f"{key}: low-ul dojiului nu e minimul zonei mărite" + sl = round(low4 - MARJA, 2) entry = fine[FINE_CONF][3] risk = round(entry - sl, 2) tp = round(entry + risk, 2) 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" + assert first == exp["first"], f"{key}: TP1 atins la {first}, nu la {exp['first']}" pct = risk / entry * 100 - # (4) pullback = revenire scurtă fără minim nou sub minimul dojiului mare + # (4) pullback = revenire scurtă care coboară spre nivel, dar NU rupe + # low-ul doji-ului de pe TF-ul mare (referința mișcării) 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" + assert min(b[2] for b in pull) > base[DOJI_B][2], f"{key}: pullback-ul rupe low-ul doji mare" - b_entry, b_sl = base[CONF_B][3], base[DOJI_B][2] + b_entry = base[CONF_B][3] + b_sl = round(base[DOJI_B][2] - MARJA, 2) b_risk = round(b_entry - b_sl, 2) b_pct = b_risk / b_entry * 100 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, + b_risk=b_risk, b_pct=b_pct, first=first, span=span, doji_big=doji_big, 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" + assert abs(got["zlo"] - got["dh"]) / got["dh"] <= 0.005, f"{key}: doji mic nu e la nivel" + assert 3.9 <= b_pct / pct <= 4.5, f"{key}: raport stopuri {b_pct / pct:.2f} nu e ~4x" + # (7) nivelul legat între panouri (close-ul confirmării mari = open fine[0]) + # cade în mijlocul zonei mărite, nu lipit de o extremă + t = (got["conf"] - sl) / (got["zhi"] - sl) + assert 0.2 <= t <= 0.8, f"{key}: nivelul comun e la {t:.2f} din interval, prea la margine" return got # --- desen ------------------------------------------------------------------ GREEN, RED, GRAY, INK, BLUE = "#188a3e", "#c00", "#888", "#333", "#1a5fb4" +LINK = "#aaa" # nivelul comun legat între panouri PLOT_H = 160 BX0, BGAP = 105, 15 # TF mare SX0, SGAP = 372, 15 # TF mic BODY_W = 9 FRAME_L = SX0 - 9 # marginea stângă a cadrului graficului mic -COL_X = 597 # coloana de etichete a graficului mic +COL_X = 604 # coloana de etichete a graficului mic MIDX = FRAME_L - 20 # granița stânga/dreapta pentru verificarea de panou +PAD = 0.06 # aer sus/jos pe graficul mic (nu lipi liniile de cadru) out = [] -LABELS = [] # (x0, x1, text) al fiecărei etichete, pentru verificări +LABELS = [] # (x0, x1, y, text) al fiecărei etichete, pentru verificări def text(x, y, s, fill=INK, anchor="start", bold=False, size=12): @@ -210,27 +226,47 @@ def candles(bars, x0, gap, yf): f'height="{hh:.1f}" fill="{color}"/>') -def bracket(x, ya, yb_, color, label, side="right"): - """Paranteză verticală între două prețuri, cu eticheta în lateral.""" +def bracket(x, ya, yb_, color, label, side="right", below=False): + """Paranteză verticală între două prețuri, cu eticheta în lateral sau dedesubt.""" tip = x + 5 if side == "right" else x - 5 out.append(f'') - 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) + if below: + text((x + tip) / 2, max(ya, yb_) + 14, label, fill=color, anchor="middle", + bold=True, size=11) + else: + 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]) +def stack(items, x_line, minsep=15, lead=13): + """Coloana din dreapta: împinge etichetele ca să nu se suprapună și trage + o liniuță de legătură de la linia de preț la eticheta ei, ca perechea + etichetă-linie să rămână neambiguă chiar dacă eticheta a fost împinsă.""" 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 + for y, lines, fill in sorted(items, key=lambda t: t[0]): + y_lab = y if y_prev is None or y >= y_prev + minsep else y_prev + minsep + if y_lab - y > 2: + out.append(f'') + else: + line(x_line + 2, y - 4, COL_X - 4, y_lab - 4, fill, width=0.8) + for j, s in enumerate(lines): + text(COL_X, y_lab + j * lead, s, fill=fill, size=10) + y_prev = y_lab + (len(lines) - 1) * lead return y_prev +def seg_dist(p, a, b): + """Distanța de la punctul p la segmentul ab.""" + (px, py), (ax, ay), (bx, by) = p, a, b + dx, dy = bx - ax, by - ay + t = 0.0 if dx == dy == 0 else max(0.0, min(1.0, ((px - ax) * dx + (py - ay) * dy) + / (dx * dx + dy * dy))) + return ((px - ax - t * dx) ** 2 + (py - ay - t * dy) ** 2) ** 0.5 + + out.append('' '') @@ -253,79 +289,126 @@ for key, f, tf_big, tf_small, k, nz, exp in ROWS: fill="#555", size=11) top = y0 + 50 + # Intervalul de preț al lupei: de la stop (sub minim) la maximul zonei, cu + # aer sus/jos. ACELAȘI interval e încadrat pe ambele panouri — asta fac + # ghidajele; altfel linia de stop ar cădea exact pe marginea cadrului. + zlo_, zhi_ = g["sl"], g["zhi"] + pad = PAD * (zhi_ - zlo_) + lo, hi = zlo_ - pad, zhi_ + pad + # scară proprie pe fiecare grafic, constantă în interiorul lui - 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) + bmax = max(b[1] for b in big) + bmin = min(min(b[2] for b in big), g["b_sl"], lo) + bs, ss = PLOT_H / (bmax - bmin), PLOT_H / (hi - lo) 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 + ys = lambda p, t=top, m=hi, s=ss: t + (m - p) * s # noqa: E731 # ---- TF mare ----------------------------------------------------------- # zona verde peste doji + confirmare (acolo se decide direcția) - zx0, zx1 = BX0 + DOJI_B * BGAP - 9, BX0 + CONF_B * BGAP + 9 + zx0, zx1 = BX0 + DOJI_B * BGAP - 9, BX0 + CONF_B * BGAP + 6.5 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 + # caseta de lupă (punctată, ca în buy_doji_directie) peste exact candelele + # mari care se sparg în dreapta, pe intervalul de preț al cadrului mic + lx0, lx1 = BX0 + len(base) * BGAP - 6, BX0 + (len(big) - 1) * BGAP + 9 + assert lx0 > zx1 + 1, f"{key}: caseta de lupă intră peste caseta verde" + ly0, ly1 = yb(hi), yb(lo) + rect(lx0, ly0, lx1, ly1, BLUE, fill_op=0.06, dash="4 3") + # nivelul-reper de pe TF-ul mare: high-ul dojiului, retestat jos 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) + text(42, yb(g["dh"]) + 11, f"high doji {tf_big}", fill="#666", size=11) + text(42, yb(g["dh"]) + 24, f"{g['dh']:.2f}", fill="#666", size=11) + # nivelul comun legat de panoul mic: close-ul confirmării mari = open-ul + # primei bare mici (prin construcție), deci e exact același preț pe ambele + hline(BX0 - 15, lx1, yb(g["conf"]), LINK, "3 3", width=1.0) + text(42, yb(g["conf"]) - 3, "close confirmare", fill="#999", size=11) candles(big, BX0, BGAP, yb) # ---- 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) + guides = [((lx1, ly0), (FRAME_L, top)), ((lx1, ly1), (FRAME_L, top + PLOT_H))] + for a_, b_ in guides: + line(a_[0], a_[1], b_[0], b_[1], BLUE, dash="5 3", width=1.1) + + # ---- nivelul comun: conector subțire între cele două panouri ----------- + # Scările au pante diferite (e o lupă), deci același preț cade la înălțimi + # diferite. Conectorul le leagă; numărul e scris o singură dată, în cot. + ycb, ycs = yb(g["conf"]), ys(g["conf"]) + + def clearance(mx): + conn = [((lx1, ycb), (mx, ycb)), ((mx, ycb), (mx, ycs)), ((mx, ycs), (FRAME_L, ycs))] + pts = [(sx + (ex - sx) * t / 24, sy + (ey - sy) * t / 24) + for (sx, sy), (ex, ey) in conn for t in range(25)] + return min(seg_dist(q, ga, gb) for q in pts if q[0] >= lx1 + 10 for ga, gb in guides) + + # cotul se alege unde conectorul stă cel mai departe de ghidajele albastre: + # pantele diferă per rând, deci mijlocul nu e mereu bun. + mid = max(range(int(lx1) + 14, int(FRAME_L) - 13), key=clearance) + dmin = clearance(mid) + assert dmin > 10, f"{key}: conectorul trece la {dmin:.1f} px de un ghidaj" + out.append(f'') + tx = min(mid + 5, FRAME_L - 62) + text(tx, (ycb + ycs) / 2 + 4, f"{g['conf']:.2f}", fill="#777", size=10) + text(tx, (ycb + ycs) / 2 + 18, "același preț", fill="#999", size=10) + print(f" conector: cot la x={mid}, la {dmin:.1f} px de ghidaje") # ---- 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" + assert top + PLOT_H - y_sl > 6, f"{key}: linia de stop e lipită de marginea cadrului" + assert y_sl > ys(g["zlo"]), f"{key}: stopul nu e sub minimul barelor" 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, + rect(sx0, y_e - 6, sx1, ys(g["zlo"]) + 4, GREEN) + line((sx0 + sx1) / 2, top + PLOT_H, (sx0 + sx1) / 2, top + PLOT_H + 40, GREEN, width=1) + text((sx0 + sx1) / 2, top + PLOT_H + 52, "doji la nivel + confirmare: aici intri", fill=GREEN, anchor="middle", bold=True, size=11) + hline(FRAME_L, frame_r, ycs, LINK, "3 3", width=1.0) 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: - col.append((y_sl + 17, "sub ultimele 4 bare", RED)) + col = [(y_tp + 4, [f"ținta 1:1 {g['tp']:.2f}"], GREEN), + (y_e + 4, [f"intrare {g['entry']:.2f}"], GREEN), + (y_dh + 4, ["retest: high doji", f"{tf_big} {g['dh']:.2f}"], "#666"), + (y_sl + 4, [f"stop {g['sl']:.2f}"] + + (["5 cenți sub minimul", f"ultimelor {STOP_BARS} bare"] if first else []), RED)] candles(fine, SX0, SGAP, ys) - stack(col) + stack(col, frame_r) # 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", + text((pxa + pxb) / 2, top + PLOT_H + 22, + f"pullback: {PULLBACK_N} candele care coboară spre nivel", fill="#555", anchor="middle", size=11) + text((pxa + pxb) / 2, top + PLOT_H + 35, + f"fără să rupă low-ul doji-ului {tf_big} din stânga", + fill="#555", anchor="middle", size=11) + if key == "C": + text(20, top + PLOT_H + 72, + "(șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate" + " — ultima bară a zilei e de 30 min)", fill="#777", size=10) if first: # același setup, stopul măsurat pe fiecare TF - bx = 30 + bx = 34 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 + f"stop {g['b_pct']:.2f} %".replace(".", ","), below=True) + # paranteza stă în golul dintre două candele, ca să nu atingă niciun fitil + kx = SX0 + (FINE_CONF + 1) * SGAP + BODY_W / 2 + 0.3 + assert min(abs(kx + d - (SX0 + i * SGAP)) for i in range(len(fine)) for d in (0, 5)) \ + > BODY_W / 2, "paranteza de stop atinge o candelă" 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”" - ya = top + PLOT_H + 56 + assert 3.9 <= ratio < 4.5, f"raportul stopurilor {ratio:.2f} nu e „de 4 ori”" + ya = top + PLOT_H + 76 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(".", ","), @@ -335,13 +418,15 @@ for key, f, tf_big, tf_small, k, nz, exp in ROWS: 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} + # Nivelurile comune (high-ul dojiului mare, retestat jos; close-ul + # confirmării mari = open-ul primei bare mici) au voie de ambele părți. + # 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", "conf"} + cval = {round(g[kk], 2) for kk in COMUNE} + MARE = {kk: g[kk] for kk in ("dh", "dl", "conf", "b_sl", "b_entry") + if round(g[kk], 2) not in cval} + MIC = {kk: g[kk] for kk in ("entry", "sl", "tp") if round(g[kk], 2) not in cval} for x0_, _x1, _y, s_ in LABELS[lab0:]: pe_mic = x0_ >= MIDX rau = MARE if pe_mic else MIC @@ -349,12 +434,16 @@ for key, f, tf_big, tf_small, k, nz, exp in ROWS: 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 {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_})" + # dh apare pe AMBELE panouri, cu exact același număr + v = f"{g['dh']:.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 dh={v} lipsește de pe un panou ({st_} / {dr_})" + # conf apare o SINGURĂ dată, în cotul conectorului dintre panouri + v = f"{g['conf']:.2f}" + cx_ = [x0_ for x0_, _x1, _y, s_ in LABELS[lab0:] if v in s_] + assert len(cx_) == 1 and lx1 < cx_[0] < FRAME_L, \ + f"{key}: {v} nu e scris exact o dată, în cotul conectorului ({cx_})" 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" @@ -362,9 +451,10 @@ for key, f, tf_big, tf_small, k, nz, exp in ROWS: 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) + f"TP1 {g['tp']:.2f} la bara {g['first']} | doar mare: SL {g['b_sl']:.2f} risc " + f"{g['b_risk']:.2f} ({g['b_pct']:.2f} %) = x{g['b_pct'] / g['pct']:.2f} | " + f"pullback peste {g['span']} candele mari, doji în candela mare {g['doji_big']}") + y0 = top + (296 if first else (274 if key == "C" else 254)) if key != "C": out.append(f'') diff --git a/gen/strategii/buy_doji_perechi_tf.spec.txt b/gen/strategii/buy_doji_perechi_tf.spec.txt index 5acc090..ed10467 100644 --- a/gen/strategii/buy_doji_perechi_tf.spec.txt +++ b/gen/strategii/buy_doji_perechi_tf.spec.txt @@ -11,8 +11,39 @@ stil: STYLE.md §„Cum trebuie să arate un grafic de preț": candele Un singur SVG, 3 rânduri stivuite vertical (lățime 720, mobil). Scară proprie pe fiecare panou, dar UNA singură în interiorul lui. -CE S-A SCHIMBAT (20.09.2026) ȘI DE CE -------------------------------------- +CE S-A SCHIMBAT (20.09.2026, runda 2 — după verificare) +-------------------------------------------------------- +1. STOPUL respectă regula capitolului: cu 5 cenți sub cel mai jos low al + ultimelor 4 bare, nu exact pe low-ul doji-ului. Se recalculează riscul, + procentele, ținta 1:1 și raportul. Aceeași marjă se aplică și stopului + măsurat pe TF-ul mare (aceeași regulă, alt timeframe). +2. Scara graficului mic acoperă intervalul [stop, maximul zonei] cu 6 % aer + sus și jos, ca linia de stop să nu mai cadă pe marginea cadrului (se citea + ca bordură, iar fitilul doji-ului părea tăiat). Cadrul mic și caseta de + lupă încadrează ACELAȘI interval de preț — ghidajele rămân exacte. +3. Eticheta pullback-ului nu mai spune „fără minim nou" (desenul arată minime + tot mai joase, deci se contrazicea singură): spune că pullback-ul coboară + spre nivel fără să rupă low-ul doji-ului de pe TF-ul mare. +4. Nivelul de pe panoul mic se numește „retest: high doji ", nu + „nivel" — Pasul 3 cere suport/pivot pentru nivel, iar aici prețul tocmai a + trecut peste high-ul doji-ului și se întoarce la el. +5. Nivelul comun legat între panouri e acum close-ul confirmării mari (egal + prin construcție cu open-ul primei bare mici), cu un CONECTOR subțire gri + între panouri și numărul scris o singură dată, în cot. High-ul doji-ului + mare cădea la 0,10 de extrema de jos a zonei, deci conectorul lui s-ar fi + confundat cu ghidajul albastru. +6. Coloana din dreapta are LINIUȚE DE LEGĂTURĂ (leader lines) de la fiecare + linie de preț la eticheta ei; liniile sunt la câțiva pixeli una de alta, + iar etichetele trebuie împinse ca să nu se suprapună. +7. Paranteza de stop de pe TF-ul mare are eticheta DEDESUBT (înainte înghițea + eticheta nivelului), cea de pe TF-ul mic stă într-un gol dintre candele + (assert), caseta de lupă e punctată ca în buy_doji_directie, iar rândul C + are o notă că ultima bară de 60 min a zilei e de 30 min. +8. Assert-ul de agregare (tautologic: zoom venea chiar din aggregate) e + înlocuit cu granițele candelelor mari peste poveste. + +CE S-A SCHIMBAT (20.09.2026, runda 1) Ș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 @@ -28,8 +59,9 @@ CE TREBUIE SĂ DEMONSTREZE ------------------------- 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. + mari, pe TF-ul mic, se vede pullback-ul de 8 candele care coboară până la + high-ul dojiului mare (retest), doji-ul acolo, confirmarea = intrarea, + stopul (5 cenți sub minimul a 4 bare), ț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. @@ -46,7 +78,7 @@ Sursa de adevăr e seria FINĂ (TF mic), 15 bare, rândul A, f = 1.0: 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 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) +10 (106.3,107.0,106.2,106.9) 11 (106.9,107.70,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ă. @@ -71,31 +103,40 @@ păstrează; gruparea (k) diferă însă per rând, deci barele mari se recalcul VALORI CARE REZULTĂ (verificate cu assert) ------------------------------------------ +Stopul e cu 5 cenți (MARJA) sub minimul ultimelor 4 bare, pe ambele TF-uri. 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 + lupă 105.10-108.60; intrare 106.30; SL 105.05; risc 1.25 (1.18 %); TP1 107.55 + doar pe TF mare: intrare 107.00, SL 101.85, risc 5.15 (4.81 %) → x4.09 B: doji mare h 113.00 / l 104.75; confirmare mare close 117.50; - 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 + lupă 112.75-119.25; intrare 115.75; SL 112.70; risc 3.05 (2.63 %); TP1 118.80 + doar pe TF mare: intrare 117.50, SL 104.70, risc 12.80 (10.89 %) → x4.13 C: doji mare h 102.08 / l 100.76; confirmare mare close 102.80; - 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 + lupă 102.04-103.20; intrare 102.52; SL 101.99; risc 0.53 (0.52 %); TP1 103.05 + doar pe TF mare: intrare 102.80, SL 100.71, risc 2.09 (2.03 %) → x3.93 +Pe toate trei, TP1 e atins prima dată de bara 11. 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ă]. +1. **Caseta de lupă** (albastru, contur punctat) pe graficul mare, peste + EXACT candelele mărite, întinsă pe intervalul de preț al cadrului mic + ([stop, high zonă], cu 6 % aer sus și jos). 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.) + zoom. Ghidajele sunt exacte: caseta și cadrul mic încadrează exact același + interval de preț, [stop, maximul zonei] cu 6 % aer sus și jos. Culoarul + dintre ghidaje e lăsat liber pentru conector (textul „lupă: ultimele N + candele" s-a scos: subtitlul din dreapta spune deja același lucru). +3. **Nivelul-reper** (high-ul doji-ului mare) apare pe ambele panouri cu + același număr: stânga „high doji weekly 105.20", dreapta „retest: high + doji weekly 105.20". Nu poate fi aliniat la aceeași înălțime — scările au + pante diferite, e o lupă. +4. **Nivelul comun LEGAT**: close-ul confirmării mari (= open-ul primei bare + mici, prin construcție) e desenat ca aceeași linie gri subțire pe ambele + panouri și cele două capete sunt unite de un **conector** gri punctat + („3 3", mai subțire decât ghidajele albastre), cu numărul scris o singură + dată, în cot. Cotul se alege prin căutare: poziția unde conectorul stă cel + mai departe de ghidaje (assert: > 10 px). Nivelul cade în mijlocul + intervalului mărit (assert: între 20 % și 80 %), nu lipit de o extremă. ETICHETE -------- @@ -105,14 +146,20 @@ Subtitluri: stânga „: direcția"; 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ă 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. + legătură spre eticheta „doji la nivel + confirmare: aici intri"; + paranteză sub cadru peste primele 8 bare, pe două rânduri: „pullback: 8 + candele care coboară spre nivel" / „fără să rupă low-ul doji-ului + din stânga"; coloana din dreapta, fiecare etichetă legată de linia ei + printr-o liniuță: „ținta 1:1 ", „intrare ", „retest: high doji + ", „stop " (pe rândul A, plus „5 cenți sub minimul + ultimelor 4 bare"). +Doar pe rândul A: paranteză de stop pe TF-ul mare („stop 4,81 %", eticheta + DEDESUBT, ca să nu înghită eticheta nivelului) și pe cel mic („stop 1,18 %", + într-un gol dintre candele), cu o săgeată roșie între ele: „același setup, + stop de 4,1 ori mai mic → de 4,1 ori mai multe acțiuni la același risc". + Raportul se calculează, nu se scrie. +Doar pe rândul C, sub grafic: „(șapte bare de 60 min pe zi: ședința 9:30-16:00 + are 6 ore și jumătate — ultima bară a zilei e de 30 min)". Restul cifrelor (praguri, „8 candele" pe fiecare pereche, cât ții) stau în tabelul din capitol, nu în SVG: diagrama nu repetă tabelul. @@ -121,27 +168,38 @@ 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, 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). + 2. GRANIȚELE candelelor mari peste poveste (NU refacerea agregării: `zoom` + vine chiar din `aggregate`, deci un assert care o recalculează nu poate + pica). Peste câte candele mari se întinde pullback-ul (2, pe toate trei + perechile — deci NU încape într-una singură) și în a câta candelă mare + cade doji-ul mic (A: 1, B: 2, C: 1); low-ul acelei candele mari e chiar + low-ul doji-ului mic. 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. + 6. min(l for fine 6..9) == low fine[8] == minimul zonei mărite; + SL == acel minim − 0,05 (marja de 5 cenți). La fel pe TF-ul mare: + b_SL == low-ul doji-ului mare − 0,05. 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"). + low-ul dojiului mare (referința pe care nu are voie s-o rupă). 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. +11. Raportul pixeli SL-intrare / intrare-TP1 == 1 pe fiecare grafic mic; + linia de stop e la > 6 px de marginea de jos a cadrului și sub minimul + barelor; paranteza de stop nu atinge nicio candelă. +12. 3,9 <= stop% pe TF mare / stop% pe TF mic <= 4,5. +13. Conectorul nivelului comun stă la > 10 px de ambele ghidaje, iar numărul + lui apare EXACT o dată, între caseta de lupă și cadrul mic (în cot). 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. + **Excepție explicită: NIVELURILE COMUNE** (setul COMUNE = {dh, conf}). + Ele sunt scoase din ambele seturi de interdicție (după VALOARE, nu după + cheie: b_entry are aceeași valoare ca conf) ȘI au assert propriu: dh + trebuie să apară pe AMBELE panouri cu același format, conf exact o dată, + în cotul conectorului. 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). diff --git a/gen/strategii/buy_doji_perechi_tf.svg b/gen/strategii/buy_doji_perechi_tf.svg index 1870813..1d2e0aa 100644 --- a/gen/strategii/buy_doji_perechi_tf.svg +++ b/gen/strategii/buy_doji_perechi_tf.svg @@ -1,247 +1,276 @@ - + 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 + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 107.00 + același preț - - - 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 + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.55 + + intrare 106.30 + + retest: high doji + weekly 105.20 + + stop 105.05 + 5 cenți sub minimul + ultimelor 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 + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului weekly din stânga + + stop 4,81 % + + stop 1,18 % + + același setup, stop de 4,1 ori mai mic + → de 4,1 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 117.50 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.80 + + intrare 115.75 + + retest: high doji + monthly 113.00 + + stop 112.70 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului monthly din stânga + + 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + 102.80 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.05 + + intrare 102.52 + + retest: high doji + daily 102.08 + + stop 101.99 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului daily din stânga + (șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate — ultima bară a zilei e de 30 min) \ 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 73bb305..b0312e0 100644 --- a/summaries/17_STRATEGII/01_buy_doji.html +++ b/summaries/17_STRATEGII/01_buy_doji.html @@ -291,10 +291,12 @@ când prețul se închide sub linia de trailing stop.

  • Tranșe — poziția împărțită în bucăți: 300 de acțiuni cumpărate ca 100 + 100 + 100, la prețuri diferite, sau vândute în trei momente.
  • Pullback — o revenire scurtă a prețului împotriva direcției trendului, - în care prețul nu mai face minim nou. Într-o urcare de la 49.20 spre 51.60, - două-trei candele care coboară până pe la 50.80 și se opresc acolo, fără să - rupă 50.40, sunt un pullback; dacă prețul ar coborî sub 50.40 și ar face un - minim mai jos decât cel dinainte, nu mai e pullback, e întoarcere. Un + care se oprește deasupra minimului de la care a pornit urcarea. Într-o + urcare pornită de la 50.40 spre 51.60, câteva candele care coboară până pe + la 50.80 și se opresc acolo, fără să rupă 50.40, sunt un pullback; dacă + prețul coboară sub 50.40, minimul de plecare e rupt — nu mai e pullback, e + întoarcere. Cât ține: câteva candele, dar numărul depinde de TF-ul pe care + te uiți — aceeași mișcare e una-două candele pe weekly și opt pe daily. Un pullback nu e semnal de intrare: intri abia la confirmarea de după doji-ul care îl termină.
  • Bull reversal — prima candelă care se închide peste ultimul nivel al @@ -306,8 +308,10 @@ când prețul se închide sub linia de trailing stop.

    unei urcări. În scaner e un câmp separat, pus pe Bull Reversal = 1.
  • Buy momentum — semnalul unui alt indicator al cursului, care marchează cu o săgeată momentul în care prețul trece cu forță printr-un nivel vechi - de suport sau rezistență. Pe candela ta de buy doji e o confirmare în plus, - nu un înlocuitor al trigger-ului.
  • + de suport sau rezistență. Completare proprie: cursul nu spune ce faci + când săgeata apare chiar pe candela ta de buy doji; pe regula trigger-ului + din acest capitol, o tratezi ca o confirmare în plus, nu ca un înlocuitor al + închiderii peste high-ul doji-ului.
  • Retest — prețul revine la un nivel pe care tocmai l-a depășit, înainte să-și continue drumul. Prețul a trecut de 50.10 și tu ai cumpărat la 50.40; dacă revine până la 50.10 și de acolo urcă iar, acela e retestul.
  • @@ -351,9 +355,9 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - ultimele 3 săptămâni, - mărite jos + + ultimele 3 săptămâni, + mărite jos @@ -382,19 +386,19 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la 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 - - + 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) + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) 83.90 @@ -456,7 +460,7 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la

    Diagrama e pe alt simbol decât exemplul din ceilalți pași, deci are alte -prețuri (80-85 $); regulile sunt aceleași. Ea arată greșeala pe short: +prețuri; regulile sunt aceleași. Ea arată greșeala pe short: weekly-ul a confirmat un Buy Doji, deci direcția e long. Pe daily apare un Sell Doji corect ca formă. Luat ca short, merge contra weekly-ului: prețul scade o zi, apoi urcă și lovește stopul.

    Intrarea mecanică e la close-ul candelei de confirmare (pasul 4). Variantele @@ -1444,10 +1448,8 @@ Cele două panouri din diagramă sunt alte simboluri, cu alte prețuri (42 $ și pivotul lunar („sfântul buy doji"); mai multe trigger-e pe aceeași candelă — buy doji plus buy momentum (săgeata indicatorului cursului, care se aprinde când prețul trece cu forță -printr-un nivel vechi) sau bull reversal, adică prima candelă care se închide -peste ultimul nivel al liniei de bear trail, linia care coboară în trepte -deasupra prețului cât ține scăderea. Bull reversal-ul nu spune „are forma -potrivită", ci „vânzătorii s-au epuizat deja": în exemplul din capitol, +printr-un nivel vechi) sau bull reversal, prima candelă care se închide peste +ultimul nivel al liniei de bear trail. În exemplul din capitol, candela care se închide la 50.40 ar fi și bull reversal dacă acel 50.40 e peste ultimul nivel de trail rămas deasupra scăderii de 14 zile — atunci ai două motive independente pe aceeași candelă, nu unul. Practic îl folosești în @@ -1464,271 +1466,309 @@ grafic: e aceeași bucată de piață, mărită. O candelă weekly e cinci cande daily puse cap la cap — același open la început, același close la sfârșit, același high și același low, doar desenate cu mai multe detalii. Caseta punctată de pe panoul din stânga arată exact ce bucată e mărită în dreapta, -iar liniile de preț sunt aceleași pe ambele panouri, ca să urmărești același -nivel dintr-o parte în alta.

    +iar linia de preț comună e trasată pe amândouă, ca să urmărești același nivel +dintr-o parte în alta. Intrarea, stopul și ținta apar doar pe panoul mic, +pentru că doar acolo au unde să fie citite.

    De ce te uiți acolo: pe TF-ul mare vezi că scăderea s-a oprit, dar nu vezi -cum s-a oprit. Pullback-ul — revenirea scurtă a prețului împotriva direcției -trendului, în care prețul nu mai face minim nou — încape de obicei întreg -într-o singură candelă a TF-ului mare, așa că pe weekly nu-l vezi deloc; pe -daily îl vezi candelă cu candelă, și odată cu el vezi și doji-ul care îl -termină.

    +cum s-a oprit. Pullback-ul se vede și pe TF-ul mare — una-două candele roșii, +iar prima dintre ele e o săptămână roșie cât se poate de vizibilă. Ce nu vezi +e ce se întâmplă în interiorul lor: nu vezi unde s-a oprit coborârea, nu vezi +doji-ul care o termină, deci n-ai unde să intri și n-ai de unde să măsori +stopul. Asta face lupa — desface aceleași candele roșii în candelele mici din +care sunt făcute.

    Momentul intrării nu se schimbă, iar pullback-ul în sine nu e semnal de intrare. Aștepți doji-ul de la capătul lui, pe TF-ul mic, și intri la prima -candelă care se închide peste high-ul acelui doji, în maximum 3 candele. -Câștigul e distanța până la stop: pe TF-ul mare stopul stă sub low-ul -întregii candele mari, pe TF-ul mic stă sub low-ul doji-ului — pe exemplul -din diagramă, în jur de 4,8 % față de în jur de 1,1 %, adică la același risc -asumat cumperi de vreo patru ori mai multe acțiuni.

    +candelă care se închide peste high-ul acelui doji, în maximum 3 candele.

    +

    Nivelul pe care stă doji-ul mic nu e aici un suport sau un pivot lunar, ca la +pasul 3, ci high-ul doji-ului de pe TF-ul mare: prețul tocmai a trecut peste +el, pe candela de confirmare, iar acum se întoarce la el — adică exact ce +înseamnă un retest (îl ai în mini-glosar). Ține rolul de nivel la fel de bine, +dar diferența merită știută, ca să nu rămâi cu ideea că high-ul oricărui doji +e suport.

    +

    Câștigul e distanța până la stop: pe TF-ul mare stopul stă sub low-ul +doji-ului de pe TF-ul mare — adică sub o candelă întreagă din TF-ul ăla — iar +pe TF-ul mic sub low-ul doji-ului mic; pe exemplul din diagramă, în jur de +4,8 % față de în jur de 1,2 %, adică la același risc asumat cumperi de vreo +patru ori mai multe acțiuni.

    Pe 60 de minute intri doar în direcția unui swing long deja stabilit pe daily. „MICI" e numele dat de curs variantei ținute luni de zile, pornită dintr-un Buy Doji weekly.

    -

    +

    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 + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 107.00 + același preț - - - 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 + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.55 + + intrare 106.30 + + retest: high doji + weekly 105.20 + + stop 105.05 + 5 cenți sub minimul + ultimelor 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 + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului weekly din stânga + + stop 4,81 % + + stop 1,18 % + + același setup, stop de 4,1 ori mai mic + → de 4,1 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 117.50 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.80 + + intrare 115.75 + + retest: high doji + monthly 113.00 + + stop 112.70 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului monthly din stânga + + 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + 102.80 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.05 + + intrare 102.52 + + retest: high doji + daily 102.08 + + stop 101.99 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului daily din stânga + (șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate — ultima bară a zilei e de 30 min)

    diff --git a/summaries/17_STRATEGII/01_buy_doji.md b/summaries/17_STRATEGII/01_buy_doji.md index 89ff13a..baff8ce 100644 --- a/summaries/17_STRATEGII/01_buy_doji.md +++ b/summaries/17_STRATEGII/01_buy_doji.md @@ -268,10 +268,12 @@ când prețul se închide sub linia de trailing stop. - **Tranșe** — poziția împărțită în bucăți: 300 de acțiuni cumpărate ca 100 + 100 + 100, la prețuri diferite, sau vândute în trei momente. - **Pullback** — o revenire scurtă a prețului împotriva direcției trendului, - în care prețul nu mai face minim nou. Într-o urcare de la 49.20 spre 51.60, - două-trei candele care coboară până pe la 50.80 și se opresc acolo, fără să - rupă 50.40, sunt un pullback; dacă prețul ar coborî sub 50.40 și ar face un - minim mai jos decât cel dinainte, nu mai e pullback, e întoarcere. Un + care se oprește deasupra minimului de la care a pornit urcarea. Într-o + urcare pornită de la 50.40 spre 51.60, câteva candele care coboară până pe + la 50.80 și se opresc acolo, fără să rupă 50.40, sunt un pullback; dacă + prețul coboară sub 50.40, minimul de plecare e rupt — nu mai e pullback, e + întoarcere. Cât ține: câteva candele, dar numărul depinde de TF-ul pe care + te uiți — aceeași mișcare e una-două candele pe weekly și opt pe daily. Un pullback nu e semnal de intrare: intri abia la confirmarea de după doji-ul care îl termină. - **Bull reversal** — prima candelă care se închide peste ultimul nivel al @@ -283,8 +285,10 @@ când prețul se închide sub linia de trailing stop. unei urcări. În scaner e un câmp separat, pus pe `Bull Reversal = 1`. - **Buy momentum** — semnalul unui alt indicator al cursului, care marchează cu o săgeată momentul în care prețul trece cu forță printr-un nivel vechi - de suport sau rezistență. Pe candela ta de buy doji e o confirmare în plus, - nu un înlocuitor al trigger-ului. + de suport sau rezistență. **Completare proprie:** cursul nu spune ce faci + când săgeata apare chiar pe candela ta de buy doji; pe regula trigger-ului + din acest capitol, o tratezi ca o confirmare în plus, nu ca un înlocuitor al + închiderii peste high-ul doji-ului. - **Retest** — prețul revine la un nivel pe care tocmai l-a depășit, înainte să-și continue drumul. Prețul a trecut de 50.10 și tu ai cumpărat la 50.40; dacă revine până la 50.10 și de acolo urcă iar, acela e retestul. @@ -338,9 +342,9 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția - - ultimele 3 săptămâni, - mărite jos + + ultimele 3 săptămâni, + mărite jos @@ -369,19 +373,19 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la 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 - - + 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) + daily: aceleași 3 săptămâni, zi cu zi + (5 zile = o bară weekly; open, close și extremele coincid) 83.90 @@ -443,7 +447,7 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la Diagrama e pe alt simbol decât exemplul din ceilalți pași, deci are alte -prețuri (80-85 $); regulile sunt aceleași. Ea arată greșeala pe short: +prețuri; regulile sunt aceleași. Ea arată greșeala pe short: weekly-ul a confirmat un Buy Doji, deci direcția e long. Pe daily apare un Sell Doji corect ca formă. Luat ca short, merge contra weekly-ului: prețul scade o zi, apoi urcă și lovește stopul. @@ -1447,10 +1451,8 @@ Mai rar citate: double bottom (două minime la același nivel) cu close peste pivotul lunar („sfântul buy doji"); mai multe trigger-e pe aceeași candelă — buy doji plus buy momentum (săgeata indicatorului cursului, care se aprinde când prețul trece cu forță -printr-un nivel vechi) sau bull reversal, adică prima candelă care se închide -peste ultimul nivel al liniei de bear trail, linia care coboară în trepte -deasupra prețului cât ține scăderea. Bull reversal-ul nu spune „are forma -potrivită", ci „vânzătorii s-au epuizat deja": în exemplul din capitol, +printr-un nivel vechi) sau bull reversal, prima candelă care se închide peste +ultimul nivel al liniei de bear trail. În exemplul din capitol, candela care se închide la 50.40 ar fi și bull reversal dacă acel 50.40 e peste ultimul nivel de trail rămas deasupra scăderii de 14 zile — atunci ai două motive independente pe aceeași candelă, nu unul. Practic îl folosești în @@ -1470,275 +1472,315 @@ grafic: e aceeași bucată de piață, mărită. O candelă weekly e cinci cande daily puse cap la cap — același open la început, același close la sfârșit, același high și același low, doar desenate cu mai multe detalii. Caseta punctată de pe panoul din stânga arată exact ce bucată e mărită în dreapta, -iar liniile de preț sunt aceleași pe ambele panouri, ca să urmărești același -nivel dintr-o parte în alta. +iar linia de preț comună e trasată pe amândouă, ca să urmărești același nivel +dintr-o parte în alta. Intrarea, stopul și ținta apar doar pe panoul mic, +pentru că doar acolo au unde să fie citite. De ce te uiți acolo: pe TF-ul mare vezi că scăderea s-a oprit, dar nu vezi -cum s-a oprit. Pullback-ul — revenirea scurtă a prețului împotriva direcției -trendului, în care prețul nu mai face minim nou — încape de obicei întreg -într-o singură candelă a TF-ului mare, așa că pe weekly nu-l vezi deloc; pe -daily îl vezi candelă cu candelă, și odată cu el vezi și doji-ul care îl -termină. +cum s-a oprit. Pullback-ul se vede și pe TF-ul mare — una-două candele roșii, +iar prima dintre ele e o săptămână roșie cât se poate de vizibilă. Ce nu vezi +e ce se întâmplă în interiorul lor: nu vezi unde s-a oprit coborârea, nu vezi +doji-ul care o termină, deci n-ai unde să intri și n-ai de unde să măsori +stopul. Asta face lupa — desface aceleași candele roșii în candelele mici din +care sunt făcute. Momentul intrării nu se schimbă, iar pullback-ul în sine nu e semnal de intrare. Aștepți doji-ul de la capătul lui, pe TF-ul mic, și intri la prima candelă care se închide peste high-ul acelui doji, în maximum 3 candele. + +Nivelul pe care stă doji-ul mic nu e aici un suport sau un pivot lunar, ca la +pasul 3, ci high-ul doji-ului de pe TF-ul mare: prețul tocmai a trecut peste +el, pe candela de confirmare, iar acum se întoarce la el — adică exact ce +înseamnă un retest (îl ai în mini-glosar). Ține rolul de nivel la fel de bine, +dar diferența merită știută, ca să nu rămâi cu ideea că high-ul oricărui doji +e suport. + Câștigul e distanța până la stop: pe TF-ul mare stopul stă sub low-ul -întregii candele mari, pe TF-ul mic stă sub low-ul doji-ului — pe exemplul -din diagramă, în jur de 4,8 % față de în jur de 1,1 %, adică la același risc -asumat cumperi de vreo patru ori mai multe acțiuni. +doji-ului de pe TF-ul mare — adică sub o candelă întreagă din TF-ul ăla — iar +pe TF-ul mic sub low-ul doji-ului mic; pe exemplul din diagramă, în jur de +4,8 % față de în jur de 1,2 %, adică la același risc asumat cumperi de vreo +patru ori mai multe acțiuni. Pe 60 de minute intri doar în direcția unui swing long deja stabilit pe daily. „MICI" e numele dat de curs variantei ținute luni de zile, pornită dintr-un Buy Doji weekly. - + 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 + confirmare: + aici se decide direcția + + + high doji weekly + 105.20 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 107.00 + același preț - - - 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 + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 107.55 + + intrare 106.30 + + retest: high doji + weekly 105.20 + + stop 105.05 + 5 cenți sub minimul + ultimelor 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 + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului weekly din stânga + + stop 4,81 % + + stop 1,18 % + + același setup, stop de 4,1 ori mai mic + → de 4,1 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + + + 117.50 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 118.80 + + intrare 115.75 + + retest: high doji + monthly 113.00 + + stop 112.70 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului monthly din stânga + + 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 + + close confirmare + + + + + + + + + + + + + + + + + + + + + + + + 102.80 + același preț + + + + doji la nivel + confirmare: aici intri + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1:1 103.05 + + intrare 102.52 + + retest: high doji + daily 102.08 + + stop 101.99 + + pullback: 8 candele care coboară spre nivel + fără să rupă low-ul doji-ului daily din stânga + (șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate — ultima bară a zilei e de 30 min)