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 construitweekly: 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.9083.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 @@
-
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 construitweekly: 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.9083.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 mariA. weekly → dailyweekly: direcțiadaily: 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 construitweekly: 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.9083.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 mariA. weekly → dailyweekly: direcțiadaily: 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)