diff --git a/PROGRESS.md b/PROGRESS.md index 4bff70e..08c2e53 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,4 +1,85 @@ -# Progres — atm-curs-dl (actualizat 2026-09-19, 18:30 UTC) +# Progres — atm-curs-dl (actualizat 2026-09-19, 21:15 UTC) + +--- + +# 19.09.2026, 21:15 UTC — `01_buy_doji` refăcut după respingerea userului + +## Ce a reclamat userul la mostra de format tutorial + +A citit `01_buy_doji.html` și l-a respins. Cererile lui, care sunt acum +contract în `STYLE.md`, secțiunea **„FORMAT TUTORIAL v2"** (prima din fișier): +niveluri 1-2-3 de sus în jos; fiecare termen tehnic explicat inline la prima +folosire („iesire pe trail" nu se presupune știut); zero trimiteri +`fișier:linie` în corpul textului; diagrame „ca la proști", cu săgeți care +spun **și de ce**, și cu zona dreptunghiulară de evidențiere care i-a plăcut +la pasul 7; tranzacția în oglindă pe short cu **diagrama ei completă**; mai +puține tabele; mai scurt. + +## Starea: gata, comis. Nimic nu mai rulează. + +- Textul: de la **8430 la 4190 de cuvinte**, de la **2451 la ~570 de linii**. + Nivel 1 (din avion, cu mini-glosar de 9 termeni) → nivel 2 (6 pași + mecanici, fiecare cu diagrama lui și „Treci mai departe doar dacă…") → + oglinda short → nivel 3 (rafinări). Sursele, toate, la final, cu legendă de + prescurtări. Două tabele în tot documentul. +- **Toate cele 14 diagrame refăcute** cu zone și săgeți. `substituie.py`: 14 + puse, 0 lipsă. Auditul: 8 raportări, toate fals-pozitive `` + (perechi de etichete identice din panouri stivuite, în `aplus` și + `fereastra`) — verificate vizual, nu se atinge nimic. +- **Bug-ul vechi din `buy_doji_sell.svg`** (titlul peste eticheta + „doji 99.20 / 100.10") — reparat. + +## Decizii de conținut luate azi (ca să nu fie redeschise) + +1. **Un singur trade prin toată procedura.** Înainte, pașii 2-4 foloseau + doji 50.10 iar pașii 5-6 doji 53.00 — exact confuzia reclamată. Cifrele + canonice acum: doji **50.10 / 49.25**, intrare **50.40**, stop **49.20**, + 1R = **1.20**, TP1 = **51.60**. Low-ul doji-ului a urcat de la 49.20 la + 49.25 ca stopul să fie *sub* el, nu pe el. `buy_doji_ansamblu.serie()` e + sursa unică, importată de `stop`, `transe` și `iesire` — coerența e acum + structurală, nu ținută prin disciplină. +2. **Short: stop 100.15, nu 100.10.** Exemplul cursului punea stopul exact pe + high, contrazicând regula oglindită de la pasul 5. Am ales coerența cu + regula; cifra cursului (100.10 / 97.90) e păstrată în text ca observație. +3. **LABU: „triple bottom" și „al doilea test" nu se contrazic.** Ambele sunt + în transcriere. Seria arată acum **trei minime** (82.40 / 82.00 / 81.45) + dar **două atingeri** ale pivotului 86.00 — între primele două prețul urcă + la 88.90 și trece pe deasupra, înainte de al treilea urcă doar la 85.80. + Generatorul are o aserțiune care definește „test" ca minim precedat de o + revenire peste nivel, deci regula rezistă la ajustări viitoare. +4. Panoul de jos de la pasul 5 e **alt traseu**, nu seria comună (fundul mai + face un picior). Textul o spune explicit acum — altfel „a șasea candelă" + vs. „bara 19" pare eroare. + +## Ce urmează + +- **Userul trebuie să aprobe formatul** înainte să-l aplicăm la celelalte 8 + capitole din `17_STRATEGII/`. Asta a fost înțelegerea de la început. +- Neatins, rămas de la `cap02`: în diagramele capitolului 02, SVG-ul cu Excel + etichetează „CROSSING BULL" ce e doar PPD > PPW, iar legenda SVG-ului + A+/mediocru dă confluența ca regulă a cursului, deși e completare. +- `aplus.spec.txt` cere doji cu high 79.00, generatorul are 78.50 + (preexistent, nu din lotul de azi). + +## CAPCANE NOI (din lotul ăsta) + +- **`Chart.render()` restaura `top`/`left`/`width` la ieșire**, deci orice + coordonată calculată cu `_y()`/`_cx()` **după** randare ieșea deplasată cu + ~22 px. Reparat azi în `svg_candles.py` (randarea nu mai mută obiectul); + generatoarele care își calculează singure offsetul din SVG-ul randat merg + mai departe — formula dă zero. Dacă ai nevoie de coordonate după randare, + folosește `_render()` și pune o aserțiune că `top`, `left` și lățimea din + `viewBox` n-au fost modificate: altfel o săgeată cu text prea lung mută + tăcut graficul și panourile stivuite se dezaliniază fără să pice nimic. +- **Eticheta unei `Zone` nu stă deasupra dreptunghiului**, ci deasupra celei + mai înalte candele din dreptul textului. La o zonă îngustă cu text lung + ajunge la zeci de pixeli de banda pe care o marchează. Soluție: `text=""` + și eticheta desenată manual, sau `p_top` distanțat pe verticală. +- **Agenții apar în `ListAgents` cu numele sesiunii-părinte**, identic cu al + sesiunii principale, nu cu numele lor de agent. Am cerut din greșeală + închiderea a patru agenți activi crezând că sunt sesiuni vechi. Au refuzat + corect, pentru că cererea era formulată „dacă ai ceva în lucru, refuză și + spune-mi ce ai atins". **Formulați mereu cererile de shutdown așa.** --- diff --git a/STYLE.md b/STYLE.md index 404f69d..a8bc8b4 100644 --- a/STYLE.md +++ b/STYLE.md @@ -3,6 +3,59 @@ Referință obligatorie înainte de a scrie/genera orice fișier nou în `summaries/`. Exemplul de referință: `summaries/05_MODUL_4/01_patternuri_complexe_partea_a_doua.md`. +## FORMAT TUTORIAL v2 — corecțiile userului după ce a citit `01_buy_doji` (19.09.2026, seara) + +Userul a citit capitolul rescris în format tutorial și l-a respins. Ce a cerut, +punct cu punct. **Astea bat orice regulă de mai jos care le contrazice.** + +### Structura: trei niveluri, de sus în jos + +1. **Nivelul 1 — din avion.** O pagină. Ce e strategia, o diagramă mare cu + tot trade-ul adnotat, fraza de decizie, mini-glosarul termenilor. Cine + citește doar atât trebuie să știe deja ce caută pe ecran. +2. **Nivelul 2 — procedura mecanică.** Pașii, în ordinea în care îi faci. + Fiecare pas: o propoziție de acțiune, **o diagramă**, maximum ~300 de + cuvinte, și „Treci mai departe doar dacă…". Aici omul nu alege nimic — dă + din mână, mecanic. +3. **Nivelul 3 — rafinări.** Confirmările care fac un setup A+, perechile de + TF, tranșele, exemplul real, transferul pe prop/BVB, contradicțiile. + Începe cu o linie: „asta citești după 20 de trade-uri făcute mecanic". + +### Limbaj + +- **Explică fiecare termen tehnic la prima folosire, inline, într-o + propoziție.** „ieșire pe trail", „retest", „1R", „tranșe", „doji" — nimic + nu se presupune știut. Dacă termenul are formă pe grafic, desenează-l. +- Propoziții normale, nu telegrafice. Fără stil abrupt de notiță. +- Cifrele se plimbă cu o diagramă. Un pas care e doar text cu numere e un pas + prost scris. + +### Referințe + +- **Zero trimiteri `fișier:linie` în corpul textului.** Ele îngreunează + cititul. Toate se mută la finalul fiecărui nivel, într-un bloc „Surse", + grupate pe pas. În text, cel mult un link markdown către un alt capitol + din `summaries/`. + +### Diagrame — „ca la proști" + +- Fiecare diagramă de preț arată **săgeți cu text**: „aici intri", „aici pui + stopul — sub el ideea e moartă", „aici prima țintă". +- **Zonă dreptunghiulară de evidențiere** peste regiunea despre care e + vorba (userului i-a plăcut explicit cea de la pasul 7). Folosește-o. +- Fiecare săgeată spune și **de ce**, nu doar ce. +- **Tranzacția în oglindă (short) are diagrama ei completă**, nu o + propoziție „e invers". Userul e vizual. + +### Volum + +- Mai puține tabele. Un tabel doar dacă compari 3+ lucruri pe aceleași + criterii. Altfel: listă sau paragraf. +- Mai scurt. Userul: „te lungesti foarte mult", „daca imi dai extrem de + multe informatii nu stiu care sunt relevante". Ce nu intră în procedura + mecanică merge la nivelul 3 sau se taie. +- Exemplele concrete și setup-urile rămân — alea îi plac. Abstracțiile pleacă. + ## FORMAT TUTORIAL pentru capitolele de strategie (cerut de user, 19.09.2026) Userul a citit `17_STRATEGII/A3_intrarea.md` și a spus: conținutul îi place, diff --git a/gen/strategii/buy_doji_ansamblu.py b/gen/strategii/buy_doji_ansamblu.py index 3ab5937..dce1759 100644 --- a/gen/strategii/buy_doji_ansamblu.py +++ b/gen/strategii/buy_doji_ansamblu.py @@ -1,103 +1,166 @@ """Buy Doji — diagrama de ansamblu (daily, exemplu construit, fără ticker). -Citește specificația `gen/strategii/buy_doji_ansamblu.spec.txt`. Seria de -32 de candele e construită din lista de close-uri dată, cu open-ul fiecărei -bare = close-ul precedentului; wick-urile sunt fixate ca nivelurile -(doji 50.10/49.20, intrare 50.40, SL 49.20, TP1 51.60, trail 52.60, ieșire -sub trail la bara 28) să iasă exact din serie, nu doar din etichetă. +Citește specificația `gen/strategii/buy_doji_ansamblu.spec.txt`. + +Seria de aici e SURSA UNICĂ a trade-ului din capitol: buy_doji_stop, +buy_doji_transe și buy_doji_iesire importă `serie()` și pornesc din +aceleași bare (doji 50.10/49.25, confirmare 50.40, SL 49.20, TP1 51.60), +ca începătorul să urmărească un singur trade prin toată procedura. + +Barele 0-19: close-uri, open = close-ul precedentului. Barele 20-28 sunt +date explicit: 21 și 27 deschid cu GAP (low peste high-ul precedentei), +fiindcă regula de trail din curs se sprijină exact pe barele astea. """ import sys; sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Chart, Level, Mark, MA, from_closes +from svg_candles import Candle, Chart, Level, MA, Zone, Arrow, from_closes -# --- seria: 32 de close-uri, exact ca în specificație ----------------------- -closes = [ - 60.20, 59.20, 59.60, 58.40, 57.30, 57.70, 56.50, 55.40, 55.80, 54.70, # 0-9 - 53.50, 52.30, 51.00, 49.65, # 10-13 downtrend - 49.60, # 14 doji - 49.90, # 15 +1 (nu confirmă) - 50.40, # 16 +2 confirmare => intrare - 50.90, 51.20, 51.50, 51.80, 52.10, 52.40, 52.20, 52.70, 52.95, 53.20, # 17-26 - 52.80, 52.30, 52.00, 51.80, 51.90, # 27-31 -] -assert len(closes) == 32 +OUT = "/workspace/atm-curs-dl/gen/strategii/buy_doji_ansamblu.svg" -# wick-uri: (up, down) implicite (0.25, 0.30) + excepțiile din specificație -wicks = [(0.25, 0.30)] * 32 -wicks[14] = (0.45, 0.40) # doji: high 50.10, low 49.20 -wicks[15] = (0.15, 0.15) # high 50.05, low 49.45 -wicks[16] = (0.15, 0.15) # high 50.55, low 49.75 -for k in range(24, 28): # barele 24-27 - wicks[k] = (0.25, 0.20) +DOJI, WAIT, CONF = 14, 15, 16 # indicii barelor-cheie +DOJI_H, DOJI_L = 50.10, 49.25 +ENTRY, SL, TP1 = 50.40, 49.20, 51.60 +R = 1.20 -# volum relativ ales de generator (materialul nu dă volum pe exemplu); -# peste medie pe doji (14) și pe confirmare (16), apoi normal -vols = [42, 44, 40, 46, 43, 41, 45, 42, 44, 47, - 43, 45, 48, 52, 78, 46, 88, 55, - 50, 48, 52, 47, 45, 49, 46, 44, 48, 51, - 54, 47, 45, 46] -assert len(vols) == 32 -media_vol = sum(vols) / len(vols) -assert vols[14] > media_vol and vols[16] > media_vol, "volum peste medie pe doji/confirmare" -cds = from_closes(closes, wicks=wicks, vols=vols, start=60.20) +def serie() -> list[Candle]: + """Cele 32 de bare ale trade-ului, cu verificările de bază.""" + closes = [ + 60.20, 59.20, 59.60, 58.40, 57.30, 57.70, 56.50, 55.40, 55.80, 54.70, # 0-9 + 53.50, 52.30, 51.00, 49.65, # 10-13 downtrend + 49.60, # 14 doji + 49.90, # 15 +1 (nu confirmă) + 50.40, # 16 confirmare => intrare + 50.90, 51.20, 51.50, # 17-19 (19 atinge TP1) + ] + wicks = [(0.25, 0.30)] * len(closes) + wicks[14] = (0.45, 0.35) # doji: high 50.10, low 49.25 + wicks[15] = (0.15, 0.15) # high 50.05, low 49.45 + wicks[16] = (0.15, 0.15) # high 50.55, low 49.75 + cds = from_closes(closes, wicks=wicks, start=60.20) + cds += [Candle(*b) for b in [ + (51.50, 51.85, 51.40, 51.75), # 20 + (52.00, 52.30, 51.95, 52.20), # 21 GAP: low 51.95 > high[20] 51.85 → trail 51.95 + (52.20, 52.45, 52.05, 52.35), # 22 + (52.35, 52.40, 52.00, 52.10), # 23 retragere, close peste trail: rămâi + (52.10, 52.50, 52.05, 52.40), # 24 + (52.40, 52.55, 52.25, 52.50), # 25 + (52.50, 52.55, 52.35, 52.45), # 26 + (52.70, 53.10, 52.60, 52.95), # 27 GAP: low 52.60 > high[26] 52.55 → trail 52.60 + (52.95, 53.00, 52.20, 52.30), # 28 close 52.30 < 52.60: ieși + ]] + cds += from_closes([52.00, 51.80, 51.90], wick=0.25, start=52.30) # 29-31 + assert len(cds) == 32 + for i, c in enumerate(cds): + assert c.l <= min(c.o, c.c) and c.h >= max(c.o, c.c), f"bara {i}: h/l nu cuprind o/c" + if i and i not in (21, 27): + assert abs(c.o - cds[i - 1].c) < 1e-9, f"open[{i}] != close[{i-1}]" + d = cds[DOJI] + assert (round(d.h, 2), round(d.l, 2)) == (DOJI_H, DOJI_L), (d.h, d.l) + assert abs(d.o - d.c) <= 0.10 * (d.h - d.l), "bara 14 nu e doji" + assert cds[WAIT].c <= DOJI_H < cds[CONF].c, "fereastra: 15 nu confirmă, 16 da" + assert abs(cds[CONF].c - ENTRY) < 1e-9 + assert abs(min(c.l for c in cds[CONF - 3:CONF + 1]) - DOJI_L) < 1e-9, "low-ul doji nu e cel mai jos din 4" + assert round(DOJI_L - 0.05, 2) == SL and round(ENTRY - SL, 2) == R and round(ENTRY + R, 2) == TP1 + return cds -# adnotările pe bara +1 și pe confirmare, ca linii sub grafic (fără suprapunere) -cds[15].color = "#777" # bara de așteptare: neutră, nu confirmă -cds[15].note = "bara 15: close 49.90 sub high-ul dojiului 50.10 — NU confirmă" -cds[16].note = "bara 16: close 50.40 peste 50.10 — confirmare (intrare)" -doji, wait, conf = cds[14], cds[15], cds[16] -entry, sl, tp1, trail = 50.40, 49.20, 51.60, 52.60 +def trail(cds, start=CONF + 1): + """Regula de trail: bara cu low > high-ul precedentei urcă linia la low-ul ei; + ieși la primul close sub linie. Întoarce (treptele, bara de ieșire).""" + t, steps = None, [] + for i in range(start, len(cds)): + if t is not None and cds[i].c < t: + return steps, i + if cds[i].l > cds[i - 1].h: + t = cds[i].l + steps.append((i, round(t, 2))) + return steps, None -# --- cele 9 assert-uri cerute de specificație ------------------------------ -# 1. SL-ul e exact low-ul dojiului, cel mai jos din fereastra de 4 candele -assert abs(min(cd.l for cd in cds[13:17]) - 49.20) < 1e-9, "min low[13:17] != 49.20" -# 2. intrarea e close-ul barei 16 -assert abs(conf.c - entry) < 1e-9, f"close[16]={conf.c} != 50.40" -# 3. confirmarea închide peste high-ul dojiului -assert abs(doji.h - 50.10) < 1e-9 and conf.c > doji.h, "close[16] nu e peste high[14]" -# 4. bara +1 NU confirmă -assert wait.c <= doji.h, "bara 15 ar confirma, fereastra n-ar avea sens" -# 5. 1:1 exact -assert abs(abs(entry - sl) - abs(tp1 - entry)) < 1e-9 and abs((entry - sl) - 1.20) < 1e-9, \ - "risc != recompensă (nu e 1:1 exact)" -# 6. primul high >= TP1 după intrare e bara 19 -primul_tp = next(i for i in range(17, len(cds)) if cds[i].h >= tp1) -assert primul_tp == 19, f"TP1 51.60 atins întâi la bara {primul_tp}, nu 19" -# 7. trailing 52.60 = low[27]; ieșire la bara 28 sub el; ieșirea e pe profit -assert abs(cds[27].l - trail) < 1e-9, f"low[27]={cds[27].l} != 52.60" -assert abs(cds[28].c - 52.30) < 1e-9 and cds[28].c < trail, "close[28] nu e sub trail" -assert trail > entry, "trail sub intrare, ieșirea n-ar fi pe profit" -# 8. doji: corp <= 10% din amplitudine -assert abs(doji.o - doji.c) <= 0.10 * (doji.h - doji.l), "bara 14 nu e doji" -# 9. downtrend vizibil -assert cds[13].c < cds[0].c - 10, "downtrend prea mic" -print(f"doji {doji.h:.2f}/{doji.l:.2f} intrare {conf.c:.2f} " - f"SL {sl:.2f} TP1 {tp1:.2f} trail {trail:.2f} ieșire bara 28 @ {cds[28].c:.2f}") +if __name__ == "__main__": + cds = serie() + vols = [42, 44, 40, 46, 43, 41, 45, 42, 44, 47, + 43, 45, 48, 52, 78, 46, 88, 55, + 50, 48, 52, 47, 45, 49, 46, 44, 48, 51, + 54, 47, 45, 46] + for c, v in zip(cds, vols): + c.vol = v + media_vol = sum(vols) / len(vols) + assert vols[DOJI] > media_vol and vols[CONF] > media_vol, "volum peste medie pe doji/confirmare" -# --- desenul ---------------------------------------------------------------- -ch = Chart( - candles=cds, - levels=[ - Level(sl, "SL 49.20 (low 4 candele)", "#c00", label_at="left"), - Level(entry, "intrare 50.40", "#188a3e", label_at="left"), - Level(tp1, "TP1 51.60 = 1R", "#1a5fb4", label_at="left"), - Level(trail, "trail 52.60", "#b06000"), - ], - marks=[ - Mark(14, "doji 50.10 / 49.20", "#b06000", "below"), - Mark(28, "ieșire pe trail ~52.60", "#c00", "above", dy=-6), - ], - mas=[MA(20, "#777", dash="4 3", text="MA(20)")], - scale=24.0, gap=15, body_w=9, left=44, width=640, vol_h=70, - vol_label="volum", title="Buy Doji — daily (exemplu construit, fără ticker)", - caption="Intrare la close-ul confirmării, SL la low-ul ultimelor 4 candele, " - "TP1 1:1, apoi trailing stop.", -) + # --- aserțiunile specificației --------------------------------------------- + primul_tp = next(i for i in range(CONF + 1, len(cds)) if cds[i].h >= TP1) + assert primul_tp == 19, f"TP1 51.60 atins întâi la bara {primul_tp}, nu 19" + steps, iesire = trail(cds) + assert steps == [(21, 51.95), (27, 52.60)], steps + assert iesire == 28 and abs(cds[28].c - 52.30) < 1e-9, iesire + assert steps[-1][1] > ENTRY, "trail sub intrare, ieșirea n-ar fi pe profit" + R_IES = round((cds[28].c - ENTRY) / R, 2) + assert R_IES == 1.58, R_IES + assert cds[13].c < cds[0].c - 10, "downtrend prea mic" + print(f"doji {DOJI_H:.2f}/{DOJI_L:.2f} intrare {ENTRY:.2f} SL {SL:.2f} TP1 {TP1:.2f} " + f"trail {steps} ieșire bara 28 @ {cds[28].c:.2f} = +{R_IES}R") -svg = ch.render() -assert "') + # parantezele 1R: riscul jos, ținta sus, aceeași înălțime = „1:1" + xp = ch._cx(5) + br = [] + for lo, hi, txt, col in ((SL, ENTRY, "1R = 1.20 (riscul)", RED), + (ENTRY, TP1, "1R = 1.20 (ținta)", BLUE)): + y1, y2 = Y(hi) + 2, Y(lo) - 2 + br.append(f'') + br.append(f'{txt}') + body = svg.rsplit("", 1)[0].rstrip() + svg = "\n ".join([body, step, *br]) + "\n" + assert " (Nivel 0, „Diagrama de ansamblu") +SPEC DIAGRAMĂ — buy_doji_ansamblu +================================= +tip: PRET (un singur panou, cu volum) +destinație: summaries/17_STRATEGII/01_buy_doji.md, nivelul 1 („tot trade-ul") +cheie markdown: +titlu SVG: „Buy Doji — un trade de la cap la coadă (daily, exemplu construit)" +rol: SURSA UNICĂ a seriei. buy_doji_stop, buy_doji_transe și + buy_doji_iesire importă `serie()` din generatorul ăsta, ca + toate patru să arate ACELAȘI trade. -CE ARATĂ -Graficul întreg al unui trade Buy Doji long: downtrend de 14 candele, -doji, o candelă de așteptare (în fereastră, care NU confirmă), apoi cea -care confirmă; intrare la close-ul confirmării, SL la extrema ultimelor 4 -candele, TP 1:1 atins, apoi poziția rămasă pe trailing stop până la -ieșire. Banda de jos = volum. +TRADE-UL (aceleași cifre în toate cele patru diagrame) +------------------------------------------------------ +doji (bara 14): high 50.10, low 49.25 +bara 15 (+1): close 49.90, sub 50.10 — NU confirmă +bara 16 (+2): close 50.40 — confirmare => INTRARE 50.40 +cel mai jos low din ultimele 4 candele (13-16): 49.25 (al doji-ului) +STOP: 49.20 (5 cenți sub); 1R = 1.20; ȚINTA 1: 51.60 (atinsă la bara 19) +trailing stop: 51.95 (gap la bara 21) → 52.60 (gap la bara 27) +ieșire: close 52.30 la bara 28 = +1.58R -NIVELURILE ȘI ETICHETELE (cu trimitere) -- doji high = 50.10, doji low = 49.20. Etichetă pe bară „doji 50.10 / 49.20". - `13_strategia_3_byh.md:90`, exemplul din `13_strategia_3_byh.md:158-167`. -- intrare = 50.40 (close-ul candelei de confirmare). Etichetă „intrare 50.40". - `13_strategia_3_byh.md:158-167`. -- SL = 49.20 (low-ul dojiului = cel mai jos low din 4 candele). Etichetă - „SL 49.20 (low 4 candele)". Regula: `13_strategia_3_byh.md:192-193`. -- TP1 = 51.60 = 1R (50.40 + 1.20). Etichetă „TP1 51.60 = 1R". Regula 1:1: - `13_strategia_3_byh.md:194-195`. -- linia de trailing = 52.60 (low-ul barei 27), etichetă „trail 52.60"; - ieșire la close sub ea (bara 28, close 52.30). Regula de trail: - `13_strategia_3_byh.md:196-200`; „ieșire pe trail ~52.60" în diagrama - lecției: `13_strategia_3_byh.md:91`. +STRUCTURA SERIEI (32 bare, 0-indexate) +-------------------------------------- +Barele 0-19 din close-uri, open = close-ul precedentului, fitile (0.25, 0.30), +cu excepțiile: 14 (0.45, 0.35) → high 50.10 / low 49.25; 15 și 16 (0.15, 0.15). +close-uri 0-19: 60.20, 59.20, 59.60, 58.40, 57.30, 57.70, 56.50, 55.40, 55.80, +54.70, 53.50, 52.30, 51.00, 49.65, 49.60, 49.90, 50.40, 50.90, 51.20, 51.50. +Barele 20-28 date explicit (o, h, l, c) — 21 și 27 deschid cu GAP, fiindcă +regula de trail cere o bară cu low peste high-ul precedentei: +20 (51.50, 51.85, 51.40, 51.75) +21 (52.00, 52.30, 51.95, 52.20) GAP: low 51.95 > high[20] 51.85 → trail 51.95 +22 (52.20, 52.45, 52.05, 52.35) +23 (52.35, 52.40, 52.00, 52.10) retragere, close peste trail: rămâi în trade +24 (52.10, 52.50, 52.05, 52.40) +25 (52.40, 52.55, 52.25, 52.50) +26 (52.50, 52.55, 52.35, 52.45) +27 (52.70, 53.10, 52.60, 52.95) GAP: low 52.60 > high[26] 52.55 → trail 52.60 +28 (52.95, 53.00, 52.20, 52.30) close sub 52.60: IEȘIRE +Barele 29-31 din close-uri 52.00, 51.80, 51.90 (fitil 0.25). +Volum: peste media seriei pe doji (14) și pe confirmare (16), altfel normal. +Valorile de volum sunt alese de generator (materialul nu le dă). -STRUCTURA SERIEI (32 candele, 0-indexate, open = close-ul precedentului) -Lista de close-uri: -[60.20, 59.20, 59.60, 58.40, 57.30, 57.70, 56.50, 55.40, 55.80, 54.70, - 53.50, 52.30, 51.00, 49.65, # 13 = ultima bară de downtrend - 49.60, # 14 = doji (o 49.65, c 49.60, h 50.10, l 49.20) - 49.90, # 15 = +1, sub high-ul dojiului, NU confirmă - 50.40, # 16 = +2, confirmare (close peste 50.10) => intrare - 50.90, 51.20, 51.50, 51.80, 52.10, 52.40, 52.20, 52.70, 52.95, 53.20, - 52.80, 52.30, 52.00, 51.80, 51.90] -Mecioni (up, down) implicite (0.25, 0.30) pentru toate barele, cu excepțiile: -- bara 14 (doji): o=49.65, c=49.60 => wu=0.45 (high 50.10), wd=0.40 (low 49.20); -- bara 15: o=49.60, c=49.90 => wu=0.15 (high 50.05), wd=0.15 (low 49.45); -- bara 16: o=49.90, c=50.40 => wu=0.15 (high 50.55), wd=0.15 (low 49.75); -- barele 24-27: wd=0.20. Cu lista de mai sus, low[27] = 52.60 (linia de trail). -Volum: peste media seriei pe doji și pe confirmare (publicul intră), apoi -normal. Valori relative, alese de generator (materialul nu dă volum pentru -acest exemplu). +ADNOTĂRI (formatul tutorial v2: zone + săgeți cu CE și DE CE) +------------------------------------------------------------- +4 zone dreptunghiulare: „1. scăderea: vânzătorii obosesc" (4-13), +„2. doji: pauză, încă nu intri" (14-15), „3. confirmarea" (16), +„4. ieșirea: o treime la țintă, restul pe trail" (17-28). +5 săgeți: stopul 49.20; „AICI INTRI, la close 50.40"; ținta 1 = riscul; +trailing stop (urcă la fiecare gap); ieșirea la 52.30 (+1.58R). +Două paranteze verticale egale: 49.20→50.40 „1R = 1.20 (riscul)" și +50.40→51.60 „1R = 1.20 (ținta)" — așa se vede 1:1. +Linia de trail e desenată în trepte (un Level ar trage-o pe toată lățimea, +inclusiv înainte să existe). CE VERIFICĂ GENERATORUL CU assert -1. min(low[13:17]) == 49.20 (SL-ul e exact low-ul dojiului, cel mai jos din 4) -2. close[16] == 50.40 == intrare -3. close[16] > high[14] == 50.10 (confirmarea chiar închide peste high) -4. close[15] <= high[14] (bara +1 NU confirmă — altfel fereastra n-ar avea sens) -5. abs(entry - sl) == abs(tp1 - entry) == 1.20 (1:1 exact, nu aproximat) -6. primul i>16 cu high[i] >= 51.60 este bara 19 -7. low[27] == 52.60; close[28] == 52.30 < 52.60; și 52.60 > intrare - (ieșirea pe trail e pe profit) -8. doji: abs(o-c) <= 0.10 * (h-l) (corp ≤ 10%, criteriul din - `28_2025-05-27.md:343-349`) -9. trend: close[13] < close[0] - 10 (downtrend vizibil) -STIL: gap=15, body_w=9, left=44, width=640, vol_h=70, scale ~24, MA(20) -opțional (linia mediei apare pe graficul lecției). Fără linie goală în SVG. +--------------------------------- +1. h/l cuprind o/c pe toate barele; open[i] == close[i-1] peste tot în afară + de barele de gap 21 și 27. +2. doji: high 50.10, low 49.25, corp <= 10% din amplitudine. +3. close[15] <= 50.10 < close[16]; close[16] == 50.40 (fereastra are sens). +4. min(low[13:17]) == 49.25; 49.25 - 0.05 == 49.20; 50.40 - 49.20 == 1.20; + 50.40 + 1.20 == 51.60. +5. primul high >= 51.60 după intrare e bara 19. +6. regula de trail, calculată pe serie, dă exact [(21, 51.95), (27, 52.60)] + și ieșire la bara 28, close 52.30; 52.60 > intrare (ieșire pe profit). +7. (52.30 - 50.40) / 1.20 == 1.58. +8. volum peste medie pe 14 și 16. +9. downtrend: close[13] < close[0] - 10. + +SURSA +----- +- Doji 50.10/49.20 și intrarea la close-ul confirmării: summaries/03_MODUL_2/ + 13_strategia_3_byh.md:90, :158-167. Low-ul doji-ului e coborât aici la 49.25, + ca stopul de 49.20 să fie SUB el, nu exact pe el (decizie de redactare). +- SL = extrema ultimelor 4 candele: :192-193. Ținta 1:1: :194-195. +- Trail pe gap și ieșire la close sub linie: :196-200. +- Barele de după intrare sunt CONSTRUITE. diff --git a/gen/strategii/buy_doji_ansamblu.svg b/gen/strategii/buy_doji_ansamblu.svg index d32d8b4..dac6098 100644 --- a/gen/strategii/buy_doji_ansamblu.svg +++ b/gen/strategii/buy_doji_ansamblu.svg @@ -1,116 +1,144 @@ - - Buy Doji — daily (exemplu construit, fără ticker) - - SL 49.20 (low 4 candele) - - intrare 50.40 - - TP1 51.60 = 1R - - trail 52.60 - - MA(20) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 50.10 / 49.20 - ieșire pe trail ~52.60 - bara 15: close 49.90 sub high-ul dojiului 50.10 — NU confirmă - bara 16: close 50.40 peste 50.10 — confirmare (intrare) - Intrare la close-ul confirmării, SL la low-ul ultimelor 4 candele, TP1 1:1, apoi trailing stop. + + Buy Doji — un trade de la cap la coadă (daily, exemplu construit) + + 1. scăderea: vânzătorii obosesc + + 2. doji: pauză, încă nu intri + + 3. confirmarea + + 4. ieșirea: o treime la țintă, restul pe trail + + ținta 1: 51.60 + + intrare 50.40 + + stop 49.20 + + MA(20) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + stopul 49.20, 5 cenți sub doji + sub el, ideea că vânzătorii + au obosit e moartă + + + AICI INTRI, la close 50.40 + abia acum știi că + cumpărătorii au câștigat + + + ținta 1: 51.60 = riscul (1.20) + încă o dată: vinzi o treime + + + trailing stop: urcă după preț + la fiecare gap, nu coboară + + + ieși la 52.30 (+1.58R) + prima închidere sub trail + + + 1R = 1.20 (riscul) + + 1R = 1.20 (ținta) \ No newline at end of file diff --git a/gen/strategii/buy_doji_aplus.py b/gen/strategii/buy_doji_aplus.py index 4f83c7e..a882cf2 100644 --- a/gen/strategii/buy_doji_aplus.py +++ b/gen/strategii/buy_doji_aplus.py @@ -23,7 +23,7 @@ import sys from pathlib import Path sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Candle, Chart, Level, Mark, MA, from_closes # noqa: E402 +from svg_candles import Arrow, Candle, Chart, Level, Zone, from_closes # noqa: E402 OUT = Path(__file__).resolve().parent / "buy_doji_aplus.svg" @@ -118,19 +118,25 @@ PW = 560 # lățimea fiecărui panou ch_a = Chart( candles=cds_a, levels=[Level(42.00, "suport 42.00", GREEN, label_at="left")], - marks=[Mark(DOJI_A, "doji la nivel (low 41.95)", ORANGE, "below"), - Mark(CONF_A, "acumulare", GREEN, "above", dy=-6)], + zones=[Zone(DOJI_A, DOJI_A, "", GREEN, p_top=43.2, p_bot=41.7)], + arrows=[Arrow(DOJI_A, "doji chiar pe nivel:\nvânzarea s-a oprit pe suport", + where="below", color=GREEN, dx=-40), + Arrow(CONF_A, "confirmarea, pe volum mare:\ncumpărătorii mari intră", + where="above", color=GREEN, dx=60)], mas=[], scale=22.0, gap=15, body_w=9, left=44, width=PW, vol_h=60, vol_label="volum", title="A+ — doji la suport, volum în acumulare", - caption="acumulare: volum peste media ultimelor 10 bare.", ) ch_n = Chart( candles=cds_n, levels=[Level(78.50, "rezistență 78.50", RED, label_at="right")], - marks=[Mark(DOJI_N, "doji 78.50 / 78.10", ORANGE, "below", dy=93)], + # eticheta zonei ar urca peste titlul panoului (zona e chiar în vârf): + # textul stă pe săgeata din stânga + zones=[Zone(DOJI_N - 1, CONF_N, "", RED, p_top=79.62)], + arrows=[Arrow(DOJI_N, "gap-up în rezistență:\naici cumpără cei întârziați", + where="left", color=RED, dx=-30, dy=30), + Arrow(18, "cade înapoi sub 78.00:\nsemnalul a mințit", where="below", color=RED, dx=40)], mas=[], scale=22.0, gap=15, body_w=9, left=44, width=PW, vol_h=60, vol_label="volum", title="Mediocru — gap-up în rezistență, volum varză", - caption="gap-up + doji în rezistență, confirmare pe volum slab.", ) # ============================================================ wrapper: două panouri alăturate @@ -145,20 +151,51 @@ def vb_height(svg: str) -> float: return float(m.group(1)) -PANEL_GAP, PAD = 24, 8 -TITLE_H, FOOTER_H = 30, 22 -svg_a, svg_n = ch_a.render(), ch_n.render() +def vol_note(svg: str, i0: int, i1: int, text: str, color: str, box: bool) -> str: + """Evidențiere în panoul de volum (Zone/Arrow din svg_candles lucrează doar pe preț). -# „gap-up, volum slab" stă în colțul liber din stânga-sus, cu linie indicatoare -# spre golul dintre bara 13 (high 76.80) și dojiul barei 14 (open 78.20). -GAP_X = (ch_n._cx(DOJI_N - 1) + ch_n._cx(DOJI_N)) / 2 -GAP_Y = ch_n._y(77.50) -gap_ann = ( - f'gap-up, volum slab' - f'' - f'' -) -svg_n = svg_n.replace("", gap_ann + "") + Coordonatele se citesc din SVG-ul randat (barele de volum sunt rect-urile cu + opacity 0.55, în ordinea candelelor), ca să nu depindă de deplasarea internă + a lui Chart. Eticheta stă sub linia de bază, unde nu acoperă nimic; + `box` = dreptunghi peste bare, altfel săgeată de jos în sus, sub bară. + """ + bars = [tuple(map(float, m)) for m in re.findall( + r'', svg)] + base = bars[0][1] + bars[0][3] + x0, x1 = bars[i0][0] - 4, bars[i1][0] + bars[i1][2] + 4 + top = min(b[1] for b in bars[i0:i1 + 1]) - 4 + if box: + mark = (f'') + ty = base + 15 + else: + cx = (x0 + x1) / 2 + mark = (f'' + f'') + ty = base + 34 + label = (f'{text}') + # dreptunghiul/săgeata în spatele barelor, eticheta la final + i = svg.index('", label + "") + + +def grow(svg: str, dh: float) -> str: + """Mărește viewBox-ul unui panou cu dh px jos, pentru eticheta de sub volum.""" + h = vb_height(svg) + return svg.replace(f'0 0 {PW} {h:.0f}"', f'0 0 {PW} {h + dh:.0f}"', 1) + + +PANEL_GAP, PAD = 24, 8 +TITLE_H, FOOTER_H = 30, 0 +svg_a = grow(vol_note(ch_a.render(), CONF_A, CONF_A + 4, + "volum în creștere = acumulare", GREEN, box=True), 10) +svg_n = grow(vol_note(ch_n.render(), CONF_N, CONF_N, + "volum slab: nimeni mare nu cumpără", RED, box=False), 30) HA, HN = vb_height(svg_a), vb_height(svg_n) assert svg_a.count("\n\n") == 0 and svg_n.count("\n\n") == 0, "linie goală în panou" @@ -168,9 +205,6 @@ TOTAL_H = PAD + TITLE_H + max(HA, HN) + FOOTER_H + PAD OFF_A = (PAD, PAD + TITLE_H) OFF_N = (PAD + PW + PANEL_GAP, PAD + TITLE_H) -FOOTER = ("Surse: 13_strategia_3_byh.md:188-190 (doji la nivel); " - "01_buy_doji_si_strategia_mici.md:227-235 (context invalid).") - wrapper = ( f'' @@ -178,8 +212,6 @@ wrapper = ( f'style="font-weight:bold">Setup A+ vs. setup mediocru (două panouri, exemple construite)' f'{inner(svg_a)}' f'{inner(svg_n)}' - f'{FOOTER}' f'' ) @@ -217,8 +249,7 @@ for frag, (ox, oy) in ((inner(svg_a), OFF_A), (inner(svg_n), OFF_N)): all_txt.append((gx, gy, anchor, t)) # textele din wrapper (titlu + footer), în coordonate globale for x, y, anchor, t in ((TOTAL_W / 2, 20.0, "middle", - "Setup A+ vs. setup mediocru (două panouri, exemple construite)"), - (TOTAL_W / 2, TOTAL_H - PAD, "middle", FOOTER)): + "Setup A+ vs. setup mediocru (două panouri, exemple construite)"),): gl, gr = span(x, anchor, t) assert -1 <= gl and gr <= TOTAL_W + 1, f"text din wrapper iese din pânză: {t!r}" assert 0 <= y <= TOTAL_H, f"text din wrapper în afara înălțimii: {t!r}" @@ -236,8 +267,10 @@ for i in range(len(all_txt)): raise AssertionError(f"texte suprapuse: {si!r} / {sj!r}") # etichetele cerute de spec există în desen -for cheie in ("suport 42.00", "doji la nivel", "acumulare", - "rezistență 78.50", "gap-up, volum slab", +assert "Surse" not in wrapper and ".md:" not in wrapper, "trimiteri la surse în SVG" +for cheie in ("suport 42.00", "doji chiar pe nivel", "vânzarea s-a oprit", "volum în creștere = acumulare", + "rezistență 78.50", "gap-up în rezistență", "cei întârziați", + "semnalul a mințit", "volum slab: nimeni mare nu cumpără", "A+ — doji la suport, volum în acumulare", "Mediocru — gap-up în rezistență, volum varză"): assert cheie in wrapper, f"lipsește din desen: {cheie!r}" diff --git a/gen/strategii/buy_doji_aplus.spec.txt b/gen/strategii/buy_doji_aplus.spec.txt index 372b6ab..41b6119 100644 --- a/gen/strategii/buy_doji_aplus.spec.txt +++ b/gen/strategii/buy_doji_aplus.spec.txt @@ -29,11 +29,18 @@ STRUCTURA SERIEI Panoul A+ (24 candele): downtrend de la 52 la ~42.60 (10 bare), apoi doji cu low 41.95 / high 42.90 care „stă" pe suportul 42.00 (low-ul e la 0.1 % sub nivel), apoi confirmare close 43.60 (> high-ul dojiului) cu volum peste -media pe 10 bare. Etichete: „suport 42.00", „doji la nivel", „acumulare". +media pe 10 bare. Adnotări: zonă verde peste doji („doji chiar pe nivel: vânzarea s-a oprit pe +suport"), zonă verde peste barele de volum ale confirmării („volum în +creștere = acumulare"), săgeată spre confirmare („confirmarea, pe volum +mare: cumpărătorii mari intră"). Level „suport 42.00". Panoul NU (24 candele): uptrend de la 70 la ~77, apoi un gap-up de la 76.80 la open 78.20, doji cu high 79.00 / low 78.10 chiar sub rezistența 78.50, apoi confirmare close 79.30 pe volum sub media pe 10 bare, după care prețul -cade înapoi sub 78.00. Etichete: „rezistență 78.50", „gap-up, volum slab". +cade înapoi sub 78.00. Adnotări: zonă roșie peste gap-up + doji + confirmare, cu săgeata „gap-up în +rezistență: aici cumpără cei întârziați"; săgeată spre volumul confirmării +(„volum slab: nimeni mare nu cumpără"); săgeată spre căderea de după („cade +înapoi sub 78.00: semnalul a mințit"). Level „rezistență 78.50". +Fără linie de surse în SVG — trimiterile stau la finalul capitolului. Nivelurile 42.00 / 78.50 / cifrele de preț sunt construite (materialul nu dă prețuri pentru acest contrast); regulile și citatele de mai sus sunt din curs. diff --git a/gen/strategii/buy_doji_aplus.svg b/gen/strategii/buy_doji_aplus.svg index 12b7ffb..ddd20a8 100644 --- a/gen/strategii/buy_doji_aplus.svg +++ b/gen/strategii/buy_doji_aplus.svg @@ -1,5 +1,6 @@ -Setup A+ vs. setup mediocru (două panouri, exemple construite) +Setup A+ vs. setup mediocru (două panouri, exemple construite) A+ — doji la suport, volum în acumulare + suport 42.00 @@ -50,113 +51,125 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji la nivel (low 41.95) - acumulare - acumulare: volum peste media ultimelor 10 bare. - + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + doji chiar pe nivel: + vânzarea s-a oprit pe suport + + + confirmarea, pe volum mare: + cumpărătorii mari intră +volum în creștere = acumulare Mediocru — gap-up în rezistență, volum varză - - rezistență 78.50 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 78.50 / 78.10 - gap-up + doji în rezistență, confirmare pe volum slab. -gap-up, volum slabSurse: 13_strategia_3_byh.md:188-190 (doji la nivel); 01_buy_doji_si_strategia_mici.md:227-235 (context invalid). \ No newline at end of file + + + rezistență 78.50 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + gap-up în rezistență: + aici cumpără cei întârziați + + + cade înapoi sub 78.00: + semnalul a mințit +volum slab: nimeni mare nu cumpără \ No newline at end of file diff --git a/gen/strategii/buy_doji_directie.py b/gen/strategii/buy_doji_directie.py index 46c1c19..4d3421c 100644 --- a/gen/strategii/buy_doji_directie.py +++ b/gen/strategii/buy_doji_directie.py @@ -12,7 +12,7 @@ Rulare: python3 gen/strategii/buy_doji_directie.py from pathlib import Path OUT = Path(__file__).with_suffix(".svg") -W = 720 +W = 900 def trend(start, closes, wick=0.15): @@ -55,10 +55,11 @@ for name, (o, h, l, c) in (("doji weekly", WK[7]), ("doji daily", DY[9])): assert WK[8][3] > WK[7][1], "weekly: fără confirmare" assert DY[10][3] < DY[9][2], "daily: fără confirmare Sell Doji" ENTRY = DY[10][3] -SL = max(b[1] for b in DY[7:11]) +# stopul: 5 cenți peste high-ul ultimelor 4 candele, ca la pasul 5 (oglindit) +SL = round(max(b[1] for b in DY[7:11]) + 0.05, 2) RISK = round(SL - ENTRY, 2) TP1 = round(ENTRY - RISK, 2) -assert eq(ENTRY, 83.60) and eq(SL, 84.80) and eq(RISK, 1.20) and eq(TP1, 82.40) +assert eq(ENTRY, 83.60) and eq(SL, 84.85) and eq(RISK, 1.25) and eq(TP1, 82.35) LOW_AFTER = min(b[2] for b in DY[11:]) assert eq(LOW_AFTER, 83.00) and LOW_AFTER > TP1, "TP1 atins" HIT = next(i for i in range(11, 17) if DY[i][1] >= SL - 1e-9) @@ -89,6 +90,16 @@ def rect(x, y, w, h, fill, opacity, stroke="none"): f'fill-opacity="{opacity}" stroke="{stroke}" rx="3"/>') +def arrow(x1, y1, x2, y2, color): + """Săgeată de la (x1,y1) la vârful (x2,y2): linie + cap triunghi.""" + d = max(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5, 1e-9) + ux, uy = (x2 - x1) / d, (y2 - y1) / d + bx, by = x2 - 9 * ux, y2 - 9 * uy + line(x1, y1, bx, by, color, 1.8) + out.append(f'') + + def candles(bars, x0, gap, yf): for i, (o, h, l, c) in enumerate(bars): cx = x0 + i * gap @@ -112,11 +123,12 @@ rect(xw(7) - 8, yw(WK[8][1]) - 4, WGAP + 16, yw(WK[7][2]) - yw(WK[8][1]) + 8, GREEN, 0.12, GREEN) candles(WK, WX0, WGAP, yw) text(xw(7), yw(WK[7][2]) + 16, "doji weekly", fill=ORANGE, anchor="middle", bold=True) -text(xw(9) + 14, yw(WK[8][3]) + 4, "Buy Doji weekly: direcția = long", fill=GREEN, bold=True) -# insigna de direcție -rect(470, 66, 230, 58, GREEN, 0.10, GREEN) -text(585, 90, "WEEKLY: LONG ↑", fill=GREEN, anchor="middle", bold=True, size=16) -text(585, 110, "confirmare 81.30 > high doji 79.80", fill=GREEN, anchor="middle", size=11) +# săgeata weekly: ce + de ce +arrow(300, yw(WK[8][3]) - 6, xw(8) + 12, yw(WK[8][3]) - 6, GREEN) +text(306, yw(WK[8][3]) - 10, "weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80)", + fill=GREEN, bold=True) +text(306, yw(WK[8][3]) + 8, "deci direcția permisă e LONG: pe daily cauți doar Buy Doji", + fill=GREEN) w_bottom = yw(min(b[2] for b in WK)) # ---- panoul de jos: daily ----------------------------------------------------- @@ -136,42 +148,33 @@ rect(xd(9) - 8, yd(DY[9][1]) - 3, DGAP + 16, yd(DY[10][2]) - yd(DY[9][1]) + 6, O line(LX1, y_sl, LX2, y_sl, RED, 1.5, "6 3") line(xd(10) - 8, y_e, LX2, y_e, ORANGE, 1.5, "6 3") line(xd(10) - 8, y_tp, LX2, y_tp, GRAY, 1.5, "2 3") -text(COL, y_sl + 4, "SL 84.80 = high 4 candele", fill=RED, size=11) +text(COL, y_sl + 4, "stop 84.85 = 5 cenți peste high-ul de 4 candele", fill=RED, size=11) text(COL, y_e + 4, "intrare short 83.60", fill=ORANGE, size=11) -text(COL, y_tp + 4, "TP1 82.40 — neatins", fill=GRAY, size=11) +text(COL, y_tp + 4, "ținta 82.35 — neatinsă (a scăzut o zi, la 83.00)", + fill=GRAY, size=11) candles(DY, DX0, DGAP, yd) -# paranteza „short de 1-2 zile" peste barele 10-11 -xa, xb, yb = xd(10) - 6, xd(11) + 6, y_sl - 12 -out.append(f'') -text(xb, yb - 6, "short de 1-2 zile: permis", fill=GRAY, anchor="end", bold=True) - -# SL lovit la bara 14 +# SL lovit la bara 14: săgeată din dreapta sus cx14 = xd(HIT) out.append(f'') -y_lbl = DT - 22 -line(cx14, y_sl - 8, cx14, y_lbl + 4, RED, 1.2) -text(cx14 - 6, y_lbl, "SL lovit: poziția short contra weekly", fill=RED, anchor="middle", bold=True) +y_hit = DT - 40 +arrow(560, y_hit + 6, cx14 + 9, y_sl - 9, RED) +text(568, y_hit, "aici te-a scos: stopul 84.85, lovit a patra zi", fill=RED, bold=True) +text(568, y_hit + 18, "banii mari de pe weekly cumpără mai departe", fill=RED) -# Sell Doji: etichetă sub panou, cu leader spre confirmare +# intrarea short: săgeată de jos-dreapta spre close-ul confirmării y_bot = yd(min(b[2] for b in DY)) -y_sd = y_bot + 22 -line(xd(10), yd(DY[10][2]) + 4, xd(10), y_sd - 12, ORANGE, 1.2) -text(xd(10) - 20, y_sd, "Sell Doji daily: tehnic valid (close 83.60 < low doji 83.95)", +x_e = xd(12) + 6 +arrow(x_e, y_tp + 30, xd(10) + 7, y_e + 4, ORANGE) +text(x_e + 6, y_tp + 28, "aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă", fill=ORANGE, bold=True) +text(x_e + 6, y_tp + 46, "(close sub low-ul doji-ului 83.95) — dar contra weekly-ului", + fill=ORANGE) -# insigna de contrast -rect(470, DT - 36, 230, 58, RED, 0.08, RED) -text(585, DT - 12, "short daily = CONTRA ✗", fill=RED, anchor="middle", bold=True, size=16) -text(585, DT + 8, "weekly zice long; daily urcă mai departe", fill=RED, anchor="middle", size=11) - -y0 = y_sd + 32 -text(20, y0, "Short scurt înăuntrul structurii weekly: da. Poziție short contra ei: nu.", - fill=INK, bold=True) -text(20, y0 + 18, "Seria e construită: un singur caz ilustrează regula, nu o dovedește.", fill="#555") -H = y0 + 30 +y0 = max(y_bot, y_tp + 46) + 34 +text(20, y0, "Seria e construită: un singur caz ilustrează regula, nu o dovedește.", fill="#555") +H = y0 + 24 svg = (f'\n ' + "\n ".join(out) + "\n") diff --git a/gen/strategii/buy_doji_directie.spec.txt b/gen/strategii/buy_doji_directie.spec.txt index 4d3e344..a518fa8 100644 --- a/gen/strategii/buy_doji_directie.spec.txt +++ b/gen/strategii/buy_doji_directie.spec.txt @@ -38,19 +38,32 @@ open[0] = 81.30, fitile 0.15 peste/sub corp (uptrend de 9 candele). NIVELURI (panoul daily) ----------------------- -intrare short 83.60 (portocaliu), SL 84.80 roșu („SL 84.80 = high 4 candele"), -TP1 82.40 punctat („TP1 82.40 — neatins"). -Paranteză orizontală peste barele 10-11: „short de 1-2 zile: permis" (gri). -Mark(14, "SL lovit: poziția short contra weekly", roșu, above). +intrare short 83.60 (portocaliu), stop 84.85 roșu („stop 84.85 = 5 cenți peste +high-ul de 4 candele"), ținta 82.35 punctată („neatinsă — a scăzut o zi, la 83.00"). +Stopul e 5 cenți peste extremă, ca oglinda pasului 5 din capitol (51.60 -> 51.55). +Paranteza „short de 1-2 zile: permis" a fost scoasă (nuanță de nivel 3, încărca +pasul mecanic), la fel și insignele de colț — locul lor îl iau săgețile. + +SĂGEȚI (format tutorial v2: ce ȘI de ce, 1 pe weekly + 2 pe daily) +- weekly, spre confirmare: „weekly: Buy Doji confirmat (close 81.30, peste + high-ul doji-ului 79.80)" / „deci direcția permisă e LONG: pe daily cauți + doar Buy Doji". +- daily, spre close-ul confirmării: „aici ai intrat SHORT, la 83.60: Sell Doji + corect ca formă (close sub low-ul doji-ului 83.95) — dar contra weekly-ului". +- daily, spre bara 14 pe linia stopului: „aici te-a scos: stopul 84.85, lovit a + patra zi" / „banii mari de pe weekly cumpără mai departe". +Zone: verde peste doji-ul + confirmarea weekly, portocalie peste Sell Doji-ul +daily (portocaliu, nu roșu, ca să nu se confunde cu linia stopului). +Lățime 900 (textele săgeților stau în dreapta candelelor). ASSERT-URI ---------- 1. open[i] == close[i-1] pe ambele panouri; h/l cuprind o/c. 2. Doji weekly și doji daily: abs(o-c) <= 0.10*(h-l). 3. weekly close[8] > high[7]; daily close[10] < low[9]. -4. SL == max(h for bare daily 7..10) == 84.80; risc == 1.20; TP1 == 82.40. -5. min(l for bare daily 11..16) == 83.00 > 82.40 (TP1 neatins). -6. primul i>10 cu high >= 84.80 este 14. +4. SL == max(h for bare daily 7..10) + 0.05 == 84.85; risc == 1.25; TP1 == 82.35. +5. min(l for bare daily 11..16) == 83.00 > 82.35 (TP1 neatins). +6. primul i>10 cu high >= 84.85 este 14. SURSA ----- diff --git a/gen/strategii/buy_doji_directie.svg b/gen/strategii/buy_doji_directie.svg index 14a4e18..69605a1 100644 --- a/gen/strategii/buy_doji_directie.svg +++ b/gen/strategii/buy_doji_directie.svg @@ -1,4 +1,4 @@ - + NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția @@ -23,19 +23,19 @@ doji weekly - Buy Doji weekly: direcția = long - - WEEKLY: LONG ↑ - confirmare 81.30 > high doji 79.80 - + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + daily: săptămânile de după confirmare (open 81.30 = close-ul ei) - + - - SL 84.80 = high 4 candele + + stop 84.85 = 5 cenți peste high-ul de 4 candele intrare short 83.60 - TP1 82.40 — neatins + ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) @@ -70,16 +70,14 @@ - - short de 1-2 zile: permis - - - SL lovit: poziția short contra weekly - - Sell Doji daily: tehnic valid (close 83.60 < low doji 83.95) - - short daily = CONTRA ✗ - weekly zice long; daily urcă mai departe - Short scurt înăuntrul structurii weekly: da. Poziție short contra ei: nu. - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + + aici te-a scos: stopul 84.85, lovit a patra zi + banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.95) — dar contra weekly-ului + Seria e construită: un singur caz ilustrează regula, nu o dovedește. \ No newline at end of file diff --git a/gen/strategii/buy_doji_doji_forma.py b/gen/strategii/buy_doji_doji_forma.py index 255b7bf..7e3cf33 100644 --- a/gen/strategii/buy_doji_doji_forma.py +++ b/gen/strategii/buy_doji_doji_forma.py @@ -1,30 +1,31 @@ #!/usr/bin/env python3 -"""Ce e doji și ce nu — patru candele cu același high 50.10 și low 49.20. +"""Ce e un doji și ce nu — patru candele cu același high 50.10 și low 49.20. Citește `gen/strategii/buy_doji_doji_forma.spec.txt` și scrie -`gen/strategii/buy_doji_doji_forma.svg`. Definiție de o candelă (stilul -vechi, candele izolate): diferă doar corpul, deci testul „corp ≤ 10 % din -range, fitil în ambele părți" se vede direct pe formă. +`gen/strategii/buy_doji_doji_forma.svg`. E prima imagine din capitol: cine o +vede nu știe ce e un doji, deci candela A primește săgeți pe corp și pe +fiecare fitil, cu explicația de ce arată așa, iar C și D sunt contraexemple. +Zonă verde peste A și B („doji"), zonă roșie peste C și D („nu e doji"). Desenat direct, nu cu `Chart`: `tag`/`note` din svg_candles pun etichetele pe un singur rând sau în blocul de jos, iar aici fiecare etichetă trebuie să -stea lipită sub candela ei, pe 2-3 rânduri. +stea lipită sub candela ei, pe 2-3 rânduri, plus săgeți cu text pe lateral. Rulare: python3 gen/strategii/buy_doji_doji_forma.py """ from pathlib import Path OUT = Path(__file__).with_suffix(".svg") -GREEN, RED, GREY = "#188a3e", "#c00", "#555" +GREEN, RED, GREY, BLUE = "#188a3e", "#c00", "#555", "#1a5fb4" H, L = 50.10, 49.20 RNG = H - L # (nume, o, h, l, c, verdict, rânduri de etichetă sub candelă) CANDLES = [ - ("A", 49.60, 50.10, 49.20, 49.55, "DA", ["DA: corp 0.05", "= 5.6 % din range"]), - ("B", 49.62, 50.10, 49.20, 49.53, "DA", ["DA, la limită:", "corp 0.09 = 10 %", "(parametrul 10)"]), + ("A", 49.60, 50.10, 49.20, 49.55, "DA", ["DA: corp 0.05", "= 5,6 % din înălțime"]), + ("B", 49.62, 50.10, 49.20, 49.53, "DA", ["DA, la limită:", "corp 0.09 = 10 %"]), ("C", 49.80, 50.10, 49.20, 49.50, "NU", ["NU: corp 0.30", "= 33 %"]), - ("D", 50.05, 50.10, 49.20, 50.10, "NU", ["NU: corp mic (5.6 %),", "dar fără fitil sus"]), + ("D", 50.05, 50.10, 49.20, 50.10, "NU", ["NU: corp mic (5,6 %),", "dar fără fitil sus"]), ] # --- assert-urile din spec -------------------------------------------------- @@ -39,8 +40,8 @@ _, oD, hD, _, cD, *_ = CANDLES[3] assert max(oD, cD) == hD # --- geometrie --------------------------------------------------------------- -SCALE, TOP, W = 260, 72, 740 -XS = [150, 300, 450, 600] # centrele candelelor +SCALE, TOP, W = 260, 210, 1000 +XS = [350, 490, 690, 860] # centrele candelelor: A, B (doji) | C, D (nu) BODY_W = 26 @@ -61,16 +62,45 @@ def text(x, yy, s, color=GREY, anchor="start", bold=False, size=12): t(f'{s}') -text(24, 22, "Ce e doji și ce nu — aceeași bară 50.10 / 49.20", "#333", bold=True) +def zone(x0, x1, y0, y1, label, color): + t(f'') + text(x0 + 6, y0 - 7, label, color, bold=True) + + +def arrow(x1, y1, x2, y2, color, lines, anchor="start"): + """Săgeată de la (x1,y1) [coada, lângă text] la (x2,y2) [vârf, pe țintă].""" + d = max(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5, 1e-9) + ux, uy = (x2 - x1) / d, (y2 - y1) / d + bx, by = x2 - 8 * ux, y2 - 8 * uy + t(f'') + t(f'') + dx = -6 if anchor == "end" else (0 if anchor == "middle" else 6) + # la săgeata verticală textul stă deasupra cozii, altfel intră peste ea + y0 = (y1 - 10 - 14 * (len(lines) - 1) if anchor == "middle" + else y1 + 4 - 14 * (len(lines) - 1) / 2) + for k, s in enumerate(lines): + text(x1 + dx, y0 + 14 * k, s, color, anchor, bold=(k == 0)) + + +text(24, 30, "Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos", "#333", + bold=True, size=14) + +# zonele: A+B sunt doji, C+D nu +label_y0 = y(L) + 28 +z_bot = label_y0 + 16 * 2 - 4 +zone(XS[0] - 58, XS[1] + 62, y(H) - 30, z_bot, "doji", GREEN) +zone(XS[2] - 62, XS[3] + 74, y(H) - 30, z_bot, "nu e doji", RED) # high și low comune: linii subțiri pe toată lățimea for p in (H, L): - t(f'') -text(XS[0] - 36, y(H) + 4, "high 50.10", anchor="end") -text(XS[0] - 36, y(L) + 4, "low 49.20", anchor="end") +text(24, y(H) - 6, "cât de sus a urcat prețul: 50.10") +text(24, y(L) + 14, "cât de jos a coborât: 49.20") -label_y0 = y(L) + 24 for (n, o, h, l, c, verdict, lines), x in zip(CANDLES, XS): color = GREEN if c >= o else RED vcol = GREEN if verdict == "DA" else RED @@ -78,25 +108,34 @@ for (n, o, h, l, c, verdict, lines), x in zip(CANDLES, XS): top, bot = y(max(o, c)), y(min(o, c)) t(f'') - text(x, y(H) - 14, verdict, vcol, "middle", bold=True, size=18) for k, s in enumerate(lines): text(x, label_y0 + 16 * k, s, vcol, "middle", bold=(k == 0)) -# prețurile pe A: open la stânga (mai sus), close la dreapta (mai jos) -x = XS[0] -text(x - 36, y(oA) + 2, "open 49.60", anchor="end") -t(f'') -text(x + 36, y(cA) + 8, "close 49.55") -t(f'') +# --- săgețile pe A: corp, fitil sus, fitil jos ------------------------------- +xA = XS[0] +arrow(xA - 60, y(49.92), xA - 3, y(49.85), BLUE, anchor="end", + lines=["fitilul de sus", "cumpărătorii au împins, dar n-au ținut"]) +arrow(xA - 60, y(49.575), xA - 15, y(49.575), BLUE, anchor="end", + lines=["corpul: aproape o linie", + "open și close aproape egale — nimeni", + "n-a câștigat ziua"]) +arrow(xA - 60, y(49.30), xA - 3, y(49.375), BLUE, anchor="end", + lines=["fitilul de jos", "vânzătorii au împins, dar n-au ținut"]) +# prețurile de open/close, în dreapta candelei A +text(xA + 20, y(oA) - 2, "open 49.60") +text(xA + 20, y(cA) + 10, "close 49.55") -# D: close = high, deci fitilul de sus lipsește -x = XS[3] -text(x + 20, y(H) + 12, "← fără fitil sus", RED) +# --- săgețile pe contraexemple ---------------------------------------------- +xC, xD = XS[2], XS[3] +arrow(xC + 34, y(H) - 112, xC + 14, y(49.78), RED, + lines=["corp prea gros (33 %)", "aici una din tabere a câștigat —", "nu mai e indecizie"]) +arrow(xD, y(H) - 34, xD, y(H) - 4, RED, anchor="middle", + lines=["fără fitil sus", "regula cere fitil în ambele părți"]) -cap_y = label_y0 + 16 * 3 + 14 -text(24, cap_y, f"Test doji: corp ≤ 10 % din range ({RNG:.2f}) și fitil în ambele părți. " - "Scară: 0.10 = 26 px.") -height = cap_y + 12 +cap_y = z_bot + 30 +text(24, cap_y, f"Doji = corpul e cel mult 10 % din înălțimea totală a barei " + f"(aici înălțimea e {RNG:.2f}) și are fitil și sus, și jos.") +height = cap_y + 16 svg = (f'\n ' diff --git a/gen/strategii/buy_doji_doji_forma.spec.txt b/gen/strategii/buy_doji_doji_forma.spec.txt index 8f2c2ec..e676526 100644 --- a/gen/strategii/buy_doji_doji_forma.spec.txt +++ b/gen/strategii/buy_doji_doji_forma.spec.txt @@ -1,10 +1,11 @@ SPEC DIAGRAMĂ — buy_doji_doji_forma =================================== tip: DEFINIȚIE de o candelă (stil vechi permis de STYLE.md: 4 candele - izolate, gap 92, body_w 26), fără trend, fără volum. -destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 3 + izolate, body_w 26), fără trend, fără volum. Adnotată „ca la + proști": 2 zone dreptunghiulare + 5 săgeți cu text (CE + DE CE). +destinație: summaries/17_STRATEGII/01_buy_doji.md, nivelul 1 („Ce e un doji") cheie markdown: -titlu SVG: „Ce e doji și ce nu — aceeași bară 50.10 / 49.20" +titlu SVG: „Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos" CE TREBUIE SĂ DEMONSTREZE ------------------------- @@ -17,9 +18,25 @@ A (49.60, 50.10, 49.20, 49.55) „DA: corp 0.05 = 5.6 % din range" B (49.62, 50.10, 49.20, 49.53) „DA, la limită: corp 0.09 = 10 % (parametrul 10)" C (49.80, 50.10, 49.20, 49.50) „NU: corp 0.30 = 33 %" D (50.05, 50.10, 49.20, 50.10) „NU: corp mic (5.6 %), dar fără fitil sus" -Deasupra fiecărei candele: „DA" verde / „NU" roșu. -Etichete de preț pe A: „high 50.10", „low 49.20", „open 49.60", „close 49.55" -(open deasupra lui close, pentru că open > close; verifică ordinea pe axă). +Verdictul e în eticheta de sub candelă („DA: …" verde / „NU: …" roșu) și în +eticheta zonei; nu se mai scrie DA/NU mare deasupra barei (se bătea cap în cap +cu textul săgeților). +Etichete de preț pe A: „cât de sus a urcat prețul: 50.10", „cât de jos a +coborât: 49.20", „open 49.60", „close 49.55" (open deasupra lui close, pentru +că open > close; verifică ordinea pe axă). + +ZONE (dreptunghiuri de evidențiere, fill-opacity 0.10) +------------------------------------------------------ +verde peste A și B, etichetă „doji"; roșie peste C și D, etichetă „nu e doji". + +SĂGEȚI (text pe 2-3 rânduri: CE, apoi DE CE) +-------------------------------------------- +pe A, din stânga: spre fitilul de sus („fitilul de sus / cumpărătorii au +împins, dar n-au ținut"); spre corp („corpul: aproape o linie / open și close +aproape egale — nimeni n-a câștigat ziua"); spre fitilul de jos („fitilul de +jos / vânzătorii au împins, dar n-au ținut"). +pe C, de sus: „corp prea gros (33 %) / aici una din tabere a câștigat — nu mai +e indecizie". pe D, de sus: „fără fitil sus / regula cere fitil în ambele părți". ASSERT-URI ---------- diff --git a/gen/strategii/buy_doji_doji_forma.svg b/gen/strategii/buy_doji_doji_forma.svg index 40cabe9..b88848d 100644 --- a/gen/strategii/buy_doji_doji_forma.svg +++ b/gen/strategii/buy_doji_doji_forma.svg @@ -1,34 +1,52 @@ - - Ce e doji și ce nu — aceeași bară 50.10 / 49.20 - - - high 50.10 - low 49.20 - - - DA - DA: corp 0.05 - = 5.6 % din range - - - DA - DA, la limită: - corp 0.09 = 10 % - (parametrul 10) - - - NU - NU: corp 0.30 - = 33 % - - - NU - NU: corp mic (5.6 %), - dar fără fitil sus - open 49.60 - - close 49.55 - - ← fără fitil sus - Test doji: corp ≤ 10 % din range (0.90) și fitil în ambele părți. Scară: 0.10 = 26 px. + + Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos + + doji + + nu e doji + + + cât de sus a urcat prețul: 50.10 + cât de jos a coborât: 49.20 + + + DA: corp 0.05 + = 5,6 % din înălțime + + + DA, la limită: + corp 0.09 = 10 % + + + NU: corp 0.30 + = 33 % + + + NU: corp mic (5,6 %), + dar fără fitil sus + + + fitilul de sus + cumpărătorii au împins, dar n-au ținut + + + corpul: aproape o linie + open și close aproape egale — nimeni + n-a câștigat ziua + + + fitilul de jos + vânzătorii au împins, dar n-au ținut + open 49.60 + close 49.55 + + + corp prea gros (33 %) + aici una din tabere a câștigat — + nu mai e indecizie + + + fără fitil sus + regula cere fitil în ambele părți + Doji = corpul e cel mult 10 % din înălțimea totală a barei (aici înălțimea e 0.90) și are fitil și sus, și jos. diff --git a/gen/strategii/buy_doji_fereastra.py b/gen/strategii/buy_doji_fereastra.py index 135b6bd..f78dd10 100644 --- a/gen/strategii/buy_doji_fereastra.py +++ b/gen/strategii/buy_doji_fereastra.py @@ -6,10 +6,14 @@ Citește `gen/strategii/buy_doji_fereastra.spec.txt` și scrie cu aceeași serie până la doji: sus confirmarea vine la bara +2 (în fereastră), jos niciuna din +1..+3 nu confirmă, iar a 4-a închide sub low-ul dojiului. -Toate cifrele din desen vin din specificație: doji h 50.10 / l 49.20, -closes-urile DA/NU, pragul 50.10, low-ul 49.20. Seriile sunt construite -(open = close-ul barei anterioare, mai puțin open-ul primei bare, start-ul), -ca nivelurile afirmate să iasă exact din serie. +Adnotat „ca la proști": zonă dreptunghiulară peste cele 3 candele ale +ferestrei pe ambele panouri, plus săgeți cu text care spun CE și DE CE +(„aici NU intri — s-a închis sub high-ul dojiului", „AICI INTRI, la close"). + +Toate cifrele din desen vin din specificație: doji h 50.10 / l 49.25, +closes-urile DA/NU, pragul 50.10. Seriile sunt construite (open = close-ul +barei anterioare, mai puțin open-ul primei bare, start-ul), ca nivelurile +afirmate să iasă exact din serie. Rulare: python3 gen/strategii/buy_doji_fereastra.py """ @@ -18,21 +22,23 @@ import sys from pathlib import Path sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Chart, Level, Mark, from_closes # noqa: E402 +from svg_candles import Arrow, Chart, Mark, from_closes # noqa: E402 OUT = Path(__file__).with_suffix(".svg") -W = 460 -VGAP = 34 -SCALE = 45.0 # px / unitate, aceeași pe ambele panouri (comparație) +W = 640 +VGAP = 0 +SCALE = 60.0 # px / unitate, aceeași pe ambele panouri (comparație) +LEFT, GAP = 64, 40 +ORANGE, RED, GREEN, BLUE, GREY = "#b06000", "#c00", "#188a3e", "#1a5fb4", "#555" # --- seriile din specificație ---------------------------------------------- CLOSES_DA = [52.20, 51.40, 50.60, 49.65, - 49.60, # doji, h 50.10 / l 49.20 + 49.60, # doji, h 50.10 / l 49.25 49.90, # +1 — sub 50.10 50.40, # +2 — peste 50.10 => confirmă 50.80] CLOSES_NU = [52.20, 51.40, 50.60, 49.65, - 49.60, # doji, h 50.10 / l 49.20 + 49.60, # doji, h 50.10 / l 49.25 49.95, # +1 50.05, # +2 49.85, # +3 @@ -40,13 +46,13 @@ CLOSES_NU = [52.20, 51.40, 50.60, 49.65, assert len(CLOSES_DA) == 8 and len(CLOSES_NU) == 9 assert CLOSES_DA[:5] == CLOSES_NU[:5] -HIGH_DOJI, LOW_DOJI = 50.10, 49.20 +HIGH_DOJI, LOW_DOJI = 50.10, 49.25 -# wick-uri: (up, down). Doji-ul (index 4) primește mecioni ca să iasă exact -# h=50.10 / l=49.20; restul au mecioni mici, egali. +# wick-uri: (up, down). Doji-ul (index 4) primește fitile ca să iasă exact +# h=50.10 / l=49.25; restul au fitile mici, egale. wicks_da = [(0.15, 0.15)] * len(CLOSES_DA) wicks_nu = [(0.15, 0.15)] * len(CLOSES_NU) -wicks_da[4] = wicks_nu[4] = (0.45, 0.40) +wicks_da[4] = wicks_nu[4] = (0.45, 0.35) START = CLOSES_DA[0] + 0.15 # prima bară roșie, open > close cds_da = from_closes(CLOSES_DA, wicks=wicks_da, start=START) @@ -72,7 +78,7 @@ assert abs(cds_da[5].c - 49.90) < 1e-9 and cds_da[5].c <= HIGH_DOJI, \ assert abs(cds_da[6].c - entry) < 1e-9 and abs(entry - 50.40) < 1e-9, \ "intrarea nu e close-ul de 50.40 al barei +2" -# 2. NU: niciun close din +1..+3 nu depășește 50.10; a 4-a închide sub 49.20 +# 2. NU: niciun close din +1..+3 nu depășește 50.10; a 4-a închide sub 49.25 assert all(cds_nu[i].c <= HIGH_DOJI for i in (5, 6, 7)), \ "un close din +1..+3 ar confirma, fereastra n-ar fi expirat" assert cds_nu[8].c < LOW_DOJI, f"close[+4]={cds_nu[8].c} nu e sub {LOW_DOJI}" @@ -87,54 +93,102 @@ ser_nu = [(round(c.o, 9), round(c.h, 9), round(c.l, 9), round(c.c, 9)) for c in assert ser_da == ser_nu, "panourile nu au aceeași serie până la doji" # --- desen: două Chart-uri, lipite vertical într-un singur SVG ------------- +cds_nu[7].note = "+1: 49.95 · +2: 50.05 · +3: 49.85 — toate sub 50.10" + +ch_da = Chart( + candles=cds_da, + marks=[Mark(4, "doji", ORANGE, "above")], + arrows=[ + Arrow(5, "aici NU intri: s-a închis sub 50.10\nsemnalul cere o ÎNCHIDERE peste", + where="below", color=RED), + Arrow(6, "AICI INTRI, la close 50.40\nprima închidere peste\nhigh-ul dojiului", + price=entry, where="right", color=GREEN, dx=20, dy=46), + ], + scale=SCALE, gap=GAP, body_w=13, left=LEFT, width=W, + title="DA — confirmare la +2, în fereastră", +) + +ch_nu = Chart( + candles=cds_nu, + marks=[Mark(4, "doji", ORANGE, "above"), Mark(8, "a 4-a", RED, "above")], + arrows=[ + Arrow(7, "a treia s-a închis tot sub 50.10\nfereastra s-a terminat: ștergi setup-ul", + where="above", color=RED, dx=135), + Arrow(8, "a închis sub low-ul dojiului\nsetup mort — nu mai intri", + where="below", color=RED), + ], + scale=SCALE, gap=GAP, body_w=13, left=LEFT, width=W, + title="NU — nicio confirmare în 3 candele", +) + + def _panel(ch: Chart): - svg = ch.render() - m = re.search(r'viewBox="0 0 (\d+) ([\d.]+)"', svg) + """`_render()`, nu `render()`: al doilea restaurează top/left după desen, + iar liniile și zonele desenate de mână ar pica deplasate față de body.""" + svg = ch._render() + m = re.search(r'viewBox="0 0 ([\d.]+) ([\d.]+)"', svg) + assert m, "viewBox lipsă" + assert float(m.group(1)) == W, f"textul unei săgeți iese din {W}px" body = svg[svg.index(">") + 1:svg.rindex("")] return body, float(m.group(2)) -# DA — confirmarea vine la +2 -cds_da[5].note = "+1: close 49.90 — sub 50.10, nu confirmă" -cds_da[6].note = "+2: close 50.40 — peste 50.10, confirmă (intrare la close)" -ch_da = Chart( - candles=cds_da, - levels=[Level(HIGH_DOJI, "high doji 50.10", "#b06000", label_at="left"), - Level(LOW_DOJI, "low doji 49.20", "#c00", label_at="left")], - marks=[Mark(4, "doji", "#b06000", "above"), - Mark(6, f"confirmare +2 — intrare {entry:.2f}", "#188a3e", "above")], - scale=SCALE, gap=40, body_w=13, left=44, width=W, - title="DA — confirmare la +2, în fereastră", -) +def level(ch, price, text, color, below=False, at_left=True): + """Linie punctată pe toată lățimea + etichetă, desenată de mână: eticheta + din `Level` stă lipită de linie și cade peste candelele care o traversează.""" + y = ch._y(price) + out = [f''] + for k, s in enumerate(text): + ty = (y + 15 + 14 * k) if below else (y - 6 - 14 * (len(text) - 1 - k)) + tx, anchor = (30, "start") if at_left else (W - 24, "end") + out.append(f'{s}') + return out + + +def zone(ch, i0, i1, label, color, lift=0.0): + """Dreptunghi de evidențiere peste candelele i0..i1, cu eticheta deasupra. + + `lift` ridică marginea de sus (și deci eticheta), ca să nu cadă peste + săgețile care intră în zonă de sus.""" + cds = ch.candles[i0:i1 + 1] + x0, x1 = ch._cx(i0) - 16, ch._cx(i1) + 16 + y0 = ch._y(max(c.h for c in cds)) - 8 - lift + y1 = ch._y(min(c.l for c in cds)) + 8 + return [f'', + f'{label}'] -# NU — nicio confirmare în 3 candele, apoi setup mort -cds_nu[5].note = "+1: 49.95; +2: 50.05; +3: 49.85 — toate sub 50.10" -cds_nu[8].note = "a 4-a: close 49.15 — sub low-ul dojiului 49.20, setup mort" -ch_nu = Chart( - candles=cds_nu, - levels=[Level(HIGH_DOJI, "high doji 50.10", "#b06000", label_at="left"), - Level(LOW_DOJI, "low doji 49.20", "#c00", label_at="left")], - marks=[Mark(4, "doji", "#b06000", "above"), - Mark(8, "a 4-a", "#c00", "above")], - scale=SCALE, gap=40, body_w=13, left=44, width=W, - title="NU — nicio confirmare în 3 candele", -) body_da, h_da = _panel(ch_da) body_nu, h_nu = _panel(ch_nu) +extra_da = (zone(ch_da, 5, 7, "fereastra: 3 candele", BLUE) + + level(ch_da, HIGH_DOJI, + ["high-ul dojiului 50.10", "trebuie ÎNCHIS peste,", "nu doar atins"], + ORANGE, below=True) + + level(ch_da, LOW_DOJI, ["low-ul dojiului 49.25"], RED, below=True)) +extra_nu = (zone(ch_nu, 5, 7, "fereastra: 3 candele", BLUE) + + level(ch_nu, HIGH_DOJI, + ["high-ul dojiului 50.10", "trebuie ÎNCHIS peste,", "nu doar atins"], + ORANGE, below=True) + + level(ch_nu, LOW_DOJI, ["low-ul dojiului 49.25"], RED, below=True)) + cap1 = "Serii construite: open = close-ul barei anterioare." -cap2 = "Doji: h 50.10 / l 49.20. Fereastra = maximum 3 candele după doji." +cap2 = "Doji: h 50.10 / l 49.25. Fereastra = maximum 3 candele după doji." cap_top = h_da + VGAP + h_nu + 20 H = cap_top + 22 parts = [ f'', - f'{body_da}', - f'{body_nu}', - f'{cap1}', - f'{cap2}', + # zonele și liniile întâi, ca să stea în spatele candelelor + f'{"".join(extra_da)}{body_da}', + f'{"".join(extra_nu)}{body_nu}', + f'{cap1}', + f'{cap2}', "", ] svg = "\n ".join(parts) @@ -162,7 +216,8 @@ def _texts(body: str, y_off: float, tag: str): return out -labels = _texts(body_da, 0.0, "DA") + _texts(body_nu, h_da + VGAP, "NU") +labels = (_texts(body_da + "".join(extra_da), 0.0, "DA") + + _texts(body_nu + "".join(extra_nu), h_da + VGAP, "NU")) for left, right, y, s, tag in labels: assert left >= -2 and right <= W + 2, f"[{tag}] text iese din panză: {s!r}" assert 0 <= y <= H, f"[{tag}] text în afara înălțimii: {s!r} (y={y:.0f})" diff --git a/gen/strategii/buy_doji_fereastra.spec.txt b/gen/strategii/buy_doji_fereastra.spec.txt index 7041d53..19c5aa6 100644 --- a/gen/strategii/buy_doji_fereastra.spec.txt +++ b/gen/strategii/buy_doji_fereastra.spec.txt @@ -5,7 +5,7 @@ MARCAJ .md: (Nivel 1, §1.2 Setup) CE ARATĂ Două panouri mici, unul sub altul, cu aceeași serie până la doji: -- Panoul DA: doji high 50.10; bara +1 închide 49.90 (sub high); bara +2 +- Panoul DA: doji high 50.10 / low 49.25; bara +1 închide 49.90 (sub high); bara +2 închide 50.40 (peste 50.10) => Buy Doji valid, intrare la close. - Panoul NU: doji high 50.10; barele +1, +2, +3 închid 49.95, 50.05, 49.85 (toate sub high); a 4-a bară închide 49.15, sub low-ul dojiului => setup @@ -15,7 +15,8 @@ numeric. Diferența e strict numerică, nu vizuală (`13_strategia_3_byh.md:179-180`). NIVELURILE ȘI ETICHETELE (cu trimitere) -- high doji = 50.10, low doji = 49.20 (exemplul construit al lecției): +- high doji = 50.10, low doji = 49.25 (low-ul e coborât de la 49.20 ca stopul + de 49.20 din pașii 5-6 să iasă SUB low, nu exact pe el): `13_strategia_3_byh.md:158-167`. - fereastra = maximum 3 candele după doji: `13_strategia_3_byh.md:151-156`. - „setup expirat, nu intri" la lipsa confirmării: `13_strategia_3_byh.md:168-176`; @@ -23,23 +24,39 @@ NIVELURILE ȘI ETICHETELE (cu trimitere) STRUCTURA SERIEI Panoul DA (8 candele): close-uri [52.20, 51.40, 50.60, 49.65, - 49.60 (doji, h 50.10 / l 49.20), + 49.60 (doji, h 50.10 / l 49.25), 49.90 (+1), 50.40 (+2, confirmă), 50.80] Panoul NU (9 candele): close-uri [52.20, 51.40, 50.60, 49.65, - 49.60 (doji, h 50.10 / l 49.20), + 49.60 (doji, h 50.10 / l 49.25), 49.95 (+1), 50.05 (+2), 49.85 (+3), 49.15 (a 4-a, sub low)] -Mecioni: doji wu=0.45/wd=0.40 ca să dea exact h=50.10, l=49.20; restul +Fitile: doji wu=0.45/wd=0.35 ca să dea exact h=50.10, l=49.25; restul (0.15, 0.15). Serie continuă, open = close-ul precedentului. CE VERIFICĂ GENERATORUL CU assert 1. Panoul DA: primul close > 50.10 e bara +2 (index 6 din panou), adică în fereastră; close[+1] <= 50.10. -2. Panoul NU: niciun close din +1..+3 nu depășește 50.10; close[+4] < 49.20. +2. Panoul NU: niciun close din +1..+3 nu depășește 50.10; close[+4] < 49.25. 3. Ambele doji: abs(o-c) <= 0.10*(h-l). 4. Ambele panouri au exact aceeași serie până la doji (aceleași 5 bare). 5. Distanța în pixeli de la 50.10 la 50.40 (DA) să fie > 0 și vizibil (scara comună pe panou). -STIL: două `Chart`-uri separate sau un SVG cu două grupuri; gap=40, body_w=13, -width=460, fără vol_h (nu se vorbește de volum aici). Titluri -„DA — confirmare la +2, în fereastră" / „NU — nicio confirmare în 3 candele". -Fără linie goală în SVG. +ADNOTĂRI („ca la proști") +- ZONĂ albastră peste barele +1..+3 pe ambele panouri, etichetă + „fereastra: 3 candele". +- Panoul DA: săgeată pe +1 („aici NU intri: s-a închis sub 50.10 / semnalul cere + o ÎNCHIDERE peste"); săgeată din dreapta pe close-ul barei +2 („AICI INTRI, la + close 50.40 / prima închidere peste / high-ul dojiului"). +- Panoul NU: săgeată pe +3 („a treia s-a închis tot sub 50.10 / fereastra s-a + terminat: ștergi setup-ul"); săgeată pe a 4-a („a închis sub low-ul dojiului / + setup mort — nu mai intri"). +- Liniile 50.10 și 49.25 și etichetele lor se desenează de mână, nu cu `Level`: + eticheta din `Level` stă lipită de linie, la dreapta, și cade peste candele. + Eticheta lui 50.10 e pe trei rânduri, jos-stânga: „high-ul dojiului 50.10 / + trebuie ÎNCHIS peste, / nu doar atins". + +STIL: două `Chart`-uri în două grupuri ``; scale=60, gap=40, +body_w=13, left=64, width=640, fără vol_h (nu se vorbește de volum aici). +Titluri „DA — confirmare la +2, în fereastră" / „NU — nicio confirmare în 3 +candele". Randare cu `ch._render()` (vezi nota din buy_doji_trend.spec.txt). +Fără linie goală în SVG. Generatorul verifică singur că nicio etichetă nu iese +din pânză și că două etichete din același panou nu se suprapun. diff --git a/gen/strategii/buy_doji_fereastra.svg b/gen/strategii/buy_doji_fereastra.svg index 7ef8659..a5c2fcd 100644 --- a/gen/strategii/buy_doji_fereastra.svg +++ b/gen/strategii/buy_doji_fereastra.svg @@ -1,60 +1,65 @@ - - + + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 DA — confirmare la +2, în fereastră - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - doji - confirmare +2 — intrare 50.40 - +1: close 49.90 — sub 50.10, nu confirmă - +2: close 50.40 — peste 50.10, confirmă (intrare la close) + + + + + + + + + + + + + + + + + doji + + + aici NU intri: s-a închis sub 50.10 + semnalul cere o ÎNCHIDERE peste + + + AICI INTRI, la close 50.40 + prima închidere peste + high-ul dojiului - + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 NU — nicio confirmare în 3 candele - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - - - doji - a 4-a - +1: 49.95; +2: 50.05; +3: 49.85 — toate sub 50.10 - a 4-a: close 49.15 — sub low-ul dojiului 49.20, setup mort + + + + + + + + + + + + + + + + + + + doji + a 4-a + + + a treia s-a închis tot sub 50.10 + fereastra s-a terminat: ștergi setup-ul + + + a închis sub low-ul dojiului + setup mort — nu mai intri + +1: 49.95 · +2: 50.05 · +3: 49.85 — toate sub 50.10 - Serii construite: open = close-ul barei anterioare. - Doji: h 50.10 / l 49.20. Fereastra = maximum 3 candele după doji. + Serii construite: open = close-ul barei anterioare. + Doji: h 50.10 / l 49.25. Fereastra = maximum 3 candele după doji. \ No newline at end of file diff --git a/gen/strategii/buy_doji_iesire.py b/gen/strategii/buy_doji_iesire.py index fe91dbe..2476c91 100644 --- a/gen/strategii/buy_doji_iesire.py +++ b/gen/strategii/buy_doji_iesire.py @@ -1,222 +1,150 @@ -#!/usr/bin/env python3 -"""Buy Doji — ieșirea: trailing stop pe gap-uri și limita de 8 candele. +"""Buy Doji — ieșirea: prima treime la țintă, a doua pe trailing stop, limita de 8 candele. -Citește `gen/strategii/buy_doji_iesire.spec.txt` și scrie -`gen/strategii/buy_doji_iesire.svg`: două panouri stivuite. +Citește `gen/strategii/buy_doji_iesire.spec.txt`. Barele vin din +`buy_doji_ansamblu.serie()` — același trade ca în restul capitolului +(doji 50.10/49.25, intrare 50.40, stop 49.20, ținta 1 51.60). -A — seria din buy_doji_transe (barele 0-18) continuată cu 19-23. Barele 19 - și 21 deschid cu GAP (excepție cerută de spec): regula de trail cere o - bară cu low peste high-ul precedentei, imposibil dacă open = close - anterior. De aceea barele 15-23 sunt construite explicit, nu cu - `from_closes`. -B — doji 50.10 / 49.20, intrare 50.40, apoi 8 candele fără TP și fără SL. +A — prima treime iese la ținta 51.60; apoi două candele cu gap urcă linia + de trailing stop (51.95, apoi 52.60); a doua treime iese la prima + închidere sub linie, 52.30 (+1.58R). +B — același setup, dar prețul stă 8 candele între stop și țintă: ieși la + close-ul celei de-a 8-a, 50.70 (+0.25R). -Barele de după intrare, în ambele panouri, sunt CONSTRUITE. -Sursa regulilor: summaries/03_MODUL_2/13_strategia_3_byh.md:196-213. - -Rulare: python3 gen/strategii/buy_doji_iesire.py +Barele de după intrare din panoul B sunt CONSTRUITE. """ import re import sys from pathlib import Path sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Candle, Chart, Level, Mark, from_closes # noqa: E402 +sys.path.insert(0, str(Path(__file__).parent)) +from svg_candles import Chart, Level, Zone, Arrow, from_closes # noqa: E402 +from buy_doji_ansamblu import serie, CONF, ENTRY, SL, TP1, R, trail # noqa: E402 OUT = Path(__file__).with_suffix(".svg") -W = 660 -VGAP = 10 +S = 10 # prima bară arătată GREEN, RED, ORANGE, BLUE, GREY = "#188a3e", "#c00", "#b06000", "#1a5fb4", "#555" +W, VGAP = 760, 14 -# --- PANOUL A ---------------------------------------------------------------- -ENTRY_A, SL_A, TP1_A = 53.70, 51.55, 55.85 -R_A = round(ENTRY_A - SL_A, 2) # 2.15 +full = serie() +steps, iesire = trail(full) # [(21, 51.95), (27, 52.60)], 28 +a = full[S:iesire + 1] +cf = CONF - S +EXIT_A = a[iesire - S].c +R_A = round((EXIT_A - ENTRY) / R, 2) +tp_i = next(i for i in range(CONF + 1, len(full)) if full[i].h >= TP1) -a = from_closes([60.40, 59.60, 59.90, 58.80, 58.10, 58.40, 57.20, 56.30, - 56.60, 55.30, 54.20, 52.40], wick=0.15, start=61.00) -a += [Candle(*ohlc) for ohlc in [ - (52.40, 53.00, 51.60, 52.30), # 12 doji - (52.30, 52.85, 52.10, 52.60), # 13 +1 - (52.60, 53.85, 52.45, 53.70), # 14 confirmare = intrare - (53.70, 53.80, 53.10, 53.45), # 15 - (53.45, 54.20, 53.35, 54.10), # 16 - (54.10, 54.85, 54.00, 54.70), # 17 - (54.70, 56.00, 54.60, 55.90), # 18 atinge TP1 - (56.30, 56.95, 56.20, 56.80), # 19 GAP - (56.80, 57.35, 56.60, 57.20), # 20 - (57.60, 58.10, 57.45, 57.90), # 21 GAP - (57.90, 58.00, 57.50, 57.60), # 22 - (57.60, 57.70, 57.10, 57.20), # 23 close sub trail -]] -assert len(a) == 24 +# --- aserțiunile panoului A ------------------------------------------------------- +assert steps == [(21, 51.95), (27, 52.60)] and iesire == 28, (steps, iesire) +for i, t in steps: # gap-urile sunt reale + assert full[i].l > full[i - 1].h, f"bara {i} nu deschide cu gap" +assert all(full[i].c >= steps[0][1] for i in range(steps[0][0], iesire)), \ + "ar fi ieșit mai devreme: un close sub linia de trail" +assert EXIT_A == 52.30 and R_A == 1.58 and EXIT_A < steps[-1][1] +assert tp_i == 19 and full[tp_i].h >= TP1 > full[tp_i - 1].h, tp_i -for c in a: - assert c.l <= min(c.o, c.c) and c.h >= max(c.o, c.c), "h/l nu cuprind o/c" -# A1. gap-urile reale -assert a[19].l > a[18].h and a[21].l > a[20].h, "barele de gap nu au low > high anterior" -# A2. open = close anterior, în afară de 19 și 21 (și 0-14, ca în transe) -for i in range(1, 24): - if i not in (19, 21): - assert abs(a[i].o - a[i - 1].c) < 1e-9, f"A: open[{i}] != close[{i-1}]" -# regula de trail, calculată pe serie: primul gap după intrare stabilește -# trail-ul, fiecare gap următor îl urcă; ieși la primul close sub el -trail, steps, exit_i = None, [], None -for i in range(15, 24): - if trail is not None and a[i].c < trail: - exit_i = i - break - if a[i].l > a[i - 1].h: - trail = a[i].l - steps.append((i, trail)) -assert [(i, round(t, 2)) for i, t in steps] == [(19, 56.20), (21, 57.45)], steps -# A3. -assert a[22].c >= 57.45 and a[23].c < 57.45 and exit_i == 23, exit_i -EXIT_A = a[23].c -# A4. -assert R_A == 2.15 and round((EXIT_A - ENTRY_A) / R_A, 2) == 1.63 -# A5. TP1 = 1R, atins prima oară la bara 18 -assert round(ENTRY_A + R_A, 2) == TP1_A -assert next(i for i in range(15, 24) if a[i].h >= TP1_A) == 18 -assert abs(a[14].c - ENTRY_A) < 1e-9 +# --- panoul B: 8 candele între stop și țintă -------------------------------------- +b = full[S:CONF + 1] +b += from_closes([50.60, 50.30, 50.90, 50.50, 51.10, 50.80, 51.20, 50.70], + wick=0.15, start=ENTRY) +opt = b[cf + 1:] +EXIT_B = opt[-1].c +R_B = round((EXIT_B - ENTRY) / R, 2) +assert len(opt) == 8, len(opt) +for i in range(1, len(b)): + assert abs(b[i].o - b[i - 1].c) < 1e-9, f"B: open[{i}] != close[{i-1}]" +assert all(c.h < TP1 and c.l > SL for c in opt), "B: o bară atinge ținta sau stopul" +assert (round(max(c.h for c in opt), 2), round(min(c.l for c in opt), 2)) == (51.35, 50.15) +assert EXIT_B == 50.70 and R_B == 0.25 +print(f"iesire A: treapta 1 {steps[0][1]:.2f}, treapta 2 {steps[1][1]:.2f}, " + f"ieșire {EXIT_A:.2f} = +{R_A}R (ținta 1 {TP1:.2f} la bara {tp_i}); " + f"B: ieșire {EXIT_B:.2f} = +{R_B}R") + +common: dict = dict(scale=40.0, gap=18, body_w=9, left=48, width=W) ch_a = Chart( candles=a, - levels=[Level(ENTRY_A, "intrare 53.70", GREEN), - Level(TP1_A, "TP1 55.85 — tranșa 1: +1R", GREEN, dash="2 3")], - scale=40, gap=16, body_w=9, left=44, width=W, - title="A — trailing stop pe gap-uri (seria de la intrarea în tranșe)", - caption="a treia treime: o lași mai departe (break-even / trend)", + levels=[Level(TP1, "ținta 1: 51.60 (= 1R)", GREEN, "2 3"), + Level(ENTRY, "intrarea: 50.40", GREY, "4 3"), + Level(SL, "stopul: 49.20", RED, "4 3")], + zones=[Zone(cf, tp_i - S, "", GREEN), Zone(tp_i - S + 1, iesire - S, "", BLUE)], + arrows=[ + Arrow(tp_i - S, "ținta 1 atinsă: vinzi prima treime\nai luat exact cât riscai (1R)", + where="above", price=TP1, color=GREEN, dx=10, dy=-26), + Arrow(steps[0][0] - S, "gap: low-ul de azi e peste high-ul de ieri\nlinia de trail urcă la 51.95", + where="below", price=steps[0][1], color=ORANGE, dx=130, dy=40), + Arrow(steps[1][0] - S, "încă un gap: linia urcă la 52.60\nurcă doar, nu coboară niciodată", + where="above", price=steps[1][1], color=ORANGE, dx=150), + Arrow(iesire - S, "prima închidere sub linie: ieși\ncu a doua treime, la 52.30 (+1.58R)", + where="below", price=EXIT_A, color=RED, dx=110, dy=96), + ], + title="A — prima treime la țintă, a doua pe trailing stop", + **common, ) -# --- PANOUL B ---------------------------------------------------------------- -ENTRY_B, SL_B, TP1_B = 50.40, 49.20, 51.60 -R_B = round(ENTRY_B - SL_B, 2) # 1.20 - -b = from_closes([52.20, 51.40, 50.60, 49.65], wick=0.15, start=53.00) -b += [Candle(*ohlc) for ohlc in [ - (49.65, 50.10, 49.20, 49.60), # 4 doji - (49.60, 50.05, 49.45, 49.90), # 5 +1 - (49.90, 50.55, 49.75, 50.40), # 6 confirmare = intrare -]] -b += from_closes([50.60, 50.30, 50.90, 50.50, 51.10, 50.80, 51.20, 50.70], - wick=0.15, start=b[-1].c) -assert len(b) == 15 -# B1. -for i in range(1, 15): - assert abs(b[i].o - b[i - 1].c) < 1e-9, f"B: open[{i}] != close[{i-1}]" -d = b[4] -assert abs(d.o - d.c) <= 0.10 * (d.h - d.l) and (d.h, d.l) == (50.10, 49.20) -assert b[6].c > d.h and abs(b[6].c - ENTRY_B) < 1e-9 -# B2. 8 candele fără TP și fără SL -after = b[7:15] -assert all(c.h < TP1_B and c.l > SL_B for c in after) -assert round(max(c.h for c in after), 2) == 51.35 and round(min(c.l for c in after), 2) == 50.15 -assert round(ENTRY_B + R_B, 2) == TP1_B -# B3. -EXIT_B = b[14].c -assert round((EXIT_B - ENTRY_B) / R_B, 2) == 0.25 - -for k, c in enumerate(after, 1): - c.tag = str(k) - ch_b = Chart( candles=b, - levels=[Level(TP1_B, "TP1 51.60", GREEN, dash="2 3"), - Level(ENTRY_B, "intrare 50.40", GREEN), - Level(SL_B, "SL 49.20", RED)], - marks=[Mark(4, "doji", ORANGE, "below")], - scale=48, gap=16, body_w=9, left=44, width=W, - title="B — limita de 8 candele", + levels=[Level(TP1, "ținta 1: 51.60 — neatinsă", GREEN, "2 3"), + Level(ENTRY, "intrarea: 50.40", GREY, "4 3"), + Level(SL, "stopul: 49.20 — neatins", RED, "4 3")], + zones=[Zone(cf + 1, len(b) - 1, "", GREY, p_top=TP1, p_bot=SL)], + arrows=[ + Arrow(len(b) - 1, "a 8-a candelă: ieși oricum, la close 50.70 (+0.25R)\nbanii blocați aici lipsesc din alt trade", + where="below", price=EXIT_B, color=GREY, dx=120, dy=40), + ], + title="B — limita de 8 candele: nici ținta, nici stopul", + **common, ) +for k, c in enumerate(opt, 1): + c.tag = str(k) -# --- etichete plasate de mână: Mark centrează textul, iar aici textele lungi -# ar cădea peste candelele vecine. Le ancorez lângă bară, pe partea liberă. -def label(ch, i, price, text, color, anchor="start", dx=0): - x = ch._cx(i) + dx - return (f'{text}') +def panou(ch, sus_de=0.0): + ch.top += sus_de + svg = ch.render() + h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1)) + # render() mută `top`/`left` intern și le restaurează: tot ce desenăm noi + # după randare trebuie deplasat cu aceiași pixeli + off_y = float(re.search(r']*stroke="#1a1a1a"', svg).group(1)) - ch._cx(0) + return svg[svg.index(">") + 1:svg.rindex("")].strip(), h, off_x, off_y -def panel(ch, extra): - svg = ch.render() # render() fixează scala (_pmax, top) - h = float(re.search(r'viewBox="0 0 \d+ ([\d.]+)"', svg).group(1)) - body = svg[svg.index(">") + 1:svg.rindex("")].strip() - return body + "".join("\n " + e for e in extra(ch)), h +body_a, h_a, ax, ay = panou(ch_a) +Y, X = (lambda p: ch_a._y(p) + ay), (lambda i: ch_a._cx(i) + ax) +(i1, t1), (i2, t2) = [(i - S, t) for i, t in steps] +extra_a = [ + # linia de trail, în trepte + f'', + f'' + f'linia de trailing stop', + # etichetele zonelor, lângă ele (Zone le-ar ridica deasupra candelelor vecine) + f'' + f'prima treime: de la intrare la ținta 1:1', + f'' + f'a doua treime: merge pe trailing stop', +] +extra_a.append(f'A treia treime o lași mai ' + f'departe, cu stopul mutat la intrare (break-even).') +h_a = max(h_a, Y(SL) + 112) - -def trail_a(ch): - x19, x21, x23 = ch._cx(19) - 7, ch._cx(21) - 8, ch._cx(23) + 7 - y1, y2 = ch._y(steps[0][1]), ch._y(steps[1][1]) - # golul dintre high-ul barei precedente și low-ul barei de gap, hașurat: - # la 0.10-0.20 de preț are doar câțiva pixeli și se pierde sub linia de trail - gaps = [f'' - for i, _ in steps] - return gaps + [ - f'', - label(ch, 18, 56.25, "TP1: ieși cu 1/3", GREEN, "end", 4), - label(ch, 19, 55.35, "gap: low > high anterior → trail 56.20", ORANGE, "start", -4), - label(ch, 21, 58.35, "gap → trail 57.45", ORANGE, "middle"), - label(ch, 23, 57.30, "close sub trail: ieși cu 1/3", RED, "start", 14), - label(ch, 23, 56.88, f"la 57.20 = +{(EXIT_A - ENTRY_A) / R_A:.2f}R", RED, "start", 14), - ] - - -def mark_b(ch): - return [ - label(ch, 14, 51.05, "a 8-a candelă: nici TP, nici SL", GREY, "start", 10), - label(ch, 14, 50.75, f"→ ieși la 50.70 = +{(EXIT_B - ENTRY_B) / R_B:.2f}R", GREY, "start", 10), - ] - - -# panourile se stivuiesc prin `top` (nu prin ): audit_diagrams -# citește coordonatele brute și ar vedea panourile suprapuse. -T = 26 -ch_a.top += T -body_a, h_a = panel(ch_a, trail_a) -ch_b.top += h_a + VGAP -body_b, H_B = panel(ch_b, mark_b) -TITLE = "Ieșirea: trailing stop pe gap-uri și limita de 8 candele — exemple construite" -CAP = "Barele de după intrare sunt construite. Regulile: 13_strategia_3_byh.md:196-213." -cap_y = H_B + 12 -H = cap_y + 10 +body_b, h_b, bx, by = panou(ch_b, h_a + VGAP) +extra_b = [ + f'8 candele în care nu se întâmplă nimic', +] +H = h_b + 8 svg = "\n ".join([ f'', - f'{TITLE}', - body_a, - body_b, - f'{CAP}', + body_a, *extra_a, + f'', + body_b, *extra_b, ]) + "\n" -assert "\n\n" not in svg - -# --- etichete în panză și fără suprapuneri (lățimi aproximate) --------------- -TEXT = re.compile(r']*)>(.*?)', re.S) - - -def texts(body, y_off, tag): - for m in TEXT.finditer(body): - x, y, attrs = float(m.group(1)), float(m.group(2)) + y_off, m.group(3) - s = m.group(4).replace(">", ">") - wpx = len(s) * 12 * (0.62 if "bold" in attrs else 0.52) - anchor = re.search(r'text-anchor="(\w+)"', attrs) - anchor = anchor.group(1) if anchor else "start" - x0 = x - wpx if anchor == "end" else (x - wpx / 2 if anchor == "middle" else x) - yield x0, x0 + wpx, y, s, tag - - -labels = list(texts(body_a, 0, "A")) + list(texts(body_b, 0, "B")) -for x0, x1, y, s, tag in labels: - assert x0 >= -2 and x1 <= W + 2 and 0 <= y <= H, f"[{tag}] text iese din panză: {s!r}" -for i, (l1, r1, y1, s1, t1) in enumerate(labels): - for l2, r2, y2, s2, t2 in labels[i + 1:]: - assert not (t1 == t2 and abs(y1 - y2) < 12 and l1 < r2 - 4 and l2 < r1 - 4), \ - f"[{t1}] texte suprapuse: {s1!r} / {s2!r}" - +assert "\n\n" not in svg, "linie goală în SVG" +for tx, ty in re.findall(r' -titlu SVG: „Ieșirea: trailing stop pe gap-uri și limita de 8 candele — exemple construite" -stil: candele lipite (gap 15-18, body_w 9-10), fără volum. - EXCEPȚIE CERUTĂ: în panoul A, barele 19 și 21 deschid cu GAP - (open != close anterior). Regula de trail are nevoie de o bară - cu low peste high-ul precedentei, ceea ce fără gap e imposibil. - Toate celelalte bare: open = close anterior. +titluri SVG: A „prima treime la țintă, a doua pe trailing stop"; + B „limita de 8 candele: nici ținta, nici stopul" +serie: `buy_doji_ansamblu.serie()` — A: barele 10-28; B: barele 10-16 + plus 8 bare construite. -PANOUL A — trailing stop (seria buy_doji_transe, continuată) ------------------------------------------------------------- -Barele 0-18: identice cu buy_doji_transe. Apoi: -19 (56.30, 56.95, 56.20, 56.80) GAP: low 56.20 > high[18] 56.00 → trail = 56.20 -20 (56.80, 57.35, 56.60, 57.20) -21 (57.60, 58.10, 57.45, 57.90) GAP: low 57.45 > high[20] 57.35 → trail urcă la 57.45 -22 (57.90, 58.00, 57.50, 57.60) close 57.60 ≥ 57.45: rămâi -23 (57.60, 57.70, 57.10, 57.20) close 57.20 < 57.45: ieși -Niveluri: intrare 53.70; TP1 55.85 („tranșa 1: +1R"); trail în trepte: -segment 56.20 de la bara 19 la 20, segment 57.45 de la bara 21 la 23. -Marks: Mark(18, "TP1: ieși cu 1/3"), Mark(19, "gap: low > high anterior → trail 56.20"), -Mark(21, "trail 57.45"), Mark(23, "close sub trail: ieși cu 1/3 la 57.20 = +1.63R"). -Text sub panou: „a treia treime: o lași mai departe (break-even / trend)". +PANOUL A — ieșirea în trepte +---------------------------- +Intrare 50.40, stop 49.20, 1R = 1.20. +- ținta 1 51.60 atinsă la bara 19: iese prima treime (+1R); +- bara 21 deschide cu gap (low 51.95 > high[20] 51.85): linia de trailing stop + se așază la 51.95; +- bara 27, alt gap (low 52.60 > high[26] 52.55): linia urcă la 52.60; +- bara 28 închide la 52.30, sub linie: iese a doua treime, +1.58R; +- a treia treime rămâne mai departe, cu stopul la intrare (break-even). +Adnotări: zonă verde de la intrare la țintă, zonă albastră pe porțiunea de +trail, linia de trail desenată în trepte, patru săgeți (ținta atinsă, primul +gap, al doilea gap, ieșirea). PANOUL B — limita de 8 candele ------------------------------ -open[0] = 53.00; close-uri: 52.20, 51.40, 50.60, 49.65, fitile 0.15; - 4 doji (49.65, 50.10, 49.20, 49.60) - 5 +1 (49.60, 50.05, 49.45, 49.90) - 6 confirmare (49.90, 50.55, 49.75, 50.40) intrare 50.40 - 7-14 close-uri: 50.60, 50.30, 50.90, 50.50, 51.10, 50.80, 51.20, 50.70 - (fitile 0.15; open = close anterior) -Niveluri: intrare 50.40, SL 49.20, TP1 51.60. -Numerotare 1..8 sub barele 7-14. Mark(14, "a 8-a candelă: nici TP, nici SL → ieși la 50.70 = +0.25R"). +Aceleași bare până la confirmare, apoi 8 bare construite, close-uri 50.60, +50.30, 50.90, 50.50, 51.10, 50.80, 51.20, 50.70 (fitile 0.15, open = close +anterior). Niciuna nu atinge ținta 51.60 sau stopul 49.20 (max high 51.35, min +low 50.15). La close-ul celei de-a 8-a ieși oricum: 50.70 = +0.25R. +Adnotări: zonă gri între stop și țintă peste cele 8 bare, numerotate 1..8, și o +săgeată: „banii blocați aici lipsesc din alt trade". ASSERT-URI ---------- -A1. low[19] > high[18] și low[21] > high[20] (gap-urile reale). -A2. open[i] == close[i-1] pentru i în 15..23, cu excepția 19 și 21. -A3. close[22] >= 57.45 și close[23] < 57.45; primul close sub trail după bara 19 e 23. -A4. round((57.20-53.70)/2.15, 2) == 1.63. -A5. primul i>14 cu high >= 55.85 este 18. -B1. open[i] == close[i-1] peste tot; doji abs(o-c) <= 0.10*(h-l); close[6] > 50.10. -B2. pentru barele 7-14: high < 51.60 și low > 49.20 (max high 51.35, min low 50.15). -B3. round((50.70-50.40)/1.20, 2) == 0.25. +A1. regula de trail, calculată pe serie, dă [(21, 51.95), (27, 52.60)]; + barele 21 și 27 au low peste high-ul barei precedente (gap-uri reale). +A2. niciun close între bara 21 și ieșire nu e sub 51.95 (n-ar fi ieșit mai devreme). +A3. ieșirea: close 52.30 la bara 28, sub 52.60; (52.30 - 50.40) / 1.20 == 1.58. +A4. ținta 51.60 e atinsă prima dată la bara 19 (bara 18 nu o atinge). +B1. open[i] == close[i-1] pe toată seria; exact 8 bare după intrare. +B2. toate cele 8 au high < 51.60 și low > 49.20; max high 51.35, min low 50.15. +B3. ieșire 50.70; (50.70 - 50.40) / 1.20 == 0.25. +B4. niciun text nu iese din pânză. SURSA ----- - Trail: low-ul barei cu low peste high-ul precedentei; ieși la close sub el: summaries/03_MODUL_2/13_strategia_3_byh.md:196-200. -- 3 poziții (1/3 TP, 1/3 trail, 1/3 mai departe): :204-213 (tabel marcat de - sumarizator ca completare, :341-350). +- Trei poziții (1/3 la țintă, 1/3 pe trail, 1/3 mai departe): :204-213. - Limita de 8 candele: :201-202. -- Doji 50.10/49.20, intrare 50.40, SL 49.20: exemplul lecției, :158-167. -- Barele după intrare, în ambele panouri, sunt CONSTRUITE. +- Barele de după intrare din panoul B sunt CONSTRUITE. diff --git a/gen/strategii/buy_doji_iesire.svg b/gen/strategii/buy_doji_iesire.svg index 72477fb..fcd9763 100644 --- a/gen/strategii/buy_doji_iesire.svg +++ b/gen/strategii/buy_doji_iesire.svg @@ -1,114 +1,122 @@ - - Ieșirea: trailing stop pe gap-uri și limita de 8 candele — exemple construite - A — trailing stop pe gap-uri (seria de la intrarea în tranșe) - - intrare 53.70 - - TP1 55.85 — tranșa 1: +1R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a treia treime: o lași mai departe (break-even / trend) - - - - TP1: ieși cu 1/3 - gap: low > high anterior → trail 56.20 - gap → trail 57.45 - close sub trail: ieși cu 1/3 - la 57.20 = +1.63R - B — limita de 8 candele - - TP1 51.60 - - intrare 50.40 - - SL 49.20 - - - - - - - - - - - - - - - - - 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - doji - a 8-a candelă: nici TP, nici SL - → ieși la 50.70 = +0.25R - Barele de după intrare sunt construite. Regulile: 13_strategia_3_byh.md:196-213. + + A — prima treime la țintă, a doua pe trailing stop + + + + ținta 1: 51.60 (= 1R) + + intrarea: 50.40 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1 atinsă: vinzi prima treime + ai luat exact cât riscai (1R) + + + gap: low-ul de azi e peste high-ul de ieri + linia de trail urcă la 51.95 + + + încă un gap: linia urcă la 52.60 + urcă doar, nu coboară niciodată + + + prima închidere sub linie: ieși + cu a doua treime, la 52.30 (+1.58R) + + linia de trailing stop + prima treime: de la intrare la ținta 1:1 + a doua treime: merge pe trailing stop + A treia treime o lași mai departe, cu stopul mutat la intrare (break-even). + + B — limita de 8 candele: nici ținta, nici stopul + + + ținta 1: 51.60 — neatinsă + + intrarea: 50.40 + + stopul: 49.20 — neatins + + + + + + + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + a 8-a candelă: ieși oricum, la close 50.70 (+0.25R) + banii blocați aici lipsesc din alt trade + 8 candele în care nu se întâmplă nimic \ No newline at end of file diff --git a/gen/strategii/buy_doji_labu.py b/gen/strategii/buy_doji_labu.py index c95cd06..1e6eb6b 100644 --- a/gen/strategii/buy_doji_labu.py +++ b/gen/strategii/buy_doji_labu.py @@ -2,16 +2,19 @@ """LABU — Buy Doji la pivotul monthly (Nivel 2.5). Citește `gen/strategii/buy_doji_labu.spec.txt` și scrie -`gen/strategii/buy_doji_labu.svg`: 49 de candele daily, downtrend → triple -bottom → doji la pivotul monthly 86.00 → confirmare (close 89.50 peste -high-ul dojiului) → bull reversal → higher high, cu SL 81.45 (−9 %) și +`gen/strategii/buy_doji_labu.svg`: 57 de candele daily, downtrend → triple +bottom (trei minime aproape egale, dar pivotul lunar atins doar de două ori) +→ doji la pivotul monthly 86.00 → confirmare (close 89.50 peste high-ul +dojiului) → bull reversal → higher high, cu SL 81.45 (−9 %) și TP 116.35 (+30 %). Toate cifrele din desen vin din specificație: pivot 86.00, intrare 89.50, SL 81.45, TP 116.35, high/low-ul dojiului (86.30 / 84.20) și low-urile triple bottom-ului (82.40 / 81.45 / 81.45). Procentele 9 % și 30 % sunt ale cursului (reale); nivelurile de preț sunt construite de sumarizator — -legenda o spune explicit. +legenda o spune explicit. Capitolul spune și „triple bottom", și „doji la al +doilea test al pivotului": desenul le satisface pe amândouă — trei minime în +zona 81-83, dintre care doar primele două vin după o urcare peste 86.00. Rulare: python3 gen/strategii/buy_doji_labu.py """ @@ -20,7 +23,7 @@ import sys from pathlib import Path sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Chart, Level, MA, Mark, from_closes # noqa: E402 +from svg_candles import Arrow, Chart, Level, MA, Mark, Zone, from_closes # noqa: E402 OUT = Path(__file__).with_suffix(".svg") @@ -29,50 +32,88 @@ PIVOT = 86.00 # pivot monthly (construit) ENTRY = 89.50 # intrare = close-ul confirmării (construit) SL = 81.45 # SL = −9 % față de intrare (construit; procentul e real) TP = 116.35 # TP = +30 % față de intrare (construit; procentul e real) -DOJI_H, DOJI_L = 86.30, 84.20 +DOJI_H, DOJI_L = 86.80, 84.90 +I_DOJI, I_CONF = 33, 34 +B1, B2, B3 = 16, 25, 31 # cele trei picioare ale triplului fund + # (B1, B2 = testele pivotului; B3 rămâne sub el) +I_RETEST = 37 # revenirea care testează intrarea și ține +FLAG = (42, 45) # consolidarea scurtă (bull flag) +I_TP = 55 # bara pe care prețul atinge 116.35 -# --- seria de close-uri din specificație ----------------------------------- +# --- seria de close-uri ----------------------------------------------------- +# Textul capitolului e sursa: „triple bottom" (trei minime aproape egale) și +# „doji la al doilea test al pivotului". Nu se bat cap în cap: sunt trei +# minime de preț, dar doar două dintre ele vin după o urcare peste 86.00 — +# al treilea e o alunecare care nu mai atinge pivotul de sus în jos. +# Restul: „+30 % într-o lună" (21 de bare daily de la confirmare) și etapele +# „retest → bull flag → breakout". Prețurile sunt construite în jurul +# nivelurilor deja folosite în capitol (86.00 / 89.50 / 81.45 / 97.55 / 116.35). closes = [ # downtrend 0-14 108.0, 106.5, 105.0, 103.0, 101.5, 100.0, 98.0, 96.5, 95.0, 93.5, 92.5, 91.0, 89.5, 87.5, 85.5, - # triple bottom 15 / 23 / 31 - 82.80, 84.5, 86.5, 88.0, 88.50, - 87.0, 85.0, 83.0, 81.50, - 83.5, 85.5, 87.0, 87.80, 87.0, 85.0, - 83.0, 81.60, 85.00, - 84.90, # 33 = doji (o 85.00, c 84.90, h 86.30, l 84.20) - 89.50, # 34 = confirmare, close > 86.30 => intrare - # bull reversal / trend up 35-48 - 91.0, 93.0, 92.0, 95.0, 97.0, 96.0, 99.0, 102.0, 101.0, 105.0, 108.0, - 112.0, 116.35, 118.0, + # 15-16: primul test al pivotului (bottom 1, low 82.40) + 83.5, 82.80, + # 17-20: revenire peste pivot (88.90 high) — de aici vine al doilea test + 84.5, 86.5, 88.0, 88.5, + # 21-24: coboară înapoi prin pivot: al doilea test al lui 86.00 + 87.0, 85.5, 84.0, 82.8, + # 25: bottom 2 (low 82.00), la capătul celui de-al doilea test + 82.30, + # 26-29: un pull-up scurt care NU mai ajunge la pivot (high max 85.80) + 83.5, 84.8, 85.4, 84.2, + # 30: alunecă iar, fără să fi atins pivotul între timp + 83.0, + # 31: bottom 3 (low 81.45 = stopul) — al treilea minim, nu un test nou + 81.90, + # 32: bara de întoarcere, închide peste pivot + 86.10, + # 33 = doji: o 86.10, c 86.00, h 86.80, l 84.90 — corpul chiar pe pivot + 86.00, + # 34 = confirmare: close 89.50 peste high-ul dojiului => intrare + 89.50, + # 35-36: pornirea + 92.0, 94.0, + # 37: retest — cade la 89.60, pe intrare, și ține + 91.0, + # 38-41: reia urcarea și trece de ținta 1:1 (97.55) + 93.5, 95.5, 98.5, 100.0, + # 42-45: bull flag — patru candele care se odihnesc + 99.2, 99.8, 98.9, 99.5, + # 46-54: breakout și continuare + 102.5, 104.0, 103.0, 106.0, 108.5, 107.5, 110.5, 112.5, 114.0, + # 55: +30 % față de intrare; 56: încă un higher high + 116.35, 117.5, ] -assert len(closes) == 49, f"seria are {len(closes)} bare, spec cere 49" +assert len(closes) == 57, f"seria are {len(closes)} bare, aștept 57" -# wick-uri: (up, down). Restul (0.4, 0.5); ajustate ca low-urile/high-urile -# cerute de asserts să iasă exact (bar 15/23/31 = triple bottom; bar 16/24 -# nu au voie să coboare sub piciorul din stânga; bar 33 = doji). +# wick-uri: (sus, jos) față de corp. Restul (0.4, 0.5); ajustate ca low-urile +# cerute de assert-uri să iasă exact. wicks = [(0.4, 0.5)] * len(closes) -wicks[15] = (0.4, 0.40) # low 82.40 -wicks[16] = (0.4, 0.20) # low 82.60 > 82.40 (piciorul 1 rămâne minim local) -wicks[23] = (0.4, 0.05) # low 81.45 -wicks[24] = (0.4, 0.00) # low 81.50 > 81.45 (piciorul 2 rămâne minim local) -wicks[31] = (0.4, 0.15) # low 81.45 -wicks[32] = (0.4, 0.10) # low 81.50 (nu sub 81.45) -wicks[33] = (1.30, 0.70) # doji: high 86.30, low 84.20 +wicks[B1] = (0.4, 0.40) # bottom 1: low 82.40 +wicks[17] = (0.4, 0.00) # low 82.80 > 82.40 (piciorul 1 rămâne minim local) +wicks[B2] = (0.4, 0.30) # bottom 2: low 82.00 +wicks[26] = (0.4, 0.00) # low 82.30 > 82.00 (piciorul 2 rămâne minim local) +wicks[B3] = (0.4, 0.45) # bottom 3: low 81.45 = stopul +wicks[32] = (0.4, 0.00) # low 81.90 (nu coboară sub 81.45) +wicks[I_DOJI] = (0.70, 1.10) # doji: high 86.80, low 84.90 +wicks[35] = (0.4, 0.00) # prima bară după intrare nu se mai duce sub 89.50 +wicks[I_RETEST] = (0.4, 1.40) # retest: low 89.60, peste intrarea de 89.50 -# volume construite: vânzare peste medie la triple bottom și la confirmare. -# Nu sunt numere din curs (nu sunt etichetate), doar panoul de volum cerut. +# volume construite: vânzare peste medie la cele două picioare, volum mare pe +# confirmare, volum mic pe flag. Nu sunt numere din curs. vols = [ 55, 52, 48, 50, 45, 47, 44, 46, 42, 44, 40, 42, 38, 41, 58, - 62, 50, 46, 44, 43, - 45, 44, 47, 66, 55, - 50, 47, 45, 44, 42, - 43, 45, 60, 72, 84, - 78, 70, 64, 60, 58, - 54, 52, 56, 60, 66, - 74, 82, 90, 98, + 62, 68, 50, 46, 44, + 43, 45, 44, 47, 46, + 45, 47, 52, 45, 44, + 48, 70, 62, 58, 88, + 76, 70, 58, 62, 66, + 72, 70, 44, 40, 38, + 42, 74, 70, 64, 68, + 72, 66, 74, 78, 82, + 90, 96, ] assert len(vols) == len(closes), f"volume {len(vols)} != bare {len(closes)}" @@ -80,80 +121,134 @@ cds = from_closes(closes, wicks=wicks, vols=vols, start=110.0) assert abs(cds[0].o - 110.0) < 1e-9 and cds[0].c < cds[0].o, "prima bară nu e roșie" # nota explicativă a dojiului (bloc stânga-jos, nu se suprapune cu candelele) -cds[33].note = ("bara 33 = doji: o 85.00, c 84.90, h 86.30, l 84.20 — " - "corp mic exact pe pivotul monthly 86.00 (indecizie la suport)") +cds[I_DOJI].note = ("doji = corp mic (o 86.10, c 86.00): cumpărătorii și vânzătorii sunt la " + "egalitate, exact pe pivotul lunar 86.00") + +TP1 = round(ENTRY + (ENTRY - SL), 2) # ținta 1:1: cât ai riscat +assert abs(TP1 - 97.55) < 1e-9, f"ținta 1:1 = {TP1}, capitolul spune 97.55" +R = (TP - ENTRY) / (ENTRY - SL) +assert 3.2 <= R <= 3.4, f"{R:.2f}R, capitolul spune „cam 3,3R”" +I_TP1 = next(i for i in range(35, len(cds)) if cds[i].h >= TP1) # prima bară peste 1:1 +cds[I_TP1].note = (f"ținta 1:1 ({TP1:.2f}) e atinsă pe bara {I_TP1}: acolo vinzi o treime, " + "restul merge mai departe — de asta nu vinzi tot la 1:1") # --- assert-urile din specificație (toate, ca assert reale) ---------------- # 1. pivot 86.00 e straddled de doji -assert cds[33].l <= PIVOT <= cds[33].h, "doji-ul nu straddlează 86.00" +assert cds[I_DOJI].l <= PIVOT <= cds[I_DOJI].h, "doji-ul nu straddlează 86.00" +# corpul dojiului stă pe pivot, nu la un dolar sub el (eticheta spune „exact pe") +assert min(cds[I_DOJI].o, cds[I_DOJI].c) <= PIVOT <= max(cds[I_DOJI].o, cds[I_DOJI].c) + 0.15, \ + f"corpul dojiului ({cds[I_DOJI].o}/{cds[I_DOJI].c}) nu e pe pivotul {PIVOT}" -# 2. confirmarea: close[34] == 89.50 == intrare și > high[33] -assert abs(cds[34].c - ENTRY) < 1e-9, f"close[34]={cds[34].c} != intrare 89.50" -assert cds[34].c > cds[33].h, "confirmarea nu închide peste high-ul dojiului" +# 2. confirmarea: close[34] == 89.50 == intrare și > high-ul dojiului +assert abs(cds[I_CONF].c - ENTRY) < 1e-9, f"close[{I_CONF}]={cds[I_CONF].c} != intrare 89.50" +assert cds[I_CONF].c > cds[I_DOJI].h, "confirmarea nu închide peste high-ul dojiului" -# 3. SL = min(low[30:35]) (regula: extrema ultimelor 4 candele de la confirmare) -min_30_35 = min(c.l for c in cds[30:35]) -assert abs(min_30_35 - SL) < 1e-9, f"min low[30:35]={min_30_35} != SL {SL}" +# 3. SL = extrema ultimelor 4 candele de la confirmare +min_win = min(c.l for c in cds[I_CONF - 4:I_CONF + 1]) +assert abs(min_win - SL) < 1e-9, f"min low[{I_CONF - 4}:{I_CONF + 1}]={min_win} != SL {SL}" # 4./5. procentele REALE ale cursului assert round((ENTRY - SL) / ENTRY * 100, 1) == 9.0, "stopul nu iese −9 %" assert round((TP - ENTRY) / ENTRY * 100, 1) == 30.0, "TP nu iese +30 %" -# 6. triple bottom: exact trei minime locale sub 86.00, în zona 81-83, -# al doilea și al treilea fără low nou semnificativ față de primul +# 6. triple bottom, dar pivotul atins de două ori — aserțiunea care ține +# laolaltă cele două formulări din capitol („trei minime aproape egale" și +# „doji la al doilea test al pivotului 86.00"). lows = [c.l for c in cds] bottom_idx = [i for i in range(1, len(cds) - 1) if lows[i] < lows[i - 1] and lows[i] < lows[i + 1] and lows[i] < PIVOT and 81.0 <= lows[i] <= 83.0] -assert bottom_idx == [15, 23, 31], f"triple bottom la {bottom_idx}, nu [15, 23, 31]" -b1, b2, b3 = lows[15], lows[23], lows[31] -tol = 0.02 * b1 # „semnificativ" = > 2 % sub primul low -assert b2 >= b1 - tol and b3 >= b1 - tol, \ - f"al doilea/treilea picior coboară semnificativ sub primul: {b1}/{b2}/{b3}" -assert abs(b1 - 82.40) < 1e-9 and abs(b2 - SL) < 1e-9 and abs(b3 - SL) < 1e-9, \ - f"low-urile triple bottom: {b1}/{b2}/{b3}" +assert bottom_idx == [B1, B2, B3], f"minimele fundului: {bottom_idx}, aștept [{B1}, {B2}, {B3}]" +assert len(bottom_idx) == 3, f"{len(bottom_idx)} minime locale în zona fundului, aștept 3" +b1, b2, b3 = (lows[i] for i in bottom_idx) +# „aproape egale": nici unul nu e cu mai mult de 2 % sub primul +assert max(b1, b2, b3) - min(b1, b2, b3) <= 0.02 * b1, \ + f"minimele nu sunt aproape egale: {b1}/{b2}/{b3}" +assert abs(b1 - 82.40) < 1e-9 and abs(b2 - 82.00) < 1e-9 and abs(b3 - SL) < 1e-9, \ + f"low-urile triplului fund: {b1}/{b2}/{b3}" +# un minim e „atingere a pivotului" doar dacă prețul a fost peste 86.00 după +# minimul dinainte: coboară prin pivot ca să ajungă acolo. Al treilea nu e. +tests = [] +for k, i in enumerate(bottom_idx): + prev = bottom_idx[k - 1] + 1 if k else 0 + if max(c.h for c in cds[prev:i]) >= PIVOT: + tests.append(i) +assert tests == [B1, B2], f"atingeri ale pivotului la {tests}, aștept [{B1}, {B2}]" +assert len(tests) == 2, f"{len(tests)} atingeri ale pivotului 86.00, aștept 2" +# între primele două picioare prețul urcă clar peste pivot (al doilea test) +assert max(c.h for c in cds[B1 + 1:B2]) > PIVOT + 1.5, "nu e revenire peste pivot înainte de B2" +# între al doilea și al treilea NU mai ajunge la pivot: al treilea nu e test +assert max(c.h for c in cds[B2 + 1:B3]) < PIVOT, \ + f"pull-up-ul dintre B2 și B3 atinge pivotul ({max(c.h for c in cds[B2 + 1:B3]):.2f})" -# 7. TP atins: există i > 34 cu high[i] >= 116.35 -assert any(c.h >= TP for c in cds[35:]), "TP 116.35 nu e atins după intrare" +# 7. TP atins la ~o lună de bursă de la confirmare (capitolul: „într-o lună") +assert abs(cds[I_TP].c - TP) < 1e-9, f"close[{I_TP}]={cds[I_TP].c} != {TP}" +assert max(c.h for c in cds[I_CONF + 1:I_TP]) < TP, "TP atins mai devreme de bara 55" +bars_to_tp = I_TP - I_CONF +assert 20 <= bars_to_tp <= 22, f"{bars_to_tp} bare până la +30 %, aștept ~21 (o lună)" # 8. doji: corp <= 10 % din amplitudine -assert abs(cds[33].o - cds[33].c) <= 0.10 * (cds[33].h - cds[33].l), "bara 33 nu e doji" -assert abs(cds[33].h - DOJI_H) < 1e-9 and abs(cds[33].l - DOJI_L) < 1e-9, \ - "doji h/l nu ies 86.30/84.20" +assert abs(cds[I_DOJI].o - cds[I_DOJI].c) <= 0.10 * (cds[I_DOJI].h - cds[I_DOJI].l), \ + "bara doji nu e doji" +assert abs(cds[I_DOJI].h - DOJI_H) < 1e-9 and abs(cds[I_DOJI].l - DOJI_L) < 1e-9, \ + "doji h/l nu ies 86.80/84.90" -# în plus: confirmarea vine cu volum peste medie (cerut de spec) +# 9. retestul: revine până pe intrare și ține (nu o rupe) +assert ENTRY <= cds[I_RETEST].l <= ENTRY + 0.5, \ + f"retestul nu atinge intrarea: low {cds[I_RETEST].l}" +assert min(c.l for c in cds[I_CONF + 1:]) >= ENTRY, "prețul cade sub intrare după confirmare" + +# 10. bull flag: 4 candele strânse, sub high-ul barei dinainte, urmate de breakout +f0, f1 = FLAG +flag_h = max(c.h for c in cds[f0:f1 + 1]) +flag_l = min(c.l for c in cds[f0:f1 + 1]) +assert flag_h - flag_l <= 2.5, f"flag prea larg: {flag_h - flag_l:.2f}" +assert flag_h <= cds[f0 - 1].h, "flagul face high nou — nu mai e consolidare" +assert cds[f1 + 1].c > flag_h, "nu există breakout după flag" + +# în plus: confirmarea vine cu volum peste medie, flagul cu volum sub medie mean_vol = sum(vols) / len(vols) -assert vols[34] > mean_vol, f"volumul confirmării {vols[34]} <= media {mean_vol:.0f}" +assert vols[I_CONF] > mean_vol, f"volumul confirmării {vols[I_CONF]} <= media {mean_vol:.0f}" +assert max(vols[f0:f1 + 1]) < mean_vol, "flagul nu vine pe volum scăzut" entry = cds[34].c -w = 820 # lățime mărită: 49 bare × gap 15 + etichetele din dreapta - # (spec sugera 760, dar ultima candelă ajunge la x=764) +w = 990 # 57 bare × gap 15 + loc pentru etichetele din dreapta ch = Chart( candles=cds, - levels=[Level(PIVOT, "pivot monthly 86.00 (construit)", "#777", - dash="4 3", label_at="left"), - Level(SL, "SL 81.45 (construit) = −9 % (procent real)", "#c00", - label_at="left"), - Level(ENTRY, "intrare 89.50 (construit)", "#188a3e"), - Level(TP, "TP 116.35 (construit) = +30 % (procent real)", "#1a5fb4")], - marks=[Mark(15, f"bottom 1 {lows[15]:.2f}", "#c00", "below"), - Mark(23, f"bottom 2 {lows[23]:.2f}", "#c00", "below"), - Mark(31, f"bottom 3 {lows[31]:.2f}", "#c00", "below"), - Mark(33, "doji", "#b06000", "above"), - Mark(34, "confirmare (intrare)", "#188a3e", "above", dy=-14), - Mark(48, "higher high — TP atins", "#188a3e", "above")], + levels=[Level(PIVOT, "pivot lunar 86.00", "#777", dash="4 3", label_at="left"), + Level(SL, "stop 81.45 = 9 % sub intrare (procent real)", "#c00", label_at="left"), + Level(ENTRY, "intrare 89.50", "#188a3e"), + Level(TP1, f"ținta 1:1 {TP1:.2f}", "#777", dash="2 3", label_at="left"), + Level(TP, "116.35 = +30 % față de intrare (procent real)", "#1a5fb4", label_at="left")], + zones=[Zone(0, B3, "1. setup: scădere lungă, apoi trei minime aproape egale — pivotul 86.00 atins de două ori", "#777"), + Zone(I_DOJI, I_CONF, "2. doji + confirmare", "#b06000"), + # p_top sub 116.35: altfel eticheta zonei 3 se așază peste linia țintei + Zone(I_CONF + 1, I_TP - 1, "3. trendul pornește", "#188a3e", p_top=113.0), + Zone(I_TP, len(cds) - 1, "4. ținta", "#1a5fb4")], + arrows=[Arrow(I_CONF, "aici intri, la close 89.50:\nabia acum știi că au câștigat cumpărătorii", + ENTRY, where="above", color="#188a3e", dx=-150), + Arrow(B3, "al treilea minim: 81.45,\nfără o nouă atingere a pivotului\naici pui stopul, sub minime", + SL, where="below", color="#c00", dx=-40), + Arrow(I_RETEST, "retest: cade înapoi pe intrare\nși ține — trendul e sănătos", + cds[I_RETEST].l, where="below", color="#188a3e", dx=110, dy=56), + Arrow(FLAG[0] + 1, "aici se odihnește, nu se strică:\nbull flag, pe volum mic", + cds[FLAG[0] + 1].h, where="above", color="#188a3e", dx=-20), + Arrow(I_TP, f"a ajuns la 116.35: +30 % în 21 de zile de bursă,\ncam {R:.1f}R din cât ai riscat".replace("3.3R", "3,3R"), + TP, where="left", color="#1a5fb4", dx=-30, dy=-40)], + marks=[Mark(B1, f"test 1 · {lows[B1]:.2f}", "#c00", "below"), + Mark(B2, f"test 2 · {lows[B2]:.2f}", "#c00", "below")], mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")], scale=8.0, gap=15, body_w=9, left=44, width=w, vol_h=70, vol_label="volum", title="LABU — daily", - caption=("Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de " - "preț sunt construite de sumarizator (18_2025-09-23.md:713)."), + caption=("Procentele (stop 9 %, +30 %) sunt ale cursului; " + "nivelurile de preț sunt puse de sumarizator."), ) svg = ch.render() assert "\n\n" not in svg and "]*)>(.*?)', re.S) -H = float(re.search(r'viewBox="0 0 (\d+) ([\d.]+)"', svg).group(2)) +W_SVG, H = (float(x) for x in re.search(r'viewBox="0 0 (\d+) ([\d.]+)"', svg).groups()) labels = [] for m in TEXT.finditer(svg): x, y, attrs, s = float(m.group(1)), float(m.group(2)), m.group(3), m.group(4) @@ -165,7 +260,7 @@ for m in TEXT.finditer(svg): labels.append((left, left + wpx, y, s)) for left, right, y, s in labels: - assert left >= -2 and right <= w + 2, f"text iese din panză: {s!r} [{left:.0f},{right:.0f}]" + assert left >= -2 and right <= W_SVG + 2, f"text iese din panză: {s!r} [{left:.0f},{right:.0f}]" assert 0 <= y <= H, f"text în afara înălțimii: {s!r} (y={y:.0f})" for i in range(len(labels)): @@ -177,14 +272,16 @@ for i in range(len(labels)): # candelele sunt o serie continuă, lipită xs = [ch._cx(i) for i in range(len(cds))] -assert xs[-1] + ch.body_w / 2 < w, f"ultima candelă iese din panză (x={xs[-1]})" +assert ".md:" not in svg and "Surse" not in svg, "trimiteri la surse în SVG" +assert xs[-1] + ch.body_w / 2 < W_SVG, f"ultima candelă iese din panză (x={xs[-1]})" assert all(xs[i + 1] - xs[i] == ch.gap for i in range(len(xs) - 1)), "serie cu goluri" for a, b in zip(cds, cds[1:]): assert abs(a.c - b.o) < 1e-9, "open != close-ul barei anterioare" print(f"LABU: {len(cds)} bare, doji {cds[33].l:.2f}-{cds[33].h:.2f} peste pivot " f"{PIVOT:.2f}, intrare {entry:.2f}, SL {SL:.2f} (−9 %), TP {TP:.2f} (+30 %)") -print(f"triple bottom: {b1:.2f} / {b2:.2f} / {b3:.2f} " +print(f"triple bottom: {b1:.2f} / {b2:.2f} / {b3:.2f}; pivotul 86.00 atins de " + f"{len(tests)} ori (barele {tests}); +30 % după {bars_to_tp} bare " f"volum confirmare {vols[34]} > medie {mean_vol:.0f}") -print(f"scris {OUT} ({w}x{H:.0f}); {len(labels)} etichete verificate, fără suprapuneri") +print(f"scris {OUT} ({W_SVG:.0f}x{H:.0f}); {len(labels)} etichete verificate, fără suprapuneri") OUT.write_text(svg, encoding="utf-8") diff --git a/gen/strategii/buy_doji_labu.spec.txt b/gen/strategii/buy_doji_labu.spec.txt index 62240bc..86c912f 100644 --- a/gen/strategii/buy_doji_labu.spec.txt +++ b/gen/strategii/buy_doji_labu.spec.txt @@ -4,8 +4,9 @@ TITLU: LABU — daily, Buy Doji la pivotul monthly (Nivel 2.5) MARCAJ .md: (Nivel 2, §2.5 Exemplul complet) CE ARATĂ -Exemplul complet din material: downtrend → consolidare → triple bottom → -doji la pivotul monthly 86.00 → candela verde care închide peste high-ul +Exemplul complet din material: downtrend → consolidare → triple bottom (trei +minime aproape egale, dar pivotul monthly atins doar de două ori — „al doilea +test") → doji la pivotul monthly 86.00 → candela verde care închide peste high-ul dojiului (intrare 89.50) → bull reversal pe candela mare → retest → bull flag → breakout → higher high, higher low. SL 81.45 (−9 %), TP 116.35 (+30 %), atins într-o lună. @@ -17,12 +18,38 @@ CE E REAL ȘI CE E CONSTRUIT (obligatoriu în legendă) higher high/higher low), `18_2025-09-23.md:716-719`; „al doilea test al pivotului monthly, fără low nou" și „corp mic exact pe pivotul monthly: indecizie la suport", `18_2025-09-23.md:710-712`. +- REZOLVAT (19.09.2026): transcrierea și capitolul spun și „triple bottom" + (`:716-719`), și „al doilea test al pivotului monthly" (`:710-712`). Nu se + contrazic: sunt trei minime de PREȚ, dar nivelul 86.00 e atins doar de două + ori. Versiunea dinainte desena doar două minime și contrazicea „triple + bottom"; seria a fost reconstruită cu TREI minime aproape egale (82.40 / + 82.00 / 81.45), dintre care doar primele două vin după o urcare peste 86.00. + Între minimul 2 și minimul 3 prețul se ridică doar până la 85.80 — sub + pivot, deci al treilea minim nu e un test nou. Generatorul asertează + explicit: 3 minime locale în zona 81-83 și 2 atingeri ale lui 86.00. - CONSTRUITE de sumarizator (nu prețuri de curs): pivot 86.00, intrare 89.50, SL 81.45, TP 116.35 — marcate ca „nivelurile sunt ale mele" (`18_2025-09-23.md:713`). Legenda diagramei trebuie să spună exact asta. - Materialul nu dă niciun exemplu numeric complet de la intrare la ieșire (`13_strategia_3_byh.md:298-308`; `byh.md:256-280`). +ADNOTĂRI (patru zone numerotate, ca subsecțiunile capitolului) +- Zona 1 (barele 0-31): „1. setup: scădere lungă, apoi trei minime aproape + egale — pivotul 86.00 atins de două ori"; Zona 2 (33-34): „2. doji + confirmare"; Zona 3 (35-54): + „3. trendul pornește"; Zona 4 (55-56): „4. ținta". +- Marcaje sub minimele 1 și 2 („test 1 · 82.40", „test 2 · 82.00") — doar + ele sunt atingeri ale pivotului; al treilea minim e numit de săgeata stopului. +- Săgeți: retestul („retest: cade înapoi pe intrare și ține — trendul e + sănătos"), bull flag-ul („aici se odihnește, nu se strică: bull flag, pe + volum mic"), intrarea („aici intri, la close 89.50: abia acum știi că au + câștigat cumpărătorii"), stopul, pe al treilea minim („al treilea minim: + 81.45, fără o nouă atingere a pivotului, aici pui stopul, sub minime"), rezultatul („a ajuns la 116.35: +30 % într-o + lună, cam 3,3R din cât ai riscat"). +- Linie punctată pentru ținta 1:1 (97.55), cu nota de dedesubt: acolo vinzi + o treime, restul merge mai departe. +- Fără trimiteri fișier:linie în SVG; legenda „procentele sunt ale cursului, + prețurile sunt puse de sumarizator" rămâne. + NIVELURILE ȘI ETICHETELE (cu trimitere) - „pivot monthly 86.00" (`18_2025-09-23.md:615`) - „intrare 89.50" (`18_2025-09-23.md:619`) @@ -30,22 +57,37 @@ NIVELURILE ȘI ETICHETELE (cu trimitere) - „TP +30 % = 116.35" (`18_2025-09-23.md:620-621`) Etichete marcate „(construit)" sau „(procent real)" în legendă. -STRUCTURA SERIEI (49 candele daily, open = close-ul precedentului) -Sugestie de close-uri: -Etapa downtrend + triple bottom (0-33): +STRUCTURA SERIEI (57 candele daily, open = close-ul precedentului) +Seria e reconstruită după textul capitolului (19.09.2026): triple bottom cu +DOUĂ atingeri ale pivotului („al doilea test"), 21 de bare de la confirmare la +30 % („într-o +lună"), retest al intrării la bara 37 și bull flag la barele 42-45. Corpul +dojiului stă pe pivot (o 86.10, c 86.00, h 86.80, l 84.90), nu cu un dolar +sub el. Nivelurile din capitol rămân: 86.00 / 89.50 / 81.45 / 97.55 / 116.35. +Close-uri: [108.0, 106.5, 105.0, 103.0, 101.5, 100.0, 98.0, 96.5, 95.0, 93.5, - 92.5, 91.0, 89.5, 87.5, 85.5, 82.80, 84.5, 86.5, 88.0, 88.50, - 87.0, 85.0, 83.0, 81.50, 83.5, 85.5, 87.0, 87.80, 87.0, 85.0, - 83.0, 81.60, 85.00, - 84.90, # 33 = doji (o 85.00, c 84.90, h 86.30, l 84.20); straddlează 86.00 - 89.50, # 34 = confirmare, close > 86.30 => intrare - 91.0, 93.0, 92.0, 95.0, 97.0, 96.0, 99.0, 102.0, 101.0, 105.0, 108.0, - 112.0, 116.35, 118.0] -Mecioni: barele 15, 23, 31 au low-urile triple bottom-ului — bara 15 low -82.40, bara 23 low 81.45, bara 31 low 81.45; bara 32 (revenirea) wd=0.10 -(low 81.50, nu sub 81.45); bara 33 (doji) high 86.30, low 84.20; restul -(0.4, 0.5). Ajustează wick-urile ca low-urile/high-urile cerute la asserts -să iasă exact (în special min(low[30:35]) == 81.45). + 92.5, 91.0, 89.5, 87.5, 85.5, + 83.5, 82.80, # 16 = primul test (low 82.40) + 84.5, 86.5, 88.0, 88.5, # 17-20 = urcare peste pivot (high 88.90) + 87.0, 85.5, 84.0, 82.8, # 21-24 = coborâre prin pivot = testul 2 + 82.30, # 25 = minimul 2 (low 82.00) + 83.5, 84.8, 85.4, 84.2, # 26-29 = pull-up sub pivot (high max 85.80) + 83.0, # 30 = alunecă iar, fără test nou + 81.90, # 31 = minimul 3 (low 81.45 = stopul) + 86.10, # 32 = bara de întoarcere, peste pivot + 86.00, # 33 = doji (o 86.10, h 86.80, l 84.90) + 89.50, # 34 = confirmare => intrare + 92.0, 94.0, + 91.0, # 37 = retest (low 89.60, peste intrare) + 93.5, 95.5, 98.5, 100.0, # 40 = prima bară peste ținta 1:1 + 99.2, 99.8, 98.9, 99.5, # 42-45 = bull flag, volum mic + 102.5, 104.0, 103.0, 106.0, 108.5, 107.5, 110.5, 112.5, 114.0, + 116.35, 117.5] # 55 = +30 %, la 21 de bare de confirmare +Wick-uri: implicit (0.4, 0.5); bara 16 (0.4, 0.40) => low 82.40; bara 17 +(0.4, 0.00) ca primul picior să rămână minim local; bara 25 (0.4, 0.30) => +low 82.00; bara 26 (0.4, 0.00) ca al doilea picior să rămână minim local; +bara 31 (0.4, 0.45) => low 81.45; bara 32 (0.4, 0.00) ca să nu coboare sub stop; bara 33 +(0.70, 1.10) = doji; bara 35 (0.4, 0.00) și bara 37 (0.4, 1.40) => retestul +atinge 89.60 și ține. CE VERIFICĂ GENERATORUL CU assert 1. pivot 86.00 e straddled de doji: low[33] <= 86.00 <= high[33] @@ -54,13 +96,22 @@ CE VERIFICĂ GENERATORUL CU assert confirmare, regula din `13_strategia_3_byh.md:192-193`) 4. round((entry - sl) / entry * 100, 1) == 9.0 (procentul REAL al cursului) 5. round((tp - entry) / entry * 100, 1) == 30.0 (procentul REAL al cursului) -6. triple bottom: există trei minime locale succesive sub 86.00, în zona - 81-83, al doilea și al treilea fără low nou semnificativ față de primul -7. există i>34 cu high[i] >= 116.35 +6. triple bottom cu două teste: exact TREI minime locale sub 86.00, în zona + 81-83 (barele 16, 25 și 31), diferența dintre ele <= 2 % („aproape + egale"); dintre ele, exact DOUĂ sunt atingeri ale pivotului 86.00 — + minimele precedate de un high >= 86.00 (barele 16 și 25). Între 16 și 25 + prețul urcă peste 86.00 + 1.5; între 25 și 31 maximul rămâne sub 86.00, + deci al treilea minim nu e un test nou. +7. close[55] == 116.35, nimic peste 116.35 înainte, și 20 <= 55-34 <= 22 + („într-o lună") +9. retestul (bara 37) atinge 89.50-90.00 și nicio bară de după confirmare nu + închide/coboară sub intrare +10. bull flag (42-45): amplitudine <= 2.5, fără high nou față de bara 41, + breakout pe bara 46, volum sub medie 8. doji: abs(o-c) <= 0.10*(h-l) -STIL: gap=15, body_w=9, left=44, width=760, vol_h=70 (volumul confirmă: +STIL: gap=15, body_w=9, left=44, width=990, vol_h=70 (volumul confirmă: „cel mai mare volum din serie" e în varianta MICI, nu obligatoriu aici — dar confirmarea are volum peste medie). scale astfel încât 86.00 → 116.35 să încapă; linie punctată pentru pivotul 86.00. Legendă obligatorie: „Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt -construite de sumarizator (18_2025-09-23.md:713)." Fără linie goală în SVG. +puse de sumarizator." (fără trimitere fișier:linie în SVG) Fără linie goală în SVG. diff --git a/gen/strategii/buy_doji_labu.svg b/gen/strategii/buy_doji_labu.svg index a262517..ad08404 100644 --- a/gen/strategii/buy_doji_labu.svg +++ b/gen/strategii/buy_doji_labu.svg @@ -1,170 +1,222 @@ - - LABU — daily - - pivot monthly 86.00 (construit) - - SL 81.45 (construit) = −9 % (procent real) - - intrare 89.50 (construit) - - TP 116.35 (construit) = +30 % (procent real) - - SMA-20 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - bottom 1 82.40 - bottom 2 81.45 - bottom 3 81.45 - doji - confirmare (intrare) - higher high — TP atins - bara 33 = doji: o 85.00, c 84.90, h 86.30, l 84.20 — corp mic exact pe pivotul monthly 86.00 (indecizie la suport) - Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt construite de sumarizator (18_2025-09-23.md:713). + + LABU — daily + + 1. setup: scădere lungă, apoi trei minime aproape egale — pivotul 86.00 atins de două ori + + 2. doji + confirmare + + 3. trendul pornește + + 4. ținta + + pivot lunar 86.00 + + stop 81.45 = 9 % sub intrare (procent real) + + intrare 89.50 + + ținta 1:1 97.55 + + 116.35 = +30 % față de intrare (procent real) + + SMA-20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + test 1 · 82.40 + test 2 · 82.00 + + + aici intri, la close 89.50: + abia acum știi că au câștigat cumpărătorii + + + al treilea minim: 81.45, + fără o nouă atingere a pivotului + aici pui stopul, sub minime + + + retest: cade înapoi pe intrare + și ține — trendul e sănătos + + + aici se odihnește, nu se strică: + bull flag, pe volum mic + + + a ajuns la 116.35: +30 % în 21 de zile de bursă, + cam 3,3R din cât ai riscat + doji = corp mic (o 86.10, c 86.00): cumpărătorii și vânzătorii sunt la egalitate, exact pe pivotul lunar 86.00 + ținta 1:1 (97.55) e atinsă pe bara 40: acolo vinzi o treime, restul merge mai departe — de asta nu vinzi tot la 1:1 + Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt puse de sumarizator. \ No newline at end of file diff --git a/gen/strategii/buy_doji_locatie.py b/gen/strategii/buy_doji_locatie.py index 89e622b..994199f 100644 --- a/gen/strategii/buy_doji_locatie.py +++ b/gen/strategii/buy_doji_locatie.py @@ -3,9 +3,9 @@ Citește `gen/strategii/buy_doji_locatie.spec.txt`. Două panouri alăturate cu ACEEAȘI serie de 10 bare, pe aceeași scară și aceeași axă de preț (candelele -stau la aceleași y). Stânga: pivot monthly S1 49.00, la 0,41 % sub low-ul +stau la aceleași y). Stânga: pivot lunar 49.00, la 0,51 % sub low-ul dojiului. Dreapta: S1 46.00 și PP 53.50 — cel mai apropiat nivel sub doji e -la 6,96 %. Nivelurile se desenează de mână, cu coordonate absolute (liniile +la 7,07 %. Nivelurile se desenează de mână, cu coordonate absolute (liniile din Chart pornesc mereu de la x=24, ar trece peste panoul vecin). Rulare: python3 gen/strategii/buy_doji_locatie.py @@ -13,13 +13,13 @@ Rulare: python3 gen/strategii/buy_doji_locatie.py import re import sys sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Chart, Mark, from_closes # noqa: E402 +from svg_candles import Arrow, Chart, Mark, from_closes # noqa: E402 OUT = "/workspace/atm-curs-dl/gen/strategii/buy_doji_locatie.svg" CLOSES = [52.20, 51.40, 50.60, 49.65, 49.60, 49.90, 50.40, 50.80, 51.10, 51.50] wicks = [(0.15, 0.15)] * len(CLOSES) -wicks[4] = (0.45, 0.40) # doji: h 50.10 / l 49.20 +wicks[4] = (0.45, 0.35) # doji: h 50.10 / l 49.25 cds = from_closes(CLOSES, wicks=wicks, start=53.00) doji = cds[4] S1_DA, S1_NU, PP_NU = 49.00, 46.00, 53.50 @@ -28,16 +28,16 @@ NIVELURI_NU = [S1_NU, PP_NU] # --- assert-urile din spec --------------------------------------------------- for i in range(1, len(cds)): # 1 assert cds[i].o == cds[i - 1].c, f"open[{i}] != close[{i-1}]" -assert abs(doji.h - 50.10) < 1e-9 and abs(doji.l - 49.20) < 1e-9 +assert abs(doji.h - 50.10) < 1e-9 and abs(doji.l - 49.25) < 1e-9 assert abs(doji.o - doji.c) <= 0.10 * (doji.h - doji.l), "bara 4 nu e doji" assert cds[6].c > doji.h, "bara 6 nu confirmă" d_da = round((doji.l - S1_DA) / S1_DA * 100, 2) # 2 -assert d_da == 0.41 and d_da <= 2 +assert d_da == 0.51 and d_da <= 2 d_nu = round((doji.l - S1_NU) / S1_NU * 100, 2) # 3 -assert d_nu == 6.96 and d_nu > 2 and (PP_NU - doji.h) > 0 +assert d_nu == 7.07 and d_nu > 2 and (PP_NU - doji.h) > 0 assert not any(S1_NU < p < PP_NU for p in NIVELURI_NU) d_pp = round((PP_NU - doji.l) / doji.l * 100, 2) # PP e deasupra, mai departe -assert d_pp == 8.74 and d_pp > d_nu +assert d_pp == 8.63 and d_pp > d_nu # --- layout: două panouri, aceeași axă -------------------------------------- BLUE, GREEN, RED, ORANGE, GREY = "#1a5fb4", "#188a3e", "#c00", "#b06000", "#555" @@ -45,61 +45,67 @@ W, PW = 760, 350 # lățime totală, lățime panou PX = [24, 24 + PW + 28] # x-ul stâng al fiecărui panou SCALE, TOP = 36.0, 96 # px/unitate și y-ul celui mai mare preț +ARR = { + PX[0]: Arrow(8, "pivot lunar: nivel urmărit\nde mulți — aici apar\ncumpărătorii", + price=S1_DA, where="below", color=BLUE), + PX[1]: Arrow(4, "aceeași formă, dar nimic sub el\nnu are cine să-l susțină", + where="below", color=RED, dx=100), +} charts = [] for px in PX: ch = Chart(candles=cds, marks=[Mark(4, "doji", ORANGE, "above", dy=-16), Mark(6, "confirmare", GREEN, "above", dy=-26)], + arrows=[ARR[px]], scale=SCALE, gap=17, body_w=10, left=px + 34, width=px + PW, top=TOP) - body = ch.render() + # `_render()`, nu `render()`: al doilea restaurează top/left, iar zonele și + # etichetele desenate de mână ar pica deplasate față de body-ul randat + body = ch._render() + assert f'viewBox="0 0 {px + PW} ' in body, "textul unei săgeți iese din panou" + assert (ch.top, ch.left) == (TOP, px + 34), "Chart a mutat graficul: panourile s-ar dezalinia" charts.append((ch, body.split(">", 1)[1].rsplit("", 1)[0].strip())) (ch_da, body_da), (ch_nu, body_nu) = charts assert ch_da.scale == ch_nu.scale and ch_da._pmax == ch_nu._pmax, "scări diferite" # 4 y = ch_da._y # axa e comună: același y pe ambele panouri -def level(px, price, text, color): +def level(px, price, text, color, below=False): yy = y(price) + ty, anchor, tx = (yy + 14, "start", px + 6) if below else (yy - 6, "end", px + PW - 4) return [f'', - f'{text}'] + f'{text}'] -def arrow(x, y1, y2, color): # săgeată dublă verticală între y1 și y2 - return [f'', - f'', - f''] +def zone(px, p_top, p_bot, label, color, label_at_bottom=False): + """Dreptunghi de evidențiere pe toată lățimea panoului, între două prețuri.""" + y0, y1 = y(p_top), y(p_bot) + ly, anchor, lx = ((y1 - 12, "start", px + 8) if label_at_bottom + else (y0 - 6, "end", px + PW - 4)) + return [f'', + f'{label}'] -xd_da, xd_nu = ch_da._cx(4), ch_nu._cx(4) -y_low, y_bot = y(doji.l), y(S1_NU) -ly = y(S1_DA) + 24 # textul de distanță, sub linia 49.00 +y_bot = y(S1_NU) parts = [ f'', f'' - f'Doji la nivel vs. doji în aer — daily, pivoți monthly (exemplu construit)', + f'Doji la nivel vs. doji în aer — daily, pivoți lunari (exemplu construit)', f'DA — doji la nivel', f'NU — doji în aer', f'', - *level(PX[0], S1_DA, "pivot monthly S1 49.00", BLUE), - *level(PX[1], PP_NU, "PP 53.50", BLUE), - *level(PX[1], S1_NU, "S1 46.00", BLUE), + *zone(PX[0], doji.l, S1_DA, f"{d_da:.2f} % — la nivel".replace(".", ","), GREEN), + *zone(PX[1], doji.l, S1_NU, f"gol de {d_nu:.2f} % sub doji — doji în aer".replace(".", ","), + RED, label_at_bottom=True), + *level(PX[0], S1_DA, "pivotul lunar 49.00", BLUE, below=True), + *level(PX[1], PP_NU, "pivotul lunar 53.50", BLUE), + *level(PX[1], S1_NU, "pivotul lunar 46.00", BLUE, below=True), body_da, body_nu, - # DA: low-ul dojiului atinge practic linia - f'', - f'low 49.20 = +0,41 % față de 49.00', - f'' - f'→ la nivel (daily: ≤ 1-2 %)', - # NU: distanța până la cel mai apropiat nivel - *arrow(xd_nu, y_low + 3, y_bot - 2, RED), - f'' - f'cel mai apropiat nivel: 46.00, la 6,96 %', - f'→ doji în aer', - f'' - f'(PP 53.50 e deasupra, la 8,74 % de low)', - f'60 min: prag ≤ 0,5 %, pivoți weekly · ' - f'daily: 1-2 %, pivoți monthly · weekly: pivoți quarterly', + f'daily: e „la nivel" dacă low-ul ' + f'dojiului e la cel mult 1-2 % de pivotul lunar (aici {d_da:.2f} %; în dreapta ' + f'{d_nu:.2f} %).'.replace("0.51 %", "0,51 %").replace("7.07 %", "7,07 %"), f'Aceeași serie, aceeași scară; ' f'nivelurile 49.00 / 46.00 / 53.50 sunt construite.', "", diff --git a/gen/strategii/buy_doji_locatie.spec.txt b/gen/strategii/buy_doji_locatie.spec.txt index cab91a1..84b86b1 100644 --- a/gen/strategii/buy_doji_locatie.spec.txt +++ b/gen/strategii/buy_doji_locatie.spec.txt @@ -3,39 +3,44 @@ SPEC DIAGRAMĂ — buy_doji_locatie tip: PRET, două panouri cu ACEEAȘI serie, niveluri diferite destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 4 cheie markdown: -titlu SVG: „Doji la nivel vs. doji în aer — daily, pivoți monthly (exemplu construit)" +titlu SVG: „Doji la nivel vs. doji în aer — daily, pivoți lunari (exemplu construit)" stil: candele lipite (gap 15-18, body_w 9-10), fără volum; open = close anterior. CE TREBUIE SĂ DEMONSTREZE ------------------------- Aceeași formă (trend → doji → confirmare), dar în stânga low-ul dojiului e -la 0,41 % de pivotul monthly (sub pragul de 1-2 % pe daily), iar în dreapta -cel mai apropiat nivel e la 6,96 % dedesubt. Pattern-ul nu te ajută să vezi +la 0,51 % de pivotul lunar (sub pragul de 1-2 % pe daily), iar în dreapta +cel mai apropiat nivel e la 7,07 % dedesubt. Pattern-ul nu te ajută să vezi diferența; doar măsurătoarea. SERIA (identică pe ambele panouri, 10 bare) ------------------------------------------- Seria panoului DA din buy_doji_fereastra.spec.txt, extinsă cu 3 bare: -close-uri 52.20, 51.40, 50.60, 49.65, 49.60 (doji: o 49.65 h 50.10 l 49.20), +close-uri 52.20, 51.40, 50.60, 49.65, 49.60 (doji: o 49.65 h 50.10 l 49.25), 49.90, 50.40 (confirmare), 50.80, 51.10, 51.50; open[0] = 53.00; fitile 0.15. NIVELURI -------- -Stânga (DA): „pivot monthly S1 49.00" (albastru), eticheta de distanță lângă -doji: „low 49.20 = +0,41 % față de 49.00 → la nivel (daily: ≤ 1-2 %)". -Dreapta (NU): „S1 46.00" jos, „PP 53.50" sus; eticheta: „cel mai apropiat -nivel: 46.00, la 6,96 % → doji în aer". -Sub ambele, text mic: „60 min: prag ≤ 0,5 %, pivoți weekly · daily: 1-2 %, -pivoți monthly · weekly: pivoți quarterly". +Stânga (DA): „pivotul lunar 49.00" (albastru) + ZONĂ verde între low-ul dojiului +(49.25) și 49.00, etichetă „0,51 % — la nivel"; SĂGEATĂ spre linia 49.00: +„pivot lunar: nivel urmărit / de mulți — aici apar / cumpărătorii". +Dreapta (NU): „pivotul lunar 46.00" jos, „pivotul lunar 53.50" sus; ZONĂ roșie +între 49.25 și 46.00, etichetă „gol de 7,07 % sub doji — doji în aer"; SĂGEATĂ +spre doji: „aceeași formă, dar nimic sub el / nu are cine să-l susțină". +Sub ambele, un singur rând: „daily: e «la nivel» dacă low-ul dojiului e la cel +mult 1-2 % de pivotul lunar (aici 0,51 %; în dreapta 7,07 %)". Rândul cu +pragurile pe 60 min / weekly s-a mutat la nivelul 3. ASSERT-URI ---------- -1. open[i] == close[i-1]; doji abs(o-c) <= 0.10*(h-l); close[6] > 50.10. -2. round((49.20-49.00)/49.00*100, 2) == 0.41 și <= 2. -3. round((49.20-46.00)/46.00*100, 2) == 6.96 și > 2; (53.50-50.10) > 0 +1. open[i] == close[i-1]; doji h 50.10 / l 49.25; abs(o-c) <= 0.10*(h-l); + close[6] > 50.10. +2. round((49.25-49.00)/49.00*100, 2) == 0.51 și <= 2. +3. round((49.25-46.00)/46.00*100, 2) == 7.07 și > 2; (53.50-50.10) > 0 (niciun nivel între 46.00 și 53.50 pe panoul NU). 4. Scara (px/unitate) identică pe cele două panouri (ca să se vadă că forma e - aceeași). + aceeași); Chart nu are voie să mute graficul (ar dezalinia panourile) — se + randează cu `_render()` și se verifică top/left/lățimea. SURSA ----- diff --git a/gen/strategii/buy_doji_locatie.svg b/gen/strategii/buy_doji_locatie.svg index a4671bd..35f5e14 100644 --- a/gen/strategii/buy_doji_locatie.svg +++ b/gen/strategii/buy_doji_locatie.svg @@ -1,14 +1,18 @@ - Doji la nivel vs. doji în aer — daily, pivoți monthly (exemplu construit) + Doji la nivel vs. doji în aer — daily, pivoți lunari (exemplu construit) DA — doji la nivel NU — doji în aer + + 0,51 % — la nivel + + gol de 7,07 % sub doji — doji în aer - pivot monthly S1 49.00 + pivotul lunar 49.00 - PP 53.50 + pivotul lunar 53.50 - S1 46.00 + pivotul lunar 46.00 @@ -17,7 +21,7 @@ - + @@ -31,6 +35,11 @@ doji confirmare + + + pivot lunar: nivel urmărit + de mulți — aici apar + cumpărătorii @@ -39,7 +48,7 @@ - + @@ -53,15 +62,10 @@ doji confirmare - - low 49.20 = +0,41 % față de 49.00 - → la nivel (daily: ≤ 1-2 %) - - - - cel mai apropiat nivel: 46.00, la 6,96 % - → doji în aer - (PP 53.50 e deasupra, la 8,74 % de low) - 60 min: prag ≤ 0,5 %, pivoți weekly · daily: 1-2 %, pivoți monthly · weekly: pivoți quarterly + + + aceeași formă, dar nimic sub el + nu are cine să-l susțină + daily: e „la nivel" dacă low-ul dojiului e la cel mult 1-2 % de pivotul lunar (aici 0,51 %; în dreapta 7,07 %). Aceeași serie, aceeași scară; nivelurile 49.00 / 46.00 / 53.50 sunt construite. \ No newline at end of file diff --git a/gen/strategii/buy_doji_perechi_tf.py b/gen/strategii/buy_doji_perechi_tf.py index 2951c5c..c8e19b3 100644 --- a/gen/strategii/buy_doji_perechi_tf.py +++ b/gen/strategii/buy_doji_perechi_tf.py @@ -133,14 +133,28 @@ def candles(bars, x0, gap, yf): out.append('') + 'markerHeight="7" orient="auto">' + '') text(20, 22, "Aceeași regulă pe trei perechi — exemplu construit (fără ticker)", bold=True, size=14) +def zone(x0, y0_, x1, y1, color): + out.append(f'') + + +def bracket(x, ya, yb_, color, label): + """Paranteză verticală între două prețuri, cu eticheta la dreapta.""" + out.append(f'') + text(x + 5, (ya + yb_) / 2 + 4, label, fill=color, bold=True) + + y0 = 40 -ROW_H = 290 for key, f, tf_big, tf_small, cap, exp in ROWS: big, small = scaled(BIG_A, f), scaled(SMALL_A, f) g = check(key, big, small, exp) + first = key == "A" # titlu rând + subtitluri text(20, y0 + 14, f"{key}. {tf_big} → {tf_small}", bold=True, size=13) @@ -155,60 +169,79 @@ for key, f, tf_big, tf_small, cap, exp in ROWS: yb = lambda p, t=top, m=bmax, s=bs: t + (m - p) * s # noqa: E731 ys = lambda p, t=top, m=smax, s=ss: t + (m - p) * s # noqa: E731 - # TF mare + # TF mare: zonă peste doji + confirmare, eticheta dedesubt + zx0, zx1 = BX0 + 9 * BGAP - 9, BX0 + 10 * BGAP + 9 + zone(zx0, yb(big[10][1]) - 5, zx1, yb(g["dl"]) + 5, GREEN) + text((zx0 + zx1) / 2, yb(g["dl"]) + 20, "doji + confirmare:", fill=GREEN, anchor="middle", bold=True) + text((zx0 + zx1) / 2, yb(g["dl"]) + 34, "aici se decide direcția", fill=GREEN, + anchor="middle", bold=True) hline(BX0 - 16, BX0 + 10 * BGAP + 12, yb(g["dh"]), GRAY, "3 3") text(BX0 - 14, yb(g["dh"]) + 14, f"high doji {tf_big} {g['dh']:.2f}", fill="#666") candles(big, BX0, BGAP, yb) - text(BX0 + 9 * BGAP, yb(g["dl"]) + 15, "doji", fill="#b06000", anchor="middle", bold=True) - text(BX0 + 10 * BGAP - 4, yb(big[10][2]) + 15, "confirmare: long permis", - fill=GREEN, bold=True) - # zoom: de la close-ul confirmării mari la open-ul primei bare mici (același preț) + # săgeata-zoom: de la close-ul confirmării mari la open-ul primei bare mici (același preț) x1, y1 = BX0 + 10 * BGAP + 8, yb(g["conf"]) x2, y2 = SX0 - 10, ys(g["conf"]) out.append(f'') - text(300, y1 + 2, f"zoom pe {tf_small},", fill="#555") - text(300, y1 + 16, "după confirmare", fill="#555") + text(290, y1 + 2, "apoi cobori", fill="#555") + text(290, y1 + 16, "pe graficul mic", fill="#555") # TF mic: niveluri y_dh, y_e, y_sl, y_tp = ys(g["dh"]), ys(g["entry"]), ys(g["sl"]), ys(g["tp"]) assert abs((y_sl - y_e) / (y_e - y_tp) - 1) < 1e-6, f"{key}: SL-intrare != intrare-TP1 în px" + # zonă peste doji-ul mic + confirmare, eticheta dedesubt + sx0, sx1 = SX0 + 8 * SGAP - 9, SX0 + 9 * SGAP + 9 + zone(sx0, y_e - 6, sx1, y_sl + 5, GREEN) + text((sx0 + sx1) / 2, y_sl + 20, "doji la nivel:", fill=GREEN, anchor="middle", bold=True) + text((sx0 + sx1) / 2, y_sl + 34, "aici intri", fill=GREEN, anchor="middle", bold=True) hline(SL_X1, SL_X2, y_dh, GRAY, "3 3") hline(SL_X1, SL_X2, y_e, GREEN, "6 3") hline(SL_X1, SL_X2, y_sl, RED, "6 3") hline(SL_X1, SL_X2, y_tp, GREEN, "2 3") - text(COL_X, y_tp + 4, f"TP1 1:1 {g['tp']:.2f}", fill=GREEN, size=11) + text(COL_X, y_tp + 4, f"ținta 1:1 {g['tp']:.2f}", fill=GREEN, size=11) text(COL_X, y_e + 4, f"intrare {g['entry']:.2f}", fill=GREEN, size=11) text(COL_X, y_dh - 5, f"high doji {g['dh']:.2f}", fill="#666", size=11) - text(COL_X, y_sl + 12, f"SL {g['sl']:.2f}", fill=RED, size=11) - text(COL_X, y_sl + 25, "= low 4 candele", fill=RED, size=11) + text(COL_X, y_sl + 12, f"stop {g['sl']:.2f}", fill=RED, size=11) + if first: + text(COL_X, y_sl + 25, "sub ultimele", fill=RED, size=11) + text(COL_X, y_sl + 38, "4 candele", fill=RED, size=11) candles(small, SX0, SGAP, ys) - # paranteză peste pullback-ul de 8 candele (barele 0..7) - yb8 = y_tp - 12 - xa, xb = SX0 - 5, SX0 + 7 * SGAP + 5 - out.append(f'') - text((xa + xb) / 2, yb8 - 5, "pullback: 8 candele", fill="#555", anchor="middle") - text(SX0 + 8 * SGAP + 4, y_sl + 15, "doji la nivel", fill="#b06000", anchor="end", bold=True) - text(SX0 + 9 * SGAP - 8, y_e - 5, "intrare", fill=GREEN, anchor="end", bold=True) - - # text sub rând - text(20, top + PLOT_H + 50, cap.format(p=g["pct"], pb=g["b_pct"]), fill=INK, bold=True) + if first: + # paranteză peste pullback-ul de 8 candele (barele 0..7), doar pe primul rând + yb8 = y_tp - 12 + xa, xb = SX0 - 5, SX0 + 7 * SGAP + 5 + out.append(f'') + text((xa + xb) / 2, yb8 - 5, "pullback: 8 candele", fill="#555", anchor="middle") + # parantezele de stop: același setup, măsurat pe TF mare și pe TF mic + bx = zx1 + 8 + bracket(bx, yb(g["b_entry"]), yb(g["b_sl"]), RED, f"stop {g['b_pct']:.2f} %".replace(".", ",")) + kx = SX0 + 9 * SGAP + 14 + bracket(kx, y_e, y_sl, RED, f"stop {g['pct']:.2f} %".replace(".", ",")) + ratio = g["b_pct"] / g["pct"] + assert 4 <= ratio < 4.5, f"raportul stopurilor {ratio:.2f} nu e „de 4 ori”" + # săgeata dintre ele, sub rând + ya = top + PLOT_H + 58 + out.append(f'') + text((bx + kx) / 2 + 20, ya + 17, "același setup, stop de 4 ori mai mic", fill=RED, + anchor="middle", bold=True) + text((bx + kx) / 2 + 20, ya + 31, "→ de 4 ori mai multe acțiuni la același risc", fill=RED, + anchor="middle", bold=True) print(f"{key}: doji mare {g['dh']:.2f}/{g['dl']:.2f} conf {g['conf']:.2f} | intrare {g['entry']:.2f} " f"SL {g['sl']:.2f} risc {g['risk']:.2f} ({g['pct']:.2f} %) TP1 {g['tp']:.2f} | " f"doar mare: risc {g['b_risk']:.2f} ({g['b_pct']:.2f} %)") - y0 += ROW_H + y0 += 320 if first else 270 if key != "C": out.append(f'') -text(20, y0 + 4, "Cifre construite, aceeași formă scalată pe trei perechi.", fill="#555") -text(20, y0 + 21, "Procentele reale depind de simbol (LABU daily: stop 9 %).", fill="#555") -H = y0 + 32 +H = y0 - 20 svg = (f'\n ' + "\n ".join(out) + "\n") assert "\n\n" not in svg +assert ".md:" not in svg and "Surse" not in svg, "trimiteri la surse în SVG" OUT.write_text(svg, encoding="utf-8") print(f"scris {OUT} ({W}x{H:.0f})") diff --git a/gen/strategii/buy_doji_perechi_tf.spec.txt b/gen/strategii/buy_doji_perechi_tf.spec.txt index 870834a..6d82100 100644 --- a/gen/strategii/buy_doji_perechi_tf.spec.txt +++ b/gen/strategii/buy_doji_perechi_tf.spec.txt @@ -63,15 +63,17 @@ intrare verde; SL roșu; TP1 verde punctat. ETICHETE -------- Titlu rând: A „weekly → daily" B „monthly → weekly" C „daily → 60 min" -Pe graficul mare: Mark(9, "doji"), Mark(10, "confirmare: long permis"). -Pe graficul mic: Mark(8, "doji la nivel"), Mark(9, "intrare"), - Level SL „SL = low 4 candele", Level TP „TP1 1:1". -Sub fiecare rând, un text de o linie: - A: „stop 1.13 % (pe weekly ar fi 4.77 %) · 8 candele = 8 zile de bursă" - B: „stop 2.59 % (pe monthly ar fi 10.85 %) · 8 candele = 8 săptămâni" - C: „stop 0.47 % (pe daily ar fi 1.98 %) · 8 candele ≈ 1,2 zile de bursă (7 bare/zi)" -Legendă jos: „Cifre construite, aceeași formă scalată pe trei perechi. -Procentele reale depind de simbol (LABU daily: stop 9 %)." +Pe graficul mare: zonă peste doji + confirmare, etichetată dedesubt + „doji + confirmare: aici se decide direcția". +Pe graficul mic: zonă peste doji + confirmare, etichetată „doji la nivel: + aici intri"; Level „stop " (pe rândul A și „sub ultimele 4 candele"), + Level „ținta 1:1 ", Level „intrare ". +Săgeata-zoom dintre grafice: „apoi cobori pe graficul mic". +Doar pe rândul A: paranteză de stop pe TF-ul mare („stop 4,77 %") și pe cel +mic („stop 1,13 %"), cu o săgeată între ele: „același setup, stop de 4 ori +mai mic → de 4 ori mai multe acțiuni la același risc". +Restul cifrelor (praguri, „8 candele" pe fiecare pereche, cât ții) stau în +tabelul din capitol, nu în SVG: diagrama nu repetă tabelul. ASSERT-URI OBLIGATORII ÎN GENERATOR ----------------------------------- diff --git a/gen/strategii/buy_doji_perechi_tf.svg b/gen/strategii/buy_doji_perechi_tf.svg index 75d03d6..b38e7e9 100644 --- a/gen/strategii/buy_doji_perechi_tf.svg +++ b/gen/strategii/buy_doji_perechi_tf.svg @@ -1,9 +1,12 @@ - - + + Aceeași regulă pe trei perechi — exemplu construit (fără ticker) A. weekly → daily weekly: direcția daily: intrarea + + doji + confirmare: + aici se decide direcția high doji weekly 105.20 @@ -28,20 +31,22 @@ - doji - confirmare: long permis - zoom pe daily, - după confirmare + apoi cobori + pe graficul mic + + doji la nivel: + aici intri - TP1 1:1 107.50 + ținta 1:1 107.50 intrare 106.30 high doji 105.20 - SL 105.10 - = low 4 candele + stop 105.10 + sub ultimele + 4 candele @@ -74,163 +79,161 @@ pullback: 8 candele - doji la nivel - intrare - stop 1.13 % (pe weekly ar fi 4.77 %) · 8 candele = 8 zile de bursă - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe weekly, - după confirmare - - - - - TP1 1:1 118.75 - intrare 115.75 - high doji 113.00 - SL 112.75 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 2.59 % (pe monthly ar fi 10.85 %) · 8 candele = 8 săptămâni - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe 60 min, - după confirmare - - - - - TP1 1:1 103.00 - intrare 102.52 - high doji 102.08 - SL 102.04 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 0.47 % (pe daily ar fi 1.98 %) · 8 candele ≈ 1,2 zile de bursă (7 bare/zi) - Cifre construite, aceeași formă scalată pe trei perechi. - Procentele reale depind de simbol (LABU daily: stop 9 %). + + stop 4,77 % + + stop 1,13 % + + același setup, stop de 4 ori mai mic + → de 4 ori mai multe acțiuni la același risc + + B. monthly → weekly + monthly: direcția + weekly: intrarea + + doji + confirmare: + aici se decide direcția + + high doji monthly 113.00 + + + + + + + + + + + + + + + + + + + + + + + + apoi cobori + pe graficul mic + + doji la nivel: + aici intri + + + + + ținta 1:1 118.75 + intrare 115.75 + high doji 113.00 + stop 112.75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C. daily → 60 min + daily: direcția + 60 min: intrarea + + doji + confirmare: + aici se decide direcția + + high doji daily 102.08 + + + + + + + + + + + + + + + + + + + + + + + + apoi cobori + pe graficul mic + + doji la nivel: + aici intri + + + + + ținta 1:1 103.00 + intrare 102.52 + high doji 102.08 + stop 102.04 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gen/strategii/buy_doji_scaner.py b/gen/strategii/buy_doji_scaner.py index e1cf6f3..908bd16 100644 --- a/gen/strategii/buy_doji_scaner.py +++ b/gen/strategii/buy_doji_scaner.py @@ -27,24 +27,21 @@ WIDTHS = [300, 280, 260, 240, 220, 200] # (linii în cutie, [(tip, text)]); tip: "n" = notă gri, "c" = capcană BOXES = [ (["Univers:", "All Stocks (~13.000)", "S&P 500 · Russell 3000"], - [("n", "mai mare = găsește mai mult, durează mai mult")]), + [("n", "mai mare = mai mulți candidați, scanare mai lentă")]), (["Trigger: jbtgrshdATM", "BDATM = 0", "(Sell Doji: SDATM = 0)"], - [("c", "Interval = TF-ul scanerului, setat manual"), - ("c", "0 = ultima candelă închisă; 1 = cu o zi în urmă")]), + [("c", "intervalul nu se aliniază singur cu TF-ul: îl pui de mână"), + ("c", "vede doar candela închisă: daily rulat la prânz arată ieri")]), (["Nivel: RSV1ATM", "% of PP ≤ 0.5 (60 min)", "% of PP ≤ 2 (daily)"], [("n", "Pivot Interval: 2 = weekly (pe 60 min), 3 = monthly (pe daily)"), - ("c", "RS/SR = 1 la filtrare; cu 100, pragul se scrie ×100")]), + ("c", "RS/SR: 1 la filtrare, 100 doar la afișare")]), (["Lichiditate: Volume Colors", "Average Volume ≥ 500.000", "Average Length = 10"], [("n", "volum daily, indiferent de TF-ul scanerului")]), (["Opțional:", "Since Bear ≥ 8", "Bull Reversal = 1", "RVOL doar Display"], - [("c", "Bear Reversal e selectat implicit — comută pe Bull"), - ("c", "în zile extreme, pragurile rigide golesc lista")]), + [("c", "pornește pe Bear Reversal: comută pe Bull")]), (["Lista de candidați", "→ o verifici pe grafic", "(pașii 2-6).", "Scanerul nu e undă verde."], []), ] -FOOT = ("Delay: scanerul vede candela închisă — daily rulat la 12:00 " - "arată triggerul de ieri.") def est_w(s, fs, bold=False): @@ -94,10 +91,18 @@ for i, (lines, notes) in enumerate(BOXES): assert x0 >= x + 6 and x1 <= x + w - 6, f"textul nu încape în cutia {i}: {ln!r}" if note_lines: assert x + w + 24 <= NOTE_X, f"cutia {i} prea aproape de note" - svg.append(f'') ny = y + (h - n_note * LH) / 2 + 12 for group in note_lines: + kind0 = group[0][0] + cy = ny - 4 + # capcana arată spre filtrul pe care îl strică (vârful pe cutie) + col = RED if kind0 == "c" else "#bbbbbb" + dash = '' if kind0 == "c" else ' stroke-dasharray="3 3"' + svg.append(f'') + if kind0 == "c": + svg.append(f'') for kind, ln in group: put(NOTE_X, ny, ln, NOTE_FS, RED if kind == "c" else GRAY) ny += LH @@ -108,10 +113,7 @@ for i, (lines, notes) in enumerate(BOXES): f'L {BOX_CX} {y + 14:g} Z" fill="{BLUE}"/>') y += 18 -y += 30 -for j, ln in enumerate(textwrap.wrap(FOOT, 88)): - put(20, y + j * LH, ln, 12.5, BLACK) -H = int(y + LH + 20) +H = int(y + 20) # ------------------------------------------------------------------ verificare assert all(a > b for a, b in zip(WIDTHS, WIDTHS[1:])), "lățimile nu scad strict" @@ -133,6 +135,7 @@ out = "\n".join([ f'ordinea filtrelor și capcanele">', f'', *svg, ""]) + "\n" +assert ".md:" not in out and "Surse" not in out, "trimiteri la surse în SVG" assert "\n\n" not in out and not any(not ln.strip() for ln in out.splitlines()), "linie goală" OUT.write_text(out, encoding="utf-8") print(f"scris {OUT} ({W}x{H}), verificare OK") diff --git a/gen/strategii/buy_doji_scaner.spec.txt b/gen/strategii/buy_doji_scaner.spec.txt index 61fe780..25d9e6e 100644 --- a/gen/strategii/buy_doji_scaner.spec.txt +++ b/gen/strategii/buy_doji_scaner.spec.txt @@ -5,28 +5,28 @@ destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 1 cheie markdown: titlu SVG: „Scanerul Buy Doji în TradeStation — ordinea filtrelor și capcanele" stil: cutii dreptunghiulare stivuite, tot mai înguste (pâlnie), lățime 640; - în dreapta fiecărei cutii, o notă roșie „capcană" unde există. + în dreapta fiecărei cutii, o notă roșie „capcană" unde există, + legată de cutie printr-o săgeată roșie (vârful pe filtrul + pe care îl strică). Fără cifre de „câte simboluri rămân" — materialul nu le dă. CUTIILE (text exact, de sus în jos) ----------------------------------- 1. „Univers: All Stocks (~13.000) · S&P 500 · Russell 3000" - notă gri: „mai mare = găsește mai mult, durează mai mult" + notă gri: „mai mare = mai mulți candidați, scanare mai lentă" 2. „Trigger: jbtgrshdATM → BDATM = 0 (Sell Doji: SDATM = 0)" - capcană: „Interval = TF-ul scanerului, setat manual" - capcană: „0 = ultima candelă închisă; 1 = cu o zi în urmă" + capcană: „intervalul nu se aliniază singur cu TF-ul: îl pui de mână" + capcană: „vede doar candela închisă: daily rulat la prânz arată ieri" 3. „Nivel: RSV1ATM → % of PP ≤ 0.5 (60 min) / ≤ 2 (daily)" notă: „Pivot Interval: 2 = weekly (pe 60 min), 3 = monthly (pe daily)" - capcană: „RS/SR = 1 la filtrare; cu 100, pragul se scrie ×100" + capcană: „RS/SR: 1 la filtrare, 100 doar la afișare" 4. „Lichiditate: Volume Colors → Average Volume ≥ 500.000, Average Length = 10" notă: „volum daily, indiferent de TF-ul scanerului" 5. „Opțional: Since Bear ≥ 8 · Bull Reversal = 1 · RVOL doar Display" - capcană: „Bear Reversal e selectat implicit — comută pe Bull" - capcană: „în zile extreme, pragurile rigide golesc lista" + capcană: „pornește pe Bear Reversal: comută pe Bull" 6. (cutie verde, cea mai îngustă) „Lista de candidați → o verifici pe grafic (pașii 2-6). Scanerul nu e undă verde." -Sub pâlnie, o linie: „Delay: scanerul vede candela închisă — daily rulat la -12:00 arată triggerul de ieri." +Fără linie de subsol: întârzierea scanerului e capcana de la cutia 2. ASSERT-URI ---------- diff --git a/gen/strategii/buy_doji_scaner.svg b/gen/strategii/buy_doji_scaner.svg index f45248f..0015111 100644 --- a/gen/strategii/buy_doji_scaner.svg +++ b/gen/strategii/buy_doji_scaner.svg @@ -1,57 +1,60 @@ - - + + Scanerul Buy Doji în TradeStation ordinea filtrelor și capcanele Univers: All Stocks (~13.000) S&P 500 · Russell 3000 - -mai mare = găsește mai mult, durează mai -mult + +mai mare = mai mulți candidați, scanare mai +lentă Trigger: jbtgrshdATM BDATM = 0 (Sell Doji: SDATM = 0) - -capcană: Interval = TF-ul scanerului, setat -manual -capcană: 0 = ultima candelă închisă; 1 = cu -o zi în urmă + + +capcană: intervalul nu se aliniază singur cu +TF-ul: îl pui de mână + + +capcană: vede doar candela închisă: daily +rulat la prânz arată ieri Nivel: RSV1ATM % of PP ≤ 0.5 (60 min) % of PP ≤ 2 (daily) - + Pivot Interval: 2 = weekly (pe 60 min), 3 = monthly (pe daily) -capcană: RS/SR = 1 la filtrare; cu 100, -pragul se scrie ×100 + + +capcană: RS/SR: 1 la filtrare, 100 doar la +afișare Lichiditate: Volume Colors Average Volume ≥ 500.000 Average Length = 10 - + volum daily, indiferent de TF-ul scanerului - -Opțional: -Since Bear ≥ 8 -Bull Reversal = 1 -RVOL doar Display - -capcană: Bear Reversal e selectat implicit — -comută pe Bull -capcană: în zile extreme, pragurile rigide -golesc lista - - -Lista de candidați -→ o verifici pe grafic -(pașii 2-6). -Scanerul nu e undă verde. -Delay: scanerul vede candela închisă — daily rulat la 12:00 arată triggerul de ieri. + +Opțional: +Since Bear ≥ 8 +Bull Reversal = 1 +RVOL doar Display + + +capcană: pornește pe Bear Reversal: comută +pe Bull + + +Lista de candidați +→ o verifici pe grafic +(pașii 2-6). +Scanerul nu e undă verde. diff --git a/gen/strategii/buy_doji_sell.py b/gen/strategii/buy_doji_sell.py index 067690a..dab2ab1 100644 --- a/gen/strategii/buy_doji_sell.py +++ b/gen/strategii/buy_doji_sell.py @@ -3,11 +3,12 @@ Citește specificația `gen/strategii/buy_doji_sell.spec.txt`. Seria de 31 de candele e construită din lista de close-uri dată, cu open-ul fiecărei bare = close-ul precedentului; wick-urile sunt fixate ca nivelurile (doji 99.20 / -100.10, intrare short 99.00, SL 100.10, TP 97.90, trail 96.45, ieșire la 96.60) +100.10, intrare short 99.00, SL 100.15 = 5 cenți peste high-ul de 4 candele, +TP 97.85 = 1R de 1.15, trail 96.45, ieșire la 96.60) să iasă exact din serie, nu doar din etichetă. """ import sys; sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Chart, Level, Mark, from_closes +from svg_candles import Arrow, Chart, Level, Zone, from_closes # --- seria: 31 de close-uri, exact ca în specificație ----------------------- closes = [ @@ -46,17 +47,16 @@ assert vols[14] > media_vol and vols[16] > media_vol, "volum peste medie pe doji cds = from_closes(closes, wicks=wicks, vols=vols, start=closes[0]) -# adnotările pe bara +1 și pe confirmare, ca linii sub grafic (fără suprapunere) -cds[15].color = "#777" # bara de așteptare: neutră, nu confirmă -cds[15].note = "bara 15: close 99.40 peste low-ul dojiului 99.20 — NU confirmă" -cds[16].note = "bara 16: close 99.00 sub 99.20 — confirmare (intrare short)" doji, wait, conf = cds[14], cds[15], cds[16] -entry, sl, tp = 99.00, 100.10, 97.90 +# stopul 5 cenți DEASUPRA high-ului, oglinda pasului 5 (51.60 -> 51.55 pe long); +# cifrele vechi (SL 100.10, TP 97.90) puneau stopul exact pe high +entry, sl, tp = 99.00, 100.15, 97.85 # --- cele 9 assert-uri cerute de specificație ------------------------------ -# 1. SL-ul e exact high-ul ultimelor 4 candele +# 1. SL-ul e 5 cenți peste high-ul ultimelor 4 candele (100.10) assert abs(max(cd.h for cd in cds[13:17]) - 100.10) < 1e-9, "max high[13:17] != 100.10" +assert abs(sl - 100.10 - 0.05) < 1e-9, "SL nu e 5 cenți peste high" # 2. intrarea e close-ul barei 16 assert abs(conf.c - entry) < 1e-9, f"close[16]={conf.c} != 99.00" # 3. confirmarea închide sub low-ul dojiului @@ -64,11 +64,11 @@ assert abs(doji.l - 99.20) < 1e-9 and conf.c < doji.l, "close[16] nu e sub low[1 # 4. bara +1 NU confirmă assert wait.c >= doji.l, "bara 15 ar confirma, fereastra n-ar avea sens" # 5. 1:1 exact -assert abs(abs(sl - entry) - abs(entry - tp)) < 1e-9 and abs((entry - tp) - 1.10) < 1e-9, \ +assert abs(abs(sl - entry) - abs(entry - tp)) < 1e-9 and abs((entry - tp) - 1.15) < 1e-9, \ "risc != recompensă (nu e 1:1 exact)" # 6. primul low <= TP după intrare e bara 19 primul_tp = next(i for i in range(17, len(cds)) if cds[i].l <= tp) -assert primul_tp == 19, f"TP 97.90 atins întâi la bara {primul_tp}, nu 19" +assert primul_tp == 19, f"TP 97.85 atins întâi la bara {primul_tp}, nu 19" assert abs(cds[18].l - 98.05) < 1e-9 and abs(cds[19].l - 97.55) < 1e-9, "low-urile 18/19 nu ies" # 7. trailing = high[25] = 96.45; primul close peste el e bara 27; ieșirea e pe profit trail = cds[25].h @@ -85,26 +85,43 @@ print(f"doji {doji.l:.2f}/{doji.h:.2f} intrare short {conf.c:.2f} " f"SL {sl:.2f} TP {tp:.2f} trail {trail:.2f} ieșire bara 27 @ {cds[27].c:.2f}") # --- desenul ---------------------------------------------------------------- +RED, GREEN, BLUE, ORANGE, GRAY = "#c00", "#188a3e", "#1a5fb4", "#b06000", "#555" ch = Chart( candles=cds, levels=[ - # toate etichetele în dreapta: în stânga sus se suprapuneau cu mark-ul - # dojiului (SL la y=62, text până în ~x196; doji la y=58, din ~x193) - Level(sl, "SL 100.10 (high 4 candele)", "#c00"), - Level(entry, "intrare short 99.00", "#188a3e"), - Level(tp, "TP 97.90 = 1R", "#1a5fb4"), - Level(trail, "trail 96.45", "#b06000"), + # etichetele în dreapta, dincolo de ultima candelă (width > ultima + # candelă); titlul stă în stânga sus, deci nu mai are cu ce să se lovească + Level(sl, "stop 100.15", RED), + Level(entry, "intrare short 99.00", ORANGE), + Level(tp, "ținta 97.85", GREEN), ], - marks=[ - Mark(14, "doji 99.20 / 100.10", "#b06000", "above"), - Mark(27, "ieșire pe trail 96.60", "#c00", "above", dy=-6), + zones=[ + Zone(0, 9, "1. creștere de 10 candele", BLUE), + Zone(14, 14, "2. doji", ORANGE), + # ca unealta „short position" din TradingView: roșu = risc, SUS; + # verde = câștig, JOS — pe short totul e întors față de long + Zone(16, 19, "", RED, p_top=sl, p_bot=entry), + Zone(16, 19, "", GREEN, p_top=entry, p_bot=tp), + # linia de trail doar unde contează (înălțime 0 nu se randează) + # (de la bara 25), nu pe toată lățimea + Zone(25, 30, "", GRAY, p_top=trail, p_bot=trail - 0.02), ], - scale=30.0, gap=15, body_w=9, left=44, width=640, vol_h=70, - vol_label="volum", title="Sell Doji — daily (exemplu construit, fără ticker)", - # scurt: o linie de caption mai lungă de ~90 de caractere iese din viewBox - # (640px) și se taie la randare - caption="Intrare short la close sub low-ul dojiului, SL la high 4 candele, " - "TP 1:1, apoi trail.", + arrows=[ + Arrow(18, "STOPUL SUS, la 100.15 — 5 cenți peste maximul ultimelor 4 candele:\n" + "dacă prețul urcă până aici, creșterea continuă și ideea e moartă", + where="above", price=sl, color=RED, dx=110), + Arrow(16, "AICI INTRI SHORT, la 99.00:\na doua candelă după doji e prima\n" + "care se ÎNCHIDE sub low-ul lui (99.20)", + where="below", color=ORANGE, dx=-70), + Arrow(19, "ținta JOS, la 97.85: tot 1.15, exact cât ai riscat;\naici închizi prima treime", + where="right", price=tp, color=GREEN, dx=50, dy=-32), + Arrow(27, "trail-ul a coborât după preț (96.45);\nprima închidere peste el: ieși cu restul, 96.60", + where="below", color=GRAY, dx=-40), + ], + scale=45.0, gap=20, body_w=9, left=44, width=790, vol_h=60, + vol_label="volum", title="Sell Doji pe short — daily (exemplu construit)", + caption="Pe short câștigi când prețul COBOARĂ: stopul stă SUS, ținta JOS, " + "trail-ul coboară după preț. Roșu = ce riști, verde = ce câștigi.", ) svg = ch.render() diff --git a/gen/strategii/buy_doji_sell.spec.txt b/gen/strategii/buy_doji_sell.spec.txt index 4943dbc..5b1cc62 100644 --- a/gen/strategii/buy_doji_sell.spec.txt +++ b/gen/strategii/buy_doji_sell.spec.txt @@ -1,16 +1,23 @@ TIP: PRET CHEIE: sell -TITLU: Sell Doji — daily (exemplu construit, fără ticker) +TITLU: Sell Doji pe short — daily (exemplu construit) MARCAJ .md: (Nivel 1, §1.3 Trigger, oglinda short) CE ARATĂ Graficul întreg al unui trade Sell Doji short, oglinda ansamblului long: uptrend de 14 candele, doji, o bară de așteptare care NU confirmă, apoi o -bară care închide sub low, intrare short la close, SL deasupra high-ului -ultimelor 4 candele, TP 1:1 în jos, apoi trailing. Panou de volum dedesubt. +bară care închide sub low, intrare short la close, SL 5 cenți deasupra +high-ului ultimelor 4 candele, TP 1:1 în jos, apoi trailing. Panou de volum. +Format tutorial v2: zone de evidențiere („1. creștere de 10 candele", +„2. doji", cutie roșie = riscul, între intrare și stop, cutie verde = câștigul, +între intrare și țintă — ca unealta „short position" din TradingView; segment +gri = linia de trail) și 4 săgeți care spun ce ȘI de ce: stop, intrare, țintă, +ieșire pe trail. Etichetele nivelurilor în dreapta, dincolo de ultima candelă. NIVELURILE ȘI ETICHETELE (cu trimitere) -- doji 99.20-100.10, intrare short 99.00, SL 100.10, TP 97.90 (1:1). +- doji 99.20-100.10, intrare short 99.00, SL 100.15, TP 97.85 (1:1, 1R = 1.15). + SL mutat de la 100.10 (exact pe high) la 100.15, ca oglinda pasului 5 din + capitol, unde stopul long stă „puțin sub" low (51.60 -> 51.55). Sursa principală construiește exact aceste cifre: `13_strategia_3_byh.md:258-259` („short: doji 99.20–100.10, intrare 99.00, SL 100.10, TP 97.90, trail ~97.30"). @@ -37,16 +44,16 @@ Mecioni (up, down) implicite (0.30, 0.25); excepții: Volum: peste medie pe doji și pe confirmare (distribuție), apoi normal. CE VERIFICĂ GENERATORUL CU assert -1. max(high[13:17]) == 100.10 == SL (cel mai înalt high din 4 candele) +1. max(high[13:17]) == 100.10 și SL == 100.10 + 0.05 == 100.15 2. close[16] == 99.00 == intrare 3. close[16] < low[14] == 99.20 (confirmarea chiar închide sub low) 4. close[15] >= low[14] (bara +1 NU confirmă) -5. abs(sl - entry) == abs(entry - tp) == 1.10 (1:1 exact) -6. primul i>16 cu low[i] <= 97.90 este bara 19 (low[18]=98.05, low[19]=97.55) +5. abs(sl - entry) == abs(entry - tp) == 1.15 (1:1 exact) +6. primul i>16 cu low[i] <= 97.85 este bara 19 (low[18]=98.05, low[19]=97.55) 7. linia de trail = high[25] = 96.45; primul close > 96.45 este barul 27 (96.60); și 96.60 < intrare (profit pe short) 8. doji: abs(o-c) <= 0.10*(h-l) 9. trend: close[13] > close[0] + 5 -STIL: gap=15, body_w=9, left=44, width=640, vol_h=70, scale ~30. Etichete -„SL 100.10 (high 4 candele)", „intrare short 99.00", „TP 97.90 = 1R". +STIL: gap=20, body_w=9, left=44, width=790, vol_h=60, scale 45. Etichete +„stop 100.15", „intrare short 99.00", „ținta 97.85". Fără linie goală în SVG. diff --git a/gen/strategii/buy_doji_sell.svg b/gen/strategii/buy_doji_sell.svg index 1c929ff..0d8d9d7 100644 --- a/gen/strategii/buy_doji_sell.svg +++ b/gen/strategii/buy_doji_sell.svg @@ -1,111 +1,129 @@ - - Sell Doji — daily (exemplu construit, fără ticker) - - SL 100.10 (high 4 candele) - - intrare short 99.00 - - TP 97.90 = 1R - - trail 96.45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 99.20 / 100.10 - ieșire pe trail 96.60 - bara 15: close 99.40 peste low-ul dojiului 99.20 — NU confirmă - bara 16: close 99.00 sub 99.20 — confirmare (intrare short) - Intrare short la close sub low-ul dojiului, SL la high 4 candele, TP 1:1, apoi trail. + + Sell Doji pe short — daily (exemplu construit) + + 1. creștere de 10 candele + + 2. doji + + + + + stop 100.15 + + intrare short 99.00 + + ținta 97.85 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + STOPUL SUS, la 100.15 — 5 cenți peste maximul ultimelor 4 candele: + dacă prețul urcă până aici, creșterea continuă și ideea e moartă + + + AICI INTRI SHORT, la 99.00: + a doua candelă după doji e prima + care se ÎNCHIDE sub low-ul lui (99.20) + + + ținta JOS, la 97.85: tot 1.15, exact cât ai riscat; + aici închizi prima treime + + + trail-ul a coborât după preț (96.45); + prima închidere peste el: ieși cu restul, 96.60 + Pe short câștigi când prețul COBOARĂ: stopul stă SUS, ținta JOS, trail-ul coboară după preț. Roșu = ce riști, verde = ce câștigi. \ No newline at end of file diff --git a/gen/strategii/buy_doji_stop.py b/gen/strategii/buy_doji_stop.py index c363e30..0db2cc1 100644 --- a/gen/strategii/buy_doji_stop.py +++ b/gen/strategii/buy_doji_stop.py @@ -1,130 +1,146 @@ -"""Buy Doji — unde pui stopul: 4 candele înapoi, sub structură (exemplu construit). +"""Buy Doji — unde pui stopul: 4 candele înapoi, sub structură. -Citește specificația `gen/strategii/buy_doji_stop.spec.txt`. Două panouri -stivuite, aceeași serie 0-14 ca buy_doji_transe (downtrend, doji 12, +1 13, -confirmare 14). Sus: numărătoarea celor 4 candele (1 = confirmarea). Jos: -același trade, stop „la ochi" 52.90 față de stopul din regulă 51.55. +Citește `gen/strategii/buy_doji_stop.spec.txt`. Barele vin din +`buy_doji_ansamblu.serie()` — e același trade ca în toate celelalte +diagrame ale capitolului (doji 50.10/49.25, intrare 50.40, stop 49.20). + +Panoul de sus: cum numeri cele 4 candele, de la confirmare înapoi. +Panoul de jos: același trade, cu un stop pus „la ochi" (49.70, sub candela +de confirmare) față de stopul din regulă (49.20). Al doilea picior al +fundului coboară la 49.50: mătură stopul la ochi, nu-l atinge pe cel din +regulă. Barele de după intrare sunt CONSTRUITE. """ import re -import sys; sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Candle, Chart, Level, Mark +import sys +from pathlib import Path -OUT = "/workspace/atm-curs-dl/gen/strategii/buy_doji_stop.svg" +sys.path.insert(0, "/workspace/atm-curs-dl") +sys.path.insert(0, str(Path(__file__).parent)) +from svg_candles import Candle, Chart, Level, Zone, Arrow # noqa: E402 +from buy_doji_ansamblu import serie, DOJI, CONF, DOJI_L, ENTRY, SL, TP1, R # noqa: E402 -# --- seria: barele 0-14 exact ca în buy_doji_transe.spec.txt ----------------- -closes = [60.40, 59.60, 59.90, 58.80, 58.10, 58.40, 57.20, 56.30, 56.60, - 55.30, 54.20, 52.40] -bars, o = [], 61.00 -for c in closes: # fitile implicite 0.15 peste/sub corp - bars.append((o, max(o, c) + 0.15, min(o, c) - 0.15, c)) - o = c -bars += [(52.40, 53.00, 51.60, 52.30), # 12 doji - (52.30, 52.85, 52.10, 52.60), # 13 +1 - (52.60, 53.85, 52.45, 53.70)] # 14 confirmare -after = [(53.70, 53.75, 52.70, 52.90), # 15 lovește stopul la ochi - (52.90, 53.05, 52.00, 52.20), # 16 al doilea picior, higher low - (52.20, 53.40, 52.10, 53.30), - (53.30, 54.30, 53.20, 54.20), - (54.20, 55.10, 54.10, 55.00), - (55.00, 56.00, 54.90, 55.95)] # 20 TP1 -full = bars + after -o_, h_, l_, c_ = (list(x) for x in zip(*full)) +OUT = Path(__file__).with_suffix(".svg") +S = 6 # prima bară arătată din serie +OCHI = 49.70 # stopul „la ochi", sub candela de confirmare +GREEN, RED, ORANGE, BLUE, GREY = "#188a3e", "#c00", "#b06000", "#1a5fb4", "#555" +W, VGAP = 720, 14 -ENTRY, SL, OCHI, TP1, LOW4 = 53.70, 51.55, 52.90, 55.85, 51.60 +base = serie()[S:CONF + 1] # până la confirmare, inclusiv +after = [Candle(*b) for b in [ + (50.40, 50.50, 49.85, 49.95), # +1: corecție + (49.95, 50.05, 49.50, 49.60), # +2: al doilea picior, low 49.50 — mătură 49.70 + (49.60, 50.35, 49.55, 50.25), + (50.25, 50.90, 50.15, 50.80), + (50.80, 51.35, 50.70, 51.25), + (51.25, 51.80, 51.15, 51.70), # +6: atinge ținta 51.60 +]] +jos = base + after +d, cf = DOJI - S, CONF - S # indici locali: doji, confirmare -# --- assert-urile din spec --------------------------------------------------- -for i in range(1, len(full)): # 1 - assert abs(o_[i] - c_[i - 1]) < 1e-9, f"open[{i}] != close[{i-1}]" -for i in range(len(full)): - assert l_[i] <= min(o_[i], c_[i]) and h_[i] >= max(o_[i], c_[i]), f"bara {i}" -assert min(l_[11:15]) == min(l_[10:15]) == LOW4 # 2 -assert l_.index(LOW4) == 12, "cel mai jos low nu e dojiul" -assert round(LOW4 - 0.05, 2) == SL -assert min(l_[15:21]) == 52.00 and SL < 52.00 < OCHI # 3 -assert next(i for i in range(15, 21) if l_[i] <= OCHI) == 15 # 4 -assert all(l_[i] > SL for i in range(15, 21)) -assert next(i for i in range(15, 21) if h_[i] >= TP1) == 20 # 5 -assert 52.00 > LOW4 # 6 -assert round(ENTRY - OCHI, 2) == 0.80 and c_[14] == ENTRY -assert round(ENTRY + (ENTRY - SL), 2) == TP1 +# --- aserțiuni ----------------------------------------------------------------- +for i, c in enumerate(jos): + assert c.l <= min(c.o, c.c) and c.h >= max(c.o, c.c), f"bara {i}: h/l nu cuprind o/c" + if i: + assert abs(c.o - jos[i - 1].c) < 1e-9, f"open[{i}] != close[{i-1}]" +# 1. cel mai jos low e al doji-ului, și cu 4 și cu 5 candele numărate +assert min(c.l for c in jos[cf - 3:cf + 1]) == min(c.l for c in jos[cf - 4:cf + 1]) == DOJI_L +assert jos[d].l == DOJI_L and round(DOJI_L - 0.05, 2) == SL +# 2. al doilea picior: mătură stopul la ochi, nu-l atinge pe cel din regulă +dip = [c.l for c in after] +assert min(dip) == 49.50 and SL < 49.50 < OCHI, dip +assert next(k for k, c in enumerate(after) if c.l <= OCHI) == 1, "stopul la ochi nu e lovit de al doilea picior" +assert all(c.l > SL for c in after), "stopul din regulă ar fi fost lovit" +# 3. al doilea picior e higher low față de low-ul doji-ului +assert min(dip) > DOJI_L +# 4. ținta e atinsă abia după corecție, la a 6-a bară de după intrare +assert next(k for k, c in enumerate(after, 1) if c.h >= TP1) == 6 +# 5. stopul la ochi e mai aproape de intrare decât cel din regulă, și peste low-ul doji-ului +assert round(ENTRY - OCHI, 2) == 0.70 < R and DOJI_L < OCHI < jos[cf].l # sub candela de confirmare, peste low-ul doji-ului +assert round(ENTRY - SL, 2) == R +print(f"stop: low4 {DOJI_L:.2f} -> SL {SL:.2f}; la ochi {OCHI:.2f} lovit de low {min(dip):.2f}; " + f"țintă {TP1:.2f} la a 6-a bară") -GREY, RED, ORANGE, GREEN, BLUE = "#555", "#c00", "#b06000", "#188a3e", "#1a5fb4" -W = 640 -common: dict = dict(scale=34.0, gap=18, body_w=10, left=44, width=W) +common: dict = dict(scale=36.0, gap=20, body_w=10, left=48, width=W) - -def mk(n): - return [Candle(*b) for b in full[:n]] - - -# --- panoul de sus: numărătoarea --------------------------------------------- -top = Chart( - candles=mk(15), - levels=[Level(LOW4, "cel mai jos low: 51.60 (doji)", GREY, "2 2", "left"), - Level(SL, "SL 51.55", RED, "4 3")], - # fără Mark pe doji: la gap 18 eticheta calcă pe bara 11; îl numește - # paranteza de dedesubt și cercul de pe low - marks=[Mark(14, "confirmare 53.70", GREEN, "above")], - title="Unde pui stopul: 4 candele înapoi, sub structură — exemplu construit", +# --- panoul de sus: numărătoarea celor 4 candele -------------------------------- +sus = Chart( + candles=base, + levels=[Level(SL, "stopul: 49.20", RED, "4 3", "left")], + zones=[Zone(cf - 3, cf, "numeri 4 candele, începând cu confirmarea", BLUE)], + arrows=[ + Arrow(d, "cel mai jos low din cele 4: 49.25\n(e al doji-ului)", + where="below", price=DOJI_L, color=GREY, dx=250, dy=34), + Arrow(cf - 1, "stopul: 49.20, cu 5 cenți mai jos\nsub el, ideea că vânzătorii\nau obosit e moartă", + where="below", price=SL, color=RED, dx=250, dy=76), + Arrow(cf, "confirmarea: close 50.40\nde aici numeri înapoi", + where="above", color=GREEN, dx=250), + ], + title="Pasul 5 — stopul: numeri 4 candele înapoi de la confirmare", **common, ) -svg_top = top.render() -# numerele 4 3 2 1 + (5) sub bare, bandă de evidențiere, paranteză -yb = top._y(SL) + 18 # rândul cu numere, sub linia de SL -x = top._cx -extra_top = [ - f'', - f'', -] -for i, n in zip(range(11, 15), "4321"): - extra_top.append(f'{n}') -extra_top.append(f'(5)') -yp = yb + 8 -extra_top.append(f'') -extra_top.append(f'' - f'ultimele 4 candele (3 = doji, 1 = confirmarea)') -extra_top.append(f'' - f'Cu 4 sau cu 5 candele iese la fel: în downtrend low-ul dojiului ' - f'e oricum cel mai jos. SL = 51.60 − 0.05.') -h_top = yp + 40 -# --- panoul de jos: același trade, două stopuri ------------------------------- -bot = Chart( - candles=mk(21), - levels=[Level(TP1, "TP1 55.85", GREEN, "2 2"), - Level(ENTRY, "intrare 53.70", GREY, "4 3"), - Level(OCHI, "stop la ochi 52.90 — lovit", ORANGE, "4 3"), - Level(SL, "SL din regulă 51.55 — ținut", RED, "4 3")], - marks=[Mark(16, "al doilea picior: 52.00, higher low", BLUE, "below", dy=10), - Mark(20, "TP1", GREEN, "above")], - title="Același trade: stop la ochi (0.80 sub intrare) vs stop din regulă", - caption="Barele 15-20 și stopul la ochi sunt construite, pentru contrast.", - top=h_top + 10 + 34, # panoul de jos începe sub cel de sus, fără +# --- panoul de jos: stop la ochi vs stop din regulă ----------------------------- +gata = Chart( + candles=jos, + levels=[Level(TP1, "ținta 1: 51.60", GREEN, "2 2", "left"), + Level(ENTRY, "intrarea: 50.40", GREY, "4 3", "left"), + Level(OCHI, "stop pus la ochi: 49.70", ORANGE, "4 3", "left"), + Level(SL, "stopul din regulă: 49.20", RED, "4 3", "left")], + # eticheta zonei o punem manual: Zone o ridică deasupra candelelor din + # dreptul textului, adică departe de banda pe care o marchează + zones=[Zone(cf + 1, cf + 2, "", RED, p_top=OCHI, p_bot=SL)], + arrows=[ + Arrow(cf + 2, "stopul pus la ochi (49.70) e măturat\nera prea aproape de intrare", + where="below", price=OCHI, color=ORANGE, dx=230, dy=6), + Arrow(cf + 2, "al doilea picior al fundului: 49.50\nfundurile fac des asta", + where="below", price=49.50, color=BLUE, dx=230, dy=56), + Arrow(cf + 1, "stopul din regulă (49.20) ține\nal doilea picior rămâne peste el", + where="below", price=SL, color=RED, dx=230, dy=106), + Arrow(len(jos) - 1, "prețul ajunge la țintă\ndar numai cu stopul corect\nmai erai în trade", + where="above", price=TP1, color=GREEN, dx=150), + ], + title="Același trade: stop „la ochi” (sub candela de confirmare) vs stopul din regulă", + caption="Barele de după intrare și stopul la ochi sunt construite, pentru contrast.", **common, ) -svg_bot = bot.render() -extra_bot = [ - f'', -] -# header-ul (viewBox) e al panoului de jos: el conține și offset-ul celui de sus +def panou(ch, sus_de=0.0): + ch.top += sus_de + svg = ch.render() + h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1)) + # render() mută `top` intern și îl restaurează; offsetul se citește din + # prima linie de Level, altfel tot ce desenăm pe urmă iese mai sus cu ~22px + off = float(re.search(r'") + 1:svg.rindex("")].strip(), h, off + + +body_sus, h_sus, off_sus = panou(sus) +# numerele 4 3 2 1 sub barele numărate, plus (5) — arată că iese la fel +yb = sus._y(SL) + off_sus + 22 +nums = [] +for k, n in zip(range(cf - 3, cf + 1), "4321"): + nums.append(f'{n}') +nums.append(f'(5)') +nums.append(f'' + f'cu 4 sau cu 5 candele iese la fel: în scădere, low-ul doji-ului e oricum cel mai jos') +h_sus = max(h_sus, yb + 32) + +body_jos, h_jos, off_jos = panou(gata, h_sus + VGAP) +zx = gata._cx(cf + 3) + 10 +banda = (f'pe aici trece al doilea picior') +H = h_jos + 8 svg = "\n ".join([ - svg_bot.split(">", 1)[0] + ">", - svg_top.split(">", 1)[1].rsplit("", 1)[0].strip(), *extra_top, - f'', - svg_bot.split(">", 1)[1].rsplit("", 1)[0].strip(), *extra_bot, + f'', + body_sus, *nums, + f'', + body_jos, banda, ]) + "\n" -H = float(re.search(r'viewBox="0 0 \d+ ([\d.]+)"', svg).group(1)) -assert " -titlu SVG: „Unde pui stopul: 4 candele înapoi, sub structură — exemplu construit" -stil: ca buy_doji_transe (aceleași bare 0-14, copiate sau importate). +titluri SVG: sus „Pasul 5 — stopul: numeri 4 candele înapoi de la confirmare"; + jos „Același trade: stop «la ochi» (sub candela de confirmare) vs stopul din regulă" +serie: `buy_doji_ansamblu.serie()`, barele 6-16 (același trade ca în tot + capitolul: doji 50.10/49.25, intrare 50.40, stop 49.20). CE TREBUIE SĂ DEMONSTREZE ------------------------- -Sus: cum numeri cele 4 candele (confirmarea și cele 3 dinainte), și de ce -în downtrend nu contează dacă numeri 4 sau 5: low-ul dojiului e oricum cel -mai jos. Jos: același trade, cu un stop pus „la ochi" (52.90, sub intrare -cu 0.80) față de stopul din regulă (51.55). Piciorul al doilea coboară la -52.00: lovește stopul la ochi, nu atinge stopul din regulă; apoi prețul -ajunge la TP1. +Sus: cum numeri cele 4 candele (confirmarea și cele 3 dinainte) și de ce în +scădere nu contează dacă numeri 4 sau 5 — low-ul doji-ului e oricum cel mai jos. +Jos: același trade, cu un stop pus „la ochi" la 49.70 (sub candela de +confirmare, care are low 49.75) față de stopul din regulă, 49.20. Al doilea +picior al fundului coboară la 49.50: mătură stopul la ochi, nu-l atinge pe cel +din regulă; apoi prețul ajunge la ținta 51.60. -SERIA ------ -Barele 0-14: identice cu buy_doji_transe (downtrend, doji 12, +1 13, -confirmare 14). -Panoul de sus: doar barele 0-14 (se oprește la intrare). -Panoul de jos: barele 0-14, apoi: -15 (53.70, 53.75, 52.70, 52.90) -16 (52.90, 53.05, 52.00, 52.20) <- al doilea picior, higher low 52.00 -17 (52.20, 53.40, 52.10, 53.30) -18 (53.30, 54.30, 53.20, 54.20) -19 (54.20, 55.10, 54.10, 55.00) -20 (55.00, 56.00, 54.90, 55.95) <- TP1 55.85 atins +BARELE DE DUPĂ INTRARE (panoul de jos, CONSTRUITE) +-------------------------------------------------- ++1 (50.40, 50.50, 49.85, 49.95) ++2 (49.95, 50.05, 49.50, 49.60) <- al doilea picior, low 49.50 ++3 (49.60, 50.35, 49.55, 50.25) ++4 (50.25, 50.90, 50.15, 50.80) ++5 (50.80, 51.35, 50.70, 51.25) ++6 (51.25, 51.80, 51.15, 51.70) <- atinge ținta 51.60 -MARKS / NIVELURI ----------------- -Sus: numerotare „4 3 2 1" sub barele 11, 12, 13, 14 (1 = confirmarea); -paranteză „ultimele 4 candele"; Level 51.60 „cel mai jos low: 51.60 (doji)"; -Level 51.55 roșu „SL 51.55". -Jos: Level 52.90 portocaliu „stop la ochi 52.90 — lovit"; Level 51.55 roșu -„SL din regulă 51.55 — ținut"; Level 55.85 verde punctat „TP1 55.85"; -Mark(16, "al doilea picior: 52.00, higher low", below). +ADNOTĂRI +-------- +Sus: zonă albastră peste cele 4 candele numărate, „numeri 4 candele, începând +cu confirmarea"; numerele 4 3 2 1 sub ele și (5) sub a cincea; Level „stopul: +49.20"; săgeți: „cel mai jos low din cele 4: 49.25 (e al doji-ului)", +„stopul: 49.20, cu 5 cenți mai jos / sub el, ideea că vânzătorii au obosit e +moartă", „confirmarea: close 50.40 / de aici numeri înapoi". +Jos: Level-uri 51.60 / 50.40 / 49.70 / 49.20; zonă roșie între 49.70 și 49.20 +peste barele +1 și +2, etichetă „pe aici trece al doilea picior"; săgeți: +stopul la ochi măturat, al doilea picior 49.50 („fundurile fac des asta"), +stopul din regulă ține, și „prețul ajunge la țintă / dar numai cu stopul corect +mai erai în trade". ASSERT-URI ---------- -1. open[i] == close[i-1] pe barele 15-20; h/l cuprind o/c. -2. min(l[11:15]) == min(l[10:15]) == 51.60 (4 sau 5 candele: același rezultat). -3. min(l[15:21]) == 52.00; 52.00 < 52.90 și 52.00 > 51.55. -4. primul i>14 cu low <= 52.90 este 15; niciun low din 15-20 <= 51.55. -5. primul i>14 cu high >= 55.85 este 20. -6. 52.00 > 51.60 (al doilea picior e higher low). +1. h/l cuprind o/c; open[i] == close[i-1] pe toată seria panoului de jos. +2. min(low) pe ultimele 4 candele == pe ultimele 5 == 49.25 (low-ul doji-ului); + 49.25 - 0.05 == 49.20. +3. min(low) după intrare == 49.50, cu 49.20 < 49.50 < 49.70. +4. prima bară de după intrare cu low <= 49.70 e a doua (al doilea picior); + nicio bară de după intrare nu are low <= 49.20. +5. ținta 51.60 e atinsă abia la a 6-a bară de după intrare. +6. 49.50 > 49.25 (al doilea picior e higher low). +7. 50.40 - 49.70 == 0.70 < 1.20 (stopul la ochi e mai aproape de intrare) și + 49.25 < 49.70 < low-ul candelei de confirmare (49.75). +8. niciun text nu iese din pânză. SURSA ----- -- SL = extrema ultimelor 4 candele de la confirmare: summaries/03_MODUL_2/13_strategia_3_byh.md:192-193; - în practică swing low-ul: summaries/09_QA/22_2025-08-04.md:23-29. -- Stopul sub structură, nu „undeva jos"; bottom-ul mai poate face un picior: +- SL = extrema ultimelor 4 candele de la confirmare: summaries/03_MODUL_2/ + 13_strategia_3_byh.md:192-193; în practică swing low-ul: summaries/09_QA/ + 22_2025-08-04.md:23-29. +- Stopul sub structură; bottom-ul mai poate face un picior: summaries/08_ANALIZA_ZILNICA/01_buy_doji_si_strategia_mici.md:833-836. -- Stopul „la ochi" 52.90 și barele 15-20 sunt CONSTRUITE (contrast). +- Stopul „la ochi" 49.70 și barele de după intrare sunt CONSTRUITE (contrast). diff --git a/gen/strategii/buy_doji_stop.svg b/gen/strategii/buy_doji_stop.svg index 66765ae..d3b51c3 100644 --- a/gen/strategii/buy_doji_stop.svg +++ b/gen/strategii/buy_doji_stop.svg @@ -1,104 +1,112 @@ - - Unde pui stopul: 4 candele înapoi, sub structură — exemplu construit - - cel mai jos low: 51.60 (doji) - - SL 51.55 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - 4 - 3 - 2 - 1 - (5) - - ultimele 4 candele (3 = doji, 1 = confirmarea) - Cu 4 sau cu 5 candele iese la fel: în downtrend low-ul dojiului e oricum cel mai jos. SL = 51.60 − 0.05. - - Același trade: stop la ochi (0.80 sub intrare) vs stop din regulă - - TP1 55.85 - - intrare 53.70 - - stop la ochi 52.90 — lovit - - SL din regulă 51.55 — ținut - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - al doilea picior: 52.00, higher low - TP1 - Barele 15-20 și stopul la ochi sunt construite, pentru contrast. - + + Pasul 5 — stopul: numeri 4 candele înapoi de la confirmare + + numeri 4 candele, începând cu confirmarea + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + cel mai jos low din cele 4: 49.25 + (e al doji-ului) + + + stopul: 49.20, cu 5 cenți mai jos + sub el, ideea că vânzătorii + au obosit e moartă + + + confirmarea: close 50.40 + de aici numeri înapoi + 4 + 3 + 2 + 1 + (5) + cu 4 sau cu 5 candele iese la fel: în scădere, low-ul doji-ului e oricum cel mai jos + + Același trade: stop „la ochi” (sub candela de confirmare) vs stopul din regulă + + + ținta 1: 51.60 + + intrarea: 50.40 + + stop pus la ochi: 49.70 + + stopul din regulă: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stopul pus la ochi (49.70) e măturat + era prea aproape de intrare + + + al doilea picior al fundului: 49.50 + fundurile fac des asta + + + stopul din regulă (49.20) ține + al doilea picior rămâne peste el + + + prețul ajunge la țintă + dar numai cu stopul corect + mai erai în trade + Barele de după intrare și stopul la ochi sunt construite, pentru contrast. + pe aici trece al doilea picior \ No newline at end of file diff --git a/gen/strategii/buy_doji_transe.py b/gen/strategii/buy_doji_transe.py index 0ff9598..0bbfb25 100644 --- a/gen/strategii/buy_doji_transe.py +++ b/gen/strategii/buy_doji_transe.py @@ -1,132 +1,134 @@ -"""Buy Doji — intrarea în trei tranșe (exemplu construit, doji 53.00 / 51.60). +"""Buy Doji — intrarea în trei tranșe, pe același trade ca restul capitolului. -Citește specificația `gen/strategii/buy_doji_transe.spec.txt`. Barele 0-14 -sunt aceleași ca în buy_doji_stop.py. Nivelurile de 1/3 și 1/2 se calculează -din corpul candelei de confirmare, nu se scriu de mână. +Citește `gen/strategii/buy_doji_transe.spec.txt`. Barele vin din +`buy_doji_ansamblu.serie()`: doji 50.10/49.25, confirmare cu close 50.40, +stop 49.20. Nivelurile de 1/3 și 1/2 se calculează din corpul candelei de +confirmare (open 49.90 → close 50.40), nu se scriu de mână. + +Lecția: împărțind intrarea în trei, prețul mediu scade de la 50.40 la +50.26, deci riscul pe acțiune de la 1.20 la 1.06 — dacă prețul revine. +Bara de după confirmare coboară la 50.10 și umple ambele ordine limită. """ import re -import sys; sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Candle, Chart, Level, Mark +import sys +from pathlib import Path -OUT = "/workspace/atm-curs-dl/gen/strategii/buy_doji_transe.svg" +sys.path.insert(0, "/workspace/atm-curs-dl") +sys.path.insert(0, str(Path(__file__).parent)) +from svg_candles import Chart, Level, Zone, Arrow # noqa: E402 +from buy_doji_ansamblu import serie, DOJI, CONF, DOJI_L, ENTRY, SL, TP1, R # noqa: E402 -# --- seria: barele 0-14 identice cu buy_doji_stop.py -------------------------- -closes = [60.40, 59.60, 59.90, 58.80, 58.10, 58.40, 57.20, 56.30, 56.60, - 55.30, 54.20, 52.40] -bars, o = [], 61.00 -for c in closes: # fitile implicite 0.15 peste/sub corp - bars.append((o, max(o, c) + 0.15, min(o, c) - 0.15, c)) - o = c -bars += [(52.40, 53.00, 51.60, 52.30), # 12 doji - (52.30, 52.85, 52.10, 52.60), # 13 +1 - (52.60, 53.85, 52.45, 53.70), # 14 confirmare - (53.70, 53.80, 53.10, 53.45), # 15 umple 1/3 și 1/2 - (53.45, 54.20, 53.35, 54.10), - (54.10, 54.85, 54.00, 54.70), - (54.70, 56.00, 54.60, 55.90)] # 18 TP1 -o_, h_, l_, c_ = (list(x) for x in zip(*bars)) +OUT = Path(__file__).with_suffix(".svg") +S = 12 # prima bară arătată (zoom pe fereastra de intrare) +GREEN, RED, ORANGE, BLUE, GREY = "#188a3e", "#c00", "#b06000", "#1a5fb4", "#555" +W, SCALE = 930, 100.0 -# --- nivelurile, calculate din corpul barei 14 --------------------------------- -op, T1 = o_[14], c_[14] -corp = T1 - op +cds = serie()[S:20] # până la bara care atinge ținta +d, cf = DOJI - S, CONF - S # doji, confirmare (indici locali) +op, T1 = cds[cf].o, cds[cf].c # corpul candelei de confirmare +corp = round(T1 - op, 2) T2, T3 = round(T1 - corp / 3, 2), round(T1 - corp / 2, 2) MED = round((T1 + T2 + T3) / 3, 2) -SL = round(min(l_[11:15]) - 0.05, 2) -TP1 = round(T1 + (T1 - SL), 2) +RISC_MED, RISC_CLOSE = round(MED - SL, 2), round(T1 - SL, 2) +TP_MED = round(MED + RISC_MED, 2) # ținta de 1R socotită de la prețul mediu +retest = cds[cf + 1] + +# --- aserțiuni ------------------------------------------------------------------ +assert (op, T1) == (49.90, ENTRY) and corp == 0.50, (op, T1, corp) +assert (T2, T3) == (50.23, 50.15), (T2, T3) +assert MED == 50.26 and RISC_MED == 1.06 and RISC_CLOSE == R == 1.20 +assert retest.l <= T3 < T2, "bara de după confirmare nu umple ambele ordine" +assert round(retest.l, 2) == 50.10, retest.l +assert min(c.l for c in cds[cf - 3:cf + 1]) == DOJI_L and round(DOJI_L - 0.05, 2) == SL +assert round(T1 + RISC_CLOSE, 2) == TP1 +# ținta de 1R vine mai devreme dacă prețul mediu de intrare e mai bun +assert TP_MED == 51.32 == round(MED + RISC_MED, 2) and TP_MED < TP1 +assert next(i for i in range(cf + 1, len(cds)) if cds[i].h >= TP1) == len(cds) - 1 +# măsurat pe toată candela (nu doar pe corp) 1/2 iese tot T3; 1/3 iese 50.28 +hi, lo = cds[cf].h, cds[cf].l +assert round(hi - (hi - lo) / 3, 2) == 50.28 and round((hi + lo) / 2, 2) == T3 +print(f"transe: T1 {T1:.2f} T2 {T2:.2f} T3 {T3:.2f} medie {MED:.2f} " + f"risc {RISC_MED:.2f} (față de {RISC_CLOSE:.2f}) retest low {retest.l:.2f}") + + +def dy_sub(price, rand): + """Săgeata pleacă din nivel și coboară sub linia stopului, pe rândul `rand`.""" + return (price - SL) * SCALE + rand -# --- assert-urile din spec ----------------------------------------------------- -for i in range(1, len(bars)): # 1 - assert abs(o_[i] - c_[i - 1]) < 1e-9, f"open[{i}] != close[{i-1}]" -for i in range(len(bars)): - assert l_[i] <= min(o_[i], c_[i]) and h_[i] >= max(o_[i], c_[i]), f"bara {i}" -assert abs(o_[12] - c_[12]) <= 0.10 * (h_[12] - l_[12]) + 1e-9 # 2 -assert c_[13] <= h_[12] < c_[14] and h_[12] == 53.00 -assert min(l_[11:15]) == l_[12] == 51.60 and SL == 51.55 # 3 -assert (op, T1) == (52.60, 53.70) and (T2, T3) == (53.33, 53.15) # 4 -assert l_[15] <= T3 < T2 # 5 -assert MED == 53.39 and round(MED - SL, 2) == 1.84 # 6 -assert round(T1 - SL, 2) == 2.15 -assert TP1 == 55.85 # 7 -assert next(i for i in range(15, len(bars)) if h_[i] >= TP1) == 18 -hi, lo = h_[14], l_[14] # 8 -assert round(hi - (hi - lo) / 3, 2) == 53.38 and round((hi + lo) / 2, 2) == T3 -GREY, RED, ORANGE, GREEN, BLUE = "#555", "#c00", "#b06000", "#188a3e", "#1a5fb4" -W = 780 ch = Chart( - candles=[Candle(*b) for b in bars], - levels=[Level(TP1, f"TP1 {TP1:.2f} = 1R de la close", GREEN, "2 2"), - Level(SL, f"SL {SL:.2f} (low 4 candele 51.60, minus 5 cenți)", RED, "4 3")], - marks=[Mark(14, f"confirmare {T1:.2f}", GREEN, "above", dy=-38)], - title="Intrarea în trei tranșe — daily, exemplu construit (doji 53.00 / 51.60)", - scale=58.0, gap=18, body_w=10, left=44, width=W, + candles=cds, + levels=[Level(TP1, "ținta 1: 51.60 = 1R față de close", GREEN, "2 2"), + Level(TP_MED, f"ținta 1: {TP_MED:.2f} = 1R față de prețul mediu {MED:.2f}", BLUE, "2 2"), + Level(SL, "stopul: 49.20", RED, "4 3", "left")], + zones=[Zone(cf, cf, "", GREEN, p_top=T1, p_bot=op)], + arrows=[ + Arrow(cf, "1/3 la close 50.40\nca să nu ratezi trade-ul dacă pleacă fără tine", + where="right", price=T1, color=GREEN, dx=150, dy=dy_sub(T1, 40)), + Arrow(cf, "1/3 cu ordin limită la 50.23 (o treime din corp)\nmai ieftin, dacă prețul revine", + where="right", price=T2, color=ORANGE, dx=150, dy=dy_sub(T2, 74)), + Arrow(cf, "1/3 cu ordin limită la 50.15 (jumătatea corpului)\nși mai ieftin", + where="right", price=T3, color=ORANGE, dx=150, dy=dy_sub(T3, 108)), + Arrow(cf - 1, "media mai bună coboară ținta:\nieși la 51.32, nu la 51.60", + where="above", price=TP_MED, color=BLUE, dx=150), + Arrow(cf + 1, "retestul: prețul revine la 50.10\nși umple amândouă ordinele limită", + where="below", price=retest.l, color=BLUE, dx=-150, dy=20), + ], + scale=SCALE, gap=30, body_w=10, left=56, width=W, + title="Intrarea în trei tranșe — același trade (doji 50.10 / 49.25)", + caption="Paranteza de pe candela de confirmare e corpul ei (49.90 → 50.40): pe el se măsoară 1/3 și 1/2. Stopul e unul singur. Exemplu construit.", ) svg = ch.render() -y, x = ch._y, ch._cx +OFF = (float(re.search(r']*stroke="#1a1a1a"', svg).group(1)) + - ch._cx(0)) + + +def Y(p): + return ch._y(p) + OFF + + +def x(i): + return ch._cx(i) + OFF_X ex = [] - -# linia de ghidaj de la confirmare la eticheta ei (eticheta stă sus, peste bara 17) -ex.append(f'') - -# cele trei tranșe: linii de la bara 13 până la paranteza corpului -XB = 404 # paranteza corpului barei 14 -for p, col, dash in ((T1, GREEN, ""), (T2, ORANGE, "3 3"), (T3, ORANGE, "3 3")): - d = f' stroke-dasharray="{dash}"' if dash else "" - ex.append(f'') -# paranteza: open 52.60 → close 53.70, cu diviziuni la 1/3 și 1/2 -ex.append(f'') -ex.append(f'') -ex.append(f'') - -# etichetele, răsfirate la dreapta, cu linii de ghidaj -yc, XL = y((T1 + T3) / 2), 440 -labels = [(T1, f"1/3 la close {T1:.2f}", GREEN, ""), - (MED, f"medie {MED:.2f} → risc {MED - SL:.2f} pe acțiune (tot la close: {T1 - SL:.2f})", "#777", "2 2"), - (T2, f"1/3 la 1/3 din corp {T2:.2f}", ORANGE, "3 3"), - (T3, f"1/3 la 1/2 din corp {T3:.2f}", ORANGE, "3 3"), - (op, f"corp: open {op:.2f} → close {T1:.2f} = {corp:.2f}", GREY, "")] -for k, (p, txt, col, dash) in enumerate(labels): - ly = yc + (k - 1.5) * 22 - d = f' stroke-dasharray="{dash}"' if dash else "" - ex.append(f'') - ex.append(f'{txt}') - -# umpleri: T1 la close-ul barei 14, T2 și T3 pe low-ul barei 15; TP1 pe bara 18 -for i, p, col in ((14, T1, GREEN), (15, T2, ORANGE), (15, T3, ORANGE), (18, TP1, GREEN)): - ex.append(f'') +# fără etichetă lângă paranteză: oriunde lângă candele s-ar suprapune peste ele +# sau peste liniile săgeților. O numește legenda de sub grafic. +# nivelurile de tranșă, ca segmente scurte peste candela de confirmare +for p, col in ((T1, GREEN), (T2, ORANGE), (T3, ORANGE)): + dash = "" if p == T1 else ' stroke-dasharray="3 3"' + ex.append(f'') +# unde se umple fiecare tranșă: T1 la close, T2 și T3 pe low-ul barei următoare +for i, p, col in ((cf, T1, GREEN), (cf + 1, T2, ORANGE), (cf + 1, T3, ORANGE)): + ex.append(f'') - -# etichetele de sub candele, pe rânduri (Mark "below" le-ar pune pe același rând) -yb = y(SL) + 20 -rows = [(15, f"low {l_[15]:.2f}: umple T2 și T3", ORANGE), - (13, f"+1: {c_[13]:.2f}, sub high", GREY), - (12, f"doji {h_[12]:.2f} / {l_[12]:.2f}", BLUE)] -for r, (i, txt, col) in enumerate(rows): - ry = yb + 16 * r - ex.append(f'') - ex.append(f'') + ex.append(f'{txt}') - -# legenda, pe două rânduri -ly = yb + 16 * len(rows) + 14 -ex.append(f'Măsurat pe corp (open {op:.2f} → close {T1:.2f}). ' - f'Măsurat pe toată candela ({lo:.2f} → {hi:.2f}), 1/3 ar fi ' - f'{hi - (hi - lo) / 3:.2f}; 1/2 iese tot {(hi + lo) / 2:.2f}.') -ex.append(f'Stopul e unul singur, pentru toată ' - f'poziția. Barele 0-11 și 15-18 sunt construite.') -H = ly + 17 + 12 - body = svg.rsplit("", 1)[0].rstrip() svg = "\n ".join([body, *ex]) + "\n" -svg = re.sub(r'viewBox="0 0 (\d+) [\d.]+"', rf'viewBox="0 0 \1 {H:.0f}"', svg, count=1) -assert "]*)>(.*?)', svg): + ty = float(re.search(r'y="([-\d.]+)"', attrs).group(1)) + w = len(txt) * 6.2 + x0 = float(tx) - (w if 'text-anchor="end"' in attrs else w / 2 if 'middle' in attrs else 0) + assert 0 <= x0 and x0 + w <= vw and 0 <= ty <= vh, f"text în afara pânzei: {txt!r}" +assert "\n\n" not in svg, "linie goală în SVG" +OUT.write_text(svg, encoding="utf-8") +print(f"scris {OUT} ({vw:.0f}x{vh:.0f})") diff --git a/gen/strategii/buy_doji_transe.spec.txt b/gen/strategii/buy_doji_transe.spec.txt index 70e1ae0..5acaae1 100644 --- a/gen/strategii/buy_doji_transe.spec.txt +++ b/gen/strategii/buy_doji_transe.spec.txt @@ -1,69 +1,53 @@ SPEC DIAGRAMĂ — buy_doji_transe =============================== -tip: PRET -destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 7 (intrarea) +tip: PRET (un panou, zoom pe fereastra de intrare) +destinație: summaries/17_STRATEGII/01_buy_doji.md, nivelul 3 (tranșele) cheie markdown: -titlu SVG: „Intrarea în trei tranșe — daily, exemplu construit (doji 53.00 / 51.60)" -stil: candele lipite (gap 15-18, body_w 9-10), fără volum; - open = close anterior, fitile implicite 0.15 peste/sub corp la barele 0-11. +titlu SVG: „Intrarea în trei tranșe — același trade (doji 50.10 / 49.25)" +serie: `buy_doji_ansamblu.serie()`, barele 12-19. CE TREBUIE SĂ DEMONSTREZE ------------------------- -Pe candela de confirmare: o treime din poziție la close (53.70), o treime -cu limit la 1/3 din corp (53.33), o treime cu limit la 1/2 (53.15). Bara de -după coboară până la 53.10 și le umple pe amândouă. Stopul e unul singur. -Prețul mediu 53.39 → risc 1.84 pe acțiune, față de 2.15 cu tot la close. - -SERIA (19 bare, (o,h,l,c)) --------------------------- -open[0] = 61.00; close-uri 0-11 (downtrend de 12 candele): -60.40, 59.60, 59.90, 58.80, 58.10, 58.40, 57.20, 56.30, 56.60, 55.30, 54.20, 52.40 -12 doji (52.40, 53.00, 51.60, 52.30) -13 +1 (52.30, 52.85, 52.10, 52.60) close sub 53.00: încă nimic -14 confirmare (52.60, 53.85, 52.45, 53.70) close peste 53.00: Buy Doji -15 (53.70, 53.80, 53.10, 53.45) umple 1/3 și 1/2 -16 (53.45, 54.20, 53.35, 54.10) -17 (54.10, 54.85, 54.00, 54.70) -18 (54.70, 56.00, 54.60, 55.90) atinge TP1 55.85 (a 4-a după intrare) +Pe candela de confirmare (open 49.90 → close 50.40, corp 0.50): o treime din +poziție la close 50.40, o treime cu ordin limită la 1/3 din corp (50.23), o +treime la 1/2 din corp (50.15). Bara următoare coboară la 50.10 (retest) și +umple amândouă ordinele limită. Prețul mediu iese 50.26, deci riscul pe acțiune +scade de la 1.20 (tot la close) la 1.06. Stopul rămâne unul singur, 49.20. NIVELURI -------- -T1 53.70 verde „1/3 la close 53.70" -T2 53.33 portocaliu punctat „1/3 la 1/3 din corp 53.33" -T3 53.15 portocaliu punctat „1/3 la 1/2 din corp 53.15" -preț mediu 53.39 gri punctat „medie 53.39" -SL 51.55 roșu „SL 51.55 (low 4 candele 51.60, minus 5 cenți)" -TP1 55.85 verde punctat „TP1 55.85 = 1R de la close" +T1 50.40 (close) · T2 50.23 (o treime din corp) · T3 50.15 (jumătatea corpului) +preț mediu 50.26 · stop 49.20 +ținta de 1R față de close: 51.60 (atinsă la ultima bară arătată) +ținta de 1R față de prețul mediu: 51.32 (50.26 + 1.06) — vine mai devreme, + ăsta e avantajul tranșelor; desenată ca al doilea nivel punctat +Măsurat pe toată candela (49.75 → 50.55), 1/3 ar fi 50.28, iar 1/2 iese tot 50.15. -MARKS ------ -Mark(12, "doji 53.00 / 51.60"), Mark(13, "+1: 52.60, sub high"), -Mark(14, "confirmare 53.70"), Mark(15, "low 53.10: umple T2 și T3", below) - -LEGENDĂ -------- -„Măsurat pe corp (open 52.60 → close 53.70). Măsurat pe toată candela -(52.45 → 53.85), 1/3 ar fi 53.38; 1/2 iese tot 53.15." +ADNOTĂRI +-------- +Zonă verde peste corpul candelei de confirmare; paranteză cu corpul +(49.90 → 50.40) în stânga ei; trei segmente scurte pentru T1/T2/T3 și cerculețe +acolo unde se umple fiecare tranșă (T1 la close, T2 și T3 pe low-ul barei +următoare); trei săgeți, câte una pe tranșă, cu motivul („ca să nu ratezi +trade-ul dacă pleacă fără tine" / „mai ieftin, dacă prețul revine" / „și mai +ieftin"); o săgeată pe retest; două paranteze de risc la dreapta: 1.20 tot la +close vs 1.06 cu tranșe. ASSERT-URI ---------- -1. open[i] == close[i-1]; h/l cuprind o/c. -2. doji: abs(o-c) <= 0.10*(h-l); close[13] <= 53.00 < close[14]. -3. min(l[11:15]) == 51.60 (low-ul dojiului e cel mai jos din 4); SL == 51.55. -4. corp = 53.70 - 52.60; round(53.70 - corp/3, 2) == 53.33; round(53.70 - corp/2, 2) == 53.15. -5. low[15] <= 53.15 (ambele limit-uri umplute). -6. round((53.70+53.33+53.15)/3, 2) == 53.39; round(53.39-51.55, 2) == 1.84; - round(53.70-51.55, 2) == 2.15. -7. TP1 == 53.70 + 2.15 == 55.85; primul i>14 cu high >= 55.85 este 18. -8. round(53.85 - (53.85-52.45)/3, 2) == 53.38; (53.85+52.45)/2 == 53.15. +1. corpul candelei de confirmare: open 49.90, close 50.40, corp 0.50. +2. T2 == 50.23 și T3 == 50.15 (calculate din corp, nu scrise de mână). +3. medie == 50.26; medie - stop == 1.06; close - stop == 1.20 == 1R. +3b. ținta de la medie == 51.32 == medie + 1.06, și e sub 51.60. +4. low-ul barei următoare == 50.10 <= T3 (ambele ordine limită se umplu). +5. min(low) pe ultimele 4 candele de la confirmare == 49.25; stop 49.20. +6. close + 1.20 == 51.60, atinsă prima dată la ultima bară arătată. +7. măsurat pe toată candela: 1/3 == 50.28, 1/2 == 50.15 (tot T3). +8. niciun text nu iese din pânză. SURSA ----- -- Doji 53.00/51.60, close 52.60 apoi 53.70, SL 51.55, TP1 55.85 atins la a 4-a: - summaries/08_ANALIZA_ZILNICA/01_buy_doji_si_strategia_mici.md:136-144 (exemplu construit - al sumarului; seria de aici îl redesenează cu aceleași niveluri). -- Tranșele 1/3 la close, 1/3 la 1/3, 1/3 la 1/2: summaries/09_QA/23_2025-07-29.md:206-213; - transcripts/09_Q_and_A/19_08092025.txt:1067-1073 (citat în A3_intrarea.md:276-279). -- Măsurat de la low sau de la open: summaries/09_QA/20_2025-08-25.md:178-180; - „Iei high-ul și low-ul și calculezi": summaries/09_QA/23_2025-07-29.md:210-211. -- Barele 0-11 și 15-18 sunt CONSTRUITE. +- Tranșele 1/3 la close, 1/3 la 1/3 din corp, 1/3 la 1/2: summaries/09_QA/ + 23_2025-07-29.md:206-213; transcripts/09_Q_and_A/19_08092025.txt:1067-1073. +- Măsurat de la low sau de la open: summaries/09_QA/20_2025-08-25.md:178-180. +- Barele sunt CONSTRUITE (aceeași serie ca restul capitolului). diff --git a/gen/strategii/buy_doji_transe.svg b/gen/strategii/buy_doji_transe.svg index 79c3ac2..76ea005 100644 --- a/gen/strategii/buy_doji_transe.svg +++ b/gen/strategii/buy_doji_transe.svg @@ -1,75 +1,58 @@ - - Intrarea în trei tranșe — daily, exemplu construit (doji 53.00 / 51.60) - - TP1 55.85 = 1R de la close - - SL 51.55 (low 4 candele 51.60, minus 5 cenți) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - - - - - - - 1/3 la close 53.70 - - medie 53.39 → risc 1.84 pe acțiune (tot la close: 2.15) - - 1/3 la 1/3 din corp 53.33 - - 1/3 la 1/2 din corp 53.15 - - corp: open 52.60 → close 53.70 = 1.10 - - - - - - low 53.10: umple T2 și T3 - - +1: 52.60, sub high - - doji 53.00 / 51.60 - Măsurat pe corp (open 52.60 → close 53.70). Măsurat pe toată candela (52.45 → 53.85), 1/3 ar fi 53.38; 1/2 iese tot 53.15. - Stopul e unul singur, pentru toată poziția. Barele 0-11 și 15-18 sunt construite. + + Intrarea în trei tranșe — același trade (doji 50.10 / 49.25) + + + ținta 1: 51.60 = 1R față de close + + ținta 1: 51.32 = 1R față de prețul mediu 50.26 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + 1/3 la close 50.40 + ca să nu ratezi trade-ul dacă pleacă fără tine + + + 1/3 cu ordin limită la 50.23 (o treime din corp) + mai ieftin, dacă prețul revine + + + 1/3 cu ordin limită la 50.15 (jumătatea corpului) + și mai ieftin + + + media mai bună coboară ținta: + ieși la 51.32, nu la 51.60 + + + retestul: prețul revine la 50.10 + și umple amândouă ordinele limită + Paranteza de pe candela de confirmare e corpul ei (49.90 → 50.40): pe el se măsoară 1/3 și 1/2. Stopul e unul singur. Exemplu construit. + + + + + + + + + risc 1.20 pe acțiune (tot la close) + + risc 1.06 pe acțiune (cu tranșe, preț mediu 50.26) \ No newline at end of file diff --git a/gen/strategii/buy_doji_trend.py b/gen/strategii/buy_doji_trend.py index b29ca56..41e0965 100644 --- a/gen/strategii/buy_doji_trend.py +++ b/gen/strategii/buy_doji_trend.py @@ -8,10 +8,10 @@ trendului sunt numerotate sub bară, ca numărătoarea să se vadă. """ import re import sys; sys.path.insert(0, "/workspace/atm-curs-dl") -from svg_candles import Candle, Chart, Mark +from svg_candles import Arrow, Candle, Chart, Mark, Zone OUT = "/workspace/atm-curs-dl/gen/strategii/buy_doji_trend.svg" -DOJI = (49.65, 50.10, 49.20, 49.60) +DOJI = (49.65, 50.10, 49.25, 49.60) CONF = (49.60, 50.55, 49.45, 50.40) @@ -54,12 +54,20 @@ def numbers(ch, idx, color): for n, i in enumerate(idx, 1)] -def bracket(ch, a, b, y, text, color): - xa, xb = ch._cx(a) - 6, ch._cx(b) + 6 - return [f'', - f'{text}'] +def render_keep_offsets(ch): + """`Chart.render()` restaurează top/left după desen, deci `_y`/`_cx` de + după el dau coordonate deplasate față de body-ul randat (titlul și + etichetele zonelor mută graficul în jos). `_render()` lasă offset-urile + puse, exact ce ne trebuie ca extra-urile desenate de mână să pice la locul + lor. Se cheamă o singură dată per Chart.""" + return ch._render() + + +def fits(ch, svg): + """Chart mută graficul dacă un text ar ieși din pânză — aici mutarea ar + dezalinia cele două panouri, deci verificăm că nu s-a întâmplat.""" + assert f'viewBox="0 0 {ch.width} ' in svg, \ + f"Chart a lărgit pânza ({svg[:60]}): textul unei săgeți iese din {ch.width}px" def body(svg): @@ -68,32 +76,35 @@ def body(svg): # --- panoul de sus: 9 candele ------------------------------------------------ top = Chart(candles=[Candle(*b) for b in L], left=44 + GAP, # dojiul pe aceeași verticală - marks=[Mark(10, "doji", ORANGE, "below", dy=8), - Mark(11, "confirmare 50.40", GREEN, "above")], - title="Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit", + marks=[Mark(11, "confirmare 50.40", GREEN, "above")], + zones=[Zone(1, 9, "9 candele de scădere — ideal", GREEN)], + arrows=[Arrow(10, "doji la capătul scăderii\nvânzătorii s-au terminat", + where="below", color=ORANGE, dx=70)], + top=54, # titlul se desenează de mână: cel din Chart ar cădea peste eticheta zonei **common) -svg_top = top.render() -y_br = top._y(max(b[1] for b in L[1:10])) - 10 -ext_top = numbers(top, range(1, 10), RED) + bracket(top, 1, 9, y_br, "downtrend 9 candele", RED) -y_cap1 = top._y(DOJI[2]) + 50 +svg_top = render_keep_offsets(top) +fits(top, svg_top) +ext_top = numbers(top, range(1, 10), RED) + [ + 'Trendul dinaintea dojiului: ' + '9 candele vs. 3 candele — exemplu construit'] +y_cap1 = max(top._y(DOJI[2]) + 50, top._arrow_geom(top.arrows[0])["box"][3] + 24) ext_top.append(f'' f'DA — ideal (8-10 candele)') # --- panoul de jos: range + 3 candele ---------------------------------------- y_sep = y_cap1 + 16 bot = Chart(candles=[Candle(*b) for b in R], left=44, - marks=[Mark(11, "doji", ORANGE, "below", dy=8), + marks=[Mark(11, "doji", ORANGE, "below", dy=22), Mark(12, "confirmare 50.40", GREEN, "above")], - top=int(y_sep + 62), **common) # titlul și paranteza range-ului, desenate mai jos -svg_bot = bot.render() -y_rg = bot._y(max(b[1] for b in R[0:8])) - 10 + zones=[Zone(8, 10, "doar 3 candele — merge, dar mai slab", ORANGE)], + arrows=[Arrow(3, "înainte: preț pe loc,\nnu scădere — de aceea\nsemnalul e mai slab", + where="above", color=GREY)], + top=int(y_sep + 118), **common) # loc pentru titlul panoului și textul săgeții +svg_bot = render_keep_offsets(bot) +fits(bot, svg_bot) ext_bot = (numbers(bot, range(8, 11), RED) - + bracket(bot, 8, 10, bot._y(R[8][1]) - 10, "doar 3 candele", RED) - + bracket(bot, 0, 7, y_rg, "", GREY) + [f'' - f'Același doji, după un range', - f'' - f'range: nu se numără']) + f'Același doji, după un range']) y_cap2 = bot._y(DOJI[2]) + 50 ext_bot += [f'' f'ACCEPTAT, semnal mai slab', diff --git a/gen/strategii/buy_doji_trend.spec.txt b/gen/strategii/buy_doji_trend.spec.txt index 182b198..81a4e95 100644 --- a/gen/strategii/buy_doji_trend.spec.txt +++ b/gen/strategii/buy_doji_trend.spec.txt @@ -5,11 +5,12 @@ destinație: summaries/17_STRATEGII/01_buy_doji.md, Pasul 3, după doji_form cheie markdown: titlu SVG: „Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit" stil: candele lipite (gap 15-18, body_w 9-10), fără volum; open = close anterior; + adnotări „ca la proști": zone dreptunghiulare + săgeți cu text (CE + DE CE). fitile implicite 0.15 peste/sub corp, cu excepțiile de mai jos. CE TREBUIE SĂ DEMONSTREZE ------------------------- -Același doji (h 50.10 / l 49.20) și aceeași confirmare (close 50.40), după +Același doji (h 50.10 / l 49.25) și aceeași confirmare (close 50.40), după două trenduri diferite. Stânga = ideal (9 candele). Dreapta = acceptat, dar semnal mai slab (3 candele după un range) — și e cazul pe care scannerul cu „Since Bear ≥ 8" nu-l găsește. @@ -18,18 +19,22 @@ PANOUL STÂNGA — 12 bare ----------------------- open[0] = 55.50; close-uri 0-9: 55.00, 54.30, 54.60, 53.60, 52.90, 53.10, 52.00, 51.20, 50.60, 49.65 (barele 1-9 = trendul de 9 candele) -10 doji (49.65, 50.10, 49.20, 49.60) +10 doji (49.65, 50.10, 49.25, 49.60) 11 confirmare (49.60, 50.55, 49.45, 50.40) -Mark(1..9 paranteză, "downtrend 9 candele"), Mark(10,"doji"), Mark(11,"confirmare 50.40"). +Zone(1..9) verde, etichetă „9 candele de scădere — ideal"; numerele 1..9 sub bare; +săgeată pe doji: „doji la capătul scăderii / vânzătorii s-au terminat". +Mark(11,"confirmare 50.40"). Text sub panou: „DA — ideal (8-10 candele)". PANOUL DREAPTA — 13 bare ------------------------ open[0] = 51.40; close-uri 0-7 (range): 51.70, 51.20, 51.60, 51.10, 51.50, 51.30, 51.70, 51.40; apoi 8: 50.90, 9: 50.30, 10: 49.65 (3 candele în jos) -11 doji (49.65, 50.10, 49.20, 49.60) +11 doji (49.65, 50.10, 49.25, 49.60) 12 confirmare (49.60, 50.55, 49.45, 50.40) -Mark(8..10 paranteză, "doar 3 candele"), Mark(12,"confirmare 50.40"). +Zone(8..10) portocalie, etichetă „doar 3 candele — merge, dar mai slab"; numerele +1..3 sub bare; săgeată pe range (bara 3): „înainte: preț pe loc, / nu scădere — de +aceea / semnalul e mai slab". Mark(11,"doji"), Mark(12,"confirmare 50.40"). Text sub panou: „ACCEPTAT, semnal mai slab · scannerul cu Since Bear ≥ 8 nu-l vede". ASSERT-URI @@ -42,6 +47,14 @@ ASSERT-URI close[8] > close[9] > close[10] (exact 3 candele în jos). 5. Confirmarea închide peste 50.10 pe ambele. +NOTĂ DE RANDARE +--------------- +Extra-urile desenate de mână (numere, titlu) folosesc `ch._render()`, nu +`ch.render()`: al doilea restaurează top/left după desen, deci `_y`/`_cx` ar da +coordonate deplasate cu offset-ul pe care Chart îl pune pentru titlu și pentru +etichetele zonelor. Titlul panoului de sus e desenat de mână din același motiv +(titlul din Chart cade exact peste eticheta zonei). + SURSA ----- - 8-10 candele ideal; 2-3 candele au funcționat, semnal mai slab: diff --git a/gen/strategii/buy_doji_trend.svg b/gen/strategii/buy_doji_trend.svg index 45f998f..dc1a20d 100644 --- a/gen/strategii/buy_doji_trend.svg +++ b/gen/strategii/buy_doji_trend.svg @@ -1,81 +1,86 @@ - - Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - - downtrend 9 candele - DA — ideal (8-10 candele) - - - - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - - doar 3 candele - - - Același doji, după un range - range: nu se numără - ACCEPTAT, semnal mai slab - scannerul cu Since Bear ≥ 8 nu-l vede + + + 9 candele de scădere — ideal + + + + + + + + + + + + + + + + + + + + + + + + + confirmare 50.40 + + + doji la capătul scăderii + vânzătorii s-au terminat + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit + DA — ideal (8-10 candele) + + + doar 3 candele — merge, dar mai slab + + + + + + + + + + + + + + + + + + + + + + + + + + + doji + confirmare 50.40 + + + înainte: preț pe loc, + nu scădere — de aceea + semnalul e mai slab + 1 + 2 + 3 + Același doji, după un range + ACCEPTAT, semnal mai slab + scannerul cu Since Bear ≥ 8 nu-l vede \ No newline at end of file diff --git a/summaries/17_STRATEGII/00_harta.html b/summaries/17_STRATEGII/00_harta.html index 48e04ab..5ed3d27 100644 --- a/summaries/17_STRATEGII/00_harta.html +++ b/summaries/17_STRATEGII/00_harta.html @@ -214,6 +214,6 @@ capitolului respectiv, secțiunea 2.2 (A+ vs. mediocru), apoi A2.

  • Patru sesiuni de analiză zilnică nu sunt ținute de autor (25, 26, 29 și 30 iunie 2026 — un înlocuitor). Regulile care se sprijineau doar pe zilele alea au fost scoase din material încă de la sumarizare.
  • - + diff --git a/summaries/17_STRATEGII/01_buy_doji.html b/summaries/17_STRATEGII/01_buy_doji.html index 1d1ba5f..cc521fb 100644 --- a/summaries/17_STRATEGII/01_buy_doji.html +++ b/summaries/17_STRATEGII/01_buy_doji.html @@ -3,7 +3,7 @@ -1. Buy Doji / Sell Doji (Strategia 3 / BYH) +1. Buy Doji / Sell Doji (Strategia 3) -

    1. Buy Doji / Sell Doji (Strategia 3 / BYH)

    -

    Etichete: long short · swing (daily) / intraday (60 min) / -investiție (weekly-monthly, varianta MICI) · acțiuni US futures BVB · -dificultate 2/5 · merge pe prop: da, cu ajustări · -merge pe BVB: da, long-only

    -

    Ce face. Cumperi când un doji apărut la capătul unei scăderi e urmat, în -maximum 3 candele, de o candelă care închide peste high-ul lui. Stopul -stă sub cele mai joase 4 candele, prima țintă e la aceeași distanță (1:1), -restul poziției merge pe trailing. Sell Doji e oglinda, pe short. E singura -regulă de intrare din curs fără niciun indicator proprietar: o vezi cu -ochiul pe orice platformă.

    -

    Pe ce timeframe. „Orice timeframe (5 min → monthly)" -(13_strategia_3_byh.md:10-11). Tu o vei folosi pe trei perechi — setup pe -TF-ul mare, intrare pe cel mic: weekly → daily, monthly → weekly, -daily → 60 min. Pasul 2 le pune una lângă alta.

    -

    Cât de des dă semnal și cât de des merge. Des: e un pattern de o singură -candelă, pe orice asset — de aceea îl predă cursul în locul Morning Star, care -apare rar (03_2026-08-11.md:180-218). Materialul nu dă o cifră de semnale pe -săptămână. Rata declarată nu e unică: 70-75 % -(13_strategia_3_byh.md:11-12), 65-70 % -(01_buy_doji_si_strategia_mici.md:146-152), peste 65 % -(03_2026-08-11.md:185-186) — vezi „Unde se contrazice materialul", punctul 1. -Nu un edge uriaș, de aceea stopul e obligatoriu și de aceea strategia se -repetă des.

    -

    Tot trade-ul, dintr-o privire:

    -

    - Buy Doji — daily (exemplu construit, fără ticker) - - SL 49.20 (low 4 candele) - - intrare 50.40 - - TP1 51.60 = 1R - - trail 52.60 - - MA(20) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 50.10 / 49.20 - ieșire pe trail ~52.60 - bara 15: close 49.90 sub high-ul dojiului 50.10 — NU confirmă - bara 16: close 50.40 peste 50.10 — confirmare (intrare) - Intrare la close-ul confirmării, SL la low-ul ultimelor 4 candele, TP1 1:1, apoi trailing stop. +/Strategii/1. Buy Doji / Sell Doji (Strategia 3)

    1. Buy Doji / Sell Doji (Strategia 3)

    +

    Etichete: long short · swing pe daily · acțiuni US futures BVB · +dificultate 2/5 · merge pe prop: da, cu ajustări · merge pe BVB: da, doar long

    +

    Nivelul 1 — Din avion

    +

    Ce e un doji

    +

    Un doji e o candelă care se închide aproape la prețul la care s-a deschis: +corpul e o linie subțire, iar fitilele ies și în sus, și în jos. Spune că în +perioada aceea cumpărătorii și vânzătorii au fost la egalitate.

    +

    + Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos + + doji + + nu e doji + + + cât de sus a urcat prețul: 50.10 + cât de jos a coborât: 49.20 + + + DA: corp 0.05 + = 5,6 % din înălțime + + + DA, la limită: + corp 0.09 = 10 % + + + NU: corp 0.30 + = 33 % + + + NU: corp mic (5,6 %), + dar fără fitil sus + + + fitilul de sus + cumpărătorii au împins, dar n-au ținut + + + corpul: aproape o linie + open și close aproape egale — nimeni + n-a câștigat ziua + + + fitilul de jos + vânzătorii au împins, dar n-au ținut + open 49.60 + close 49.55 + + + corp prea gros (33 %) + aici una din tabere a câștigat — + nu mai e indecizie + + + fără fitil sus + regula cere fitil în ambele părți + Doji = corpul e cel mult 10 % din înălțimea totală a barei (aici înălțimea e 0.90) și are fitil și sus, și jos.

    -

    Graficul întreg al trade-ului: downtrend de 10 candele → doji → confirmare în -fereastra de 3 → intrare la close-ul de confirmare, SL la extrema ultimelor -4 candele, TP 1:1 atins, apoi poziția rămasă pe trailing stop. Nivelurile -sunt cele din exemplul construit al lecției (13_strategia_3_byh.md:38-95, -:97-100).

    -

    Fraza de decizie:

    +

    Ce face strategia

    +

    Când prețul a scăzut mai multe zile la rând și apare un doji, e posibil ca +vânzătorii să fi obosit. Nu cumperi pe doji. Aștepți ca una din următoarele +trei candele să se închidă peste vârful lui (high-ul) — asta arată că au +preluat controlul cumpărătorii. Atunci cumperi, pui stopul sub ultimele 4 +candele, vinzi o parte când prețul a urcat cât riscai și lași restul să +meargă cât ține creșterea.

    +

    Nu are nevoie de niciun indicator: o vezi cu ochiul, pe orice platformă. Cursul +spune că merge în cam 65-70 % din cazuri, deci cam un trade din trei pierde. +De aceea stopul e obligatoriu.

    +

    Tot trade-ul, pe un exemplu construit:

    +

    + Buy Doji — un trade de la cap la coadă (daily, exemplu construit) + + 1. scăderea: vânzătorii obosesc + + 2. doji: pauză, încă nu intri + + 3. confirmarea + + 4. ieșirea: o treime la țintă, restul pe trail + + ținta 1: 51.60 + + intrare 50.40 + + stop 49.20 + + MA(20) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + stopul 49.20, 5 cenți sub doji + sub el, ideea că vânzătorii + au obosit e moartă + + + AICI INTRI, la close 50.40 + abia acum știi că + cumpărătorii au câștigat + + + ținta 1: 51.60 = riscul (1.20) + încă o dată: vinzi o treime + + + trailing stop: urcă după preț + la fiecare gap, nu coboară + + + ieși la 52.30 (+1.58R) + prima închidere sub trail + + + 1R = 1.20 (riscul) + + 1R = 1.20 (ținta) +

    +

    De la stânga la dreapta: 14 zile de scădere, doji-ul (high 50.10, low 49.25), +o zi care nu confirmă, apoi ziua care se închide la 50.40, peste 50.10 — +acolo intri. Stopul e la 49.20, puțin sub doji, deci riști 1.20 pe acțiune. Prima țintă +e tot la 1.20 deasupra intrării, la 51.60. Restul poziției iese mai târziu, +când prețul se închide sub linia de trailing stop.

    +

    Mini-glosar

    +
      +
    • Doji — candelă cu corp foarte mic și fitile în ambele părți. Regula de + lucru: corpul are cel mult 10 % din înălțimea totală a candelei.
    • +
    • Timeframe (TF) — cât timp acoperă o candelă: pe daily, o zi; pe weekly, + o săptămână. Pe „TF-ul mare" citești direcția, pe „TF-ul mic" intri.
    • +
    • Trigger — evenimentul care îți dă voie să intri. Aici: o candelă care se + închide peste high-ul doji-ului.
    • +
    • Stop-loss (SL) — prețul la care ieși automat cu pierdere, pentru că + ideea s-a dovedit greșită. Îl pui în platformă odată cu intrarea.
    • +
    • 1R — cât pierzi pe acțiune dacă te lovește stopul. Intri la 50.40, stopul + e la 49.20, deci 1R = 1.20; un câștig de „+2R" înseamnă 2.40 pe acțiune.
    • +
    • Take-profit (TP) — prețul la care iei profitul. Aici prima țintă e la 1R + deasupra intrării: 50.40 + 1.20 = 51.60. Asta înseamnă „1:1".
    • +
    • Trailing stop („ieșire pe trail") — un stop pe care îl urci după preț, + dar nu-l cobori niciodată. Când prețul se întoarce și se închide sub el, + ieși cu profitul strâns până atunci.
    • +
    • 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.
    • +
    • 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.
    • +
    +

    Fraza de decizie

    Cumpăr când un doji de după un downtrend e confirmat de o închidere peste high-ul lui în maximum 3 candele, ies la TP egal cu SL sau pe trailing, și dacă în 8 candele nici una nu s-a atins, ies oricum.

    -

    Oglinda: vând în lipsă când un doji de după un uptrend e confirmat de o -închidere sub low-ul lui, cu aceleași reguli de SL/TP/timp -(13_strategia_3_byh.md:227-232).

    -

    Cei 9 pași: 1. lista · 2. perechea și direcția · -3. trendul și doji-ul · 4. locația · -5. confirmările · 6. trigger-ul · -7. stopul și mărimea · 8. intrarea · -9. ieșirea. Apoi: oglinda short, -exemplul LABU, checklist.

    -

    Cum citești blocurile. Regulile au trimitere fișier:linie; textul fără -trimitere dintre ele e explicația mea și nu adaugă reguli. Unde completez o -regulă pe care materialul n-o dă, blocul începe cu Completare proprie: și -spune pe ce mă sprijin.

    +

    Pe short: vând în lipsă când un doji de după un uptrend e confirmat de o +închidere sub low-ul lui, cu aceleași reguli de SL, TP și timp.

    +

    Cei 6 pași

    +

    1. Candidatul și direcția pe weekly · +2. Trendul și doji-ul · 3. Doji-ul pe un nivel · +4. Trigger-ul · 5. Stopul și mărimea · +6. Ieșirea · apoi oglinda pe short, +rafinările și checklist-ul.


    +

    Nivelul 2 — Procedura mecanică, în 6 pași

    +

    Aici nu alegi nimic. Faci pașii în ordine, pe perechea weekly → daily: +citești direcția pe weekly și intri pe daily. Dacă un pas nu trece, lași +simbolul și treci la următorul.

    -

    Pasul 1 — Îți faci lista de candidați

    -

    Rulezi scanerul (sau treci manual prin lista ta) și păstrezi doar -simbolurile lichide, pe care chiar poți intra și ieși. Scanerul nu-ți dă -undă verde; îți economisește timpul de căutat. Restul pașilor îi faci pe -grafic, pe fiecare candidat.

    -

    - -Scanerul Buy Doji în TradeStation -ordinea filtrelor și capcanele - -Univers: -All Stocks (~13.000) -S&P 500 · Russell 3000 - -mai mare = găsește mai mult, durează mai -mult - - -Trigger: jbtgrshdATM -BDATM = 0 -(Sell Doji: SDATM = 0) - -capcană: Interval = TF-ul scanerului, setat -manual -capcană: 0 = ultima candelă închisă; 1 = cu -o zi în urmă - - -Nivel: RSV1ATM -% of PP ≤ 0.5 (60 min) -% of PP ≤ 2 (daily) - -Pivot Interval: 2 = weekly (pe 60 min), 3 = -monthly (pe daily) -capcană: RS/SR = 1 la filtrare; cu 100, -pragul se scrie ×100 - - -Lichiditate: Volume Colors -Average Volume ≥ 500.000 -Average Length = 10 - -volum daily, indiferent de TF-ul scanerului - - -Opțional: -Since Bear ≥ 8 -Bull Reversal = 1 -RVOL doar Display - -capcană: Bear Reversal e selectat implicit — -comută pe Bull -capcană: în zile extreme, pragurile rigide -golesc lista - - -Lista de candidați -→ o verifici pe grafic -(pașii 2-6). -Scanerul nu e undă verde. -Delay: scanerul vede candela închisă — daily rulat la 12:00 arată triggerul de ieri. -

    -

    Ce setezi, în ordinea din diagramă:

    -
      -
    1. Universul: All Stocks (~13.000 de simboluri), S&P 500 sau o listă - custom (Russell 3000). Mai mare = găsește mai mult, dar durează mai mult - (11_construire_scanere_sf_byd_sld.md:53-57).
    2. -
    3. Trigger-ul: jbtgrshdATM, câmpul BDATM (SDATM la short), = 0 - (11_construire_scanere_sf_byd_sld.md:58-62). „0" înseamnă ultima candelă - închisă; un cursant care pusese 1 a primit semnalele cu o zi mai devreme - (28_2025-05-27.md:47-52).
    4. -
    5. Nivelul: RSV1ATM, % of PP ≤ prag; pivoții și pragul depind de - timeframe (Pasul 4).
    6. -
    7. Lichiditatea: close > 30-40 $; volum mediu daily ≥ 500.000 (ideal
      -

      1 milion pe 3 luni) (28_2025-05-27.md:372-380; - 11_construire_scanere_sf_byd_sld.md:70-73).

      -
      -
    8. -
    9. Opțional: Since Bear ≥ 8 pentru trend (28_2025-05-27.md:40-52) și - Bull Reversal (Pasul 5).
    10. -
    -

    La short, încă un filtru, înainte de grafic: piața sau sectorul trebuie să -fie slabe. 30 de sell-uri în același sector = problemă de sector -(28_2025-05-27.md:313-330). Nu există prag numeric în material.

    -

    Capcane de scaner:

    -
      -
    • Interval-ul indicatorului nu se sincronizează automat cu timeframe-ul - scanerului. Dacă uiți, calculează pe alt timeframe - (11_construire_scanere_sf_byd_sld.md:317-320).
    • -
    • Delay-ul scanerului: rulează pe candela deja închisă; un scanner daily - la ora 12 arată triggerul de ieri (11_construire_scanere_sf_byd_sld.md:321-324).
    • -
    • RS/SR: factorul 1 pentru filtrare, 100 doar pentru display. Cu - 100 ca prag, înmulțește pragul cu 100, altfel filtrezi greșit - (04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:329-341).
    • -
    • Bear Reversal e selectat implicit (alfabetic) la deschiderea - indicatorului — pe un scaner long comută manual pe Bull, altfel filtrezi cu - semnalul opus (04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:343-346).
    • -
    • Nu pune praguri rigide (RVOL, distanță) în zile de mișcare extremă — - pot elimina toți candidații valizi (04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:303-327).
    • -
    • Sistemul nu vede orice Buy Doji. Uneori un doji valid nu e marcat; îl - recunoști vizual, cu aceeași regulă de închidere - (01_buy_doji_si_strategia_mici.md:838-839).
    • -
    -

    Treci mai departe doar dacă simbolul trece de pragul de lichiditate și, -la short, piața sau sectorul lui e slab.

    -
    -

    -

    Pasul 2 — Alegi perechea de timeframe-uri și citești direcția pe cel mare

    -

    Deschizi întâi graficul mare (weekly, monthly sau daily, după pereche) și -te uiți dacă are un Buy Doji sau un Sell Doji confirmat. El îți spune în ce -direcție ai voie să cauți intrarea pe graficul mic. Materialul, pe -fiecare timeframe (01_buy_doji_si_strategia_mici.md:32-40):

    -
      -
    • pe daily — „când intri într-un swing (trigger mecanic, stop și țintă - fixe)";
    • -
    • pe weekly/monthly — „în ce direcție ai voie să tranzacționezi. Un - buy doji weekly e un semnal al banilor mari";
    • -
    • pe 60 min — „o intrare mai devreme decât MBT-10, dar numai în - direcția unui swing long deja stabilit pe daily. Fără contextul de daily, - un buy doji pe 60 min singur nu ajunge".
    • -
    -

    Și regula dedusă de el din asta: nu shortezi contra unui Buy Doji weekly, -nu cumperi contra unui Sell Doji weekly. „Short-uri de termen scurt în -interiorul structurii, da (el însuși a shortat 2 zile în aceeași săptămână) — -dar nu împotriva semnalului weekly" (03_2026-08-11.md:220-223; -01_buy_doji_si_strategia_mici.md:35-37).

    -

    Aceeași regulă, pe cele trei perechi

    -

    - - Aceeași regulă pe trei perechi — exemplu construit (fără ticker) - A. weekly → daily - weekly: direcția - daily: intrarea - - high doji weekly 105.20 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe daily, - după confirmare - - - - - TP1 1:1 107.50 - intrare 106.30 - high doji 105.20 - SL 105.10 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 1.13 % (pe weekly ar fi 4.77 %) · 8 candele = 8 zile de bursă - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe weekly, - după confirmare - - - - - TP1 1:1 118.75 - intrare 115.75 - high doji 113.00 - SL 112.75 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 2.59 % (pe monthly ar fi 10.85 %) · 8 candele = 8 săptămâni - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe 60 min, - după confirmare - - - - - TP1 1:1 103.00 - intrare 102.52 - high doji 102.08 - SL 102.04 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 0.47 % (pe daily ar fi 1.98 %) · 8 candele ≈ 1,2 zile de bursă (7 bare/zi) - Cifre construite, aceeași formă scalată pe trei perechi. - Procentele reale depind de simbol (LABU daily: stop 9 %). -

    -

    Diagrama e același setup, desenat de trei ori: pe TF-ul mare s-a confirmat un -Buy Doji; pe TF-ul mic prețul face pullback până la high-ul acelui doji, face -un doji acolo și confirmă. Intri pe TF-ul mic. Ce rămâne și ce se schimbă:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    weekly → dailymonthly → weeklydaily → 60 min
    Ce spune materialul despre perecheparțial: weekly = direcția, daily = trigger-ul de swing (01_buy_doji_si_strategia_mici.md:32-37); la MICI, „buy doji și pe daily" e bonus (:386)parțial: MICI pornește din buy doji weekly cu pivotul monthly (:370-379); „strategia mici pe monthly […] by doji retestat la 1x2, 1x3" (:555-556)explicit: 60 min doar în direcția swing-ului de pe daily (:38-40); exemplul XLE pe 60 min (20_2025-08-25.md:172-176)
    Pivoții pe graficul de intraremonthlyquarterly (03_timeframes_set_up.md:69-79) — dar MICI citește pivotul monthly, vezi „Unde se contrazice", punctul 7weekly
    Pragul de proximitate1-2 %fără prag în material≤ 0,5 %
    Stopul: 4 candele pe TF-ul intrării4 candele daily4 candele weekly4 candele de 60 min
    „8 candele" înseamnă8 zile de bursă8 săptămâni~1,2 zile de bursă (aritmetica mea: 7 bare pe o sesiune US de 6,5 ore)
    Intrareala close sau la retest (Pasul 8)în tranșe de 1/3: close, 1/3, 1/2 (23_2025-07-29.md:206-213)la retest 1/2 sau 1/3: candela e înaltă, riscul mare (transcripts/09_Q_and_A/20_25082025.txt:207-208)
    Cât ții pozițialimita de 8 zile, restul pe trailing6-7-8 luni la MICI (01_buy_doji_si_strategia_mici.md:538-541)(completare) intraday sau câteva zile; limita de 8 candele trece peste noapte
    -

    Pragurile de proximitate: 11_construire_scanere_sf_byd_sld.md:99-104. -Pivoții: 11_construire_scanere_sf_byd_sld.md:63-69; -03_timeframes_set_up.md:69-79. Stopul se numără pe timeframe-ul pe care -ai luat decizia: la GTLB, un stop care părea „jos de tot" era corect, pentru -că decizia fusese pe weekly, nu pe daily (20_2025-08-25.md:9-15). Regulile -MICI se pot copia pe alt TF: „Si sa o folosesti pe daily, pe 60 de minute, pe -ce vrei tu" (transcripts/09_Q_and_A/20_25082025.txt:154-156).

    -
    -

    Completare proprie: cum leg cele două timeframe-uri și ce se strică când -cobori. Materialul spune ce rol are fiecare TF, dar nu dictează -succesiunea „buy doji pe TF-ul mare → aștepți pullback → buy doji pe TF-ul -mic → intri". O construiesc din trei piese ale lui: TF-ul mare dă direcția -(01_buy_doji_si_strategia_mici.md:32-40); intrarea după buy doji-ul -weekly se face pe pullback, ideal la retestul high-ului doji-ului -(triaj/DECIZII.md:118 — dar sursa acelei observații, CTZ, nu e legată -explicit de MICI, 01_buy_doji_si_strategia_mici.md:547-559); iar la M2D, -strategia cursului construită exact pe două TF-uri, stopul se numără pe -TF-ul mic (fise/m2d.md:68), cu perechile 60×daily, daily×weekly, -weekly×monthly (14_strategia_1_m2d.md:461-466).

    -

    De ce merită perechea: pe diagramă, același setup luat doar pe TF-ul -mare are stopul de 4-5 ori mai larg (4,77 % pe weekly față de 1,13 % pe -daily, la aceleași cifre construite). Cu același risc în dolari, cumperi de -4 ori mai multe acțiuni.

    -

    Ce rămâne valabil când cobori: toată regula de candelă — trend, doji, -fereastra de 3, stopul pe 4 candele, 1:1, limita de 8.

    -

    Ce nu mai rămâne: timpul (8 candele de 60 min se termină a doua zi), -pivoții (alt nivel, mai slab urmărit) și încrederea în semnal. Materialul -dă mecanismul: pe TF-urile mici, volumul vine din tranzacții mici, -reactive la zgomot, iar o mișcare contrară pe TF mic e „cel mai adesea, -doar zgomot în interiorul" trendului mare -(03_timeframes_set_up.md:52-61). Deducția mea: pe 60 min vei vedea mai -multe doji-uri confirmate, și o parte mai mare din ele vor fi false — -cifra de 65-70 % nu e dată pe timeframe, deci nu presupune că ține la fel -pe 60 min. De aceea materialul nu te lasă să iei 60 min singur.

    -

    Pentru antrenament: perechea daily → 60 min îți dă cele mai multe -semnale de exersat recunoașterea. Nu trage concluzii despre rata de -câștig din ea pentru perechile mari.

    -
    -

    Ce înseamnă „contra direcției", pe grafic

    -

    +

    Pasul 1 — Candidatul și direcția pe weekly

    +

    Deschizi graficul weekly al simbolului și te uiți dacă ultimele candele au +un Sell Doji confirmat. Dacă au, simbolul nu e bun pentru un Buy Doji pe +daily.

    +

    Candidații vin din scaner (în TradeStation, câmpul BDATM = 0, adică semnal +pe ultima candelă închisă) sau din lista ta, trecută de mână. Păstrezi doar +simbolurile lichide, pe care intri și ieși fără să miști prețul: close peste 30-40 $ și volum mediu zilnic de +cel puțin 500.000 de acțiuni, ideal peste un milion.

    +

    Apoi te uiți pe weekly. Cursul îi dă fiecărui TF un rol: weekly-ul spune în +ce direcție ai voie să tranzacționezi („un buy doji weekly e un semnal al +banilor mari"), iar daily-ul spune când intri. De aici regula: nu cumperi +contra unui Sell Doji weekly și nu shortezi contra unui Buy Doji weekly. +Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la +început îl tratezi ca pe un stop.

    +

    NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția @@ -683,19 +334,19 @@ câștig din ea pentru perechile mari.

    doji weekly - Buy Doji weekly: direcția = long - - WEEKLY: LONG ↑ - confirmare 81.30 > high doji 79.80 - + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + daily: săptămânile de după confirmare (open 81.30 = close-ul ei) - + - - SL 84.80 = high 4 candele + + stop 84.85 = 5 cenți peste high-ul de 4 candele intrare short 83.60 - TP1 82.40 — neatins + ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) @@ -730,203 +381,156 @@ câștig din ea pentru perechile mari.

    - - short de 1-2 zile: permis - - - SL lovit: poziția short contra weekly - - Sell Doji daily: tehnic valid (close 83.60 < low doji 83.95) - - short daily = CONTRA ✗ - weekly zice long; daily urcă mai departe - Short scurt înăuntrul structurii weekly: da. Poziție short contra ei: nu. - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + + aici te-a scos: stopul 84.85, lovit a patra zi + banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.95) — dar contra weekly-ului + Seria e construită: un singur caz ilustrează regula, nu o dovedește.

    -

    Pe weekly s-a confirmat un Buy Doji. Pe daily, prețul urcă 9 zile, face un -doji și apoi închide sub low-ul lui: tehnic, un Sell Doji valid. Ca poziție -short, e contra weekly-ului. Prețul coboară o zi, apoi urcă și lovește -stopul. Diagrama e construită; un caz nu dovedește regula, o ilustrează.

    -

    Nuanța: Sell Doji pe monthly/weekly înseamnă prudență pe long, nu regulă -absolută. Chiar el: sell doji-ul de pe monthly „nu înseamnă neapărat că se va -materializa" (01_buy_doji_si_strategia_mici.md:316-326).

    -

    Treci mai departe doar dacă TF-ul mare nu are un doji confirmat în -direcția opusă trade-ului tău. Pe 60 min: doar dacă daily-ul are deja un -swing long stabilit.

    -
    +

    Diagrama 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 +de intrare — în tranșe, la retest — sunt la nivelul 3.

    +

    Treci mai departe doar dacă simbolul e lichid și weekly-ul nu are un doji +confirmat în direcția opusă trade-ului tău.

    +

    +

    Pasul 2 — Trendul care se termină și doji-ul

    +

    Treci pe daily și te uiți la ultimele 8-10 candele: trebuie să vezi o +scădere care se oprește într-un doji.

    +

    Ideal, scăderea durează 8-10 candele. Au funcționat și scăderi de 2-3 +candele, dar cursul le tratează ca semnal mai slab. Dacă scanerul tău cere +Since Bear ≥ 8 (cel puțin 8 candele de la ultimul semnal de scădere), pe +astea nu ți le arată deloc.

    +

    + + 9 candele de scădere — ideal + + + + + + + + + + + + + + + + + + + + + + + + + confirmare 50.40 + + + doji la capătul scăderii + vânzătorii s-au terminat + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit + DA — ideal (8-10 candele) + + + doar 3 candele — merge, dar mai slab + + + + + + + + + + + + + + + + + + + + + + + + + + + doji + confirmare 50.40 + + + înainte: preț pe loc, + nu scădere — de aceea + semnalul e mai slab + 1 + 2 + 3 + Același doji, după un range + ACCEPTAT, semnal mai slab + scannerul cu Since Bear ≥ 8 nu-l vede +

    +

    Doji-ul îl verifici cu o împărțire, nu din ochi: corpul împărțit la +înălțimea întregii candele trebuie să dea cel mult 10 %, iar candela trebuie +să aibă fitil și sus, și jos (diagrama de la nivelul 1).

    +

    Capcana: un doji care vine după o creștere nu e Buy Doji, chiar dacă o +candelă se închide apoi peste el. Autorul: „am un buy-doji, dar după un +gap-up și sus, buy-dojiul ăsta, nu prea am încredere în el". Gap-up înseamnă +că prețul a deschis mult peste închiderea de ieri, lăsând un gol între +candele. Cazul real CTLD e exemplul cursului de setup care „nu funcționează": +doji după o creștere, nu după o scădere.

    +

    Treci mai departe doar dacă ai un doji (corp de cel mult 10 % din +înălțime, fitile în ambele părți) după o scădere clară — nu după un gap-up +sau o creștere.

    -

    Pasul 3 — Pe graficul mic, găsești trendul care se termină și doji-ul

    -

    Te uiți la ultimele candele: trebuie să vezi o scădere de 8-10 candele -(pentru Buy Doji) care se oprește într-o candelă cu corp aproape inexistent.

    -

    Cum recunoști doji-ul

    -

    Open ≈ close, corp foarte mic față de range-ul total, fitil în ambele părți. -La scanerul de watchlist, parametrul standard de doji se pune pe 10 -(nu 5) — adică corp maximum ~10 % din range -(28_2025-05-27.md:343-349; 13_strategia_3_byh.md:15-30).

    -

    - Ce e doji și ce nu — aceeași bară 50.10 / 49.20 - - - high 50.10 - low 49.20 - - - DA - DA: corp 0.05 - = 5.6 % din range - - - DA - DA, la limită: - corp 0.09 = 10 % - (parametrul 10) - - - NU - NU: corp 0.30 - = 33 % - - - NU - NU: corp mic (5.6 %), - dar fără fitil sus - open 49.60 - - close 49.55 - - ← fără fitil sus - Test doji: corp ≤ 10 % din range (0.90) și fitil în ambele părți. Scară: 0.10 = 26 px. -

    -

    Toate patru au același high și același low. A și B sunt doji. C are corpul -prea mare. D are corpul mic, dar niciun fitil deasupra — regula cere fitil în -ambele părți. Nu te uita la „cât de mică pare candela": împarte corpul la -range.

    -

    Cât de lung trebuie să fie trendul

    -

    Downtrend pentru Buy Doji, uptrend pentru Sell Doji, 8-10 candele ideal. -Exemplele reale au avut și 2-3 candele și au funcționat, dar sunt tratate ca -semnal mai slab (13_strategia_3_byh.md:185-187, 315-318). Scanerul cere -Since Bear ≥ 8 (long) / Since Bull ≥ 8 (short) -(28_2025-05-27.md:40-52), iar contorul numără candelele de la trigger-ul de -sell momentum, nu „candele descrescătoare" (28_2025-05-27.md:43-46).

    -

    - Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - - downtrend 9 candele - DA — ideal (8-10 candele) - - - - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - - doar 3 candele - - - Același doji, după un range - range: nu se numără - ACCEPTAT, semnal mai slab - scannerul cu Since Bear ≥ 8 nu-l vede -

    -

    Stânga: 9 candele de scădere, apoi doji-ul și confirmarea — cazul ideal. -Dreapta: același doji, aceeași confirmare, dar după doar 3 candele de scădere -ieșite dintr-un range. Se ia, ca semnal mai slab — iar scannerul cu -Since Bear ≥ 8 nu ți-l arată deloc (28_2025-05-27.md:144-149).

    -

    Capcană — doji-ul care nu vine după trendul corect. După un gap-up, sus în -rezistență, sau după un uptrend cu volum „varză" (miros de blow-off top), un -Buy Doji nu se ia (01_buy_doji_si_strategia_mici.md:227-235):

    -
    -

    „am un buy-doji, dar după un gap-up și sus, buy-dojiul ăsta, nu prea am -încredere în el" (01_buy_doji_si_strategia_mici.md:231-232)

    -
    -

    Cazul CTLD e exemplul explicit de „nu funcționează": context invalid, -uptrend anterior, nu downtrend (13_strategia_3_byh.md:308). Un caz de acest -tip (construit) e în panoul din dreapta al diagramei de la Pasul 5.

    -

    Pe cele trei perechi: cele 8-10 candele se numără pe graficul pe care -cauți doji-ul. Pe weekly, asta înseamnă 2 luni de scădere; pe 60 min, o zi și -jumătate (aritmetica mea).

    -

    Treci mai departe doar dacă ai un doji (corp ≤ ~10 % din range, fitil în -ambele părți) după o scădere clară — ideal 8-10 candele, minim 2-3 — și nu -după un gap-up sau un uptrend.

    -
    -

    -

    Pasul 4 — Verifici că doji-ul stă pe un nivel

    -

    Tragi pe grafic pivoții timeframe-ului superior și măsori în procente cât de -departe e low-ul doji-ului de cel mai apropiat suport sau pivot. Ideal -aproape de suport sau pivot point pentru Buy Doji, aproape de rezistență sau -pivot point pentru Sell Doji (13_strategia_3_byh.md:188-190).

    +

    Pasul 3 — Doji-ul stă pe un nivel

    +

    Tragi pe daily pivoții lunari și măsori în procente cât de departe e low-ul +doji-ului de cel mai apropiat suport sau pivot.

    +

    Un suport e un nivel de unde prețul a mai întors în sus. Un pivot e un nivel +calculat din maximul, minimul și închiderea lunii trecute: PP la mijloc, +suporturile S1, S2 dedesubt, rezistențele R1, R2 deasupra. Fiindcă îl urmăresc +mulți, prețul reacționează des acolo. TradeStation îl desenează +singur; formula e la nivelul 3, la BVB.

    +

    Un doji departe de orice nivel e o simplă pauză; pe un nivel, cumpărătorii +au motiv să apară.

    - Doji la nivel vs. doji în aer — daily, pivoți monthly (exemplu construit) + Doji la nivel vs. doji în aer — daily, pivoți lunari (exemplu construit) DA — doji la nivel NU — doji în aer + + 0,51 % — la nivel + + gol de 7,07 % sub doji — doji în aer - pivot monthly S1 49.00 + pivotul lunar 49.00 - PP 53.50 + pivotul lunar 53.50 - S1 46.00 + pivotul lunar 46.00 @@ -935,7 +539,7 @@ pivot point pentru Sell Doji (13_strategia_3_byh.md:188-190).

    - + @@ -949,6 +553,11 @@ pivot point pentru Sell Doji (13_strategia_3_byh.md:188-190).

    doji confirmare + + + pivot lunar: nivel urmărit + de mulți — aici apar + cumpărătorii @@ -957,7 +566,7 @@ pivot point pentru Sell Doji (13_strategia_3_byh.md:188-190).

    - + @@ -971,40 +580,568 @@ pivot point pentru Sell Doji (13_strategia_3_byh.md:188-190).

    doji confirmare - - low 49.20 = +0,41 % față de 49.00 - → la nivel (daily: ≤ 1-2 %) - - - - cel mai apropiat nivel: 46.00, la 6,96 % - → doji în aer - (PP 53.50 e deasupra, la 8,74 % de low) - 60 min: prag ≤ 0,5 %, pivoți weekly · daily: 1-2 %, pivoți monthly · weekly: pivoți quarterly + + + aceeași formă, dar nimic sub el + nu are cine să-l susțină + daily: e „la nivel" dacă low-ul dojiului e la cel mult 1-2 % de pivotul lunar (aici 0,51 %; în dreapta 7,07 %). Aceeași serie, aceeași scară; nivelurile 49.00 / 46.00 / 53.50 sunt construite.

    -

    Aceeași formă de două ori. În stânga, low-ul doji-ului e la 0,41 % de pivot: -„la nivel". În dreapta, cel mai apropiat nivel e la aproape 7 %: doji în aer. -Ochiul nu vede diferența; procentul da.

    -

    Pragul, pe timeframe: ≤ 0,5 % pe 60 min; 1-2 % pe Daily. Motivul: la -0,5 % pe daily găsești foarte puține simboluri -(11_construire_scanere_sf_byd_sld.md:99-104).

    -

    Pivoții, sincronizați cu timeframe-ul: 60 min → pivoți Weekly; Daily → -Monthly; Weekly → Quarterly (11_construire_scanere_sf_byd_sld.md:63-69; -01_filtre_scaner_bull_bear_reversal_pp.md:36-42). În scaner: -Pivot Interval = 2 pe 60 min, = 3 pe Daily -(11_construire_scanere_sf_byd_sld.md:63-69).

    -

    Treci mai departe doar dacă low-ul doji-ului (high-ul, la short) e sub -pragul timeframe-ului tău față de un suport, o rezistență sau un pivot.

    -
    +

    Aceeași formă, de două ori. În stânga, low-ul doji-ului e la 49.25, iar +pivotul la 49.00: (49.25 − 49.00) / 49.00 = 0,51 %, deci doji „la nivel". În +dreapta, cel mai apropiat nivel e la cam 7 %: doji „în aer". Ochiul nu +vede diferența, procentul da.

    +

    Pe daily, pragul e 1-2 %. Pe 60 de minute cursul folosește 0,5 %, dar pe daily +la 0,5 % găsești prea puține simboluri.

    +

    Treci mai departe doar dacă low-ul doji-ului e la cel mult 1-2 % de un +suport sau de un pivot lunar.

    +

    +

    Pasul 4 — Trigger-ul: închidere peste high, în maximum 3 candele

    +

    Notezi high-ul doji-ului și aștepți. Intri doar dacă una din următoarele 3 +candele se închide peste el.

    +

    Nu intri pe doji: el spune doar că scăderea a făcut o pauză, iar pauza poate +fi urmată de încă un val în jos. Contează închiderea, nu atingerea — o +candelă care trece peste high în timpul zilei și se închide sub el nu e +trigger.

    +

    + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 + DA — confirmare la +2, în fereastră + + + + + + + + + + + + + + + + + doji + + + aici NU intri: s-a închis sub 50.10 + semnalul cere o ÎNCHIDERE peste + + + AICI INTRI, la close 50.40 + prima închidere peste + high-ul dojiului + + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 + NU — nicio confirmare în 3 candele + + + + + + + + + + + + + + + + + + + doji + a 4-a + + + a treia s-a închis tot sub 50.10 + fereastra s-a terminat: ștergi setup-ul + + + a închis sub low-ul dojiului + setup mort — nu mai intri + +1: 49.95 · +2: 50.05 · +3: 49.85 — toate sub 50.10 + + Serii construite: open = close-ul barei anterioare. + Doji: h 50.10 / l 49.25. Fereastra = maximum 3 candele după doji. +

    +

    Sus, setup-ul valid: doji cu high 50.10; prima candelă se închide la 49.90, +încă sub; a doua la 50.40, peste. Intri la 50.40, la close-ul ei. Jos, +setup-ul expirat: trei candele se închid la 49.95, 50.05 și 49.85, toate sub +50.10, așa că după a treia îl ștergi. Aici a patra se închide chiar sub +low-ul doji-ului — „setup mort".

    +

    De ce contează închiderea peste high: cine a vândut în ziua doji-ului e acum +pe pierdere, iar stopurile celor care au shortat, puse deasupra high-ului, se +execută ca ordine de cumpărare. De aceea mișcarea se întoarce brusc. +(Explicația e a sumarizatorului lecției, nu a cursului.)

    +

    Treci mai departe doar dacă o candelă s-a închis peste high-ul doji-ului +în maximum 3 candele. Altfel ștergi setup-ul și te întorci la pasul 1.

    -

    Pasul 5 — Aduni confirmările: A+ sau mediocru?

    -

    Înainte de trigger, numeri câte motive independente ai pentru același -trade. Pașii 3-4 sunt minimul. Ce urmează nu e obligatoriu, dar e ce -separă un setup A+ de unul mediocru — răspunsul la „ce să corelez ca să am -mai multe confirmări".

    -

    Setup A+ vs. setup mediocru (două panouri, exemple construite) +

    Pasul 5 — Stopul și mărimea poziției

    +

    Numeri 4 candele înapoi, începând cu cea de confirmare, iei cel mai jos low +dintre ele și pui stopul puțin sub el.

    +

    + Pasul 5 — stopul: numeri 4 candele înapoi de la confirmare + + numeri 4 candele, începând cu confirmarea + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + cel mai jos low din cele 4: 49.25 + (e al doji-ului) + + + stopul: 49.20, cu 5 cenți mai jos + sub el, ideea că vânzătorii + au obosit e moartă + + + confirmarea: close 50.40 + de aici numeri înapoi + 4 + 3 + 2 + 1 + (5) + cu 4 sau cu 5 candele iese la fel: în scădere, low-ul doji-ului e oricum cel mai jos + + Același trade: stop „la ochi” (sub candela de confirmare) vs stopul din regulă + + + ținta 1: 51.60 + + intrarea: 50.40 + + stop pus la ochi: 49.70 + + stopul din regulă: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stopul pus la ochi (49.70) e măturat + era prea aproape de intrare + + + al doilea picior al fundului: 49.50 + fundurile fac des asta + + + stopul din regulă (49.20) ține + al doilea picior rămâne peste el + + + prețul ajunge la țintă + dar numai cu stopul corect + mai erai în trade + Barele de după intrare și stopul la ochi sunt construite, pentru contrast. + pe aici trece al doilea picior +

    +

    Sus, candelele numerotate de la confirmare. Cel mai jos low e al doji-ului, +49.25, iar stopul merge la 49.20, cu 5 cenți sub. După o scădere, low-ul +doji-ului e aproape mereu cel mai jos, deci stopul iese practic sub doji. +Jos, același setup, dar cu o continuare diferită: o variantă în care fundul +mai face un picior înainte să plece. Stopul e pus aici „la ochi", la 49.70, +sub candela de confirmare. A doua candelă după intrare coboară până la +49.50, mătură stopul „la ochi", iar prețul urcă și atinge ținta abia la a +șasea candelă — în restul capitolului, unde fundul pleacă direct, ținta vine +la a treia. Stopul din regulă, 49.20, n-a fost atins în nicio variantă.

    +

    De ce acolo: dacă prețul trece sub acel low, ideea că vânzătorii s-au +epuizat e moartă. Fundurile fac des un al doilea picior, de aceea stopul stă +sub toată structura, nu „undeva aproape". Candelele le numeri pe graficul pe care intri, aici +daily.

    +

    Mărimea poziției vine din regula generală de risc a cursului: pierzi cel mult +2 % din cont pe un trade. Numărul de acțiuni e riscul în dolari împărțit la +distanța până la stop, rotunjit în jos. Strategia nu dă o cifră de risc +proprie.

    +
    +

    Completare proprie (cifrele sunt ale mele, regula de 2 % e a cursului): +pe un cont de 50.000 $ riști cel mult 1.000 $. Cu intrarea la 50.40 și +stopul la 49.20 riști 1.20 pe acțiune: 1.000 / 1.20 = 833,3, deci cumperi +833 de acțiuni.

    +
    +

    Treci mai departe doar dacă știi prețul exact al stopului și numărul de +acțiuni, iar pierderea maximă încape în regula ta de risc.

    +

    +

    Pasul 6 — Ieșirea: o treime la 1:1, restul pe trailing, maximum 8 candele

    +

    Pui ținta la aceeași distanță deasupra intrării la care e stopul dedesubt, +iar după ce e atinsă lași restul pe trailing stop.

    +

    Ieși în trei treimi:

    +
      +
    1. Prima treime la ținta 1:1. Cu intrarea la 50.40 și stopul la 49.20 + riști 1.20, deci ținta e 51.60. Cursul e categoric: ținta fixă e 1:1, „nu + mai mult". Profitul în plus vine din trailing.
    2. +
    3. A doua treime pe trailing stop. Linia de trail o pui la low-ul oricărei + candele care deschide cu gap peste high-ul candelei dinainte și o urci de + fiecare dată când apare una nouă. Ieși la prima închidere sub linie.
    4. +
    5. A treia treime o lași mai departe, cât ține trendul; pe ea poți risca + tot stopul inițial.
    6. +
    +

    Limita de timp: dacă în 8 candele de la intrare nu s-a atins nici ținta, +nici stopul, ieși oricum, la close-ul celei de-a 8-a.

    +

    + A — prima treime la țintă, a doua pe trailing stop + + + + ținta 1: 51.60 (= 1R) + + intrarea: 50.40 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1 atinsă: vinzi prima treime + ai luat exact cât riscai (1R) + + + gap: low-ul de azi e peste high-ul de ieri + linia de trail urcă la 51.95 + + + încă un gap: linia urcă la 52.60 + urcă doar, nu coboară niciodată + + + prima închidere sub linie: ieși + cu a doua treime, la 52.30 (+1.58R) + + linia de trailing stop + prima treime: de la intrare la ținta 1:1 + a doua treime: merge pe trailing stop + A treia treime o lași mai departe, cu stopul mutat la intrare (break-even). + + B — limita de 8 candele: nici ținta, nici stopul + + + ținta 1: 51.60 — neatinsă + + intrarea: 50.40 + + stopul: 49.20 — neatins + + + + + + + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + a 8-a candelă: ieși oricum, la close 50.70 (+0.25R) + banii blocați aici lipsesc din alt trade + 8 candele în care nu se întâmplă nimic +

    +

    Sus, prima treime iese la 51.60. Apar două candele cu gap, care urcă linia +de trail întâi la 51.95, apoi la 52.60; a doua treime iese la 52.30, prima +închidere sub linie, cu +1,58R. Pe a treia treime muți stopul la prețul de +intrare, 50.40. Jos, alt trade: în 8 zile prețul urcă cel mult la 51.35 și +coboară cel mult la 50.15, deci nu atinge nici ținta, nici stopul; ieși la +close-ul celei de-a 8-a, 50.70, cu +0,25R.

    +
    +

    Completare proprie: candelele de după intrare, din ambele panouri, sunt +construite. Împărțirea în trei treimi e a sumarizatorului lecției; ținta +1:1, regula de trail și limita de 8 candele sunt ale cursului.

    +
    +

    Treci la trade-ul următor doar după ce toate trei treimile au ieșit — la +țintă, pe trail, la limita de 8 candele sau la stop.

    +
    +

    +

    Oglinda — Sell Doji, pe short

    +

    Pe short vinzi acțiuni împrumutate și le cumperi înapoi mai târziu; câștigi +dacă prețul scade între timp. Pașii sunt aceiași, întorși:

    +
      +
    • înainte de doji vine o creștere de 8-10 candele;
    • +
    • doji-ul stă lângă o rezistență sau un pivot, deasupra;
    • +
    • trigger-ul e o închidere sub low-ul doji-ului, în maximum 3 candele;
    • +
    • stopul stă deasupra celui mai înalt high din ultimele 4 candele;
    • +
    • ținta e la aceeași distanță, în jos, iar linia de trail coboară.
    • +
    +

    + Sell Doji pe short — daily (exemplu construit) + + 1. creștere de 10 candele + + 2. doji + + + + + stop 100.15 + + intrare short 99.00 + + ținta 97.85 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + STOPUL SUS, la 100.15 — 5 cenți peste maximul ultimelor 4 candele: + dacă prețul urcă până aici, creșterea continuă și ideea e moartă + + + AICI INTRI SHORT, la 99.00: + a doua candelă după doji e prima + care se ÎNCHIDE sub low-ul lui (99.20) + + + ținta JOS, la 97.85: tot 1.15, exact cât ai riscat; + aici închizi prima treime + + + trail-ul a coborât după preț (96.45); + prima închidere peste el: ieși cu restul, 96.60 + Pe short câștigi când prețul COBOARĂ: stopul stă SUS, ținta JOS, trail-ul coboară după preț. Roșu = ce riști, verde = ce câștigi. +

    +

    Pe diagramă, doji-ul e între 99.20 și 100.10. A doua candelă se închide la +99.00, sub 99.20: intri short acolo. Stopul e la 100.15, cu 5 cenți peste cel +mai înalt high din ultimele 4 candele (care e chiar high-ul doji-ului), deci +riști 1.15, iar ținta e la aceeași distanță în jos, 97.85. Restul poziției +iese la 96.60, prima închidere peste linia de trail coborâtă la 96.45.

    +

    Exemplul din curs pune stopul fix pe high, la 100.10, cu ținta la 97.90; aici +e urcat cu 5 cenți, ca să respecte regula „stopul deasupra maximului", la fel +ca cei 5 cenți de sub low la pasul 5.

    +

    Ce se adaugă la short:

    +
      +
    • Piața trebuie să fie slabă: „când shortăm, să fie overall piața praf". + Dacă primești 30 de Sell Doji în același sector, problema e sectorul.
    • +
    • Nu pe acțiuni sub 10 $. Riști un short squeeze: prețul sare brusc + pentru că toți cei pe short cumpără odată, iar piața poate deschide direct + peste stopul tău.
    • +
    • Nu contra unui Buy Doji weekly (pasul 1).
    • +
    • Divergența de volum sau un stochastic ieșit din supravânzare pot + întoarce semnalul într-un Buy Doji.
    • +
    +
    +

    +

    Nivelul 3 — Rafinări

    +

    Astea se citesc după ce ai făcut 20 de trade-uri mecanic, nu înainte.

    +

    Confirmările care fac un setup A+

    +

    Pașii 2 și 3 sunt minimul. Cu cât ai mai multe motive independente pentru +același trade, cu atât e mai bun — dar materialul nu cere o poziție mai mare.

    +

    Setup A+ vs. setup mediocru (două panouri, exemple construite) A+ — doji la suport, volum în acumulare + suport 42.00 @@ -1055,1585 +1192,944 @@ mai multe confirmări".

    - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji la nivel (low 41.95) - acumulare - acumulare: volum peste media ultimelor 10 bare. -
    + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + doji chiar pe nivel: + vânzarea s-a oprit pe suport + + + confirmarea, pe volum mare: + cumpărătorii mari intră +volum în creștere = acumulare Mediocru — gap-up în rezistență, volum varză - - rezistență 78.50 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 78.50 / 78.10 - gap-up + doji în rezistență, confirmare pe volum slab. -gap-up, volum slabSurse: 13_strategia_3_byh.md:188-190 (doji la nivel); 01_buy_doji_si_strategia_mici.md:227-235 (context invalid).

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    A+Mediocru / NU
    Trend anteriordowntrend lung (8-10+) spre suport/pivot (13_strategia_3_byh.md:185-190)uptrend scurt sau gap-up în rezistență (01_buy_doji_si_strategia_mici.md:227-229)
    Locațiepe suport / pivot monthly, ideal al doilea test fără low nou (18_2025-09-23.md:710-712)sus, în rezistență, cu gap de închis dedesubt (01_buy_doji_si_strategia_mici.md:227-235)
    Volumacumulare / divergență bull (13_strategia_3_byh.md:221-222, 01_buy_doji_si_strategia_mici.md:338-347)„varză", volum slab — miros de blow-off top (01_buy_doji_si_strategia_mici.md:234-235)
    Direcție weeklynu contrazice un Buy Doji weekly (03_2026-08-11.md:220-223)contra unui Sell Doji weekly (01_buy_doji_si_strategia_mici.md:35-37)
    Rezultat„sfântul buy doji" = double bottom + close peste pivot monthly + proiecție bull (01_buy_doji_si_strategia_mici.md:351-360)CTLD: context invalid, setup nereușit (13_strategia_3_byh.md:308)
    -

    Toate confirmările din material, ordonate după cât de des apar:

    + + + rezistență 78.50 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + gap-up în rezistență: + aici cumpără cei întârziați + + + cade înapoi sub 78.00: + semnalul a mințit +volum slab: nimeni mare nu cumpără

    - - - + + - - - - + + + - - - - + + + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
    CriteriuDe ce dă edgeCât e confirmatSursăA+Mediocru sau NU
    1. Locația față de un nivel (suport/pivot la long, rezistență/pivot la short)Diferența dintre setup mediocru și bun; doji-ul „la nivel" e cel care contează5 surse distincte (13, 11, 28_QA, 04_MODUL_3, 01_mici); nu apare ca rând separat în DECIZII.md13_strategia_3_byh.md:188-190; 11_construire_scanere_sf_byd_sld.md:106-137; 28_2025-05-27.md:379Trendul dinaintescădere de 8-10+ candele, spre suportcreștere scurtă sau gap-up în rezistență
    2. Confirmarea strictă în fereastra de 3 candele + SL 4 candele + TP1 = SL (1:1)Fără confirmare, doji-ul e doar o pauză în trendDECIZII 01.1: 3 loturi / 5 zile (~60-70 % merge; stopul e obligatoriu)DECIZII.md:107-109; 01_buy_doji_si_strategia_mici.md:146-152Locațiapivot lunar, al doilea test fără low nousus, cu un gap neînchis dedesubt
    3. Trendul anterior corect (8-10, nu după gap-up/uptrend)Doji fără trend corect = context invalidDECIZII 01.2: 2 loturi / 2 zile; în rest 3-4 surseDECIZII.md:110; 13_strategia_3_byh.md:185-187; 22_2025-08-04.md:14Volumulacumulare, divergență bullslab, „varză"
    4. Volumul — acumulare/distribuție, divergență bull/bearConfirmă dacă epuizarea e reală; trigger fără volum = mișcare falsă3 surse (13, 04_MODUL_3, 01_mici); nu apare în DECIZII.md13_strategia_3_byh.md:214-226; 04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:296-301; 01_buy_doji_si_strategia_mici.md:338-347
    5. Direcția instituțională de pe weekly/monthlyNu mergi contra semnalului banilor mariDECIZII 01.3: 1 lot / 2 zile; plus Q&A explicitDECIZII.md:111; 03_2026-08-11.md:220-223
    6. Higher low confirmat de candela din dreapta (MICI)Al doilea semn, nu primul; e diferența dintre MICI și un simplu buy dojiDECIZII 01.n1: 2 loturi / 2 zileDECIZII.md:118; 01_buy_doji_si_strategia_mici.md:370-386
    7. Retest 1/2 sau 1/3 în loc de intrarea la closeReduce riscul la ~jumătate pe același setup; explicit util pe propDECIZII 01.n1: 2 loturi / 2 zile; pe prop, Q&ADECIZII.md:118; 20_2025-08-25.md:141-164
    8. Bull/Bear Reversal + RVOL ca filtre agresiveMai puține rezultate, dar confirmare mai mare1 lecție (04_MODUL_3/01); niciun lot de triaj nu o ridică04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:44-52, 303-327
    9. Confluența de niveluri pentru ținte (R1+R2+SMA 200+jumătate marubozu)Unde se suprapun mai multe rezistențe, iei profit1 sursă (01_mici); nu în DECIZII.md01_buy_doji_si_strategia_mici.md:531-536
    10. Mai multe trigger-e pe aceeași candelă (buy doji + buy momentum + bull reversal)Semnal mai puternicDECIZII 01.5: 1 lot / 1 ziDECIZII.md:113; 102_24032026.txt:167-170
    11. Frecvența patternului ca ratăUn pattern rar nu-ți produce nimic, oricât de bun; de-aia cursul predă Buy Doji, nu Morning/Evening Star1 sesiune, dar argumentul e explicit03_2026-08-11.md:180-218
    12. Tranșele (1/2, 1/3, 1/4)„Rar all-in la swing"; pentru acțiuni scumpe, 4 tranșe de 1/4DECIZII regula 4: 5 loturi / 16 zileDECIZII.md:47; 01_buy_doji_si_strategia_mici.md:798-814Weekly-ulîn aceeași direcțieSell Doji weekly contra ta
    -

    Proiecția bull/bear aliniată cu direcția e tot un edge, nu o obligație: -„proiecție bull" pe long, citită din Market Preview (RSV1ATM) -(13_strategia_3_byh.md:223-225).

    -

    Treci mai departe doar dacă pașii 3-4 sunt bifați (trend corect, doji la -nivel) și știi, înainte de trigger, dacă setup-ul e A+ sau mediocru. -Materialul nu dă o regulă de mărime după calitatea setup-ului.

    -
    -

    -

    Pasul 6 — Aștepți trigger-ul: o închidere peste high, în maximum 3 candele

    -

    Notezi high-ul doji-ului și aștepți. Nu intri pe doji. Intri doar dacă -una din următoarele 3 candele închide peste acel high (la short: sub -low). Dacă a trecut a treia și n-a închis nicio candelă dincolo, setup-ul a -expirat.

    -

    - - DA — confirmare la +2, în fereastră - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - doji - confirmare +2 — intrare 50.40 - +1: close 49.90 — sub 50.10, nu confirmă - +2: close 50.40 — peste 50.10, confirmă (intrare la close) - - - NU — nicio confirmare în 3 candele - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - - - doji - a 4-a - +1: 49.95; +2: 50.05; +3: 49.85 — toate sub 50.10 - a 4-a: close 49.15 — sub low-ul dojiului 49.20, setup mort - - Serii construite: open = close-ul barei anterioare. - Doji: h 50.10 / l 49.20. Fereastra = maximum 3 candele după doji. -

    -

    Diagrama de sus arată exact diferența dintre un setup care se confirmă și -unul care expiră — diferența e strict numerică (a închis sau nu peste 50.10), -nu vizuală.

    -

    DA și NU, cu cifre:

    -
      -
    • DA: prima candelă care închide peste high-ul dojiului (long) / - sub low-ul lui (short), în maximum 3 candele după doji. Intri la - close-ul candelei de confirmare. Exemplu: doji high 53.00 / low 51.60; a - doua candelă închide 53.70 → Buy Doji, intrare 53.70 - (01_buy_doji_si_strategia_mici.md:136-138).
    • -
    • NU — prea devreme: doji singur, sau candele care închid încă sub high. - Exemplu: doji high 50.10; +1 închide 49.90 → nu e semnal - (13_strategia_3_byh.md:158-167).
    • -
    • NU — invalidat: nicio candelă nu închide dincolo de doji în cele 3 - candele → setup expirat; dacă a 4-a închide sub low-ul dojiului, „setup - mort". Exemplu: doji 53.00/51.60; +1, +2, +3 rămân sub 53.00, a 4-a - închide 51.20 → nu intri (01_buy_doji_si_strategia_mici.md:222-225).
    • -
    • NU — context: doji care nu vine după trendul corect (gap-up în - rezistență; uptrend cu volum slab) — cazul CTLD, „nu funcționează" - explicit (13_strategia_3_byh.md:308). Vezi Pasul 3.
    • -
    -

    Capcană — nu intra pe doji, intri pe trigger. Fără închidere dincolo de -high/low în 3 candele, doji-ul a fost doar o pauză în trend -(01_buy_doji_si_strategia_mici.md:818-821).

    -

    De ce închiderea peste high e trigger-ul. După 8-10 candele de scădere, -vânzătorii care mai aveau marjă au ieșit deja pe drum; la doji, cumpărătorii -noi (vânători de preț mic) apar în număr aproape egal, de aceea bara închide -aproape de unde a deschis. Confirmarea e mecanismul real: când o candelă -închide peste high-ul dojiului, toți cei care au vândut (sau au shortat) în -bara de indecizie sunt pe pierdere, iar stop-urile lor de deasupra acelui -high se execută automat ca ordine de cumpărare — de aceea raportul se -inversează brusc, nu treptat (13_strategia_3_byh.md:102-149; -01_buy_doji_si_strategia_mici.md:20-28). (Explicația mecanismului de aici -e completarea sumarizatorului, nu material al cursului: -13_strategia_3_byh.md:342-350 notează explicit că secțiunea „De ce apare -inversarea" — mecanismul cumpărători/vânzători — e „completări ale mele, -dincolo de ce spune explicit transcrierea".)

    -

    Nu merge de fiecare dată:

    -
    -

    „nu luați de bună faptul că dacă am un buy dos [sic] și buy hammer de -fiecare data [sic] merge [...] sunt niște probabilități aici, în 70% din -cazuri 65-70% din cazuri va funcționa" -(01_buy_doji_si_strategia_mici.md:150-152)

    -
    -

    Pe cele trei perechi: fereastra de 3 se numără pe graficul mic. Pe 60 -min, 3 candele înseamnă 3 ore; pe weekly, 3 săptămâni (aritmetica mea). -Candela trebuie să se închidă: pe weekly, asta e vineri la închidere -(23_2025-07-29.md:208-209).

    -

    Treci mai departe doar dacă o candelă a închis dincolo de doji în -fereastra de 3. Altfel ștergi setup-ul și te întorci la Pasul 1.

    -
    -

    -

    Pasul 7 — Calculezi stopul și mărimea poziției, înainte de ordin

    -

    Numeri 4 candele înapoi de la candela de confirmare, iei cel mai jos low -dintre ele (la short: cel mai sus high) și pui stopul acolo. -(13_strategia_3_byh.md:192-193; 22_2025-08-04.md:23-29)

    -

    - Unde pui stopul: 4 candele înapoi, sub structură — exemplu construit - - cel mai jos low: 51.60 (doji) - - SL 51.55 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - 4 - 3 - 2 - 1 - (5) - - ultimele 4 candele (3 = doji, 1 = confirmarea) - Cu 4 sau cu 5 candele iese la fel: în downtrend low-ul dojiului e oricum cel mai jos. SL = 51.60 − 0.05. - - Același trade: stop la ochi (0.80 sub intrare) vs stop din regulă - - TP1 55.85 - - intrare 53.70 - - stop la ochi 52.90 — lovit - - SL din regulă 51.55 — ținut - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - al doilea picior: 52.00, higher low - TP1 - Barele 15-20 și stopul la ochi sunt construite, pentru contrast. - +

    Mai rar citate: double bottom cu close peste pivotul lunar („sfântul buy +doji"); mai multe trigger-e pe aceeași candelă (buy doji, buy momentum, bull +reversal); filtrele Bull Reversal și RVOL (volumul de azi față de media lui).

    +

    Cele trei perechi de TF

    +

    Regula de candelă e aceeași pe orice pereche. Pe 60 de minute intri doar în +direcția unui swing long deja stabilit pe daily.

    +

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

    -

    Sus: cele 4 candele numărate de la confirmare. În downtrend, low-ul doji-ului -e oricum cel mai jos, deci nu contează dacă o numeri și pe a 5-a. Jos: un stop -pus „la ochi", aproape de intrare, e lovit de al doilea picior; stopul din -regulă ține.

    -

    De ce acolo: acel nivel e ultimul loc care, dacă e spart, anulează ideea -că vânzătorii (sau cumpărătorii) s-au epuizat. În practică, cel mai jos low -din 4 candele coincide aproape întotdeauna cu un swing low -(22_2025-08-04.md:24-29):

    -
    -

    „Stop-ul, 4 candele în spate față de trigger. Sau, exact, swing low — în -principiu o să fie swing low, pentru că în general ce găsește aici? Un -swing high și aici un swing low." (22_2025-08-04.md:27-29)

    -
    -

    Cât e în %/R: procentul depinde de simbol; la exemplul construit, doji low -51.60 → SL 51.55 (cu 5 cenți sub), adică risc mic față de intrare -(01_buy_doji_si_strategia_mici.md:139-141). La LABU, SL a fost −9 % față de -intrare (18_2025-09-23.md:716-719). Nu se folosește ATR pentru acest SL în -sursele citite.

    -

    Capcană — bottom-ul poate mai face un picior. Double bottom-ul cu buy doji -weekly poate deveni triple bottom sau bear flag fără divergență de volum; de -aceea stopul stă sub structură, nu „undeva jos" -(01_buy_doji_si_strategia_mici.md:833-836).

    -
    -

    Completare proprie: stopul „la ochi" de 52.90 din panoul de jos și -barele de după intrare sunt construite de mine, ca să arăt ce înseamnă -„sub structură" pe un caz. Materialul dă regula și capcana, nu acest -exemplu.

    -
    -

    Pe cele trei perechi: cele 4 candele se numără pe timeframe-ul pe care ai -luat decizia (20_2025-08-25.md:9-15). În pereche, decizia de intrare e pe -graficul mic, deci stopul e mai strâns decât pe graficul mare (Pasul 2).

    -

    Mărimea poziției

    -

    Regula generală de money management: maximum 2 % din cont per tranzacție; -mărimea poziției = (cont × 2 %) / distanța până la stop, ajustată cu -spread-ul și rotunjită în jos (03_MODUL_2/04_money_management_position_sizing.md:4-11, 28-34). -NEACOPERIT ÎN MATERIAL: Strategia 3 nu dă o cifră proprie de risc per -trade, nici o mărime minimă de cont. Singurele cifre apropiate vin din alte -lecții: 2 % general (money management) și risc fix intraday 25 $ cu țintă 4R -(08_executie_si_risc.md:40-49), care nu sunt date pentru S3.

    -
    -

    Completare proprie — exemplu numeric ilustrativ (cifrele exemplului -sunt ale mele, nu din curs; din material vine doar regula de 2 %): pe un -cont de 50.000 $, risc maxim = 1.000 $. Intrare 50.40, SL 49.20 → distanță -1.20 $/acțiune. Mărime = 1.000 / 1.20 = 833,3 → 833 de acțiuni -rotunjit în jos (risc efectiv 999,6 $). Dacă poziția se împarte în 3 -(„multiplu de 3 poziții", 13_strategia_3_byh.md:204-213; varianta de -execuție cu 48 de acțiuni pe un risc de 25 $ în -08_executie_si_risc.md:619-634), fiecare parte are același stop.

    -
    -

    Pe un cont de prop, secțiunea „Pe cont de prop" (judecata mea) coboară -riscul la 0,33 % pe poziție. Pentru plafonul de risc pe contul tău: -A1_risc.md.

    -

    Treci mai departe doar dacă știi stopul exact și numărul de acțiuni, și -riscul în dolari încape în regula ta de risc.

    -
    -

    -

    Pasul 8 — Intri: la close sau în tranșe, la retest

    -

    Pui ordinul. Regula de bază a strategiei: intri la close-ul candelei de -confirmare (13_strategia_3_byh.md:191-195). Varianta pe care o predă ca -„corectă" în Q&A: o treime la close, restul cu ordine limită mai jos, în -corpul candelei.

    -

    - Intrarea în trei tranșe — daily, exemplu construit (doji 53.00 / 51.60) - - TP1 55.85 = 1R de la close - - SL 51.55 (low 4 candele 51.60, minus 5 cenți) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - - - - - corp: open 52.60 → close 53.70 (1.10) - - - 1/3 la close 53.70 - - medie 53.39 → risc 1.84 pe acțiune (tot la close: 2.15) - - 1/3 la 1/3 din corp 53.33 - - 1/3 la 1/2 din corp 53.15 - - - - - - low 53.10: umple T2 și T3 - - +1: 52.60, sub high - - doji 53.00 / 51.60 - Măsurat pe corp (open 52.60 → close 53.70). Măsurat pe toată candela (52.45 → 53.85), 1/3 ar fi 53.38; 1/2 iese tot 53.15. - Stopul e unul singur, pentru toată poziția. Barele 0-11 și 15-18 sunt construite. -

    -

    Cu cifrele exemplului (construit, pe nivelurile din -01_buy_doji_si_strategia_mici.md:136-142):

    -
      -
    1. 1/3 la close-ul confirmării: 53.70.
    2. -
    3. 1/3 cu limit la 1/3 din corp: 53.70 − 1.10/3 = 53.33.
    4. -
    5. 1/3 cu limit la 1/2 din corp: 53.15.
    6. -
    7. Candela de după coboară la 53.10 și le umple pe amândouă. Prețul mediu: - 53.39; riscul pe acțiune până la stopul 51.55: 1.84, față de 2.15 dacă - intrai tot la close.
    8. -
    -

    Tranșele, pe weekly, spuse de el: „1/3 din poziție la close-ul trigger-ului -(vineri, la închiderea săptămânii)", „1/3 cu limit la retestul de 1/3 din -înălțimea candelei. Iei high-ul și low-ul și calculezi", „1/3 cu limit la -1/2 din candelă" (23_2025-07-29.md:206-213). Și în altă sesiune:

    -
    -

    „aici nu se intră full, / se intră cu 1 pe 3 din poziția aici, / 1 pe 3 la -1 pe 3 din candelă / și 1 pe 3 la 1 pe 2 sau 2-3 / la 1 pe 2. / Așa se face -de cea corectă. / Așa cum v-am învățat pe strategia respectivă." -(transcripts/09_Q_and_A/19_08092025.txt:1067-1073)

    -
    -

    Măsori de la open sau de la low? Se poate măsura de la low sau de la -open; pe XLE diferența a fost 3.16 % vs 2.98 %, „Nu e mare diferență, că ăsta -nu e așa volatil, dar e o diferență" (20_2025-08-25.md:178-180). Pe -exemplul de sus: pe corp, 1/3 = 53.33; pe toată candela (52.45 → 53.85), -1/3 = 53.38. La 1/2 iese 53.15 în ambele feluri.

    -

    De ce retestul contează pe TF mic și pe prop: „Pai ba, e inalt, ai ris -[sic] mare pe asta, mai ales daca esti pe prop. Si atunci de asta sa intre pe -unul, pe 3, unul, pe 2, pentru un ris [sic] mai mic." — buy doji pe 60 min -(transcripts/09_Q_and_A/20_25082025.txt:207-208). Retestul la 1/2 sau 1/3 -reduce riscul la ~jumătate pe același setup (20_2025-08-25.md:141-164). La -XLE pe 60 min, retestul de 1/2 a căzut fix în pivotul weekly — două motive -independente pentru aceeași intrare (20_2025-08-25.md:172-176).

    -

    La acțiuni scumpe (sute sau mii de $): 4 tranșe de 1/4, stop unic sub -higher low; riscul total nu crește, doar prețul mediu scade -(01_buy_doji_si_strategia_mici.md:798-814).

    -

    Capcană — nu alerga după preț. Dacă buy doji-ul weekly a plecat deja, -aștepți retestul de 1/3 - 1/2 din lumânarea mare. Poate să nu mai vină, și -atunci ratezi: „Poate să nu mai facă, poate nu mai face niciodată." -(01_buy_doji_si_strategia_mici.md:825-827). Nu muți ordinul limită mai sus -după preț (08_ANALIZA_ZILNICA/03_locul_crimei_si_pullback.md:296-311).

    -
    -

    Completare proprie — de unde calculezi TP1 când ai intrat în tranșe. -Materialul nu leagă cele trei tranșe de intrare de cele trei de ieșire -(Pasul 9). Două variante: TP1 = 1R de la close-ul confirmării (55.85, -regula din 13_strategia_3_byh.md:194-195), sau TP1 = 1R de la prețul -tău mediu, 53.39 + 1.84 = 55.23 (deducția din -A3_intrarea.md, §1.3, pasul 4). Alege una înainte de -trade și ține-te de ea. Toată discuția „la close sau la retest", desfăcută -pas cu pas: A3_intrarea.md.

    -
    -

    Treci mai departe doar dacă ordinele sunt puse (sau prima tranșă e -executată), cu stopul din Pasul 7 pus în platformă, pe toată poziția.

    -
    -

    -

    Pasul 9 — Ieși: o treime la 1:1, restul pe trailing, și nu stai peste 8 candele

    -

    Pui ținta la aceeași distanță ca stopul și, după ce e atinsă, muți restul -poziției pe trailing stop. Dacă în 8 candele nu s-a atins nici ținta, nici -stopul, ieși oricum.

    -

    - Ieșirea: trailing stop pe gap-uri și limita de 8 candele — exemple construite - A — trailing stop pe gap-uri (seria de la intrarea în tranșe) - - intrare 53.70 - - TP1 55.85 — tranșa 1: +1R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a treia treime: o lași mai departe (break-even / trend) - - - - TP1: ieși cu 1/3 - gap: low > high anterior → trail 56.20 - gap → trail 57.45 - close sub trail: ieși cu 1/3 - la 57.20 = +1.63R - B — limita de 8 candele - - TP1 51.60 - - intrare 50.40 - - SL 49.20 - - - - - - - - - - - - - - - - - 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - doji - a 8-a candelă: nici TP, nici SL - → ieși la 50.70 = +0.25R - Barele de după intrare sunt construite. Regulile: 13_strategia_3_byh.md:196-213. -

    -

    Sus: prima treime iese la TP1; linia de trail apare doar pe candelele care -deschid cu gap (low peste high-ul candelei de dinainte), urcă în trepte, iar a -doua treime iese la primul close sub ea. Jos: alt trade, în care prețul -stă 8 candele între stop și țintă — ieși la close-ul celei de-a 8-a.

    - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + + + + + + + + + + + +
    TranșăIeșire laDe unde vine țintaCe faci cu stopulweekly → dailymonthly → weeklydaily → 60 min
    1 din 3TP = SL ca distanță (1:1), proiectat de la close-ul de confirmare13_strategia_3_byh.md:194-195rămâne sub pozițiile 2-3Pivoțiilunaritrimestriali (MICI: lunari)săptămânali
    2 din 3pe trailing stop13_strategia_3_byh.md:196-200trail = low-ul candelei cu gap peste high-ul precedentei (long); ieși la close dincolo de elPragul1-2 %nedat0,5 %
    3 din 3mai departe, spre break-even/trend13_strategia_3_byh.md:204-213poți risca tot stopul inițial„8 candele"8 zile8 săptămâni~1,2 zile (calculul meu)
    Intrareaclose sau retesttranșe: close, 1/3, 1/2la retest
    Cât țiilimita de 8 + trail6-8 luni (MICI)ore sau zile (completare)
    -

    Regula de bază: TP 1:1, „nu mai mult". Profitul suplimentar vine din -trailing, nu din mutarea țintei fixe (13_strategia_3_byh.md:319-321).

    -

    Limită de timp: dacă nici TP, nici SL nu se ating în 8 candele de la -intrare, ieși oricum (13_strategia_3_byh.md:201-202).

    -

    Varianta cu două ținte (execuție): TP1 = 1R, TP2 = 2R, a treia pe trail -(08_executie_si_risc.md:619-634). Contradicția cu „nu mai mult" e la -„Unde se contrazice materialul", punctul 2.

    -

    Varianta weekly/MICI: ținte în trepte pe niveluri (R1 → R2 → vârful -anterior → SMA 200 → jumătatea marubozu-ului mare → fostul suport spart), iar -unde se suprapun mai multe niveluri, acolo iei profit -(01_buy_doji_si_strategia_mici.md:531-536). Orizont 6-7-8 luni -(01_buy_doji_si_strategia_mici.md:538-541):

    +

    Stopul se numără pe TF-ul pe care ai decis intrarea.

    -

    „strategia mici, asta e pentru cei care aveți răbdare, 6-7-8 luni să stat -în tranzacție." (01_buy_doji_si_strategia_mici.md:540-541)

    +

    Completare proprie. Legătura „doji pe TF-ul mare → pullback → doji pe +TF-ul mic" e construită de mine din piese ale cursului. Câștigul: pe +diagramă, stopul are 4,77 % pe weekly și 1,13 % pe daily, deci la același +risc cumperi de 4 ori mai multe acțiuni. Costul: pe 60 de minute vezi mai +multe doji-uri false; rata de 65-70 % nu e dată pe timeframe.

    -

    Capcană — nu extinde targetul peste 1:1. Profitul în plus vine din -trailing (13_strategia_3_byh.md:319-321).

    -
    -

    Completare proprie: barele de după intrare, din ambele panouri, sunt -construite. Tabelul cu cele 3 tranșe e, în lecția 13, marcat de -sumarizator ca completare a lui, nu ca regulă rostită -(13_strategia_3_byh.md:341-350); regula de trail, limita de 8 și 1:1 -sunt ale cursului.

    -
    -

    Pe cele trei perechi: 8 candele = 8 zile pe daily, 8 săptămâni pe -weekly, ~1,2 zile pe 60 min (aritmetica mea). Pe 60 min, limita de 8 candele -trece peste noapte; dacă nu poți ține peste noapte, vezi „Pe cont de prop".

    -

    Gata. Trade-ul s-a închis când toate trei treimile au ieșit: la TP1, la -close sub trail, sau la limita de 8 candele — ori la stop.

    -
    -

    -

    Oglinda: Sell Doji, pe short

    -

    Aceeași procedură, întoarsă: uptrend de 8-10 candele, doji lângă -rezistență/PP, confirmare = o candelă care închide sub low-ul dojiului în -maximum 3 candele; SL = high-ul ultimelor 4 candele, TP = aceeași distanță în -jos, trail-ul coboară pe candelele cu high sub low-ul precedentei -(13_strategia_3_byh.md:227-232).

    -

    Cifrele exemplului: doji high 49.40 / low 48.00, a doua candelă închide -47.30 (sub 48.00) → Sell Doji, intrare short, SL 49.45, TP 45.15 -(01_buy_doji_si_strategia_mici.md:312-314). Graficul întreg al variantei -short:

    -

    - Sell Doji — daily (exemplu construit, fără ticker) - - SL 100.10 (high 4 candele) - - intrare short 99.00 - - TP 97.90 = 1R - - trail 96.45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 99.20 / 100.10 - ieșire pe trail 96.60 - bara 15: close 99.40 peste low-ul dojiului 99.20 — NU confirmă - bara 16: close 99.00 sub 99.20 — confirmare (intrare short) - Intrare short la close sub low-ul dojiului, SL la high 4 candele, TP 1:1, apoi trail. +

    Scanerul, pe scurt

    +

    + +Scanerul Buy Doji în TradeStation +ordinea filtrelor și capcanele + +Univers: +All Stocks (~13.000) +S&P 500 · Russell 3000 + +mai mare = mai mulți candidați, scanare mai +lentă + + +Trigger: jbtgrshdATM +BDATM = 0 +(Sell Doji: SDATM = 0) + + +capcană: intervalul nu se aliniază singur cu +TF-ul: îl pui de mână + + +capcană: vede doar candela închisă: daily +rulat la prânz arată ieri + + +Nivel: RSV1ATM +% of PP ≤ 0.5 (60 min) +% of PP ≤ 2 (daily) + +Pivot Interval: 2 = weekly (pe 60 min), 3 = +monthly (pe daily) + + +capcană: RS/SR: 1 la filtrare, 100 doar la +afișare + + +Lichiditate: Volume Colors +Average Volume ≥ 500.000 +Average Length = 10 + +volum daily, indiferent de TF-ul scanerului + + +Opțional: +Since Bear ≥ 8 +Bull Reversal = 1 +RVOL doar Display + + +capcană: pornește pe Bear Reversal: comută +pe Bull + + +Lista de candidați +→ o verifici pe grafic +(pașii 2-6). +Scanerul nu e undă verde.

    -

    Ce se adaugă la short, față de long:

    -
      -
    • Nu pe piață „foarte strong bull". Un sell doji poate fi doar un bull - flag; „când shortăm, să fie overall piața praf" - (28_2025-05-27.md:313-317).
    • -
    • Nu la acțiuni sub 10 $ — short squeeze, manipulabile, gap-uri - intraday (28_2025-05-27.md:397-402, 560-576).
    • -
    • Nu contra unui Buy Doji weekly (Pasul 2).
    • -
    • Divergența poate întoarce semnalul: sell doji cu divergență de volum - sau stochastic din oversold → urmărești reverse în buy doji - (01_buy_doji_si_strategia_mici.md:338-347).
    • -
    -
    -

    +

    Capcanele: intervalul indicatorului nu se aliniază singur cu TF-ul +scanerului; scanerul vede doar candela închisă; factorul RS/SR e 1 la +filtrare, 100 doar la afișare; indicatorul pornește pe Bear Reversal; unele +Buy Doji nu apar deloc și le vezi doar cu ochiul.

    +

    Intrarea în tranșe și la retest

    +

    În sesiunile de întrebări, autorul predă ca „corectă" o treime la close și +restul cu ordine limită (se execută doar la prețul dat sau mai bun) mai jos, +în corpul candelei de confirmare.

    +

    + Intrarea în trei tranșe — același trade (doji 50.10 / 49.25) + + + ținta 1: 51.60 = 1R față de close + + ținta 1: 51.32 = 1R față de prețul mediu 50.26 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + 1/3 la close 50.40 + ca să nu ratezi trade-ul dacă pleacă fără tine + + + 1/3 cu ordin limită la 50.23 (o treime din corp) + mai ieftin, dacă prețul revine + + + 1/3 cu ordin limită la 50.15 (jumătatea corpului) + și mai ieftin + + + media mai bună coboară ținta: + ieși la 51.32, nu la 51.60 + + + retestul: prețul revine la 50.10 + și umple amândouă ordinele limită + Paranteza de pe candela de confirmare e corpul ei (49.90 → 50.40): pe el se măsoară 1/3 și 1/2. Stopul e unul singur. Exemplu construit. + + + + + + + + + risc 1.20 pe acțiune (tot la close) + + risc 1.06 pe acțiune (cu tranșe, preț mediu 50.26) +

    +

    Candela de confirmare are corpul între 49.90 și 50.40. O treime o cumperi la +close, la 50.40; o treime cu limită la o treime din corp, 50.23; o treime la +jumătatea corpului, 50.15. Candela următoare coboară până la 50.10 și le +umple pe amândouă. Prețul mediu iese 50.26: riști 1.06 pe acțiune în loc de +1.20, iar ținta de 1R vine mai devreme, la 51.32 în loc de 51.60. Cu tranșe +câștigi de două ori: risc mai mic și țintă mai apropiată. +Pe 60 de minute și pe prop, retestul contează mai mult, pentru că acolo +candela e înaltă. Nu alerga după preț: „poate nu mai face niciodată".

    +
    +

    Completare proprie: materialul nu spune de la care din cele două +prețuri calculezi ținta. Alege înainte de trade și ține-te de ea. Detalii: A3_intrarea.md.

    +

    Exemplul real: LABU, de la doji la +30 %

    -

    LABU — daily, Buy Doji la pivotul monthly (18_2025-09-23.md:608-719).

    -
    -

    Ce e real și ce nu: din curs vin doar procentele — stop inițial -9 %, +30 % într-o lună (18_2025-09-23.md:716-719). Nivelurile de preț -(pivot 86.00, intrare 89.50, SL 81.45, TP 116.35) sunt marcate de -sumarizator ca fiind ale lui, nu citite din curs (18_2025-09-23.md:713). -Materialul nu dă niciun exemplu numeric complet, de la intrare la ieșire, -cu prețuri de curs.

    -
    -

    - LABU — daily - - pivot monthly 86.00 (construit) - - SL 81.45 (construit) = −9 % (procent real) - - intrare 89.50 (construit) - - TP 116.35 (construit) = +30 % (procent real) - - SMA-20 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - bottom 1 82.40 - bottom 2 81.45 - bottom 3 81.45 - doji - confirmare (intrare) - higher high — TP atins - bara 33 = doji: o 85.00, c 84.90, h 86.30, l 84.20 — corp mic exact pe pivotul monthly 86.00 (indecizie la suport) - Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt construite de sumarizator (18_2025-09-23.md:713). +

    + LABU — daily + + 1. setup: scădere lungă, apoi trei minime aproape egale — pivotul 86.00 atins de două ori + + 2. doji + confirmare + + 3. trendul pornește + + 4. ținta + + pivot lunar 86.00 + + stop 81.45 = 9 % sub intrare (procent real) + + intrare 89.50 + + ținta 1:1 97.55 + + 116.35 = +30 % față de intrare (procent real) + + SMA-20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + test 1 · 82.40 + test 2 · 82.00 + + + aici intri, la close 89.50: + abia acum știi că au câștigat cumpărătorii + + + al treilea minim: 81.45, + fără o nouă atingere a pivotului + aici pui stopul, sub minime + + + retest: cade înapoi pe intrare + și ține — trendul e sănătos + + + aici se odihnește, nu se strică: + bull flag, pe volum mic + + + a ajuns la 116.35: +30 % în 21 de zile de bursă, + cam 3,3R din cât ai riscat + doji = corp mic (o 86.10, c 86.00): cumpărătorii și vânzătorii sunt la egalitate, exact pe pivotul lunar 86.00 + ținta 1:1 (97.55) e atinsă pe bara 40: acolo vinzi o treime, restul merge mai departe — de asta nu vinzi tot la 1:1 + Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt puse de sumarizator.

    -

    Pașii, pe acest exemplu:

    +

    Ce e real: doar procentele — stop de 9 %, +30 % într-o lună. Prețurile +sunt puse de sumarizator.

    +

    Setup-ul. Pe daily: scădere, consolidare, apoi trei minime aproape egale +— 82.40, 82.00 și 81.45, între ele 0,95 $, cam 1,2 %. Pivotul lunar 86.00 e +însă atins doar de două ori: între primele două minime prețul urcă până la +88.90, deci trece pe deasupra pivotului și cade iar prin el, iar înainte de +al treilea minim urcă doar până la 85.80 și rămâne sub. De aceea cursul îi +spune și „triple bottom", și „al doilea test al pivotului": unul numără +minimele de preț, celălalt atingerile nivelului. Doji-ul vine imediat după al +treilea minim.

    +

    Intrarea. Candela verde se închide peste doji: intrare la 89.50, stop la +81.45, sub toate cele trei minime. Ținta 1:1 ar fi fost 97.55.

    +

    Rezultatul. Retestul coboară la 89.60 și ține, urmează un flag de patru +candele pe volum mic, apoi breakout; prețul ajunge la 116.35 în 21 de zile de +bursă de la confirmare — cam 3,3R (calculul meu). Aici se vede de ce nu +vinzi tot la 1:1.

    +

    Pe weekly, tot doar procente: NKE, +36 % în 14 săptămâni.

    +

    Transfer (judecata mea, nu a cursului)

    +

    Pe prop (cont de la o firmă, cu limită zilnică de pierdere): limita se +calculează și pe pozițiile deschise, iar interdicția de overnight lasă doar +varianta de 60 de minute. Pe 50.000 $ cu limită de 1.000 $, un singur stop la +2 % te duce la limită. Cu 3 poziții și o zi proastă de cel mult 500 $, riști +167 $ pe poziție (0,33 %): 139 de acțiuni la stopul de 1.20. Intrarea la +retest e recomandată explicit pe prop.

    +

    Pe BVB: doar long, pe daily și weekly, pe 8-12 nume lichide din BET (TLV, +H2O, SNP, SNN, BRD, SNG, EL, TGN, DIGI, M), verificate de mână. Lichiditatea +o măsori în RON tranzacționați pe zi, nu în număr de acțiuni. Pivoții îi +calculezi în Excel, din maximul, minimul și închiderea lunii trecute: +PP = (H + L + C) / 3, R1 = 2·PP − L, S1 = 2·PP − H. Un spread de 1 % mănâncă +jumătate dintr-o țintă 1:1.

    +

    Unde se contrazice materialul

      -
    1. Context (pașii 3 și 5): downtrend → consolidare → triple bottom → doji.
    2. -
    3. Locație (pasul 4): doji la pivotul monthly 86.00 — al doilea test al - nivelului, fără low nou (18_2025-09-23.md:710-712).
    4. -
    5. Trigger (pasul 6): candela verde care închide peste high-ul - dojiului → intrare 89.50.
    6. -
    7. Stop (pasul 7): SL 81.45 = −9 % față de intrare. Risc 8.05, deci TP 1:1 - ar fi 97.55 — dar exemplul a mers mult mai departe.
    8. -
    9. Ieșire (pasul 9): TP +30 % = 116.35, atins într-o lună, după: bull - reversal pe candela mare → retestare → bull flag → breakout → higher high, - higher low.
    10. -
    11. Rezultat: „stop inițial 9 %, +30 % într-o lună" — un trade care a - mers ~3,3R pe distanța de stop (calcul al meu, din nivelurile marcate ca - ale sumarizatorului în 18_2025-09-23.md:713), adică exact scenariul în - care tranșa de 1/3 la 1:1 și restul pe trailing contează.
    12. +
    13. Rata: 70-75 % într-o lecție, 65-70 % în altele. Socotește cu 65-70 %.
    14. +
    15. Ținta: lecția cere 1:1, alte sesiuni folosesc 2R. 2R e alegere de + execuție, nu regulă.
    16. +
    17. Trendul scurt: lecția acceptă 2-3 candele, scanerul cu Since Bear ≥ 8 + le pierde. Caută-le și de mână.
    18. +
    19. Pivotul pe weekly: regula zice trimestrial, MICI citește lunarul. + Trage-i pe amândoi.
    20. +
    21. La close sau la retest: lecția zice close, sesiunile de întrebări + retest (A3_intrarea.md).
    22. +
    23. Detalii de scaner (factorul RS/SR, două seturi de cifre la ULTA): + A2_contradictii.md.
    -

    Ce lipsește din material: cifrele reale de intrare/SL/TP pentru LABU (și -pentru toate tickerele din lecția 13 — ANF, PYPL, XBI, ARTL, Novavax, ODFL, -Baidu, Tesla long; Apple, Lowe's, MCO, Q, SPY, Moderna, Pfizer, Google, -McDonald's, Honeywell short — 13_strategia_3_byh.md:298-308). Transcrierea -trece prin grafice reale, dar audio-ul nu conține prețuri clare. -NEACOPERIT ÎN MATERIAL: nu există niciun exemplu numeric complet de la -curs, de la intrare la ieșire, pentru nicio strategie din capitolul ăsta -(13_strategia_3_byh.md:298-308).

    -

    Exemplu weekly/MICI (doar cifrele procentuale sunt confirmate): NKE -weekly, +36 % în 14 săptămâni; răbdare pe Buy Doji weekly, +54 % în 20 de -săptămâni, trigger la a 11-a candelă (23_2025-07-29.md:202-204; -18_2025-09-23.md:728-730).

    +

    Ce trebuie să exersezi

    +
      +
    1. Marchează retroactiv 20 de setup-uri pe daily: doji, confirmare, stop, + țintă, ce s-a întâmplat în 8 candele.
    2. +
    3. Compară pe hârtie, pe 10 semnale, ținta 1:1 cu varianta 1R + 2R.
    4. +
    5. Pe BVB, măsoară spread-ul 5 zile și scoate de pe listă ce trece de 1 %.
    6. +
    +

    Legături: 06_hammer_mbt10.md (același +schelet), 02_mp2.md (unde; Buy Doji spune când), +A1_risc.md.


    Checklist de tipărit

      -
    • [ ] (Pasul 1) Simbolul e lichid: close > 30-40 $, volum mediu daily ≥ 500.000. La short: piața/sectorul e slab, prețul > 10 $.
    • -
    • [ ] (Pasul 2) Am ales perechea. TF-ul mare nu are doji confirmat contra direcției mele; pe 60 min, daily-ul are swing long stabilit.
    • -
    • [ ] (Pasul 3) Am un trend anterior în direcția opusă setup-ului: 8-10 candele ideal; 2-3 candele acceptate, dar tratate ca semnal mai slab.
    • -
    • [ ] (Pasul 3) Candelă cu open ≈ close, corp mic față de range, fitil în ambele părți.
    • -
    • [ ] (Pasul 4) Doji-ul e la un suport/pivot (long) sau rezistență/pivot (short), sub pragul TF-ului (60 min ≤ 0,5 %, daily 1-2 %).
    • -
    • [ ] (Pasul 5) Știu dacă e A+ sau mediocru: volum, divergență, proiecție, trigger-e multiple.
    • -
    • [ ] (Pasul 6) A închis o candelă peste high-ul dojiului (long) / sub low (short), în maximum 3 candele după doji.
    • -
    • [ ] (Pasul 6) Dacă au trecut 3 candele fără confirmare → setup expirat, nu intru.
    • -
    • [ ] (Pasul 7) Stop = extrema ultimelor 4 candele de la candela de confirmare, pe TF-ul intrării.
    • -
    • [ ] (Pasul 7) Mărimea poziției = risc$ / distanța la stop, rotunjit în jos.
    • -
    • [ ] (Pasul 8) Am hotărât înainte: tot la close, sau 1/3 la close + 1/3 la 1/3 + 1/3 la 1/2. Nu mut ordinul după preț.
    • -
    • [ ] (Pasul 9) TP = aceeași distanță ca stop, proiectată de la close-ul de confirmare.
    • -
    • [ ] (Pasul 9) Dacă în 8 candele nu s-a atins nici TP, nici SL → ies la a 8-a.
    • -
    -
    -

    Unde se contrazice materialul

    -

    Nu aleg eu între variante. Pentru fiecare: ce spune fiecare sursă și ce -înseamnă practic pentru cine trebuie să decidă.

    -
      -
    1. -

      Rata de câștig. 13_strategia_3_byh.md:11-12 scrie „70-75 %"; - 01_buy_doji_si_strategia_mici.md:146-152 și 03_2026-08-11.md:185 spun - „65-70 %" / „peste 65 %". Practic: folosește 65-70 % pentru așteptări de - sizing (partea prudentă), dar nu schimba regulile pe baza diferenței — ea - nu afectează setup-ul, doar expectation management.

      -
    2. -
    3. -

      Take-profit. 13_strategia_3_byh.md:194-195 impune 1:1 fix („nu mai - mult"); 28_2025-05-27.md:130-134 și 08_executie_si_risc.md:619-634 - folosesc TP la 2R / TP1 1R + TP2 2R. Practic: dacă vrei să respecți - regula principală, iei 1R pe prima tranșă și lași restul pe trailing; - varianta 2R e o alegere de execuție, nu o regulă a strategiei.

      -
    4. -
    5. -

      Condiția de trend în scanner. 11_construire_scanere_sf_byd_sld.md:58-62 - construiește triggerul doar din BDATM = 0; - 28_2025-05-27.md:37-52 adaugă Since Bear ≥ 8 din alt indicator. - Practic: versiunea cu ≥ 8 filtrează mai mult și ratează setup-urile cu - trend scurt; versiunea fără filtru le prinde pe toate, dar îți dă listă mai - lungă de triat manual.

      -
    6. -
    7. -

      Lungimea trendului vs. scanner. 13_strategia_3_byh.md:315-318 - acceptă și 2-3 candele de trend; scannerul din 28_2025-05-27.md:144-149 - cere ≥ 8 și pierde explicit acele cazuri. Practic: nu te baza doar pe - scanner dacă vrei să prinzi și trendurile scurte; verifică și manual.

      -
    8. -
    9. -

      Factorul RS/SR. 11_construire_scanere_sf_byd_sld.md:80-93 explică - 100 ca opțiune validă (afișezi 5.97 în loc de 0.0597), cu condiția să - înmulțești pragul; 04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:329-341 revine cu o corecție - explicită (pune 1 la filtrare, 100 doar la display). Practic: cu 1 - scrii pragul natural (≤ 0.5); cu 100 trebuie să-l scrii ≤ 50, altfel - filtrezi de 100 de ori mai strâns. Amestecul celor două e singura variantă - greșită sigur.

      -
    10. -
    11. -

      Două seturi de cifre ULTA. 11_construire_scanere_sf_byd_sld.md:139-209 - (doji ~403.60, intrare 404.20, SL 396, TP 418) vs. - 04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:82-183 (close real 373.30, suport 355.48, pivot - 383.74). Ambele sunt marcate ca parțial completări ale sumarizatorului. - Practic: nu lua niciunul ca exemplu „de curs"; singurele cifre confirmate - sunt cele din al doilea set (close/suport/pivot), nu nivelurile de trade.

      -
    12. -
    13. -

      Ce pivot citești pe weekly. Regula de pivoți spune Weekly → pivoți - Quarterly (03_timeframes_set_up.md:69-79; - 11_construire_scanere_sf_byd_sld.md:63-69); MICI, care e un buy doji - weekly, se citește față de pivotul monthly - (01_buy_doji_si_strategia_mici.md:12, 357, 370-379). Materialul nu - le împacă. Practic: pe perechea monthly → weekly, trage-le pe amândouă; - un doji la ambele niveluri e oricum mai bun decât la unul.

      -
    14. -
    15. -

      Intri la close sau aștepți retestul. Lecția 13 intră la close - (13_strategia_3_byh.md:191-195); sumarul Q&A din 25.08.2025 scrie „nu - intri la închiderea lui — aștepți retestul" (20_2025-08-25.md:144-145), - iar transcrierile spun o treime la close și restul la retest - (Pasul 8). Desfăcută complet în A3_intrarea.md.

      -
    16. -
    -
    -

    Transfer

    -
    -

    Tot ce urmează în secțiunea asta e judecata mea, nu materialul cursului. -Unde cursul chiar spune ceva despre prop sau despre BVB, citatul e marcat -cu trimitere; restul e extrapolare și poate fi greșit.

    -
    -

    Pe cont de prop

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Regulă de propCe stricăAjustarea
    drawdown zilnic %, calculat și pe poziții deschiseUn Sell Doji pe un small cap poate atinge limita cu pierderea flotantă. Materialul: un participant a pățit-o — i s-au închis tranzacții care erau pe profit, pentru că pierderea flotantă atinsese limita (26_2025-06-11.md:214-222)Nu intra niciodată cât să ajungi la limită doar cu pozițiile deschise. Size-ul din §„calculat înapoi"
    drawdown totalPoziții multiple corelate (30 de sell-uri în același sector, 28_2025-05-27.md:319-330) pot mișca contul în aceeași ziCap pe risc agregat simultan, nu doar per trade
    interdicție overnight / weekendStrategia daily ține poziția peste noapte prin construcție (SL la 4 candele, TP 1:1, limită 8 candele)Dacă firma interzice overnight, rămâne doar varianta 60 min; verifică regulile exacte
    news lockoutDoji-ul însuși e adesea pe o zi cu eveniment; lockout-ul poate bloca tocmai semnalulAccepți că ratezi semnalul din fereastră; nu forța intrarea înainte
    consistency rule (o zi nu poate fi > X % din profit)TP 1:1 dă zile mici, dar o zi cu 2-3 stop-uri poate domina partea de pierdereRegula de mai jos ține pierderea zilnică sub 1/2 din limită, deci și consistency-ul pe pierdere e mai greu de atins
    -

    Timp de ecran: strategia nu cere stat la ecran — scanerul se programează -(Schedule), iar cifra orelor nu e dată explicit în material -(28_2025-05-27.md:392-394; 11_construire_scanere_sf_byd_sld.md:296-304). -Pe BVB, înlocuitorul e o verificare manuală de ~5 minute pe zi pe lista de -8-12 nume.

    -

    Sizing-ul, calculat înapoi din limita zilnică. Pe un cont de 50.000 $ -cu limită zilnică de 1.000 $ (2 %), regula generală de 2 % per tranzacție -(03_MODUL_2/04_money_management_position_sizing.md:4-11) înseamnă exact -1.000 $ per trade — un singur stop atinge limita. De aceea coborâm:

    -
      -
    • ținta e ca o zi proastă planificată × 2 ≤ limita zilnică → pierderea - planificată într-o zi proastă ≤ 500 $;
    • -
    • cu maximum 3 poziții simultane (nu uita: nu depăși limita nici dacă - „ies pe pierdere maximă toate cele 3 tranzacții ale zilei", - 26_2025-06-11.md:218-219) → risc per poziție ≤ 167 $ = 0,33 % din - cont;
    • -
    • la intrare 50.40 / SL 49.20 (distanță 1.20 $) → 167 / 1.20 = 139 de - acțiuni, rotunjit în jos.
    • -
    -

    Asta e judecata mea de sizing, nu o cifră din material. Materialul are -NEACOPERIT exact aici: nu dă nicio cifră de risc per trade pentru -Strategia 3, în nicio lecție citată.

    -

    Un plus specific strategiei: intrarea pe retest 1/2 sau 1/3 în loc de -close-ul triggerului reduce riscul la ~jumătate pe același setup și e -recomandată explicit „pe prop, unde pragul de pierdere zilnică e fix" -(20_2025-08-25.md:141-164).

    -

    Verdict: merge, cu ajustările de mai sus. Regula de intrare e pur -preț, riscul e măsurabil din construcție (SL fix, TP 1:1), deci se -pretează la un cont cu limită zilnică. Rezervele: short-ul e descurajat de -contextul de piață și de regulile de overnight, iar limita de 8 candele -forțează ieșiri care pot lovi tocmai în news lockout. Cu sizing-ul de -0,33 %/poziție și retest 1/2–1/3, limita zilnică nu se atinge nici cu 3 -stop-uri.

    -

    Pe BVB (swing)

    -

    Ce cere strategia vs. ce există:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Ce cereExistă la BVB?Înlocuitorul concret
    scaner jbtgrshdATM, BDATM/SDATM = 0nulistă manuală de 8-12 nume BET, verificată o dată pe zi (5 min/zi) cu condiția doji din Pasul 3
    indicator RSV1ATM pentru proximitate de pivotnupivoții se calculează în Excel din H/L/C din luna precedentă; proximitatea o măsori cu raportul preț/pivot
    Bull/Bear Reversal, RVOL (proprietare)nuBull Reversal se înlocuiește cu „prețul a spart trail-ul"; RVOL cu volumul de azi față de media 10 zile, calculat manual
    shortpractic nu (retail, fără împrumut lichid)rămâne doar jumătatea long. Vezi verdictul
    volum mediu > 500.000, preț > 30-40 $pragmatic nu (praguri US)praguri recalculate: valoare tranzacționată, nu număr de acțiuni sau preț (vezi mai jos)
    date fundamentale trimestrialeda, dar anual/trimestrialrapoartele de pe bvb.ro / platforma brokerului; nu sunt cerință de intrare la S3 (01_buy_doji_si_strategia_mici.md:828-832)
    -

    Pragurile, recalculate. Pragul US „volum mediu > 500.000 de acțiuni" și -„preț > 30-40 $" nu au sens pe BVB: acțiunile se tranzacționează în RON, -numărul de acțiuni e incomparabil (o bancă are miliarde de acțiuni, un -emitent mic are milioane), iar pe BVB prețul în RON nu e proxy de -lichiditate — SNP tranzacționează sub 1 RON și e printre cele mai lichide -nume. Pragul util e valoarea:

    -
      -
    • valoare tranzacționată ≥ ~1-2 milioane RON/zi, medie pe 10 zile (înlocuiește Average Length = 10, 11_construire_scanere_sf_byd_sld.md:70-73);
    • -
    • spread top-of-book ≤ ~0,5 % la cele mai lichide, până la ~1-2 % la coada listei;
    • -
    • cel puțin ~30-50 de tranzacții/zi — un nume care se tranzacționează în 3 tranzacții pe zi nu are grafic pe care să citești un doji.
    • -
    -

    Cifrele de mai sus sunt estimările mele de ordin de mărime, de verificat în -platformă; materialul nu dă niciun prag pentru BVB.

    -

    Universul propus (toate sunt membri BET, dar lichiditatea și spread-ul -diferă; ordinea e a mea, de verificat):

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    SimbolDe ce intrăCe te aștepți la lichiditate / spread
    TLV (Banca Transilvania)cea mai mare pondere BET, cel mai urmărit nume de retaillichiditate mare, spread ~0,2-0,4 %
    H2O (Hidroelectrica)pondere mare BET, volatilitate bună pentru SL structurallichiditate mare, spread ~0,3-0,5 %
    SNP (OMV Petrom)cel mai tranzacționat ca volum de acțiuni; preț sub 1 RONlichiditate mare pe valoare, spread poate părea mare în procent din preț mic
    SNN (Nuclearelectrica)pondere BET, trenduri lungilichiditate medie-mare
    BRD (BRD-GSG)pondere BETlichiditate medie-mare
    SNG (Romgaz)pondere BET, mișcări pe energie/gazlichiditate medie
    EL (Electrica)pondere BETlichiditate medie
    TGN (Transgaz)pondere BETlichiditate medie-mică
    DIGI (Digi Communications)lichid, dar cu free-float restrânslichiditate medie
    M (MedLife)emisiune cu volatilitate, spread mai larglichiditate mică-medie
    -

    Fără opțiuni listate lichide pe aceste nume; există derivate pe indicele BET, -dar nu schimbă regula de candelă. Nu propun small-cap-uri: pe BVB filtrul de -5-10 nume lichide e oricum mai mic decât universul pe care a fost gândită -strategia.

    -

    Pivoții în Excel. Strategia folosește floor pivots ca „nivel" pentru -doji. Autorul a confirmat că pivoții clasici se calculează „1 la 1" pe BVB, -fără TradeStation (09_2025-12-09.md:1177-1180). Formula standard, din H/L/C -ale perioadei precedente (pentru un grafic daily, luna precedentă):

    -
    PP = (H + L + C) / 3
    -R1 = 2*PP - L        S1 = 2*PP - H
    -R2 = PP + (H - L)    S2 = PP - (H - L)
    -R3 = H + 2*(PP - L)  S3 = L - 2*(H - PP)
    -
    -

    Exemplu ilustrativ pe TLV (cifrele H/L/C sunt ale mele, ca să arăt pașii): -H = 25,00, L = 23,00, C = 24,50 → PP = 24,17; R1 = 25,34; S1 = 23,34; -R2 = 26,17; S2 = 22,17. Doji-ul „la nivel" înseamnă că low-ul/high-ul lui -cade în vecinătatea unuia dintre aceste numere (Pasul 4).

    -

    Ce se rupe din cauza lichidității:

    -
      -
    • Spread-ul mănâncă un TP de 1:1. Pe un nume cu spread 1 %, o mișcare de - 2 % dus-întors pierde jumătate în costuri; la 1:1 net ajungi ~0,5:1. La - TLV/H2O (0,3-0,5 %) efectul e suportabil; la coada listei nu.
    • -
    • SL-ul de 4 candele poate fi lovit de zgomot. Pe un nume cu volum de - ordinul a 1 milion RON/zi, o singură comandă de 20-30 mii RON mișcă prețul - câteva zecimi de procent — suficient să atingă un SL apropiat fără ca - ideea să fie invalidată.
    • -
    • Gap-uri la deschidere. BVB deschide cu licitație (10:00); pe știri, - prețul poate deschide direct peste SL → SL-ul nu te protejează, exact - mecanismul descris la 28_2025-05-27.md:566-570 pentru valorile mici.
    • -
    • Limita de 8 candele devine „8 zile de așteptat". Pe un nume lent, TP-ul - 1:1 poate să nu fie atins în 8 zile și ieși pe la zero, cu spread plătit.
    • -
    • Pivoții monthly se calculează manual — o greșeală de câteva zecimi la - H/L/C mută nivelul și transformă un setup „la nivel" într-unul oarecare.
    • -
    -

    Verdict: merge degradat, long-only. Regulile de candelă -(trend → doji → confirmare în 3 → SL la 4 → TP 1:1 → trail → limita 8) se -aplică integral pe cele 8-12 nume BET lichide, pe daily/weekly. Pierzi -short-ul (jumătate din strategie), scanerul pe mii de simboluri, viteza de -reacție pe 60 min și filtrele proprietare.

    -

    Cât din strategie supraviețuiește: regulile de intrare/ieșire, integral -(~50-60 % din strategia ca sistem, adică toată jumătatea long). Din jumătatea -short, 0 %. Din infrastructura de scanare/filtrare, 0 % — înlocuită manual. -Estimarea e a mea, nu a materialului.

    -
    -

    Ce trebuie să exersezi ca s-o poți folosi

    -
      -
    1. Marchează retroactiv 20 de setup-uri pe BVB, pe daily, pe cele 8-12 - nume BET: pentru fiecare, notează data doji-ului, high/low, dacă a - confirmat în 3 candele, unde ar fi fost SL la 4 candele și TP 1:1, și ce - s-a întâmplat în următoarele 8 candele. Măsurabil: 20 de fișe completate.
    2. -
    3. Calculează pivoții monthly pentru 6 luni în urmă pe 5 nume BET, în - Excel, și verifică câte doji-uri au căzut la ≤ 1 % de un nivel. Scopul: - să vezi dacă Pasul 4 chiar filtrează ceva pe universul mic.
    4. -
    5. Testează pe hârtie varianta TP 1:1 vs. TP1 1R + TP2 2R pe minim 10 - semnale (punctul 2 din „Unde se contrazice materialul"). Notează în jurnal care dă rezultat mai - bun pe BVB, unde limita de 8 candele e mai strânsă.
    6. -
    7. Măsoară spread-ul real la deschidere și la 12:00 pe 5 nume BET, 5 - zile la rând. Măsurabil: un tabel cu spread-ul mediu; dacă depășește ~1 %, - scoate numele de pe listă.
    8. -
    9. Rulează pe prop un singur semnal la 0,33 % risc, cu sizing calculat - dinainte ca în Transfer. Scopul nu e profitul, ci să verifici că limita - zilnică nu se apropie nici când SL-ul e lovit.
    10. -
    -
    -

    Legături

    -
      -
    • Strategia se suprapune cu: Buy hammer + MBT-10 (06_buy_hammer_mbt10.md) - — același schelet de trigger (extrema 4 candele, confirmare), iar buy - hammer-ul apare des după buy doji (01_buy_doji_si_strategia_mici.md:50, - 543-545). Când amândouă sunt pe aceeași candelă, semnalul e mai puternic - (102_24032026.txt:167-170; Pasul 5, rândul 10).
    • -
    • Se suprapune cu MP² (02_mp2.md): MP² dă unde (bottom-ul, crossing-ul - de pivoți), Buy Doji dă când (trigger-ul de candelă). Pe BVB, combinația - e soluția pentru lipsa trigger-elor fine (09_2025-12-09.md:1184-1190).
    • -
    • Selecția simbolului: 04_selectia.md.
    • -
    • Risc și execuție: A1_risc.md.
    • -
    • Contradicțiile din material, toate la un loc: - A2_contradictii.md.
    • +
    • [ ] (1) Simbol lichid; weekly-ul nu are doji contra mea.
    • +
    • [ ] (2) Scădere clară înainte, nu gap-up; doji cu corp ≤ 10 %, fitile în ambele părți.
    • +
    • [ ] (3) Low-ul doji-ului la cel mult 1-2 % de un suport sau pivot lunar.
    • +
    • [ ] (4) Închidere peste high-ul doji-ului în maximum 3 candele.
    • +
    • [ ] (5) Stop sub cel mai jos low din 4 candele; acțiuni = risc / distanță.
    • +
    • [ ] (6) Ținta 1 = distanța stopului; restul pe trail; ies după 8 candele.
    • +
    • [ ] Short: piață slabă, preț > 10 $, stop deasupra.

    Surse

    -

    13_strategia_3_byh.md -(fișierul principal, S3) · -11_construire_scanere_sf_byd_sld.md -(scanerele; indicator proprietar) · -01_filtre_scaner_bull_bear_reversal_pp.md -(filtre + ULTA) · -01_buy_doji_si_strategia_mici.md -(aplicarea zilnică, varianta MICI) · -08_executie_si_risc.md -(3 poziții, sizing) · -28_2025-05-27.md (scanere, filtre, short) · -22_2025-08-04.md (regulile dictate) · -03_2026-08-11.md (SL 4 candele, >65 %, weekly) · -18_2025-09-23.md (LABU) · -20_2025-08-25.md (retest 1/2–1/3 pe prop; stopul pe TF-ul deciziei) · -26_2025-06-11.md (limita zilnică pe poziții deschise) · -23_2025-07-29.md (tranșe weekly) · -09_2025-12-09.md (pivoții pe BVB) · -03_timeframes_set_up.md (pivoții pe timeframe; TF mare vs. TF mic) · -A3_intrarea.md (la close sau la retest).

    -
    -

    Notă de denumire. Fișierul principal se numește 13_strategia_3_byh.md, -dar titlul lui e „Strategia 3: Buy Doji / Sell Doji (SF BYD/SLD)" -(13_strategia_3_byh.md:1). „BYH" din slug nu e o strategie separată de -„breakout" — grep -rn -i 'byh' prin summaries/ găsește doar acest -fișier. Fișele byd_sld.md și byh.md descriu aceeași strategie; capitolul -ăsta le folosește ca o singură sursă.

    -
    -

    Ce e al meu, nu al cursului, în capitolul ăsta: blocurile „Completare -proprie" (succesiunea pe două timeframe-uri și ce se strică pe TF mic; -stopul „la ochi"; exemplul de sizing; TP1 la intrarea în tranșe; barele de -după intrare din diagramele de ieșire), aritmetica timpului („8 candele = -…", marcată aritmetica mea), secțiunea Transfer întreagă, și toate -diagramele: sunt exemple construite, fără ticker, cu excepția LABU, unde -doar procentele sunt ale cursului. Mecanismul stop-urilor de deasupra -high-ului e completarea sumarizatorului lecției 13, marcată ca atare la -Pasul 6.

    +

    Textul fără trimitere e explicația mea și nu adaugă reguli; ce completez eu +începe cu Completare proprie. Diagramele sunt exemple construite, cu +excepția LABU, unde doar procentele sunt ale cursului.

    +

    Prescurtări: +13 = 13_strategia_3_byh.md +(lecția principală; „byh" din nume nu e altă strategie, titlul e „Strategia +3: Buy Doji / Sell Doji", 13:1) · +11 = 11_construire_scanere_sf_byd_sld.md · +tf = 03_timeframes_set_up.md · +mm = 04_money_management_position_sizing.md · +filtre = 01_filtre_scaner_bull_bear_reversal_pp.md · +mici = 01_buy_doji_si_strategia_mici.md · +exec = 08_executie_si_risc.md · +crimei = 03_locul_crimei_si_pullback.md · +fișierele datate sunt sesiuni Q&A din ../09_QA/; fișierele .txt sunt +transcrieri din transcripts/09_Q_and_A/.

    +

    Nivelul 1 — 13: 10-12, 15-30, 38-100, 227-232 · mici: 146-152 · +03_2026-08-11: 180-218 · 28_2025-05-27: 343-349.

    +

    Pasul 1 — 11: 53-62, 70-73 · 28_2025-05-27: 47-52, 372-380 · +mici: 32-40, 316-326 · 03_2026-08-11: 220-223.

    +

    Pasul 2 — 13: 185-187, 308, 315-318 · 28_2025-05-27: 40-52, +144-149 · mici: 227-235.

    +

    Pasul 3 — 13: 188-190 · 11: 63-69, 99-104 · filtre: 36-42.

    +

    Pasul 4 — 13: 102-149, 158-167, 342-350 (mecanismul, marcat +completare) · mici: 20-28, 136-138, 222-225, 818-821 · +23_2025-07-29: 208-209.

    +

    Pasul 5 — 13: 192-193, 204-213 · 22_2025-08-04: 23-29 · mici: +139-141, 833-836 · 18_2025-09-23: 716-719 · 20_2025-08-25: 9-15 · mm: +4-11, 28-34 · exec: 40-49, 619-634.

    +

    Pasul 6 — 13: 194-213, 319-321, 341-350 (treimile, marcate +completare) · mici: 531-541.

    +

    Oglinda — 13: 227-232, 258-259 · mici: 312-314 (alt exemplu: doji +49.40/48.00, intrare 47.30), 338-347 · 28_2025-05-27: 313-330, 397-402, +560-576.

    +

    A+ — 13: 185-190, 214-226, 308 · mici: 35-37, 227-235, 338-360, +370-386, 531-536 · 11: 106-137 · filtre: 44-52, 296-327 · +18_2025-09-23: 710-712 · 03_2026-08-11: 180-223 · 28_2025-05-27: 379 · +22_2025-08-04: 14 · 102_24032026.txt: 167-170 · triaj/DECIZII.md: 47, +107-113, 118.

    +

    Perechile de TF — mici: 32-40, 370-386, 538-559 · tf: 52-61, 69-79 · +11: 63-69, 99-104 · 20_2025-08-25: 9-15, 172-176 · 23_2025-07-29: +206-213 · 20_25082025.txt: 154-156, 207-208 · fise/m2d.md: 68 · +14_strategia_1_m2d.md: 461-466 · triaj/DECIZII.md: 118.

    +

    Scanerul — 11: 317-324 · 28_2025-05-27: 47-52 · filtre: 303-346 · +mici: 838-839.

    +

    Tranșele — 13: 191-195 · mici: 136-142, 798-814, 825-827 · +23_2025-07-29: 206-213 · 19_08092025.txt: 1067-1073 · 20_2025-08-25: +141-164, 172-180 · 20_25082025.txt: 207-208 · crimei: 296-311.

    +

    LABU — 18_2025-09-23: 608-719 (nivelurile sumarizatorului: 713), +728-730 · 13: 298-308 · 23_2025-07-29: 202-204.

    +

    Transfer — 26_2025-06-11: 214-222 · 28_2025-05-27: 319-330, +392-394, 566-570 · 11: 70-73, 296-304 · mm: 4-11 · 20_2025-08-25: +141-164 · mici: 828-832 · 09_2025-12-09: 1177-1180.

    +

    Contradicțiile — (1) 13: 11-12 · mici: 146-152 · 03_2026-08-11: +185; (2) 13: 194-195 · 28_2025-05-27: 130-134 · exec: 619-634; +(3-4) 11: 58-62 · 13: 315-318 · 28_2025-05-27: 37-52, 144-149; +(5-6) 11: 80-93, 139-209 · filtre: 82-183, 329-341; (7) tf: 69-79 · +11: 63-69 · mici: 12, 357, 370-379; (8) 13: 191-195 · +20_2025-08-25: 144-145.

    +

    Legături — mici: 50, 543-545 · 102_24032026.txt: 167-170 · +09_2025-12-09: 1184-1190.

    diff --git a/summaries/17_STRATEGII/01_buy_doji.md b/summaries/17_STRATEGII/01_buy_doji.md index 27023a5..68716e3 100644 --- a/summaries/17_STRATEGII/01_buy_doji.md +++ b/summaries/17_STRATEGII/01_buy_doji.md @@ -1,612 +1,303 @@ -# 1. Buy Doji / Sell Doji (Strategia 3 / BYH) +# 1. Buy Doji / Sell Doji (Strategia 3) -**Etichete:** `long` `short` · `swing` (daily) / `intraday` (60 min) / -`investiție` (weekly-monthly, varianta MICI) · `acțiuni US` `futures` `BVB` · -dificultate `2/5` · `merge pe prop: da, cu ajustări` · -`merge pe BVB: da, long-only` +**Etichete:** `long` `short` · `swing` pe daily · `acțiuni US` `futures` `BVB` · +dificultate `2/5` · merge pe prop: da, cu ajustări · merge pe BVB: da, doar long -**Ce face.** Cumperi când un doji apărut la capătul unei scăderi e urmat, în -maximum 3 candele, de o candelă care **închide peste high-ul lui**. Stopul -stă sub cele mai joase 4 candele, prima țintă e la aceeași distanță (1:1), -restul poziției merge pe trailing. Sell Doji e oglinda, pe short. E singura -regulă de intrare din curs **fără niciun indicator proprietar**: o vezi cu -ochiul pe orice platformă. +# Nivelul 1 — Din avion -**Pe ce timeframe.** „Orice timeframe (5 min → monthly)" -(`13_strategia_3_byh.md:10-11`). Tu o vei folosi pe trei perechi — setup pe -TF-ul mare, intrare pe cel mic: **weekly → daily**, **monthly → weekly**, -**daily → 60 min**. Pasul 2 le pune una lângă alta. +## Ce e un doji -**Cât de des dă semnal și cât de des merge.** Des: e un pattern de o singură -candelă, pe orice asset — de aceea îl predă cursul în locul Morning Star, care -apare rar (`03_2026-08-11.md:180-218`). Materialul nu dă o cifră de semnale pe -săptămână. Rata declarată nu e unică: **70-75 %** -(`13_strategia_3_byh.md:11-12`), **65-70 %** -(`01_buy_doji_si_strategia_mici.md:146-152`), **peste 65 %** -(`03_2026-08-11.md:185-186`) — vezi „Unde se contrazice materialul", punctul 1. -Nu un edge uriaș, de aceea stopul e obligatoriu și de aceea strategia se -repetă des. +Un doji e o candelă care se închide aproape la prețul la care s-a deschis: +corpul e o linie subțire, iar fitilele ies și în sus, și în jos. Spune că în +perioada aceea cumpărătorii și vânzătorii au fost la egalitate. -**Tot trade-ul, dintr-o privire:** - - - Buy Doji — daily (exemplu construit, fără ticker) - - SL 49.20 (low 4 candele) - - intrare 50.40 - - TP1 51.60 = 1R - - trail 52.60 - - MA(20) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 50.10 / 49.20 - ieșire pe trail ~52.60 - bara 15: close 49.90 sub high-ul dojiului 50.10 — NU confirmă - bara 16: close 50.40 peste 50.10 — confirmare (intrare) - Intrare la close-ul confirmării, SL la low-ul ultimelor 4 candele, TP1 1:1, apoi trailing stop. + + Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.20 jos + + doji + + nu e doji + + + cât de sus a urcat prețul: 50.10 + cât de jos a coborât: 49.20 + + + DA: corp 0.05 + = 5,6 % din înălțime + + + DA, la limită: + corp 0.09 = 10 % + + + NU: corp 0.30 + = 33 % + + + NU: corp mic (5,6 %), + dar fără fitil sus + + + fitilul de sus + cumpărătorii au împins, dar n-au ținut + + + corpul: aproape o linie + open și close aproape egale — nimeni + n-a câștigat ziua + + + fitilul de jos + vânzătorii au împins, dar n-au ținut + open 49.60 + close 49.55 + + + corp prea gros (33 %) + aici una din tabere a câștigat — + nu mai e indecizie + + + fără fitil sus + regula cere fitil în ambele părți + Doji = corpul e cel mult 10 % din înălțimea totală a barei (aici înălțimea e 0.90) și are fitil și sus, și jos. -Graficul întreg al trade-ului: downtrend de 10 candele → doji → confirmare în -fereastra de 3 → intrare la close-ul de confirmare, SL la extrema ultimelor -4 candele, TP 1:1 atins, apoi poziția rămasă pe trailing stop. Nivelurile -sunt cele din exemplul construit al lecției (`13_strategia_3_byh.md:38-95`, -`:97-100`). +## Ce face strategia -**Fraza de decizie:** +Când prețul a scăzut mai multe zile la rând și apare un doji, e posibil ca +vânzătorii să fi obosit. Nu cumperi pe doji. Aștepți ca una din următoarele +trei candele să se închidă peste vârful lui (high-ul) — asta arată că au +preluat controlul cumpărătorii. Atunci cumperi, pui stopul sub ultimele 4 +candele, vinzi o parte când prețul a urcat cât riscai și lași restul să +meargă cât ține creșterea. + +Nu are nevoie de niciun indicator: o vezi cu ochiul, pe orice platformă. Cursul +spune că merge în cam 65-70 % din cazuri, deci cam un trade din trei pierde. +De aceea stopul e obligatoriu. + +Tot trade-ul, pe un exemplu construit: + + + Buy Doji — un trade de la cap la coadă (daily, exemplu construit) + + 1. scăderea: vânzătorii obosesc + + 2. doji: pauză, încă nu intri + + 3. confirmarea + + 4. ieșirea: o treime la țintă, restul pe trail + + ținta 1: 51.60 + + intrare 50.40 + + stop 49.20 + + MA(20) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + stopul 49.20, 5 cenți sub doji + sub el, ideea că vânzătorii + au obosit e moartă + + + AICI INTRI, la close 50.40 + abia acum știi că + cumpărătorii au câștigat + + + ținta 1: 51.60 = riscul (1.20) + încă o dată: vinzi o treime + + + trailing stop: urcă după preț + la fiecare gap, nu coboară + + + ieși la 52.30 (+1.58R) + prima închidere sub trail + + + 1R = 1.20 (riscul) + + 1R = 1.20 (ținta) + + +De la stânga la dreapta: 14 zile de scădere, doji-ul (high 50.10, low 49.25), +o zi care nu confirmă, apoi ziua care se închide la 50.40, peste 50.10 — +acolo intri. Stopul e la 49.20, puțin sub doji, deci riști 1.20 pe acțiune. Prima țintă +e tot la 1.20 deasupra intrării, la 51.60. Restul poziției iese mai târziu, +când prețul se închide sub linia de trailing stop. + +## Mini-glosar + +- **Doji** — candelă cu corp foarte mic și fitile în ambele părți. Regula de + lucru: corpul are cel mult 10 % din înălțimea totală a candelei. +- **Timeframe (TF)** — cât timp acoperă o candelă: pe daily, o zi; pe weekly, + o săptămână. Pe „TF-ul mare" citești direcția, pe „TF-ul mic" intri. +- **Trigger** — evenimentul care îți dă voie să intri. Aici: o candelă care se + închide peste high-ul doji-ului. +- **Stop-loss (SL)** — prețul la care ieși automat cu pierdere, pentru că + ideea s-a dovedit greșită. Îl pui în platformă odată cu intrarea. +- **1R** — cât pierzi pe acțiune dacă te lovește stopul. Intri la 50.40, stopul + e la 49.20, deci 1R = 1.20; un câștig de „+2R" înseamnă 2.40 pe acțiune. +- **Take-profit (TP)** — prețul la care iei profitul. Aici prima țintă e la 1R + deasupra intrării: 50.40 + 1.20 = 51.60. Asta înseamnă „1:1". +- **Trailing stop („ieșire pe trail")** — un stop pe care îl urci după preț, + dar nu-l cobori niciodată. Când prețul se întoarce și se închide sub el, + ieși cu profitul strâns până atunci. +- **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. +- **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. + +## Fraza de decizie > Cumpăr când un doji de după un downtrend e confirmat de o închidere peste > high-ul lui în maximum 3 candele, ies la TP egal cu SL sau pe trailing, și > dacă în 8 candele nici una nu s-a atins, ies oricum. -Oglinda: vând în lipsă când un doji de după un uptrend e confirmat de o -închidere sub low-ul lui, cu aceleași reguli de SL/TP/timp -(`13_strategia_3_byh.md:227-232`). +Pe short: vând în lipsă când un doji de după un uptrend e confirmat de o +închidere sub low-ul lui, cu aceleași reguli de SL, TP și timp. -**Cei 9 pași:** [1. lista](#pasul-1) · [2. perechea și direcția](#pasul-2) · -[3. trendul și doji-ul](#pasul-3) · [4. locația](#pasul-4) · -[5. confirmările](#pasul-5) · [6. trigger-ul](#pasul-6) · -[7. stopul și mărimea](#pasul-7) · [8. intrarea](#pasul-8) · -[9. ieșirea](#pasul-9). Apoi: [oglinda short](#oglinda-short), -[exemplul LABU](#exemplul-labu), [checklist](#checklist). +## Cei 6 pași -**Cum citești blocurile.** Regulile au trimitere `fișier:linie`; textul fără -trimitere dintre ele e explicația mea și nu adaugă reguli. Unde completez o -regulă pe care materialul n-o dă, blocul începe cu **Completare proprie:** și -spune pe ce mă sprijin. +[1. Candidatul și direcția pe weekly](#pasul-1) · +[2. Trendul și doji-ul](#pasul-2) · [3. Doji-ul pe un nivel](#pasul-3) · +[4. Trigger-ul](#pasul-4) · [5. Stopul și mărimea](#pasul-5) · +[6. Ieșirea](#pasul-6) · apoi [oglinda pe short](#oglinda-short), +[rafinările](#nivelul-3) și [checklist-ul](#checklist). --- +# Nivelul 2 — Procedura mecanică, în 6 pași + +Aici nu alegi nimic. Faci pașii în ordine, pe perechea weekly → daily: +citești direcția pe weekly și intri pe daily. Dacă un pas nu trece, lași +simbolul și treci la următorul. + -## Pasul 1 — Îți faci lista de candidați +## Pasul 1 — Candidatul și direcția pe weekly -**Rulezi scanerul (sau treci manual prin lista ta) și păstrezi doar -simbolurile lichide, pe care chiar poți intra și ieși.** Scanerul nu-ți dă -undă verde; îți economisește timpul de căutat. Restul pașilor îi faci pe -grafic, pe fiecare candidat. +**Deschizi graficul weekly al simbolului și te uiți dacă ultimele candele au +un Sell Doji confirmat. Dacă au, simbolul nu e bun pentru un Buy Doji pe +daily.** - - -Scanerul Buy Doji în TradeStation -ordinea filtrelor și capcanele - -Univers: -All Stocks (~13.000) -S&P 500 · Russell 3000 - -mai mare = găsește mai mult, durează mai -mult - - -Trigger: jbtgrshdATM -BDATM = 0 -(Sell Doji: SDATM = 0) - -capcană: Interval = TF-ul scanerului, setat -manual -capcană: 0 = ultima candelă închisă; 1 = cu -o zi în urmă - - -Nivel: RSV1ATM -% of PP ≤ 0.5 (60 min) -% of PP ≤ 2 (daily) - -Pivot Interval: 2 = weekly (pe 60 min), 3 = -monthly (pe daily) -capcană: RS/SR = 1 la filtrare; cu 100, -pragul se scrie ×100 - - -Lichiditate: Volume Colors -Average Volume ≥ 500.000 -Average Length = 10 - -volum daily, indiferent de TF-ul scanerului - - -Opțional: -Since Bear ≥ 8 -Bull Reversal = 1 -RVOL doar Display - -capcană: Bear Reversal e selectat implicit — -comută pe Bull -capcană: în zile extreme, pragurile rigide -golesc lista - - -Lista de candidați -→ o verifici pe grafic -(pașii 2-6). -Scanerul nu e undă verde. -Delay: scanerul vede candela închisă — daily rulat la 12:00 arată triggerul de ieri. - +Candidații vin din scaner (în TradeStation, câmpul `BDATM = 0`, adică semnal +pe ultima candelă închisă) sau din lista ta, trecută de mână. Păstrezi doar +simbolurile lichide, pe care intri și ieși fără să miști prețul: close peste 30-40 $ și volum mediu zilnic de +cel puțin 500.000 de acțiuni, ideal peste un milion. -Ce setezi, în ordinea din diagramă: +Apoi te uiți pe weekly. Cursul îi dă fiecărui TF un rol: weekly-ul spune în +ce direcție ai voie să tranzacționezi („un buy doji weekly e un semnal al +banilor mari"), iar daily-ul spune când intri. De aici regula: nu cumperi +contra unui Sell Doji weekly și nu shortezi contra unui Buy Doji weekly. +Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la +început îl tratezi ca pe un stop. -1. **Universul:** `All Stocks` (~13.000 de simboluri), S&P 500 sau o listă - custom (Russell 3000). Mai mare = găsește mai mult, dar durează mai mult - (`11_construire_scanere_sf_byd_sld.md:53-57`). -2. **Trigger-ul:** `jbtgrshdATM`, câmpul `BDATM` (`SDATM` la short), `= 0` - (`11_construire_scanere_sf_byd_sld.md:58-62`). „0" înseamnă ultima candelă - închisă; un cursant care pusese 1 a primit semnalele cu o zi mai devreme - (`28_2025-05-27.md:47-52`). -3. **Nivelul:** `RSV1ATM`, `% of PP` ≤ prag; pivoții și pragul depind de - timeframe (Pasul 4). -4. **Lichiditatea:** close > 30-40 $; volum mediu daily ≥ 500.000 (ideal - > 1 milion pe 3 luni) (`28_2025-05-27.md:372-380`; - `11_construire_scanere_sf_byd_sld.md:70-73`). -5. **Opțional:** `Since Bear ≥ 8` pentru trend (`28_2025-05-27.md:40-52`) și - Bull Reversal (Pasul 5). - -**La short, încă un filtru, înainte de grafic:** piața sau sectorul trebuie să -fie slabe. 30 de sell-uri în același sector = problemă de sector -(`28_2025-05-27.md:313-330`). Nu există prag numeric în material. - -**Capcane de scaner:** - -- **Interval-ul indicatorului nu se sincronizează automat** cu timeframe-ul - scanerului. Dacă uiți, calculează pe alt timeframe - (`11_construire_scanere_sf_byd_sld.md:317-320`). -- **Delay-ul scanerului:** rulează pe candela deja închisă; un scanner daily - la ora 12 arată triggerul de ieri (`11_construire_scanere_sf_byd_sld.md:321-324`). -- **RS/SR: factorul `1` pentru filtrare, `100` doar pentru display.** Cu - `100` ca prag, înmulțește pragul cu 100, altfel filtrezi greșit - (`04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:329-341`). -- **Bear Reversal e selectat implicit** (alfabetic) la deschiderea - indicatorului — pe un scaner long comută manual pe Bull, altfel filtrezi cu - semnalul opus (`04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:343-346`). -- **Nu pune praguri rigide (RVOL, distanță) în zile de mișcare extremă** — - pot elimina toți candidații valizi (`04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:303-327`). -- **Sistemul nu vede orice Buy Doji.** Uneori un doji valid nu e marcat; îl - recunoști vizual, cu aceeași regulă de închidere - (`01_buy_doji_si_strategia_mici.md:838-839`). - -**Treci mai departe doar dacă** simbolul trece de pragul de lichiditate și, -la short, piața sau sectorul lui e slab. - ---- - - -## Pasul 2 — Alegi perechea de timeframe-uri și citești direcția pe cel mare - -**Deschizi întâi graficul mare (weekly, monthly sau daily, după pereche) și -te uiți dacă are un Buy Doji sau un Sell Doji confirmat.** El îți spune în ce -direcție **ai voie** să cauți intrarea pe graficul mic. Materialul, pe -fiecare timeframe (`01_buy_doji_si_strategia_mici.md:32-40`): - -- **pe daily** — „când intri într-un swing (trigger mecanic, stop și țintă - fixe)"; -- **pe weekly/monthly** — „în ce direcție **ai voie** să tranzacționezi. Un - buy doji weekly e un semnal al banilor mari"; -- **pe 60 min** — „o intrare mai devreme decât MBT-10, dar **numai** în - direcția unui swing long deja stabilit pe daily. Fără contextul de daily, - un buy doji pe 60 min singur nu ajunge". - -Și regula dedusă de el din asta: **nu shortezi contra unui Buy Doji weekly, -nu cumperi contra unui Sell Doji weekly.** „Short-uri de termen scurt în -interiorul structurii, da (el însuși a shortat 2 zile în aceeași săptămână) — -dar nu împotriva semnalului weekly" (`03_2026-08-11.md:220-223`; -`01_buy_doji_si_strategia_mici.md:35-37`). - -### Aceeași regulă, pe cele trei perechi - - - - Aceeași regulă pe trei perechi — exemplu construit (fără ticker) - A. weekly → daily - weekly: direcția - daily: intrarea - - high doji weekly 105.20 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe daily, - după confirmare - - - - - TP1 1:1 107.50 - intrare 106.30 - high doji 105.20 - SL 105.10 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 1.13 % (pe weekly ar fi 4.77 %) · 8 candele = 8 zile de bursă - - B. monthly → weekly - monthly: direcția - weekly: intrarea - - high doji monthly 113.00 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe weekly, - după confirmare - - - - - TP1 1:1 118.75 - intrare 115.75 - high doji 113.00 - SL 112.75 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 2.59 % (pe monthly ar fi 10.85 %) · 8 candele = 8 săptămâni - - C. daily → 60 min - daily: direcția - 60 min: intrarea - - high doji daily 102.08 - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare: long permis - - zoom pe 60 min, - după confirmare - - - - - TP1 1:1 103.00 - intrare 102.52 - high doji 102.08 - SL 102.04 - = low 4 candele - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - pullback: 8 candele - doji la nivel - intrare - stop 0.47 % (pe daily ar fi 1.98 %) · 8 candele ≈ 1,2 zile de bursă (7 bare/zi) - Cifre construite, aceeași formă scalată pe trei perechi. - Procentele reale depind de simbol (LABU daily: stop 9 %). - - -Diagrama e același setup, desenat de trei ori: pe TF-ul mare s-a confirmat un -Buy Doji; pe TF-ul mic prețul face pullback până la high-ul acelui doji, face -un doji acolo și confirmă. Intri pe TF-ul mic. Ce rămâne și ce se schimbă: - -| | **weekly → daily** | **monthly → weekly** | **daily → 60 min** | -|---|---|---|---| -| **Ce spune materialul despre pereche** | parțial: weekly = direcția, daily = trigger-ul de swing (`01_buy_doji_si_strategia_mici.md:32-37`); la MICI, „buy doji și pe daily" e bonus (`:386`) | parțial: MICI pornește din buy doji weekly cu pivotul monthly (`:370-379`); „strategia mici pe monthly […] by doji retestat la 1x2, 1x3" (`:555-556`) | explicit: 60 min doar în direcția swing-ului de pe daily (`:38-40`); exemplul XLE pe 60 min (`20_2025-08-25.md:172-176`) | -| **Pivoții pe graficul de intrare** | monthly | quarterly (`03_timeframes_set_up.md:69-79`) — dar MICI citește pivotul monthly, vezi „Unde se contrazice", punctul 7 | weekly | -| **Pragul de proximitate** | 1-2 % | fără prag în material | ≤ 0,5 % | -| **Stopul: 4 candele pe TF-ul intrării** | 4 candele daily | 4 candele weekly | 4 candele de 60 min | -| **„8 candele" înseamnă** | 8 zile de bursă | 8 săptămâni | ~1,2 zile de bursă *(aritmetica mea: 7 bare pe o sesiune US de 6,5 ore)* | -| **Intrarea** | la close sau la retest (Pasul 8) | în tranșe de 1/3: close, 1/3, 1/2 (`23_2025-07-29.md:206-213`) | la retest 1/2 sau 1/3: candela e înaltă, riscul mare (`transcripts/09_Q_and_A/20_25082025.txt:207-208`) | -| **Cât ții poziția** | limita de 8 zile, restul pe trailing | 6-7-8 luni la MICI (`01_buy_doji_si_strategia_mici.md:538-541`) | *(completare)* intraday sau câteva zile; limita de 8 candele trece peste noapte | - -Pragurile de proximitate: `11_construire_scanere_sf_byd_sld.md:99-104`. -Pivoții: `11_construire_scanere_sf_byd_sld.md:63-69`; -`03_timeframes_set_up.md:69-79`. Stopul se numără pe timeframe-ul pe care -ai luat decizia: la GTLB, un stop care părea „jos de tot" era corect, pentru -că decizia fusese pe weekly, nu pe daily (`20_2025-08-25.md:9-15`). Regulile -MICI se pot copia pe alt TF: „Si sa o folosesti pe daily, pe 60 de minute, pe -ce vrei tu" (`transcripts/09_Q_and_A/20_25082025.txt:154-156`). - -> **Completare proprie: cum leg cele două timeframe-uri și ce se strică când -> cobori.** Materialul spune ce rol are fiecare TF, dar nu dictează -> succesiunea „buy doji pe TF-ul mare → aștepți pullback → buy doji pe TF-ul -> mic → intri". O construiesc din trei piese ale lui: TF-ul mare dă direcția -> (`01_buy_doji_si_strategia_mici.md:32-40`); intrarea după buy doji-ul -> weekly se face pe pullback, ideal la retestul high-ului doji-ului -> (`triaj/DECIZII.md:118` — dar sursa acelei observații, CTZ, nu e legată -> explicit de MICI, `01_buy_doji_si_strategia_mici.md:547-559`); iar la M2D, -> strategia cursului construită exact pe două TF-uri, stopul se numără pe -> TF-ul mic (`fise/m2d.md:68`), cu perechile 60×daily, daily×weekly, -> weekly×monthly (`14_strategia_1_m2d.md:461-466`). -> -> **De ce merită perechea:** pe diagramă, același setup luat doar pe TF-ul -> mare are stopul de 4-5 ori mai larg (4,77 % pe weekly față de 1,13 % pe -> daily, la aceleași cifre construite). Cu același risc în dolari, cumperi de -> 4 ori mai multe acțiuni. -> -> **Ce rămâne valabil când cobori:** toată regula de candelă — trend, doji, -> fereastra de 3, stopul pe 4 candele, 1:1, limita de 8. -> -> **Ce nu mai rămâne:** timpul (8 candele de 60 min se termină a doua zi), -> pivoții (alt nivel, mai slab urmărit) și încrederea în semnal. Materialul -> dă mecanismul: pe TF-urile mici, volumul vine din tranzacții mici, -> reactive la zgomot, iar o mișcare contrară pe TF mic e „cel mai adesea, -> doar zgomot în interiorul" trendului mare -> (`03_timeframes_set_up.md:52-61`). Deducția mea: **pe 60 min vei vedea mai -> multe doji-uri confirmate, și o parte mai mare din ele vor fi false** — -> cifra de 65-70 % nu e dată pe timeframe, deci nu presupune că ține la fel -> pe 60 min. De aceea materialul nu te lasă să iei 60 min singur. -> -> **Pentru antrenament:** perechea daily → 60 min îți dă cele mai multe -> semnale de exersat recunoașterea. Nu trage concluzii despre rata de -> câștig din ea pentru perechile mari. - -### Ce înseamnă „contra direcției", pe grafic - - + NU: Sell Doji daily contra unui Buy Doji weekly — exemplu construit weekly: direcția @@ -631,19 +322,19 @@ ce vrei tu" (`transcripts/09_Q_and_A/20_25082025.txt:154-156`). doji weekly - Buy Doji weekly: direcția = long - - WEEKLY: LONG ↑ - confirmare 81.30 > high doji 79.80 - + + + weekly: Buy Doji confirmat (close 81.30, peste high-ul doji-ului 79.80) + deci direcția permisă e LONG: pe daily cauți doar Buy Doji + daily: săptămânile de după confirmare (open 81.30 = close-ul ei) - + - - SL 84.80 = high 4 candele + + stop 84.85 = 5 cenți peste high-ul de 4 candele intrare short 83.60 - TP1 82.40 — neatins + ținta 82.35 — neatinsă (a scăzut o zi, la 83.00) @@ -678,224 +369,171 @@ ce vrei tu" (`transcripts/09_Q_and_A/20_25082025.txt:154-156`). - - short de 1-2 zile: permis - - - SL lovit: poziția short contra weekly - - Sell Doji daily: tehnic valid (close 83.60 < low doji 83.95) - - short daily = CONTRA ✗ - weekly zice long; daily urcă mai departe - Short scurt înăuntrul structurii weekly: da. Poziție short contra ei: nu. - Seria e construită: un singur caz ilustrează regula, nu o dovedește. + + + + aici te-a scos: stopul 84.85, lovit a patra zi + banii mari de pe weekly cumpără mai departe + + + aici ai intrat SHORT, la 83.60: Sell Doji corect ca formă + (close sub low-ul doji-ului 83.95) — dar contra weekly-ului + Seria e construită: un singur caz ilustrează regula, nu o dovedește. -Pe weekly s-a confirmat un Buy Doji. Pe daily, prețul urcă 9 zile, face un -doji și apoi închide sub low-ul lui: tehnic, un Sell Doji valid. Ca poziție -short, e contra weekly-ului. Prețul coboară o zi, apoi urcă și lovește -stopul. Diagrama e construită; un caz nu dovedește regula, o ilustrează. +Diagrama 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. -**Nuanța:** Sell Doji pe monthly/weekly înseamnă prudență pe long, nu regulă -absolută. Chiar el: sell doji-ul de pe monthly „nu înseamnă neapărat că se va -materializa" (`01_buy_doji_si_strategia_mici.md:316-326`). +Intrarea mecanică e la close-ul candelei de confirmare (pasul 4). Variantele +de intrare — în tranșe, la retest — sunt la nivelul 3. -**Treci mai departe doar dacă** TF-ul mare nu are un doji confirmat în -direcția opusă trade-ului tău. Pe 60 min: doar dacă daily-ul are deja un -swing long stabilit. +**Treci mai departe doar dacă** simbolul e lichid și weekly-ul nu are un doji +confirmat în direcția opusă trade-ului tău. ---- + +## Pasul 2 — Trendul care se termină și doji-ul + +**Treci pe daily și te uiți la ultimele 8-10 candele: trebuie să vezi o +scădere care se oprește într-un doji.** + +Ideal, scăderea durează 8-10 candele. Au funcționat și scăderi de 2-3 +candele, dar cursul le tratează ca semnal mai slab. Dacă scanerul tău cere +`Since Bear ≥ 8` (cel puțin 8 candele de la ultimul semnal de scădere), pe +astea nu ți le arată deloc. + + + + 9 candele de scădere — ideal + + + + + + + + + + + + + + + + + + + + + + + + + confirmare 50.40 + + + doji la capătul scăderii + vânzătorii s-au terminat + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit + DA — ideal (8-10 candele) + + + doar 3 candele — merge, dar mai slab + + + + + + + + + + + + + + + + + + + + + + + + + + + doji + confirmare 50.40 + + + înainte: preț pe loc, + nu scădere — de aceea + semnalul e mai slab + 1 + 2 + 3 + Același doji, după un range + ACCEPTAT, semnal mai slab + scannerul cu Since Bear ≥ 8 nu-l vede + + +Doji-ul îl verifici cu o împărțire, nu din ochi: corpul împărțit la +înălțimea întregii candele trebuie să dea cel mult 10 %, iar candela trebuie +să aibă fitil și sus, și jos (diagrama de la nivelul 1). + +Capcana: un doji care vine după o creștere nu e Buy Doji, chiar dacă o +candelă se închide apoi peste el. Autorul: „am un buy-doji, dar după un +gap-up și sus, buy-dojiul ăsta, nu prea am încredere în el". Gap-up înseamnă +că prețul a deschis mult peste închiderea de ieri, lăsând un gol între +candele. Cazul real CTLD e exemplul cursului de setup care „nu funcționează": +doji după o creștere, nu după o scădere. + +**Treci mai departe doar dacă** ai un doji (corp de cel mult 10 % din +înălțime, fitile în ambele părți) după o scădere clară — nu după un gap-up +sau o creștere. -## Pasul 3 — Pe graficul mic, găsești trendul care se termină și doji-ul +## Pasul 3 — Doji-ul stă pe un nivel -**Te uiți la ultimele candele: trebuie să vezi o scădere de 8-10 candele -(pentru Buy Doji) care se oprește într-o candelă cu corp aproape inexistent.** +**Tragi pe daily pivoții lunari și măsori în procente cât de departe e low-ul +doji-ului de cel mai apropiat suport sau pivot.** -### Cum recunoști doji-ul +Un suport e un nivel de unde prețul a mai întors în sus. Un pivot e un nivel +calculat din maximul, minimul și închiderea lunii trecute: PP la mijloc, +suporturile S1, S2 dedesubt, rezistențele R1, R2 deasupra. Fiindcă îl urmăresc +mulți, prețul reacționează des acolo. TradeStation îl desenează +singur; formula e la nivelul 3, la BVB. -Open ≈ close, corp foarte mic față de range-ul total, fitil în ambele părți. -La scanerul de watchlist, parametrul standard de doji se pune pe **10** -(nu 5) — adică corp maximum ~10 % din range -(`28_2025-05-27.md:343-349`; `13_strategia_3_byh.md:15-30`). - - - Ce e doji și ce nu — aceeași bară 50.10 / 49.20 - - - high 50.10 - low 49.20 - - - DA - DA: corp 0.05 - = 5.6 % din range - - - DA - DA, la limită: - corp 0.09 = 10 % - (parametrul 10) - - - NU - NU: corp 0.30 - = 33 % - - - NU - NU: corp mic (5.6 %), - dar fără fitil sus - open 49.60 - - close 49.55 - - ← fără fitil sus - Test doji: corp ≤ 10 % din range (0.90) și fitil în ambele părți. Scară: 0.10 = 26 px. - - -Toate patru au același high și același low. A și B sunt doji. C are corpul -prea mare. D are corpul mic, dar niciun fitil deasupra — regula cere fitil în -ambele părți. Nu te uita la „cât de mică pare candela": împarte corpul la -range. - -### Cât de lung trebuie să fie trendul - -Downtrend pentru Buy Doji, uptrend pentru Sell Doji, **8-10 candele ideal**. -Exemplele reale au avut și 2-3 candele și au funcționat, dar sunt tratate ca -semnal mai slab (`13_strategia_3_byh.md:185-187`, `315-318`). Scanerul cere -`Since Bear ≥ 8` (long) / `Since Bull ≥ 8` (short) -(`28_2025-05-27.md:40-52`), iar contorul numără candelele de la trigger-ul de -sell momentum, nu „candele descrescătoare" (`28_2025-05-27.md:43-46`). - - - Trendul dinaintea dojiului: 9 candele vs. 3 candele — exemplu construit - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - - downtrend 9 candele - DA — ideal (8-10 candele) - - - - - - - - - - - - - - - - - - - - - - - - - - - - doji - confirmare 50.40 - 1 - 2 - 3 - - doar 3 candele - - - Același doji, după un range - range: nu se numără - ACCEPTAT, semnal mai slab - scannerul cu Since Bear ≥ 8 nu-l vede - - -Stânga: 9 candele de scădere, apoi doji-ul și confirmarea — cazul ideal. -Dreapta: același doji, aceeași confirmare, dar după doar 3 candele de scădere -ieșite dintr-un range. Se ia, ca semnal mai slab — iar scannerul cu -`Since Bear ≥ 8` nu ți-l arată deloc (`28_2025-05-27.md:144-149`). - -**Capcană — doji-ul care nu vine după trendul corect.** După un gap-up, sus în -rezistență, sau după un uptrend cu volum „varză" (miros de blow-off top), un -Buy Doji nu se ia (`01_buy_doji_si_strategia_mici.md:227-235`): - -> „am un buy-doji, dar după un gap-up și sus, buy-dojiul ăsta, nu prea am -> încredere în el" (`01_buy_doji_si_strategia_mici.md:231-232`) - -Cazul CTLD e exemplul explicit de „nu funcționează": context invalid, -uptrend anterior, nu downtrend (`13_strategia_3_byh.md:308`). Un caz de acest -tip (construit) e în panoul din dreapta al diagramei de la Pasul 5. - -**Pe cele trei perechi:** cele 8-10 candele se numără pe graficul pe care -cauți doji-ul. Pe weekly, asta înseamnă 2 luni de scădere; pe 60 min, o zi și -jumătate *(aritmetica mea)*. - -**Treci mai departe doar dacă** ai un doji (corp ≤ ~10 % din range, fitil în -ambele părți) după o scădere clară — ideal 8-10 candele, minim 2-3 — și nu -după un gap-up sau un uptrend. - ---- - - -## Pasul 4 — Verifici că doji-ul stă pe un nivel - -**Tragi pe grafic pivoții timeframe-ului superior și măsori în procente cât de -departe e low-ul doji-ului de cel mai apropiat suport sau pivot.** Ideal -aproape de suport sau pivot point pentru Buy Doji, aproape de rezistență sau -pivot point pentru Sell Doji (`13_strategia_3_byh.md:188-190`). +Un doji departe de orice nivel e o simplă pauză; pe un nivel, cumpărătorii +au motiv să apară. - Doji la nivel vs. doji în aer — daily, pivoți monthly (exemplu construit) + Doji la nivel vs. doji în aer — daily, pivoți lunari (exemplu construit) DA — doji la nivel NU — doji în aer + + 0,51 % — la nivel + + gol de 7,07 % sub doji — doji în aer - pivot monthly S1 49.00 + pivotul lunar 49.00 - PP 53.50 + pivotul lunar 53.50 - S1 46.00 + pivotul lunar 46.00 @@ -904,7 +542,7 @@ pivot point pentru Sell Doji (`13_strategia_3_byh.md:188-190`). - + @@ -918,6 +556,11 @@ pivot point pentru Sell Doji (`13_strategia_3_byh.md:188-190`). doji confirmare + + + pivot lunar: nivel urmărit + de mulți — aici apar + cumpărătorii @@ -926,7 +569,7 @@ pivot point pentru Sell Doji (`13_strategia_3_byh.md:188-190`). - + @@ -940,48 +583,600 @@ pivot point pentru Sell Doji (`13_strategia_3_byh.md:188-190`). doji confirmare - - low 49.20 = +0,41 % față de 49.00 - → la nivel (daily: ≤ 1-2 %) - - - - cel mai apropiat nivel: 46.00, la 6,96 % - → doji în aer - (PP 53.50 e deasupra, la 8,74 % de low) - 60 min: prag ≤ 0,5 %, pivoți weekly · daily: 1-2 %, pivoți monthly · weekly: pivoți quarterly + + + aceeași formă, dar nimic sub el + nu are cine să-l susțină + daily: e „la nivel" dacă low-ul dojiului e la cel mult 1-2 % de pivotul lunar (aici 0,51 %; în dreapta 7,07 %). Aceeași serie, aceeași scară; nivelurile 49.00 / 46.00 / 53.50 sunt construite. -Aceeași formă de două ori. În stânga, low-ul doji-ului e la 0,41 % de pivot: -„la nivel". În dreapta, cel mai apropiat nivel e la aproape 7 %: doji în aer. -Ochiul nu vede diferența; procentul da. +Aceeași formă, de două ori. În stânga, low-ul doji-ului e la 49.25, iar +pivotul la 49.00: (49.25 − 49.00) / 49.00 = 0,51 %, deci doji „la nivel". În +dreapta, cel mai apropiat nivel e la cam 7 %: doji „în aer". Ochiul nu +vede diferența, procentul da. -**Pragul, pe timeframe:** ≤ 0,5 % pe 60 min; 1-2 % pe Daily. Motivul: la -0,5 % pe daily găsești foarte puține simboluri -(`11_construire_scanere_sf_byd_sld.md:99-104`). +Pe daily, pragul e 1-2 %. Pe 60 de minute cursul folosește 0,5 %, dar pe daily +la 0,5 % găsești prea puține simboluri. -**Pivoții, sincronizați cu timeframe-ul:** 60 min → pivoți Weekly; Daily → -Monthly; Weekly → Quarterly (`11_construire_scanere_sf_byd_sld.md:63-69`; -`01_filtre_scaner_bull_bear_reversal_pp.md:36-42`). În scaner: -`Pivot Interval = 2` pe 60 min, `= 3` pe Daily -(`11_construire_scanere_sf_byd_sld.md:63-69`). +**Treci mai departe doar dacă** low-ul doji-ului e la cel mult 1-2 % de un +suport sau de un pivot lunar. -**Treci mai departe doar dacă** low-ul doji-ului (high-ul, la short) e sub -pragul timeframe-ului tău față de un suport, o rezistență sau un pivot. + +## Pasul 4 — Trigger-ul: închidere peste high, în maximum 3 candele + +**Notezi high-ul doji-ului și aștepți. Intri doar dacă una din următoarele 3 +candele se închide peste el.** + +Nu intri pe doji: el spune doar că scăderea a făcut o pauză, iar pauza poate +fi urmată de încă un val în jos. Contează închiderea, nu atingerea — o +candelă care trece peste high în timpul zilei și se închide sub el nu e +trigger. + + + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 + DA — confirmare la +2, în fereastră + + + + + + + + + + + + + + + + + doji + + + aici NU intri: s-a închis sub 50.10 + semnalul cere o ÎNCHIDERE peste + + + AICI INTRI, la close 50.40 + prima închidere peste + high-ul dojiului + + fereastra: 3 candelehigh-ul dojiului 50.10trebuie ÎNCHIS peste,nu doar atinslow-ul dojiului 49.25 + NU — nicio confirmare în 3 candele + + + + + + + + + + + + + + + + + + + doji + a 4-a + + + a treia s-a închis tot sub 50.10 + fereastra s-a terminat: ștergi setup-ul + + + a închis sub low-ul dojiului + setup mort — nu mai intri + +1: 49.95 · +2: 50.05 · +3: 49.85 — toate sub 50.10 + + Serii construite: open = close-ul barei anterioare. + Doji: h 50.10 / l 49.25. Fereastra = maximum 3 candele după doji. + + +Sus, setup-ul valid: doji cu high 50.10; prima candelă se închide la 49.90, +încă sub; a doua la 50.40, peste. Intri la 50.40, la close-ul ei. Jos, +setup-ul expirat: trei candele se închid la 49.95, 50.05 și 49.85, toate sub +50.10, așa că după a treia îl ștergi. Aici a patra se închide chiar sub +low-ul doji-ului — „setup mort". + +De ce contează închiderea peste high: cine a vândut în ziua doji-ului e acum +pe pierdere, iar stopurile celor care au shortat, puse deasupra high-ului, se +execută ca ordine de cumpărare. De aceea mișcarea se întoarce brusc. +(Explicația e a sumarizatorului lecției, nu a cursului.) + +**Treci mai departe doar dacă** o candelă s-a închis peste high-ul doji-ului +în maximum 3 candele. Altfel ștergi setup-ul și te întorci la pasul 1. + + +## Pasul 5 — Stopul și mărimea poziției + +**Numeri 4 candele înapoi, începând cu cea de confirmare, iei cel mai jos low +dintre ele și pui stopul puțin sub el.** + + + Pasul 5 — stopul: numeri 4 candele înapoi de la confirmare + + numeri 4 candele, începând cu confirmarea + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + cel mai jos low din cele 4: 49.25 + (e al doji-ului) + + + stopul: 49.20, cu 5 cenți mai jos + sub el, ideea că vânzătorii + au obosit e moartă + + + confirmarea: close 50.40 + de aici numeri înapoi + 4 + 3 + 2 + 1 + (5) + cu 4 sau cu 5 candele iese la fel: în scădere, low-ul doji-ului e oricum cel mai jos + + Același trade: stop „la ochi” (sub candela de confirmare) vs stopul din regulă + + + ținta 1: 51.60 + + intrarea: 50.40 + + stop pus la ochi: 49.70 + + stopul din regulă: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stopul pus la ochi (49.70) e măturat + era prea aproape de intrare + + + al doilea picior al fundului: 49.50 + fundurile fac des asta + + + stopul din regulă (49.20) ține + al doilea picior rămâne peste el + + + prețul ajunge la țintă + dar numai cu stopul corect + mai erai în trade + Barele de după intrare și stopul la ochi sunt construite, pentru contrast. + pe aici trece al doilea picior + + +Sus, candelele numerotate de la confirmare. Cel mai jos low e al doji-ului, +49.25, iar stopul merge la 49.20, cu 5 cenți sub. După o scădere, low-ul +doji-ului e aproape mereu cel mai jos, deci stopul iese practic sub doji. +Jos, același setup, dar cu o continuare diferită: o variantă în care fundul +mai face un picior înainte să plece. Stopul e pus aici „la ochi", la 49.70, +sub candela de confirmare. A doua candelă după intrare coboară până la +49.50, mătură stopul „la ochi", iar prețul urcă și atinge ținta abia la a +șasea candelă — în restul capitolului, unde fundul pleacă direct, ținta vine +la a treia. Stopul din regulă, 49.20, n-a fost atins în nicio variantă. + +De ce acolo: dacă prețul trece sub acel low, ideea că vânzătorii s-au +epuizat e moartă. Fundurile fac des un al doilea picior, de aceea stopul stă +sub toată structura, nu „undeva aproape". Candelele le numeri pe graficul pe care intri, aici +daily. + +Mărimea poziției vine din regula generală de risc a cursului: pierzi cel mult +2 % din cont pe un trade. Numărul de acțiuni e riscul în dolari împărțit la +distanța până la stop, rotunjit în jos. Strategia nu dă o cifră de risc +proprie. + +> **Completare proprie** (cifrele sunt ale mele, regula de 2 % e a cursului): +> pe un cont de 50.000 $ riști cel mult 1.000 $. Cu intrarea la 50.40 și +> stopul la 49.20 riști 1.20 pe acțiune: 1.000 / 1.20 = 833,3, deci cumperi +> 833 de acțiuni. + +**Treci mai departe doar dacă** știi prețul exact al stopului și numărul de +acțiuni, iar pierderea maximă încape în regula ta de risc. + + +## Pasul 6 — Ieșirea: o treime la 1:1, restul pe trailing, maximum 8 candele + +**Pui ținta la aceeași distanță deasupra intrării la care e stopul dedesubt, +iar după ce e atinsă lași restul pe trailing stop.** + +Ieși în trei treimi: + +1. **Prima treime la ținta 1:1.** Cu intrarea la 50.40 și stopul la 49.20 + riști 1.20, deci ținta e 51.60. Cursul e categoric: ținta fixă e 1:1, „nu + mai mult". Profitul în plus vine din trailing. +2. **A doua treime pe trailing stop.** Linia de trail o pui la low-ul oricărei + candele care deschide cu gap peste high-ul candelei dinainte și o urci de + fiecare dată când apare una nouă. Ieși la prima închidere sub linie. +3. **A treia treime o lași mai departe**, cât ține trendul; pe ea poți risca + tot stopul inițial. + +Limita de timp: dacă în 8 candele de la intrare nu s-a atins nici ținta, +nici stopul, ieși oricum, la close-ul celei de-a 8-a. + + + A — prima treime la țintă, a doua pe trailing stop + + + + ținta 1: 51.60 (= 1R) + + intrarea: 50.40 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ținta 1 atinsă: vinzi prima treime + ai luat exact cât riscai (1R) + + + gap: low-ul de azi e peste high-ul de ieri + linia de trail urcă la 51.95 + + + încă un gap: linia urcă la 52.60 + urcă doar, nu coboară niciodată + + + prima închidere sub linie: ieși + cu a doua treime, la 52.30 (+1.58R) + + linia de trailing stop + prima treime: de la intrare la ținta 1:1 + a doua treime: merge pe trailing stop + A treia treime o lași mai departe, cu stopul mutat la intrare (break-even). + + B — limita de 8 candele: nici ținta, nici stopul + + + ținta 1: 51.60 — neatinsă + + intrarea: 50.40 + + stopul: 49.20 — neatins + + + + + + + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + a 8-a candelă: ieși oricum, la close 50.70 (+0.25R) + banii blocați aici lipsesc din alt trade + 8 candele în care nu se întâmplă nimic + + +Sus, prima treime iese la 51.60. Apar două candele cu gap, care urcă linia +de trail întâi la 51.95, apoi la 52.60; a doua treime iese la 52.30, prima +închidere sub linie, cu +1,58R. Pe a treia treime muți stopul la prețul de +intrare, 50.40. Jos, alt trade: în 8 zile prețul urcă cel mult la 51.35 și +coboară cel mult la 50.15, deci nu atinge nici ținta, nici stopul; ieși la +close-ul celei de-a 8-a, 50.70, cu +0,25R. + +> **Completare proprie:** candelele de după intrare, din ambele panouri, sunt +> construite. Împărțirea în trei treimi e a sumarizatorului lecției; ținta +> 1:1, regula de trail și limita de 8 candele sunt ale cursului. + +**Treci la trade-ul următor doar după ce** toate trei treimile au ieșit — la +țintă, pe trail, la limita de 8 candele sau la stop. --- - -## Pasul 5 — Aduni confirmările: A+ sau mediocru? + +# Oglinda — Sell Doji, pe short -**Înainte de trigger, numeri câte motive independente ai pentru același -trade.** Pașii 3-4 sunt minimul. Ce urmează nu e obligatoriu, dar e ce -separă un setup A+ de unul mediocru — răspunsul la „ce să corelez ca să am -mai multe confirmări". +Pe short vinzi acțiuni împrumutate și le cumperi înapoi mai târziu; câștigi +dacă prețul scade între timp. Pașii sunt aceiași, întorși: -Setup A+ vs. setup mediocru (două panouri, exemple construite) +- înainte de doji vine o **creștere** de 8-10 candele; +- doji-ul stă lângă o rezistență sau un pivot, **deasupra**; +- trigger-ul e o închidere **sub low-ul** doji-ului, în maximum 3 candele; +- stopul stă **deasupra** celui mai înalt high din ultimele 4 candele; +- ținta e la aceeași distanță, în jos, iar linia de trail coboară. + + + Sell Doji pe short — daily (exemplu construit) + + 1. creștere de 10 candele + + 2. doji + + + + + stop 100.15 + + intrare short 99.00 + + ținta 97.85 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + STOPUL SUS, la 100.15 — 5 cenți peste maximul ultimelor 4 candele: + dacă prețul urcă până aici, creșterea continuă și ideea e moartă + + + AICI INTRI SHORT, la 99.00: + a doua candelă după doji e prima + care se ÎNCHIDE sub low-ul lui (99.20) + + + ținta JOS, la 97.85: tot 1.15, exact cât ai riscat; + aici închizi prima treime + + + trail-ul a coborât după preț (96.45); + prima închidere peste el: ieși cu restul, 96.60 + Pe short câștigi când prețul COBOARĂ: stopul stă SUS, ținta JOS, trail-ul coboară după preț. Roșu = ce riști, verde = ce câștigi. + + +Pe diagramă, doji-ul e între 99.20 și 100.10. A doua candelă se închide la +99.00, sub 99.20: intri short acolo. Stopul e la 100.15, cu 5 cenți peste cel +mai înalt high din ultimele 4 candele (care e chiar high-ul doji-ului), deci +riști 1.15, iar ținta e la aceeași distanță în jos, 97.85. Restul poziției +iese la 96.60, prima închidere peste linia de trail coborâtă la 96.45. + +Exemplul din curs pune stopul fix pe high, la 100.10, cu ținta la 97.90; aici +e urcat cu 5 cenți, ca să respecte regula „stopul deasupra maximului", la fel +ca cei 5 cenți de sub low la pasul 5. + +Ce se adaugă la short: + +- **Piața trebuie să fie slabă**: „când shortăm, să fie overall piața praf". + Dacă primești 30 de Sell Doji în același sector, problema e sectorul. +- **Nu pe acțiuni sub 10 $.** Riști un short squeeze: prețul sare brusc + pentru că toți cei pe short cumpără odată, iar piața poate deschide direct + peste stopul tău. +- **Nu contra unui Buy Doji weekly** (pasul 1). +- **Divergența** de volum sau un stochastic ieșit din supravânzare pot + întoarce semnalul într-un Buy Doji. + +--- + + +# Nivelul 3 — Rafinări + +**Astea se citesc după ce ai făcut 20 de trade-uri mecanic, nu înainte.** + +## Confirmările care fac un setup A+ + +Pașii 2 și 3 sunt minimul. Cu cât ai mai multe motive independente pentru +același trade, cu atât e mai bun — dar materialul nu cere o poziție mai mare. + +Setup A+ vs. setup mediocru (două panouri, exemple construite) A+ — doji la suport, volum în acumulare + suport 42.00 @@ -1032,1420 +1227,926 @@ mai multe confirmări". - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji la nivel (low 41.95) - acumulare - acumulare: volum peste media ultimelor 10 bare. - + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + doji chiar pe nivel: + vânzarea s-a oprit pe suport + + + confirmarea, pe volum mare: + cumpărătorii mari intră +volum în creștere = acumulare Mediocru — gap-up în rezistență, volum varză - - rezistență 78.50 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 78.50 / 78.10 - gap-up + doji în rezistență, confirmare pe volum slab. -gap-up, volum slabSurse: 13_strategia_3_byh.md:188-190 (doji la nivel); 01_buy_doji_si_strategia_mici.md:227-235 (context invalid). + + + rezistență 78.50 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + gap-up în rezistență: + aici cumpără cei întârziați + + + cade înapoi sub 78.00: + semnalul a mințit +volum slab: nimeni mare nu cumpără -| | **A+** | **Mediocru / NU** | +| Criteriu | A+ | Mediocru sau NU | |---|---|---| -| Trend anterior | downtrend lung (8-10+) spre suport/pivot (`13_strategia_3_byh.md:185-190`) | uptrend scurt sau gap-up în rezistență (`01_buy_doji_si_strategia_mici.md:227-229`) | -| Locație | pe suport / pivot monthly, ideal al doilea test fără low nou (`18_2025-09-23.md:710-712`) | sus, în rezistență, cu gap de închis dedesubt (`01_buy_doji_si_strategia_mici.md:227-235`) | -| Volum | acumulare / divergență bull (`13_strategia_3_byh.md:221-222`, `01_buy_doji_si_strategia_mici.md:338-347`) | „varză", volum slab — miros de blow-off top (`01_buy_doji_si_strategia_mici.md:234-235`) | -| Direcție weekly | nu contrazice un Buy Doji weekly (`03_2026-08-11.md:220-223`) | contra unui Sell Doji weekly (`01_buy_doji_si_strategia_mici.md:35-37`) | -| Rezultat | „sfântul buy doji" = double bottom + close peste pivot monthly + proiecție bull (`01_buy_doji_si_strategia_mici.md:351-360`) | CTLD: context invalid, setup nereușit (`13_strategia_3_byh.md:308`) | +| Trendul dinainte | scădere de 8-10+ candele, spre suport | creștere scurtă sau gap-up în rezistență | +| Locația | pivot lunar, al doilea test fără low nou | sus, cu un gap neînchis dedesubt | +| Volumul | acumulare, divergență bull | slab, „varză" | +| Weekly-ul | în aceeași direcție | Sell Doji weekly contra ta | -**Toate confirmările din material, ordonate după cât de des apar:** +Mai rar citate: double bottom cu close peste pivotul lunar („sfântul buy +doji"); mai multe trigger-e pe aceeași candelă (buy doji, buy momentum, bull +reversal); filtrele Bull Reversal și RVOL (volumul de azi față de media lui). -| Criteriu | De ce dă edge | Cât e confirmat | Sursă | +## Cele trei perechi de TF + +Regula de candelă e aceeași pe orice pereche. Pe 60 de minute intri doar în +direcția unui swing long deja stabilit pe daily. + + + + Aceeași regulă pe trei perechi — exemplu construit (fără ticker) + A. weekly → daily + weekly: direcția + daily: intrarea + + doji + confirmare: + aici se decide direcția + + high doji weekly 105.20 + + + + + + + + + + + + + + + + + + + + + + + + apoi cobori + pe graficul mic + + doji la nivel: + aici intri + + + + + ținta 1:1 107.50 + intrare 106.30 + high doji 105.20 + stop 105.10 + sub ultimele + 4 candele + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pullback: 8 candele + + stop 4,77 % + + stop 1,13 % + + același setup, stop de 4 ori mai mic + → de 4 ori mai multe acțiuni la același risc + + B. monthly → weekly + monthly: direcția + weekly: intrarea + + doji + confirmare: + aici se decide direcția + + high doji monthly 113.00 + + + + + + + + + + + + + + + + + + + + + + + + apoi cobori + pe graficul mic + + doji la nivel: + aici intri + + + + + ținta 1:1 118.75 + intrare 115.75 + high doji 113.00 + stop 112.75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C. daily → 60 min + daily: direcția + 60 min: intrarea + + doji + confirmare: + aici se decide direcția + + high doji daily 102.08 + + + + + + + + + + + + + + + + + + + + + + + + apoi cobori + pe graficul mic + + doji la nivel: + aici intri + + + + + ținta 1:1 103.00 + intrare 102.52 + high doji 102.08 + stop 102.04 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +| | weekly → daily | monthly → weekly | daily → 60 min | |---|---|---|---| -| **1. Locația față de un nivel** (suport/pivot la long, rezistență/pivot la short) | Diferența dintre setup mediocru și bun; doji-ul „la nivel" e cel care contează | **5 surse distincte** (13, 11, 28_QA, 04_MODUL_3, 01_mici); nu apare ca rând separat în `DECIZII.md` | `13_strategia_3_byh.md:188-190`; `11_construire_scanere_sf_byd_sld.md:106-137`; `28_2025-05-27.md:379` | -| **2. Confirmarea strictă în fereastra de 3 candele** + SL 4 candele + TP1 = SL (1:1) | Fără confirmare, doji-ul e doar o pauză în trend | **DECIZII 01.1: 3 loturi / 5 zile** (~60-70 % merge; stopul e obligatoriu) | `DECIZII.md:107-109`; `01_buy_doji_si_strategia_mici.md:146-152` | -| **3. Trendul anterior corect** (8-10, nu după gap-up/uptrend) | Doji fără trend corect = context invalid | **DECIZII 01.2: 2 loturi / 2 zile**; în rest 3-4 surse | `DECIZII.md:110`; `13_strategia_3_byh.md:185-187`; `22_2025-08-04.md:14` | -| **4. Volumul** — acumulare/distribuție, divergență bull/bear | Confirmă dacă epuizarea e reală; trigger fără volum = mișcare falsă | **3 surse** (13, 04_MODUL_3, 01_mici); nu apare în `DECIZII.md` | `13_strategia_3_byh.md:214-226`; `04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:296-301`; `01_buy_doji_si_strategia_mici.md:338-347` | -| **5. Direcția instituțională de pe weekly/monthly** | Nu mergi contra semnalului banilor mari | **DECIZII 01.3: 1 lot / 2 zile**; plus Q&A explicit | `DECIZII.md:111`; `03_2026-08-11.md:220-223` | -| **6. Higher low confirmat de candela din dreapta** (MICI) | Al doilea semn, nu primul; e diferența dintre MICI și un simplu buy doji | **DECIZII 01.n1: 2 loturi / 2 zile** | `DECIZII.md:118`; `01_buy_doji_si_strategia_mici.md:370-386` | -| **7. Retest 1/2 sau 1/3** în loc de intrarea la close | Reduce riscul la ~jumătate pe același setup; explicit util pe prop | **DECIZII 01.n1: 2 loturi / 2 zile**; pe prop, Q&A | `DECIZII.md:118`; `20_2025-08-25.md:141-164` | -| **8. Bull/Bear Reversal + RVOL** ca filtre agresive | Mai puține rezultate, dar confirmare mai mare | **1 lecție** (04_MODUL_3/01); niciun lot de triaj nu o ridică | `04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:44-52`, `303-327` | -| **9. Confluența de niveluri pentru ținte** (R1+R2+SMA 200+jumătate marubozu) | Unde se suprapun mai multe rezistențe, iei profit | **1 sursă** (`01_mici`); nu în `DECIZII.md` | `01_buy_doji_si_strategia_mici.md:531-536` | -| **10. Mai multe trigger-e pe aceeași candelă** (buy doji + buy momentum + bull reversal) | Semnal mai puternic | **DECIZII 01.5: 1 lot / 1 zi** | `DECIZII.md:113`; `102_24032026.txt:167-170` | -| **11. Frecvența patternului ca rată** | Un pattern rar nu-ți produce nimic, oricât de bun; de-aia cursul predă Buy Doji, nu Morning/Evening Star | **1 sesiune**, dar argumentul e explicit | `03_2026-08-11.md:180-218` | -| **12. Tranșele** (1/2, 1/3, 1/4) | „Rar all-in la swing"; pentru acțiuni scumpe, 4 tranșe de 1/4 | **DECIZII regula 4: 5 loturi / 16 zile** | `DECIZII.md:47`; `01_buy_doji_si_strategia_mici.md:798-814` | +| Pivoții | lunari | trimestriali (MICI: lunari) | săptămânali | +| Pragul | 1-2 % | nedat | 0,5 % | +| „8 candele" | 8 zile | 8 săptămâni | ~1,2 zile (calculul meu) | +| Intrarea | close sau retest | tranșe: close, 1/3, 1/2 | la retest | +| Cât ții | limita de 8 + trail | 6-8 luni (MICI) | ore sau zile (completare) | -Proiecția bull/bear aliniată cu direcția e tot un edge, nu o obligație: -„proiecție bull" pe long, citită din `Market Preview` (`RSV1ATM`) -(`13_strategia_3_byh.md:223-225`). +Stopul se numără pe TF-ul pe care ai decis intrarea. -**Treci mai departe doar dacă** pașii 3-4 sunt bifați (trend corect, doji la -nivel) și știi, înainte de trigger, dacă setup-ul e A+ sau mediocru. -Materialul nu dă o regulă de mărime după calitatea setup-ului. +> **Completare proprie.** Legătura „doji pe TF-ul mare → pullback → doji pe +> TF-ul mic" e construită de mine din piese ale cursului. Câștigul: pe +> diagramă, stopul are 4,77 % pe weekly și 1,13 % pe daily, deci la același +> risc cumperi de 4 ori mai multe acțiuni. Costul: pe 60 de minute vezi mai +> multe doji-uri false; rata de 65-70 % nu e dată pe timeframe. ---- +## Scanerul, pe scurt - -## Pasul 6 — Aștepți trigger-ul: o închidere peste high, în maximum 3 candele - -**Notezi high-ul doji-ului și aștepți. Nu intri pe doji.** Intri doar dacă -una din următoarele 3 candele **închide** peste acel high (la short: sub -low). Dacă a trecut a treia și n-a închis nicio candelă dincolo, setup-ul a -expirat. - - - - DA — confirmare la +2, în fereastră - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - doji - confirmare +2 — intrare 50.40 - +1: close 49.90 — sub 50.10, nu confirmă - +2: close 50.40 — peste 50.10, confirmă (intrare la close) - - - NU — nicio confirmare în 3 candele - - high doji 50.10 - - low doji 49.20 - - - - - - - - - - - - - - - - - - - doji - a 4-a - +1: 49.95; +2: 50.05; +3: 49.85 — toate sub 50.10 - a 4-a: close 49.15 — sub low-ul dojiului 49.20, setup mort - - Serii construite: open = close-ul barei anterioare. - Doji: h 50.10 / l 49.20. Fereastra = maximum 3 candele după doji. - - -Diagrama de sus arată exact diferența dintre un setup care se confirmă și -unul care expiră — diferența e strict numerică (a închis sau nu peste 50.10), -nu vizuală. - -**DA și NU, cu cifre:** - -- **DA:** prima candelă care închide **peste high-ul dojiului** (long) / - **sub low-ul lui** (short), în maximum 3 candele după doji. Intri la - close-ul candelei de confirmare. Exemplu: doji high 53.00 / low 51.60; a - doua candelă închide 53.70 → Buy Doji, intrare 53.70 - (`01_buy_doji_si_strategia_mici.md:136-138`). -- **NU — prea devreme:** doji singur, sau candele care închid încă sub high. - Exemplu: doji high 50.10; +1 închide 49.90 → nu e semnal - (`13_strategia_3_byh.md:158-167`). -- **NU — invalidat:** nicio candelă nu închide dincolo de doji în cele 3 - candele → setup expirat; dacă a 4-a închide sub low-ul dojiului, „setup - mort". Exemplu: doji 53.00/51.60; +1, +2, +3 rămân sub 53.00, a 4-a - închide 51.20 → nu intri (`01_buy_doji_si_strategia_mici.md:222-225`). -- **NU — context:** doji care nu vine după trendul corect (gap-up în - rezistență; uptrend cu volum slab) — cazul CTLD, „nu funcționează" - explicit (`13_strategia_3_byh.md:308`). Vezi Pasul 3. - -**Capcană — nu intra pe doji, intri pe trigger.** Fără închidere dincolo de -high/low în 3 candele, doji-ul a fost doar o pauză în trend -(`01_buy_doji_si_strategia_mici.md:818-821`). - -**De ce închiderea peste high e trigger-ul.** După 8-10 candele de scădere, -vânzătorii care mai aveau marjă au ieșit deja pe drum; la doji, cumpărătorii -noi (vânători de preț mic) apar în număr aproape egal, de aceea bara închide -aproape de unde a deschis. Confirmarea e mecanismul real: când o candelă -închide peste high-ul dojiului, toți cei care au vândut (sau au shortat) în -bara de indecizie sunt pe pierdere, iar stop-urile lor de deasupra acelui -high se execută automat ca ordine de cumpărare — de aceea raportul se -inversează brusc, nu treptat (`13_strategia_3_byh.md:102-149`; -`01_buy_doji_si_strategia_mici.md:20-28`). *(Explicația mecanismului de aici -e completarea sumarizatorului, nu material al cursului: -`13_strategia_3_byh.md:342-350` notează explicit că secțiunea „De ce apare -inversarea" — mecanismul cumpărători/vânzători — e „completări ale mele, -dincolo de ce spune explicit transcrierea".)* - -**Nu merge de fiecare dată:** - -> „nu luați de bună faptul că dacă am un buy dos [sic] și buy hammer de -> fiecare data [sic] merge [...] sunt niște probabilități aici, în 70% din -> cazuri 65-70% din cazuri va funcționa" -> (`01_buy_doji_si_strategia_mici.md:150-152`) - -**Pe cele trei perechi:** fereastra de 3 se numără pe graficul mic. Pe 60 -min, 3 candele înseamnă 3 ore; pe weekly, 3 săptămâni *(aritmetica mea)*. -Candela trebuie să se **închidă**: pe weekly, asta e vineri la închidere -(`23_2025-07-29.md:208-209`). - -**Treci mai departe doar dacă** o candelă a închis dincolo de doji în -fereastra de 3. Altfel ștergi setup-ul și te întorci la Pasul 1. - ---- - - -## Pasul 7 — Calculezi stopul și mărimea poziției, înainte de ordin - -**Numeri 4 candele înapoi de la candela de confirmare, iei cel mai jos low -dintre ele (la short: cel mai sus high) și pui stopul acolo.** -(`13_strategia_3_byh.md:192-193`; `22_2025-08-04.md:23-29`) - - - Unde pui stopul: 4 candele înapoi, sub structură — exemplu construit - - cel mai jos low: 51.60 (doji) - - SL 51.55 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - 4 - 3 - 2 - 1 - (5) - - ultimele 4 candele (3 = doji, 1 = confirmarea) - Cu 4 sau cu 5 candele iese la fel: în downtrend low-ul dojiului e oricum cel mai jos. SL = 51.60 − 0.05. - - Același trade: stop la ochi (0.80 sub intrare) vs stop din regulă - - TP1 55.85 - - intrare 53.70 - - stop la ochi 52.90 — lovit - - SL din regulă 51.55 — ținut - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - al doilea picior: 52.00, higher low - TP1 - Barele 15-20 și stopul la ochi sunt construite, pentru contrast. - + + +Scanerul Buy Doji în TradeStation +ordinea filtrelor și capcanele + +Univers: +All Stocks (~13.000) +S&P 500 · Russell 3000 + +mai mare = mai mulți candidați, scanare mai +lentă + + +Trigger: jbtgrshdATM +BDATM = 0 +(Sell Doji: SDATM = 0) + + +capcană: intervalul nu se aliniază singur cu +TF-ul: îl pui de mână + + +capcană: vede doar candela închisă: daily +rulat la prânz arată ieri + + +Nivel: RSV1ATM +% of PP ≤ 0.5 (60 min) +% of PP ≤ 2 (daily) + +Pivot Interval: 2 = weekly (pe 60 min), 3 = +monthly (pe daily) + + +capcană: RS/SR: 1 la filtrare, 100 doar la +afișare + + +Lichiditate: Volume Colors +Average Volume ≥ 500.000 +Average Length = 10 + +volum daily, indiferent de TF-ul scanerului + + +Opțional: +Since Bear ≥ 8 +Bull Reversal = 1 +RVOL doar Display + + +capcană: pornește pe Bear Reversal: comută +pe Bull + + +Lista de candidați +→ o verifici pe grafic +(pașii 2-6). +Scanerul nu e undă verde. -Sus: cele 4 candele numărate de la confirmare. În downtrend, low-ul doji-ului -e oricum cel mai jos, deci nu contează dacă o numeri și pe a 5-a. Jos: un stop -pus „la ochi", aproape de intrare, e lovit de al doilea picior; stopul din -regulă ține. +Capcanele: intervalul indicatorului nu se aliniază singur cu TF-ul +scanerului; scanerul vede doar candela închisă; factorul RS/SR e `1` la +filtrare, `100` doar la afișare; indicatorul pornește pe Bear Reversal; unele +Buy Doji nu apar deloc și le vezi doar cu ochiul. -**De ce acolo:** acel nivel e ultimul loc care, dacă e spart, anulează ideea -că vânzătorii (sau cumpărătorii) s-au epuizat. În practică, cel mai jos low -din 4 candele coincide aproape întotdeauna cu un swing low -(`22_2025-08-04.md:24-29`): +## Intrarea în tranșe și la retest -> „Stop-ul, 4 candele în spate față de trigger. Sau, exact, swing low — în -> principiu o să fie swing low, pentru că în general ce găsește aici? Un -> swing high și aici un swing low." (`22_2025-08-04.md:27-29`) +În sesiunile de întrebări, autorul predă ca „corectă" o treime la close și +restul cu ordine limită (se execută doar la prețul dat sau mai bun) mai jos, +în corpul candelei de confirmare. -**Cât e în %/R:** procentul depinde de simbol; la exemplul construit, doji low -51.60 → SL 51.55 (cu 5 cenți sub), adică risc mic față de intrare -(`01_buy_doji_si_strategia_mici.md:139-141`). La LABU, SL a fost −9 % față de -intrare (`18_2025-09-23.md:716-719`). Nu se folosește ATR pentru acest SL în -sursele citite. - -**Capcană — bottom-ul poate mai face un picior.** Double bottom-ul cu buy doji -weekly poate deveni triple bottom sau bear flag fără divergență de volum; de -aceea stopul stă sub structură, nu „undeva jos" -(`01_buy_doji_si_strategia_mici.md:833-836`). - -> **Completare proprie:** stopul „la ochi" de 52.90 din panoul de jos și -> barele de după intrare sunt construite de mine, ca să arăt ce înseamnă -> „sub structură" pe un caz. Materialul dă regula și capcana, nu acest -> exemplu. - -**Pe cele trei perechi:** cele 4 candele se numără pe timeframe-ul pe care ai -luat decizia (`20_2025-08-25.md:9-15`). În pereche, decizia de intrare e pe -graficul mic, deci stopul e mai strâns decât pe graficul mare (Pasul 2). - -### Mărimea poziției - -Regula generală de money management: **maximum 2 % din cont per tranzacție**; -mărimea poziției = (cont × 2 %) / distanța până la stop, ajustată cu -spread-ul și **rotunjită în jos** (`03_MODUL_2/04_money_management_position_sizing.md:4-11`, `28-34`). -**NEACOPERIT ÎN MATERIAL:** Strategia 3 nu dă o cifră proprie de risc per -trade, nici o mărime minimă de cont. Singurele cifre apropiate vin din alte -lecții: 2 % general (money management) și risc fix intraday 25 $ cu țintă 4R -(`08_executie_si_risc.md:40-49`), care nu sunt date pentru S3. - -> **Completare proprie — exemplu numeric ilustrativ** (cifrele exemplului -> sunt ale mele, nu din curs; din material vine doar regula de 2 %): pe un -> cont de 50.000 $, risc maxim = 1.000 $. Intrare 50.40, SL 49.20 → distanță -> 1.20 $/acțiune. Mărime = 1.000 / 1.20 = 833,3 → **833 de acțiuni** -> rotunjit în jos (risc efectiv 999,6 $). Dacă poziția se împarte în 3 -> („multiplu de 3 poziții", `13_strategia_3_byh.md:204-213`; varianta de -> execuție cu 48 de acțiuni pe un risc de 25 $ în -> `08_executie_si_risc.md:619-634`), fiecare parte are același stop. - -Pe un cont de prop, secțiunea „Pe cont de prop" (judecata mea) coboară -riscul la 0,33 % pe poziție. Pentru plafonul de risc pe contul tău: -[`A1_risc.md`](A1_risc.md). - -**Treci mai departe doar dacă** știi stopul exact și numărul de acțiuni, și -riscul în dolari încape în regula ta de risc. - ---- - - -## Pasul 8 — Intri: la close sau în tranșe, la retest - -**Pui ordinul.** Regula de bază a strategiei: intri la close-ul candelei de -confirmare (`13_strategia_3_byh.md:191-195`). Varianta pe care o predă ca -„corectă" în Q&A: o treime la close, restul cu ordine limită mai jos, în -corpul candelei. - - - Intrarea în trei tranșe — daily, exemplu construit (doji 53.00 / 51.60) - - TP1 55.85 = 1R de la close - - SL 51.55 (low 4 candele 51.60, minus 5 cenți) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - confirmare 53.70 - - - - - - - corp: open 52.60 → close 53.70 (1.10) - - - 1/3 la close 53.70 - - medie 53.39 → risc 1.84 pe acțiune (tot la close: 2.15) - - 1/3 la 1/3 din corp 53.33 - - 1/3 la 1/2 din corp 53.15 - - - - - - low 53.10: umple T2 și T3 - - +1: 52.60, sub high - - doji 53.00 / 51.60 - Măsurat pe corp (open 52.60 → close 53.70). Măsurat pe toată candela (52.45 → 53.85), 1/3 ar fi 53.38; 1/2 iese tot 53.15. - Stopul e unul singur, pentru toată poziția. Barele 0-11 și 15-18 sunt construite. + + Intrarea în trei tranșe — același trade (doji 50.10 / 49.25) + + + ținta 1: 51.60 = 1R față de close + + ținta 1: 51.32 = 1R față de prețul mediu 50.26 + + stopul: 49.20 + + + + + + + + + + + + + + + + + + + 1/3 la close 50.40 + ca să nu ratezi trade-ul dacă pleacă fără tine + + + 1/3 cu ordin limită la 50.23 (o treime din corp) + mai ieftin, dacă prețul revine + + + 1/3 cu ordin limită la 50.15 (jumătatea corpului) + și mai ieftin + + + media mai bună coboară ținta: + ieși la 51.32, nu la 51.60 + + + retestul: prețul revine la 50.10 + și umple amândouă ordinele limită + Paranteza de pe candela de confirmare e corpul ei (49.90 → 50.40): pe el se măsoară 1/3 și 1/2. Stopul e unul singur. Exemplu construit. + + + + + + + + + risc 1.20 pe acțiune (tot la close) + + risc 1.06 pe acțiune (cu tranșe, preț mediu 50.26) -Cu cifrele exemplului (construit, pe nivelurile din -`01_buy_doji_si_strategia_mici.md:136-142`): +Candela de confirmare are corpul între 49.90 și 50.40. O treime o cumperi la +close, la 50.40; o treime cu limită la o treime din corp, 50.23; o treime la +jumătatea corpului, 50.15. Candela următoare coboară până la 50.10 și le +umple pe amândouă. Prețul mediu iese 50.26: riști 1.06 pe acțiune în loc de +1.20, iar ținta de 1R vine mai devreme, la 51.32 în loc de 51.60. Cu tranșe +câștigi de două ori: risc mai mic și țintă mai apropiată. +Pe 60 de minute și pe prop, retestul contează mai mult, pentru că acolo +candela e înaltă. Nu alerga după preț: „poate nu mai face niciodată". -1. **1/3 la close-ul confirmării:** 53.70. -2. **1/3 cu limit la 1/3 din corp:** 53.70 − 1.10/3 = 53.33. -3. **1/3 cu limit la 1/2 din corp:** 53.15. -4. Candela de după coboară la 53.10 și le umple pe amândouă. Prețul mediu: - 53.39; riscul pe acțiune până la stopul 51.55: **1.84**, față de 2.15 dacă - intrai tot la close. +> **Completare proprie:** materialul nu spune de la care din cele două +> prețuri calculezi ținta. Alege înainte de trade și ține-te de ea. Detalii: [`A3_intrarea.md`](A3_intrarea.md). -Tranșele, pe weekly, spuse de el: „1/3 din poziție la close-ul trigger-ului -(vineri, la închiderea săptămânii)", „1/3 cu limit la retestul de 1/3 din -înălțimea candelei. Iei high-ul și low-ul și calculezi", „1/3 cu limit la -1/2 din candelă" (`23_2025-07-29.md:206-213`). Și în altă sesiune: - -> „aici nu se intră full, / se intră cu 1 pe 3 din poziția aici, / 1 pe 3 la -> 1 pe 3 din candelă / și 1 pe 3 la 1 pe 2 sau 2-3 / la 1 pe 2. / Așa se face -> de cea corectă. / Așa cum v-am învățat pe strategia respectivă." -> (`transcripts/09_Q_and_A/19_08092025.txt:1067-1073`) - -**Măsori de la open sau de la low?** Se poate măsura de la low sau de la -open; pe XLE diferența a fost 3.16 % vs 2.98 %, „Nu e mare diferență, că ăsta -nu e așa volatil, dar e o diferență" (`20_2025-08-25.md:178-180`). Pe -exemplul de sus: pe corp, 1/3 = 53.33; pe toată candela (52.45 → 53.85), -1/3 = 53.38. La 1/2 iese 53.15 în ambele feluri. - -**De ce retestul contează pe TF mic și pe prop:** „Pai ba, e inalt, ai ris -[sic] mare pe asta, mai ales daca esti pe prop. Si atunci de asta sa intre pe -unul, pe 3, unul, pe 2, pentru un ris [sic] mai mic." — buy doji pe 60 min -(`transcripts/09_Q_and_A/20_25082025.txt:207-208`). Retestul la 1/2 sau 1/3 -reduce riscul la ~jumătate pe același setup (`20_2025-08-25.md:141-164`). La -XLE pe 60 min, retestul de 1/2 a căzut fix în pivotul weekly — două motive -independente pentru aceeași intrare (`20_2025-08-25.md:172-176`). - -**La acțiuni scumpe (sute sau mii de $):** 4 tranșe de 1/4, stop unic sub -higher low; riscul total nu crește, doar prețul mediu scade -(`01_buy_doji_si_strategia_mici.md:798-814`). - -**Capcană — nu alerga după preț.** Dacă buy doji-ul weekly a plecat deja, -aștepți retestul de 1/3 - 1/2 din lumânarea mare. Poate să nu mai vină, și -atunci ratezi: „Poate să nu mai facă, poate nu mai face niciodată." -(`01_buy_doji_si_strategia_mici.md:825-827`). Nu muți ordinul limită mai sus -după preț (`08_ANALIZA_ZILNICA/03_locul_crimei_si_pullback.md:296-311`). - -> **Completare proprie — de unde calculezi TP1 când ai intrat în tranșe.** -> Materialul nu leagă cele trei tranșe de intrare de cele trei de ieșire -> (Pasul 9). Două variante: TP1 = 1R de la close-ul confirmării (55.85, -> regula din `13_strategia_3_byh.md:194-195`), sau TP1 = 1R de la prețul -> tău mediu, 53.39 + 1.84 = 55.23 (deducția din -> [`A3_intrarea.md`](A3_intrarea.md), §1.3, pasul 4). Alege una înainte de -> trade și ține-te de ea. Toată discuția „la close sau la retest", desfăcută -> pas cu pas: [`A3_intrarea.md`](A3_intrarea.md). - -**Treci mai departe doar dacă** ordinele sunt puse (sau prima tranșă e -executată), cu stopul din Pasul 7 pus în platformă, pe toată poziția. - ---- - - -## Pasul 9 — Ieși: o treime la 1:1, restul pe trailing, și nu stai peste 8 candele - -**Pui ținta la aceeași distanță ca stopul și, după ce e atinsă, muți restul -poziției pe trailing stop.** Dacă în 8 candele nu s-a atins nici ținta, nici -stopul, ieși oricum. - - - Ieșirea: trailing stop pe gap-uri și limita de 8 candele — exemple construite - A — trailing stop pe gap-uri (seria de la intrarea în tranșe) - - intrare 53.70 - - TP1 55.85 — tranșa 1: +1R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a treia treime: o lași mai departe (break-even / trend) - - - - TP1: ieși cu 1/3 - gap: low > high anterior → trail 56.20 - gap → trail 57.45 - close sub trail: ieși cu 1/3 - la 57.20 = +1.63R - B — limita de 8 candele - - TP1 51.60 - - intrare 50.40 - - SL 49.20 - - - - - - - - - - - - - - - - - 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - doji - a 8-a candelă: nici TP, nici SL - → ieși la 50.70 = +0.25R - Barele de după intrare sunt construite. Regulile: 13_strategia_3_byh.md:196-213. - - -Sus: prima treime iese la TP1; linia de trail apare doar pe candelele care -deschid cu gap (low peste high-ul candelei de dinainte), urcă în trepte, iar a -doua treime iese la primul close sub ea. Jos: alt trade, în care prețul -stă 8 candele între stop și țintă — ieși la close-ul celei de-a 8-a. - -| Tranșă | Ieșire la | De unde vine ținta | Ce faci cu stopul | -|---|---|---|---| -| 1 din 3 | TP = SL ca distanță (1:1), proiectat de la close-ul de confirmare | `13_strategia_3_byh.md:194-195` | rămâne sub pozițiile 2-3 | -| 2 din 3 | pe trailing stop | `13_strategia_3_byh.md:196-200` | trail = low-ul candelei cu gap peste high-ul precedentei (long); ieși la close dincolo de el | -| 3 din 3 | mai departe, spre break-even/trend | `13_strategia_3_byh.md:204-213` | poți risca tot stopul inițial | - -**Regula de bază:** TP 1:1, „nu mai mult". Profitul suplimentar vine din -trailing, nu din mutarea țintei fixe (`13_strategia_3_byh.md:319-321`). - -**Limită de timp:** dacă nici TP, nici SL nu se ating în **8 candele** de la -intrare, ieși oricum (`13_strategia_3_byh.md:201-202`). - -**Varianta cu două ținte** (execuție): TP1 = 1R, TP2 = 2R, a treia pe trail -(`08_executie_si_risc.md:619-634`). Contradicția cu „nu mai mult" e la -„Unde se contrazice materialul", punctul 2. - -**Varianta weekly/MICI:** ținte în trepte pe niveluri (R1 → R2 → vârful -anterior → SMA 200 → jumătatea marubozu-ului mare → fostul suport spart), iar -unde se suprapun mai multe niveluri, acolo iei profit -(`01_buy_doji_si_strategia_mici.md:531-536`). Orizont 6-7-8 luni -(`01_buy_doji_si_strategia_mici.md:538-541`): - -> „strategia mici, asta e pentru cei care aveți răbdare, 6-7-8 luni să stat -> în tranzacție." (`01_buy_doji_si_strategia_mici.md:540-541`) - -**Capcană — nu extinde targetul peste 1:1.** Profitul în plus vine din -trailing (`13_strategia_3_byh.md:319-321`). - -> **Completare proprie:** barele de după intrare, din ambele panouri, sunt -> construite. Tabelul cu cele 3 tranșe e, în lecția 13, marcat de -> sumarizator ca completare a lui, nu ca regulă rostită -> (`13_strategia_3_byh.md:341-350`); regula de trail, limita de 8 și 1:1 -> sunt ale cursului. - -**Pe cele trei perechi:** 8 candele = 8 zile pe daily, 8 săptămâni pe -weekly, ~1,2 zile pe 60 min *(aritmetica mea)*. Pe 60 min, limita de 8 candele -trece peste noapte; dacă nu poți ține peste noapte, vezi „Pe cont de prop". - -**Gata.** Trade-ul s-a închis când toate trei treimile au ieșit: la TP1, la -close sub trail, sau la limita de 8 candele — ori la stop. - ---- - - -## Oglinda: Sell Doji, pe short - -Aceeași procedură, întoarsă: uptrend de 8-10 candele, doji lângă -rezistență/PP, confirmare = o candelă care închide sub low-ul dojiului în -maximum 3 candele; SL = high-ul ultimelor 4 candele, TP = aceeași distanță în -jos, trail-ul coboară pe candelele cu high sub low-ul precedentei -(`13_strategia_3_byh.md:227-232`). - -Cifrele exemplului: doji high 49.40 / low 48.00, a doua candelă închide -47.30 (sub 48.00) → Sell Doji, intrare short, SL 49.45, TP 45.15 -(`01_buy_doji_si_strategia_mici.md:312-314`). Graficul întreg al variantei -short: - - - Sell Doji — daily (exemplu construit, fără ticker) - - SL 100.10 (high 4 candele) - - intrare short 99.00 - - TP 97.90 = 1R - - trail 96.45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - doji 99.20 / 100.10 - ieșire pe trail 96.60 - bara 15: close 99.40 peste low-ul dojiului 99.20 — NU confirmă - bara 16: close 99.00 sub 99.20 — confirmare (intrare short) - Intrare short la close sub low-ul dojiului, SL la high 4 candele, TP 1:1, apoi trail. - - -**Ce se adaugă la short, față de long:** - -- **Nu pe piață „foarte strong bull".** Un sell doji poate fi doar un bull - flag; „când shortăm, să fie overall piața praf" - (`28_2025-05-27.md:313-317`). -- **Nu la acțiuni sub 10 $** — short squeeze, manipulabile, gap-uri - intraday (`28_2025-05-27.md:397-402`, `560-576`). -- **Nu contra unui Buy Doji weekly** (Pasul 2). -- **Divergența poate întoarce semnalul:** sell doji cu divergență de volum - sau stochastic din oversold → urmărești reverse în buy doji - (`01_buy_doji_si_strategia_mici.md:338-347`). - ---- - - ## Exemplul real: LABU, de la doji la +30 % -**LABU — daily, Buy Doji la pivotul monthly** (`18_2025-09-23.md:608-719`). - -> **Ce e real și ce nu:** din curs vin **doar procentele** — stop inițial -> 9 %, +30 % într-o lună (`18_2025-09-23.md:716-719`). **Nivelurile de preț -> (pivot 86.00, intrare 89.50, SL 81.45, TP 116.35) sunt marcate de -> sumarizator ca fiind ale lui, nu citite din curs** (`18_2025-09-23.md:713`). -> Materialul nu dă niciun exemplu numeric complet, de la intrare la ieșire, -> cu prețuri de curs. - - - LABU — daily - - pivot monthly 86.00 (construit) - - SL 81.45 (construit) = −9 % (procent real) - - intrare 89.50 (construit) - - TP 116.35 (construit) = +30 % (procent real) - - SMA-20 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - bottom 1 82.40 - bottom 2 81.45 - bottom 3 81.45 - doji - confirmare (intrare) - higher high — TP atins - bara 33 = doji: o 85.00, c 84.90, h 86.30, l 84.20 — corp mic exact pe pivotul monthly 86.00 (indecizie la suport) - Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt construite de sumarizator (18_2025-09-23.md:713). + + LABU — daily + + 1. setup: scădere lungă, apoi trei minime aproape egale — pivotul 86.00 atins de două ori + + 2. doji + confirmare + + 3. trendul pornește + + 4. ținta + + pivot lunar 86.00 + + stop 81.45 = 9 % sub intrare (procent real) + + intrare 89.50 + + ținta 1:1 97.55 + + 116.35 = +30 % față de intrare (procent real) + + SMA-20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + test 1 · 82.40 + test 2 · 82.00 + + + aici intri, la close 89.50: + abia acum știi că au câștigat cumpărătorii + + + al treilea minim: 81.45, + fără o nouă atingere a pivotului + aici pui stopul, sub minime + + + retest: cade înapoi pe intrare + și ține — trendul e sănătos + + + aici se odihnește, nu se strică: + bull flag, pe volum mic + + + a ajuns la 116.35: +30 % în 21 de zile de bursă, + cam 3,3R din cât ai riscat + doji = corp mic (o 86.10, c 86.00): cumpărătorii și vânzătorii sunt la egalitate, exact pe pivotul lunar 86.00 + ținta 1:1 (97.55) e atinsă pe bara 40: acolo vinzi o treime, restul merge mai departe — de asta nu vinzi tot la 1:1 + Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt puse de sumarizator. -Pașii, pe acest exemplu: +**Ce e real:** doar procentele — stop de 9 %, +30 % într-o lună. Prețurile +sunt puse de sumarizator. -1. **Context** (pașii 3 și 5): downtrend → consolidare → triple bottom → doji. -2. **Locație** (pasul 4): doji la pivotul monthly 86.00 — al doilea test al - nivelului, fără low nou (`18_2025-09-23.md:710-712`). -3. **Trigger** (pasul 6): candela verde care închide peste high-ul - dojiului → intrare 89.50. -4. **Stop** (pasul 7): SL 81.45 = −9 % față de intrare. Risc 8.05, deci TP 1:1 - ar fi 97.55 — dar exemplul a mers mult mai departe. -5. **Ieșire** (pasul 9): TP +30 % = 116.35, atins într-o lună, după: bull - reversal pe candela mare → retestare → bull flag → breakout → higher high, - higher low. -6. **Rezultat:** „stop inițial 9 %, +30 % într-o lună" — un trade care a - mers ~3,3R pe distanța de stop (calcul al meu, din nivelurile marcate ca - ale sumarizatorului în `18_2025-09-23.md:713`), adică exact scenariul în - care tranșa de 1/3 la 1:1 și restul pe trailing contează. +**Setup-ul.** Pe daily: scădere, consolidare, apoi trei minime aproape egale +— 82.40, 82.00 și 81.45, între ele 0,95 $, cam 1,2 %. Pivotul lunar 86.00 e +însă atins doar de două ori: între primele două minime prețul urcă până la +88.90, deci trece pe deasupra pivotului și cade iar prin el, iar înainte de +al treilea minim urcă doar până la 85.80 și rămâne sub. De aceea cursul îi +spune și „triple bottom", și „al doilea test al pivotului": unul numără +minimele de preț, celălalt atingerile nivelului. Doji-ul vine imediat după al +treilea minim. -**Ce lipsește din material:** cifrele reale de intrare/SL/TP pentru LABU (și -pentru toate tickerele din lecția 13 — ANF, PYPL, XBI, ARTL, Novavax, ODFL, -Baidu, Tesla long; Apple, Lowe's, MCO, Q, SPY, Moderna, Pfizer, Google, -McDonald's, Honeywell short — `13_strategia_3_byh.md:298-308`). Transcrierea -trece prin grafice reale, dar audio-ul nu conține prețuri clare. -**NEACOPERIT ÎN MATERIAL:** nu există niciun exemplu numeric complet de la -curs, de la intrare la ieșire, pentru nicio strategie din capitolul ăsta -(`13_strategia_3_byh.md:298-308`). +**Intrarea.** Candela verde se închide peste doji: intrare la 89.50, stop la +81.45, sub toate cele trei minime. Ținta 1:1 ar fi fost 97.55. -**Exemplu weekly/MICI** (doar cifrele procentuale sunt confirmate): NKE -weekly, +36 % în 14 săptămâni; răbdare pe Buy Doji weekly, +54 % în 20 de -săptămâni, trigger la a 11-a candelă (`23_2025-07-29.md:202-204`; -`18_2025-09-23.md:728-730`). +**Rezultatul.** Retestul coboară la 89.60 și ține, urmează un flag de patru +candele pe volum mic, apoi breakout; prețul ajunge la 116.35 în 21 de zile de +bursă de la confirmare — cam 3,3R (calculul meu). Aici se vede de ce nu +vinzi tot la 1:1. + +Pe weekly, tot doar procente: NKE, +36 % în 14 săptămâni. + +## Transfer (judecata mea, nu a cursului) + +**Pe prop** (cont de la o firmă, cu limită zilnică de pierdere): limita se +calculează și pe pozițiile deschise, iar interdicția de overnight lasă doar +varianta de 60 de minute. Pe 50.000 $ cu limită de 1.000 $, un singur stop la +2 % te duce la limită. Cu 3 poziții și o zi proastă de cel mult 500 $, riști +167 $ pe poziție (0,33 %): 139 de acțiuni la stopul de 1.20. Intrarea la +retest e recomandată explicit pe prop. + +**Pe BVB:** doar long, pe daily și weekly, pe 8-12 nume lichide din BET (TLV, +H2O, SNP, SNN, BRD, SNG, EL, TGN, DIGI, M), verificate de mână. Lichiditatea +o măsori în RON tranzacționați pe zi, nu în număr de acțiuni. Pivoții îi +calculezi în Excel, din maximul, minimul și închiderea lunii trecute: +PP = (H + L + C) / 3, R1 = 2·PP − L, S1 = 2·PP − H. Un spread de 1 % mănâncă +jumătate dintr-o țintă 1:1. + +## Unde se contrazice materialul + +1. **Rata:** 70-75 % într-o lecție, 65-70 % în altele. Socotește cu 65-70 %. +2. **Ținta:** lecția cere 1:1, alte sesiuni folosesc 2R. 2R e alegere de + execuție, nu regulă. +3. **Trendul scurt:** lecția acceptă 2-3 candele, scanerul cu `Since Bear ≥ 8` + le pierde. Caută-le și de mână. +4. **Pivotul pe weekly:** regula zice trimestrial, MICI citește lunarul. + Trage-i pe amândoi. +5. **La close sau la retest:** lecția zice close, sesiunile de întrebări + retest ([`A3_intrarea.md`](A3_intrarea.md)). +6. **Detalii de scaner** (factorul RS/SR, două seturi de cifre la ULTA): + [`A2_contradictii.md`](A2_contradictii.md). + +## Ce trebuie să exersezi + +1. Marchează retroactiv 20 de setup-uri pe daily: doji, confirmare, stop, + țintă, ce s-a întâmplat în 8 candele. +2. Compară pe hârtie, pe 10 semnale, ținta 1:1 cu varianta 1R + 2R. +3. Pe BVB, măsoară spread-ul 5 zile și scoate de pe listă ce trece de 1 %. + +Legături: [`06_hammer_mbt10.md`](06_hammer_mbt10.md) (același +schelet), [`02_mp2.md`](02_mp2.md) (unde; Buy Doji spune când), +[`A1_risc.md`](A1_risc.md). --- ## Checklist de tipărit -- [ ] (Pasul 1) Simbolul e lichid: close > 30-40 $, volum mediu daily ≥ 500.000. La short: piața/sectorul e slab, prețul > 10 $. -- [ ] (Pasul 2) Am ales perechea. TF-ul mare nu are doji confirmat contra direcției mele; pe 60 min, daily-ul are swing long stabilit. -- [ ] (Pasul 3) Am un trend anterior în direcția opusă setup-ului: 8-10 candele ideal; 2-3 candele acceptate, dar tratate ca semnal mai slab. -- [ ] (Pasul 3) Candelă cu open ≈ close, corp mic față de range, fitil în ambele părți. -- [ ] (Pasul 4) Doji-ul e la un suport/pivot (long) sau rezistență/pivot (short), sub pragul TF-ului (60 min ≤ 0,5 %, daily 1-2 %). -- [ ] (Pasul 5) Știu dacă e A+ sau mediocru: volum, divergență, proiecție, trigger-e multiple. -- [ ] (Pasul 6) A închis o candelă peste high-ul dojiului (long) / sub low (short), în maximum 3 candele după doji. -- [ ] (Pasul 6) Dacă au trecut 3 candele fără confirmare → setup expirat, nu intru. -- [ ] (Pasul 7) Stop = extrema ultimelor 4 candele de la candela de confirmare, pe TF-ul intrării. -- [ ] (Pasul 7) Mărimea poziției = risc$ / distanța la stop, rotunjit în jos. -- [ ] (Pasul 8) Am hotărât înainte: tot la close, sau 1/3 la close + 1/3 la 1/3 + 1/3 la 1/2. Nu mut ordinul după preț. -- [ ] (Pasul 9) TP = aceeași distanță ca stop, proiectată de la close-ul de confirmare. -- [ ] (Pasul 9) Dacă în 8 candele nu s-a atins nici TP, nici SL → ies la a 8-a. - ---- - -## Unde se contrazice materialul - -Nu aleg eu între variante. Pentru fiecare: ce spune fiecare sursă și ce -înseamnă practic pentru cine trebuie să decidă. - -1. **Rata de câștig.** `13_strategia_3_byh.md:11-12` scrie „70-75 %"; - `01_buy_doji_si_strategia_mici.md:146-152` și `03_2026-08-11.md:185` spun - „65-70 %" / „peste 65 %". *Practic:* folosește 65-70 % pentru așteptări de - sizing (partea prudentă), dar nu schimba regulile pe baza diferenței — ea - nu afectează setup-ul, doar expectation management. - -2. **Take-profit.** `13_strategia_3_byh.md:194-195` impune 1:1 fix („nu mai - mult"); `28_2025-05-27.md:130-134` și `08_executie_si_risc.md:619-634` - folosesc TP la 2R / TP1 1R + TP2 2R. *Practic:* dacă vrei să respecți - regula principală, iei 1R pe prima tranșă și lași restul pe trailing; - varianta 2R e o alegere de execuție, nu o regulă a strategiei. - -3. **Condiția de trend în scanner.** `11_construire_scanere_sf_byd_sld.md:58-62` - construiește triggerul doar din `BDATM = 0`; - `28_2025-05-27.md:37-52` adaugă `Since Bear ≥ 8` din alt indicator. - *Practic:* versiunea cu ≥ 8 filtrează mai mult și ratează setup-urile cu - trend scurt; versiunea fără filtru le prinde pe toate, dar îți dă listă mai - lungă de triat manual. - -4. **Lungimea trendului vs. scanner.** `13_strategia_3_byh.md:315-318` - acceptă și 2-3 candele de trend; scannerul din `28_2025-05-27.md:144-149` - cere ≥ 8 și pierde explicit acele cazuri. *Practic:* nu te baza doar pe - scanner dacă vrei să prinzi și trendurile scurte; verifică și manual. - -5. **Factorul RS/SR.** `11_construire_scanere_sf_byd_sld.md:80-93` explică - `100` ca opțiune validă (afișezi `5.97` în loc de `0.0597`), cu condiția să - înmulțești pragul; `04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:329-341` revine cu o corecție - explicită (pune `1` la filtrare, `100` doar la display). *Practic:* cu `1` - scrii pragul natural (`≤ 0.5`); cu `100` trebuie să-l scrii `≤ 50`, altfel - filtrezi de 100 de ori mai strâns. Amestecul celor două e singura variantă - greșită sigur. - -6. **Două seturi de cifre ULTA.** `11_construire_scanere_sf_byd_sld.md:139-209` - (doji ~403.60, intrare 404.20, SL 396, TP 418) vs. - `04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md:82-183` (close real 373.30, suport 355.48, pivot - 383.74). Ambele sunt marcate ca parțial completări ale sumarizatorului. - *Practic:* nu lua niciunul ca exemplu „de curs"; singurele cifre confirmate - sunt cele din al doilea set (close/suport/pivot), nu nivelurile de trade. - -7. **Ce pivot citești pe weekly.** Regula de pivoți spune Weekly → pivoți - Quarterly (`03_timeframes_set_up.md:69-79`; - `11_construire_scanere_sf_byd_sld.md:63-69`); MICI, care e un buy doji - weekly, se citește față de **pivotul monthly** - (`01_buy_doji_si_strategia_mici.md:12`, `357`, `370-379`). Materialul nu - le împacă. *Practic:* pe perechea monthly → weekly, trage-le pe amândouă; - un doji la ambele niveluri e oricum mai bun decât la unul. - -8. **Intri la close sau aștepți retestul.** Lecția 13 intră la close - (`13_strategia_3_byh.md:191-195`); sumarul Q&A din 25.08.2025 scrie „nu - intri la închiderea lui — aștepți retestul" (`20_2025-08-25.md:144-145`), - iar transcrierile spun o treime la close și restul la retest - (Pasul 8). Desfăcută complet în [`A3_intrarea.md`](A3_intrarea.md). - ---- - -## Transfer - -> **Tot ce urmează în secțiunea asta e judecata mea, nu materialul cursului.** -> Unde cursul chiar spune ceva despre prop sau despre BVB, citatul e marcat -> cu trimitere; restul e extrapolare și poate fi greșit. - -### Pe cont de prop - -| Regulă de prop | Ce strică | Ajustarea | -|---|---|---| -| drawdown zilnic **%**, calculat **și pe poziții deschise** | Un Sell Doji pe un small cap poate atinge limita cu pierderea flotantă. Materialul: un participant a pățit-o — i s-au închis tranzacții care erau pe profit, pentru că pierderea flotantă atinsese limita (`26_2025-06-11.md:214-222`) | Nu intra niciodată cât să ajungi la limită doar cu pozițiile deschise. Size-ul din §„calculat înapoi" | -| drawdown total | Poziții multiple corelate (30 de sell-uri în același sector, `28_2025-05-27.md:319-330`) pot mișca contul în aceeași zi | Cap pe risc agregat simultan, nu doar per trade | -| interdicție overnight / weekend | Strategia daily ține poziția peste noapte prin construcție (SL la 4 candele, TP 1:1, limită 8 candele) | Dacă firma interzice overnight, rămâne doar varianta 60 min; verifică regulile exacte | -| news lockout | Doji-ul însuși e adesea pe o zi cu eveniment; lockout-ul poate bloca tocmai semnalul | Accepți că ratezi semnalul din fereastră; nu forța intrarea înainte | -| consistency rule (o zi nu poate fi > X % din profit) | TP 1:1 dă zile mici, dar o zi cu 2-3 stop-uri poate domina partea de pierdere | Regula de mai jos ține pierderea zilnică sub 1/2 din limită, deci și consistency-ul pe pierdere e mai greu de atins | - -**Timp de ecran:** strategia nu cere stat la ecran — scanerul se programează -(`Schedule`), iar cifra orelor nu e dată explicit în material -(`28_2025-05-27.md:392-394`; `11_construire_scanere_sf_byd_sld.md:296-304`). -Pe BVB, înlocuitorul e o verificare manuală de ~5 minute pe zi pe lista de -8-12 nume. - -**Sizing-ul, calculat înapoi din limita zilnică.** Pe un cont de **50.000 $** -cu **limită zilnică de 1.000 $ (2 %)**, regula generală de 2 % per tranzacție -(`03_MODUL_2/04_money_management_position_sizing.md:4-11`) înseamnă **exact -1.000 $ per trade** — un singur stop atinge limita. De aceea coborâm: - -- ținta e ca **o zi proastă planificată × 2 ≤ limita zilnică** → pierderea - planificată într-o zi proastă ≤ **500 $**; -- cu maximum **3 poziții simultane** (nu uita: nu depăși limita nici dacă - „ies pe pierdere maximă toate cele 3 tranzacții ale zilei", - `26_2025-06-11.md:218-219`) → risc per poziție ≤ **167 $ = 0,33 % din - cont**; -- la intrare 50.40 / SL 49.20 (distanță 1.20 $) → **167 / 1.20 = 139 de - acțiuni**, rotunjit în jos. - -Asta e judecata mea de sizing, nu o cifră din material. Materialul are -**NEACOPERIT** exact aici: nu dă nicio cifră de risc per trade pentru -Strategia 3, în nicio lecție citată. - -Un plus specific strategiei: intrarea pe **retest 1/2 sau 1/3** în loc de -close-ul triggerului reduce riscul la ~jumătate pe același setup și e -recomandată explicit „pe prop, unde pragul de pierdere zilnică e fix" -(`20_2025-08-25.md:141-164`). - -**Verdict:** **merge, cu ajustările de mai sus.** Regula de intrare e pur -preț, riscul e măsurabil din construcție (SL fix, TP 1:1), deci se -pretează la un cont cu limită zilnică. Rezervele: short-ul e descurajat de -contextul de piață și de regulile de overnight, iar limita de 8 candele -forțează ieșiri care pot lovi tocmai în news lockout. Cu sizing-ul de -0,33 %/poziție și retest 1/2–1/3, limita zilnică nu se atinge nici cu 3 -stop-uri. - -### Pe BVB (swing) - -**Ce cere strategia vs. ce există:** - -| Ce cere | Există la BVB? | Înlocuitorul concret | -|---|---|---| -| scaner `jbtgrshdATM`, `BDATM`/`SDATM = 0` | nu | listă manuală de 8-12 nume BET, verificată o dată pe zi (5 min/zi) cu condiția doji din Pasul 3 | -| indicator `RSV1ATM` pentru proximitate de pivot | nu | pivoții se calculează în Excel din H/L/C din luna precedentă; proximitatea o măsori cu raportul preț/pivot | -| Bull/Bear Reversal, RVOL (proprietare) | nu | Bull Reversal se înlocuiește cu „prețul a spart trail-ul"; RVOL cu volumul de azi față de media 10 zile, calculat manual | -| short | practic nu (retail, fără împrumut lichid) | rămâne **doar jumătatea long**. Vezi verdictul | -| volum mediu > 500.000, preț > 30-40 $ | pragmatic nu (praguri US) | praguri recalculate: **valoare tranzacționată**, nu număr de acțiuni sau preț (vezi mai jos) | -| date fundamentale trimestriale | da, dar anual/trimestrial | rapoartele de pe `bvb.ro` / platforma brokerului; nu sunt cerință de intrare la S3 (`01_buy_doji_si_strategia_mici.md:828-832`) | - -**Pragurile, recalculate.** Pragul US „volum mediu > 500.000 de acțiuni" și -„preț > 30-40 $" **nu au sens pe BVB**: acțiunile se tranzacționează în RON, -numărul de acțiuni e incomparabil (o bancă are miliarde de acțiuni, un -emitent mic are milioane), iar pe BVB prețul în RON nu e proxy de -lichiditate — SNP tranzacționează sub 1 RON și e printre cele mai lichide -nume. Pragul util e **valoarea**: - -- **valoare tranzacționată ≥ ~1-2 milioane RON/zi**, medie pe 10 zile (înlocuiește `Average Length = 10`, `11_construire_scanere_sf_byd_sld.md:70-73`); -- **spread top-of-book ≤ ~0,5 %** la cele mai lichide, până la ~1-2 % la coada listei; -- **cel puțin ~30-50 de tranzacții/zi** — un nume care se tranzacționează în 3 tranzacții pe zi nu are grafic pe care să citești un doji. - -Cifrele de mai sus sunt estimările mele de ordin de mărime, de verificat în -platformă; materialul nu dă niciun prag pentru BVB. - -**Universul propus** (toate sunt membri BET, dar lichiditatea și spread-ul -diferă; ordinea e a mea, de verificat): - -| Simbol | De ce intră | Ce te aștepți la lichiditate / spread | -|---|---|---| -| **TLV** (Banca Transilvania) | cea mai mare pondere BET, cel mai urmărit nume de retail | lichiditate mare, spread ~0,2-0,4 % | -| **H2O** (Hidroelectrica) | pondere mare BET, volatilitate bună pentru SL structural | lichiditate mare, spread ~0,3-0,5 % | -| **SNP** (OMV Petrom) | cel mai tranzacționat ca volum de acțiuni; preț sub 1 RON | lichiditate mare **pe valoare**, spread poate părea mare în procent din preț mic | -| **SNN** (Nuclearelectrica) | pondere BET, trenduri lungi | lichiditate medie-mare | -| **BRD** (BRD-GSG) | pondere BET | lichiditate medie-mare | -| **SNG** (Romgaz) | pondere BET, mișcări pe energie/gaz | lichiditate medie | -| **EL** (Electrica) | pondere BET | lichiditate medie | -| **TGN** (Transgaz) | pondere BET | lichiditate medie-mică | -| **DIGI** (Digi Communications) | lichid, dar cu free-float restrâns | lichiditate medie | -| **M** (MedLife) | emisiune cu volatilitate, spread mai larg | lichiditate mică-medie | - -Fără opțiuni listate lichide pe aceste nume; există derivate pe indicele BET, -dar nu schimbă regula de candelă. Nu propun small-cap-uri: pe BVB filtrul de -5-10 nume lichide e oricum mai mic decât universul pe care a fost gândită -strategia. - -**Pivoții în Excel.** Strategia folosește floor pivots ca „nivel" pentru -doji. Autorul a confirmat că pivoții clasici se calculează „1 la 1" pe BVB, -fără TradeStation (`09_2025-12-09.md:1177-1180`). Formula standard, din H/L/C -ale **perioadei precedente** (pentru un grafic daily, luna precedentă): - -``` -PP = (H + L + C) / 3 -R1 = 2*PP - L S1 = 2*PP - H -R2 = PP + (H - L) S2 = PP - (H - L) -R3 = H + 2*(PP - L) S3 = L - 2*(H - PP) -``` - -Exemplu ilustrativ pe TLV (cifrele H/L/C sunt ale mele, ca să arăt pașii): -H = 25,00, L = 23,00, C = 24,50 → PP = 24,17; R1 = 25,34; S1 = 23,34; -R2 = 26,17; S2 = 22,17. Doji-ul „la nivel" înseamnă că low-ul/high-ul lui -cade în vecinătatea unuia dintre aceste numere (Pasul 4). - -**Ce se rupe din cauza lichidității:** - -- **Spread-ul mănâncă un TP de 1:1.** Pe un nume cu spread 1 %, o mișcare de - 2 % dus-întors pierde jumătate în costuri; la 1:1 net ajungi ~0,5:1. La - TLV/H2O (0,3-0,5 %) efectul e suportabil; la coada listei nu. -- **SL-ul de 4 candele poate fi lovit de zgomot.** Pe un nume cu volum de - ordinul a 1 milion RON/zi, o singură comandă de 20-30 mii RON mișcă prețul - câteva zecimi de procent — suficient să atingă un SL apropiat fără ca - ideea să fie invalidată. -- **Gap-uri la deschidere.** BVB deschide cu licitație (10:00); pe știri, - prețul poate deschide direct peste SL → SL-ul nu te protejează, exact - mecanismul descris la `28_2025-05-27.md:566-570` pentru valorile mici. -- **Limita de 8 candele devine „8 zile de așteptat".** Pe un nume lent, TP-ul - 1:1 poate să nu fie atins în 8 zile și ieși pe la zero, cu spread plătit. -- **Pivoții monthly se calculează manual** — o greșeală de câteva zecimi la - H/L/C mută nivelul și transformă un setup „la nivel" într-unul oarecare. - -**Verdict:** **merge degradat, long-only.** Regulile de candelă -(trend → doji → confirmare în 3 → SL la 4 → TP 1:1 → trail → limita 8) se -aplică integral pe cele 8-12 nume BET lichide, pe daily/weekly. Pierzi -short-ul (jumătate din strategie), scanerul pe mii de simboluri, viteza de -reacție pe 60 min și filtrele proprietare. - -**Cât din strategie supraviețuiește:** regulile de intrare/ieșire, integral -(~50-60 % din strategia ca sistem, adică toată jumătatea long). Din jumătatea -short, 0 %. Din infrastructura de scanare/filtrare, 0 % — înlocuită manual. -Estimarea e a mea, nu a materialului. - ---- - -## Ce trebuie să exersezi ca s-o poți folosi - -1. **Marchează retroactiv 20 de setup-uri pe BVB**, pe daily, pe cele 8-12 - nume BET: pentru fiecare, notează data doji-ului, high/low, dacă a - confirmat în 3 candele, unde ar fi fost SL la 4 candele și TP 1:1, și ce - s-a întâmplat în următoarele 8 candele. Măsurabil: 20 de fișe completate. -2. **Calculează pivoții monthly pentru 6 luni în urmă** pe 5 nume BET, în - Excel, și verifică câte doji-uri au căzut la ≤ 1 % de un nivel. Scopul: - să vezi dacă Pasul 4 chiar filtrează ceva pe universul mic. -3. **Testează pe hârtie varianta TP 1:1 vs. TP1 1R + TP2 2R** pe minim 10 - semnale (punctul 2 din „Unde se contrazice materialul"). Notează în jurnal care dă rezultat mai - bun pe BVB, unde limita de 8 candele e mai strânsă. -4. **Măsoară spread-ul real** la deschidere și la 12:00 pe 5 nume BET, 5 - zile la rând. Măsurabil: un tabel cu spread-ul mediu; dacă depășește ~1 %, - scoate numele de pe listă. -5. **Rulează pe prop un singur semnal la 0,33 % risc**, cu sizing calculat - dinainte ca în Transfer. Scopul nu e profitul, ci să verifici că limita - zilnică nu se apropie nici când SL-ul e lovit. - ---- - -## Legături - -- Strategia se suprapune cu: **Buy hammer + MBT-10** (`06_buy_hammer_mbt10.md`) - — același schelet de trigger (extrema 4 candele, confirmare), iar buy - hammer-ul apare des după buy doji (`01_buy_doji_si_strategia_mici.md:50`, - `543-545`). Când amândouă sunt pe aceeași candelă, semnalul e mai puternic - (`102_24032026.txt:167-170`; Pasul 5, rândul 10). -- Se suprapune cu **MP²** (`02_mp2.md`): MP² dă *unde* (bottom-ul, crossing-ul - de pivoți), Buy Doji dă *când* (trigger-ul de candelă). Pe BVB, combinația - e soluția pentru lipsa trigger-elor fine (`09_2025-12-09.md:1184-1190`). -- Selecția simbolului: [`04_selectia.md`](04_selectia.md). -- Risc și execuție: [`A1_risc.md`](A1_risc.md). -- Contradicțiile din material, toate la un loc: - [`A2_contradictii.md`](A2_contradictii.md). +- [ ] (1) Simbol lichid; weekly-ul nu are doji contra mea. +- [ ] (2) Scădere clară înainte, nu gap-up; doji cu corp ≤ 10 %, fitile în ambele părți. +- [ ] (3) Low-ul doji-ului la cel mult 1-2 % de un suport sau pivot lunar. +- [ ] (4) Închidere peste high-ul doji-ului în maximum 3 candele. +- [ ] (5) Stop sub cel mai jos low din 4 candele; acțiuni = risc / distanță. +- [ ] (6) Ținta 1 = distanța stopului; restul pe trail; ies după 8 candele. +- [ ] Short: piață slabă, preț > 10 $, stop deasupra. --- ## Surse -[`13_strategia_3_byh.md`](../03_MODUL_2/13_strategia_3_byh.md) -(fișierul principal, S3) · -[`11_construire_scanere_sf_byd_sld.md`](../03_MODUL_2/11_construire_scanere_sf_byd_sld.md) -(scanerele; indicator proprietar) · -[`01_filtre_scaner_bull_bear_reversal_pp.md`](../04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md) -(filtre + ULTA) · -[`01_buy_doji_si_strategia_mici.md`](../08_ANALIZA_ZILNICA/01_buy_doji_si_strategia_mici.md) -(aplicarea zilnică, varianta MICI) · -[`08_executie_si_risc.md`](../08_ANALIZA_ZILNICA/08_executie_si_risc.md) -(3 poziții, sizing) · -[`28_2025-05-27.md`](../09_QA/28_2025-05-27.md) (scanere, filtre, short) · -[`22_2025-08-04.md`](../09_QA/22_2025-08-04.md) (regulile dictate) · -[`03_2026-08-11.md`](../09_QA/03_2026-08-11.md) (SL 4 candele, >65 %, weekly) · -[`18_2025-09-23.md`](../09_QA/18_2025-09-23.md) (LABU) · -[`20_2025-08-25.md`](../09_QA/20_2025-08-25.md) (retest 1/2–1/3 pe prop; stopul pe TF-ul deciziei) · -[`26_2025-06-11.md`](../09_QA/26_2025-06-11.md) (limita zilnică pe poziții deschise) · -[`23_2025-07-29.md`](../09_QA/23_2025-07-29.md) (tranșe weekly) · -[`09_2025-12-09.md`](../09_QA/09_2025-12-09.md) (pivoții pe BVB) · -[`03_timeframes_set_up.md`](../03_MODUL_2/03_timeframes_set_up.md) (pivoții pe timeframe; TF mare vs. TF mic) · -[`A3_intrarea.md`](A3_intrarea.md) (la close sau la retest). +Textul fără trimitere e explicația mea și nu adaugă reguli; ce completez eu +începe cu **Completare proprie**. Diagramele sunt exemple construite, cu +excepția LABU, unde doar procentele sunt ale cursului. -> **Notă de denumire.** Fișierul principal se numește `13_strategia_3_byh.md`, -> dar titlul lui e „Strategia 3: Buy Doji / Sell Doji (SF BYD/SLD)" -> (`13_strategia_3_byh.md:1`). „BYH" din slug nu e o strategie separată de -> „breakout" — `grep -rn -i 'byh'` prin `summaries/` găsește doar acest -> fișier. Fișele `byd_sld.md` și `byh.md` descriu aceeași strategie; capitolul -> ăsta le folosește ca o singură sursă. +**Prescurtări:** +`13` = [`13_strategia_3_byh.md`](../03_MODUL_2/13_strategia_3_byh.md) +(lecția principală; „byh" din nume nu e altă strategie, titlul e „Strategia +3: Buy Doji / Sell Doji", `13:1`) · +`11` = [`11_construire_scanere_sf_byd_sld.md`](../03_MODUL_2/11_construire_scanere_sf_byd_sld.md) · +`tf` = [`03_timeframes_set_up.md`](../03_MODUL_2/03_timeframes_set_up.md) · +`mm` = [`04_money_management_position_sizing.md`](../03_MODUL_2/04_money_management_position_sizing.md) · +`filtre` = [`01_filtre_scaner_bull_bear_reversal_pp.md`](../04_MODUL_3/01_filtre_scaner_bull_bear_reversal_pp.md) · +`mici` = [`01_buy_doji_si_strategia_mici.md`](../08_ANALIZA_ZILNICA/01_buy_doji_si_strategia_mici.md) · +`exec` = [`08_executie_si_risc.md`](../08_ANALIZA_ZILNICA/08_executie_si_risc.md) · +`crimei` = [`03_locul_crimei_si_pullback.md`](../08_ANALIZA_ZILNICA/03_locul_crimei_si_pullback.md) · +fișierele datate sunt sesiuni Q&A din `../09_QA/`; fișierele `.txt` sunt +transcrieri din `transcripts/09_Q_and_A/`. -**Ce e al meu, nu al cursului, în capitolul ăsta:** blocurile „Completare -proprie" (succesiunea pe două timeframe-uri și ce se strică pe TF mic; -stopul „la ochi"; exemplul de sizing; TP1 la intrarea în tranșe; barele de -după intrare din diagramele de ieșire), aritmetica timpului („8 candele = -…", marcată *aritmetica mea*), secțiunea Transfer întreagă, și toate -diagramele: sunt exemple construite, fără ticker, cu excepția LABU, unde -doar procentele sunt ale cursului. Mecanismul stop-urilor de deasupra -high-ului e completarea sumarizatorului lecției 13, marcată ca atare la -Pasul 6. +**Nivelul 1** — `13`: 10-12, 15-30, 38-100, 227-232 · `mici`: 146-152 · +`03_2026-08-11`: 180-218 · `28_2025-05-27`: 343-349. + +**Pasul 1** — `11`: 53-62, 70-73 · `28_2025-05-27`: 47-52, 372-380 · +`mici`: 32-40, 316-326 · `03_2026-08-11`: 220-223. + +**Pasul 2** — `13`: 185-187, 308, 315-318 · `28_2025-05-27`: 40-52, +144-149 · `mici`: 227-235. + +**Pasul 3** — `13`: 188-190 · `11`: 63-69, 99-104 · `filtre`: 36-42. + +**Pasul 4** — `13`: 102-149, 158-167, 342-350 (mecanismul, marcat +completare) · `mici`: 20-28, 136-138, 222-225, 818-821 · +`23_2025-07-29`: 208-209. + +**Pasul 5** — `13`: 192-193, 204-213 · `22_2025-08-04`: 23-29 · `mici`: +139-141, 833-836 · `18_2025-09-23`: 716-719 · `20_2025-08-25`: 9-15 · `mm`: +4-11, 28-34 · `exec`: 40-49, 619-634. + +**Pasul 6** — `13`: 194-213, 319-321, 341-350 (treimile, marcate +completare) · `mici`: 531-541. + +**Oglinda** — `13`: 227-232, 258-259 · `mici`: 312-314 (alt exemplu: doji +49.40/48.00, intrare 47.30), 338-347 · `28_2025-05-27`: 313-330, 397-402, +560-576. + +**A+** — `13`: 185-190, 214-226, 308 · `mici`: 35-37, 227-235, 338-360, +370-386, 531-536 · `11`: 106-137 · `filtre`: 44-52, 296-327 · +`18_2025-09-23`: 710-712 · `03_2026-08-11`: 180-223 · `28_2025-05-27`: 379 · +`22_2025-08-04`: 14 · `102_24032026.txt`: 167-170 · `triaj/DECIZII.md`: 47, +107-113, 118. + +**Perechile de TF** — `mici`: 32-40, 370-386, 538-559 · `tf`: 52-61, 69-79 · +`11`: 63-69, 99-104 · `20_2025-08-25`: 9-15, 172-176 · `23_2025-07-29`: +206-213 · `20_25082025.txt`: 154-156, 207-208 · `fise/m2d.md`: 68 · +`14_strategia_1_m2d.md`: 461-466 · `triaj/DECIZII.md`: 118. + +**Scanerul** — `11`: 317-324 · `28_2025-05-27`: 47-52 · `filtre`: 303-346 · +`mici`: 838-839. + +**Tranșele** — `13`: 191-195 · `mici`: 136-142, 798-814, 825-827 · +`23_2025-07-29`: 206-213 · `19_08092025.txt`: 1067-1073 · `20_2025-08-25`: +141-164, 172-180 · `20_25082025.txt`: 207-208 · `crimei`: 296-311. + +**LABU** — `18_2025-09-23`: 608-719 (nivelurile sumarizatorului: 713), +728-730 · `13`: 298-308 · `23_2025-07-29`: 202-204. + +**Transfer** — `26_2025-06-11`: 214-222 · `28_2025-05-27`: 319-330, +392-394, 566-570 · `11`: 70-73, 296-304 · `mm`: 4-11 · `20_2025-08-25`: +141-164 · `mici`: 828-832 · `09_2025-12-09`: 1177-1180. + +**Contradicțiile** — (1) `13`: 11-12 · `mici`: 146-152 · `03_2026-08-11`: +185; (2) `13`: 194-195 · `28_2025-05-27`: 130-134 · `exec`: 619-634; +(3-4) `11`: 58-62 · `13`: 315-318 · `28_2025-05-27`: 37-52, 144-149; +(5-6) `11`: 80-93, 139-209 · `filtre`: 82-183, 329-341; (7) `tf`: 69-79 · +`11`: 63-69 · `mici`: 12, 357, 370-379; (8) `13`: 191-195 · +`20_2025-08-25`: 144-145. + +**Legături** — `mici`: 50, 543-545 · `102_24032026.txt`: 167-170 · +`09_2025-12-09`: 1184-1190. diff --git a/summaries/17_STRATEGII/02_mp2.html b/summaries/17_STRATEGII/02_mp2.html index 2fda6fc..ea77f30 100644 --- a/summaries/17_STRATEGII/02_mp2.html +++ b/summaries/17_STRATEGII/02_mp2.html @@ -1432,6 +1432,6 @@ long-only. Rămâne miezul logic — doi pivoți, crossing, close peste pivotul
  • Filtrele dinainte de strategie: 04_selectia.md.
  • Risc și execuție: A1_risc.md.
  • Regula de trail și money management, integral: 03_MODUL_2/14_strategia_1_m2d.md.
  • - + diff --git a/summaries/index.html b/summaries/index.html index 29470a9..de6318f 100644 --- a/summaries/index.html +++ b/summaries/index.html @@ -32,6 +32,6 @@ -

    ATM — Sumarizări

    Modulul 1

    Catalizatori

    Modulul 2

    Modulul 3

    Modulul 4

    Analiză zilnică

    Q&A

    Analiză fundamentală

    Strategii

    +

    ATM — Sumarizări

    Modulul 1

    Catalizatori

    Modulul 2

    Modulul 3

    Modulul 4

    Analiză zilnică

    Q&A

    Analiză fundamentală

    Strategii

    diff --git a/svg_candles.py b/svg_candles.py index 081c381..b54ef56 100644 --- a/svg_candles.py +++ b/svg_candles.py @@ -89,6 +89,37 @@ class MA: _check_dash(self.dash, "MA") +@dataclass +class Zone: + """Dreptunghi de evidențiere peste candelele i0..i1, desenat în spatele lor.""" + i0: int # prima candelă acoperită + i1: int # ultima candelă acoperită (inclusiv) + text: str = "" # eticheta zonei, deasupra dreptunghiului + color: str = "#1a5fb4" + p_top: float | None = None # implicit: cel mai mare high din interval + 8 px + p_bot: float | None = None # implicit: cel mai mic low din interval + 8 px + + def __post_init__(self) -> None: + if not 0 <= self.i0 <= self.i1: + raise ValueError(f"Zone(i0={self.i0}, i1={self.i1}): astept 0 <= i0 <= i1") + + +@dataclass +class Arrow: + """Săgeată cu text spre o candelă: „aici intri / aici stopul / aici ținta".""" + i: int # candela țintită + text: str # textul săgeții; "\n" rupe rândul + price: float | None = None # implicit: high (above), low (below), close (left/right) + where: str = "above" # "above" | "below" | "left" | "right" — unde stă textul + color: str = "#1a5fb4" + dx: float = 0.0 # mută textul (și coada săgeții); vârful rămâne pe țintă + dy: float = 0.0 + + def __post_init__(self) -> None: + if self.where not in ("above", "below", "left", "right"): + raise ValueError(f"Arrow.where={self.where!r}, astept above/below/left/right") + + @dataclass class Chart: candles: list[Candle] @@ -108,6 +139,17 @@ class Chart: vol_gap: float = 26.0 # spațiu între panoul de preț și cel de volum vol_label: str = "volum" title: str = "" # ex. "SPY — daily" + zones: list[Zone] = field(default_factory=list) + arrows: list[Arrow] = field(default_factory=list) + + def __post_init__(self) -> None: + n = len(self.candles) + for z in self.zones: + if z.i1 >= n: + raise ValueError(f"Zone(i0={z.i0}, i1={z.i1}): graficul are doar {n} candele") + for a in self.arrows: + if not 0 <= a.i < n: + raise ValueError(f"Arrow(i={a.i}): graficul are doar {n} candele") def _y(self, price: float) -> float: return self.top + (self._pmax - price) * self.scale @@ -115,10 +157,80 @@ class Chart: def _cx(self, i: int) -> float: return self.left + i * self.gap + def _zone_box(self, z: Zone) -> tuple[float, float, float, float]: + cds = self.candles[z.i0:z.i1 + 1] + pad = self.body_w / 2 + 5 + y0 = self._y(z.p_top) if z.p_top is not None else self._y(max(c.h for c in cds)) - 8 + y1 = self._y(z.p_bot) if z.p_bot is not None else self._y(min(c.l for c in cds)) + 8 + return self._cx(z.i0) - pad, y0, self._cx(z.i1) + pad, y1 + + def _zone_label_y(self, z: Zone) -> float: + """Baseline-ul etichetei: deasupra zonei și a candelelor din dreptul textului.""" + x0, y0, _, _ = self._zone_box(z) + x1 = x0 + len(z.text) * 6.2 + tops = [self._y(c.h) for j, c in enumerate(self.candles) + if x0 - self.body_w / 2 < self._cx(j) < x1 + self.body_w / 2] + return min([y0] + [t - 4 for t in tops]) - 5 + + def _arrow_geom(self, a: Arrow) -> dict: + """Vârf, coadă, rânduri de text și bbox-ul textului (x0, x1, ytop, ybot).""" + LH, CW = 14, 6.2 # înălțime rând, lățime caracter bold 12px + cd, cx = self.candles[a.i], self._cx(a.i) + lines = a.text.split("\n") + tw = max(len(t) for t in lines) * CW + if a.where in ("above", "below"): + up = a.where == "above" + price = a.price if a.price is not None else (cd.h if up else cd.l) + tip = (cx, self._y(price) + (-4 if up else 4)) + # textul stă peste candelele vecine din dreptul lui: urcă/coboară + # peste cea mai extremă, altfel acoperă fitilele + near = [c for j, c in enumerate(self.candles) + if abs(self._cx(j) - cx - a.dx) < tw / 2 + self.body_w] + [cd] + if up: + ty = min(tip[1] - 26, min(self._y(c.h) for c in near) - 8) + a.dy + base = [ty - 5 - LH * k for k in range(len(lines))][::-1] + else: + ty = max(tip[1] + 26, max(self._y(c.l) for c in near) + 8) + a.dy + base = [ty + 14 + LH * k for k in range(len(lines))] + tail, tx, anchor = (cx + a.dx, ty), cx + a.dx, "middle" + x0 = tx - tw / 2 + else: + sgn = 1 if a.where == "right" else -1 + price = a.price if a.price is not None else cd.c + tip = (cx + sgn * (self.body_w / 2 + 4), self._y(price)) + tail = (tip[0] + sgn * 30 + a.dx, tip[1] + a.dy) + tx = tail[0] + sgn * 4 + base = [tail[1] + 4 - LH * (len(lines) - 1) / 2 + LH * k for k in range(len(lines))] + anchor = "start" if sgn > 0 else "end" + x0 = tx if sgn > 0 else tx - tw + return dict(tip=tip, tail=tail, tx=tx, anchor=anchor, lines=lines, base=base, + box=(x0, x0 + tw, base[0] - 11, base[-1] + 3)) + def render(self) -> str: + # _render mută top/left/width ca să facă loc titlului, trendului și + # săgeților; le restaurăm, altfel a doua randare a aceluiași Chart iese deplasată + saved = self.top, self.left, self.width + try: + return self._render() + finally: + self.top, self.left, self.width = saved + + def _render(self) -> str: prices = [p for c in self.candles for p in (c.o, c.h, c.l, c.c)] prices += [lv.price for lv in self.levels] + prices += [p for z in self.zones for p in (z.p_top, z.p_bot) if p is not None] + prices += [a.price for a in self.arrows if a.price is not None] self._pmax, pmin = max(prices), min(prices) + # textul săgeților și etichetele zonelor nu au voie să iasă din pânză: + # mută graficul în jos / la dreapta și lărgește canvasul cât e nevoie + boxes = [self._arrow_geom(a)["box"] for a in self.arrows] + boxes += [(x0, x0 + len(z.text) * 6.2, self._zone_label_y(z) - 11, y0) + for z in self.zones if z.text for x0, y0, _, _ in [self._zone_box(z)]] + if boxes: + self.top += max(0, 14 - min(b[2] for b in boxes)) + shift = max(0, 6 - min(b[0] for b in boxes)) + self.left += shift + self.width = max(self.width + int(shift), int(max(b[1] for b in boxes) + shift + 8)) if self.title: self.top += 22 # segmentul de trend iese din zona candelelor: rezervă loc pentru el, @@ -127,6 +239,10 @@ class Chart: self.top += 56 body_bottom = self.top + (self._pmax - pmin) * self.scale extra = 62 if self.trend == "up" else 0 + low = [self._arrow_geom(a)["box"][3] for a in self.arrows] + low += [self._zone_box(z)[3] for z in self.zones] + if low: + extra = max(extra, max(low) - body_bottom + 6) panel_bottom = body_bottom + extra vols = [c.vol for c in self.candles if c.vol is not None] @@ -148,6 +264,15 @@ class Chart: out.append(f'{self.title}') + # zonele primele, ca să stea în spatele nivelurilor și candelelor + for z in self.zones: + x0, y0, x1, y1 = self._zone_box(z) + out.append(f'') + if z.text: + out.append(f'{z.text}') + # nivelurile: linie pe toată lățimea, eticheta deasupra liniei for lv in self.levels: y = self._y(lv.price) @@ -234,6 +359,23 @@ class Chart: out.append(f'{mk.text}') + # săgețile: linie de la text la țintă + vârf triunghi (nu marker, ca + # să nu depindă de suportul în randare); un per rând, + # ca audit_diagrams.py să le măsoare corect + for a in self.arrows: + g = self._arrow_geom(a) + (x1, y1), (x2, y2) = g["tail"], g["tip"] + d = max(((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5, 1e-9) + ux, uy = (x2 - x1) / d, (y2 - y1) / d + bx, by = x2 - 8 * ux, y2 - 8 * uy + out.append(f'') + out.append(f'') + for t, y in zip(g["lines"], g["base"]): + out.append(f'{t}') + # detaliile ca bloc stânga-jos, câte o linie per candelă: centrate sub # candelă se suprapun între ele de îndată ce textul depășește `gap`. ny = panel_bottom + (self.label_gap if tags else 18) + 4 @@ -319,7 +461,36 @@ def selftest(): assert min(c.l for c in ser[:3]) > min(c.l for c in ser[3:5]), \ "al doilea picior ar trebui să fie mai jos" - print("selftest ok: 2R la exact 2R, serie fără goluri, volum proporțional") + # zone și săgeți: validare, text în pânză, vârful pe țintă + for bad in (lambda: Arrow(0, "x", where="up"), lambda: Zone(3, 1), + lambda: Chart(candles=ser, arrows=[Arrow(6, "x")]), + lambda: Chart(candles=ser, zones=[Zone(4, 6)])): + try: + bad() + raise AssertionError("validarea n-a prins argumente greșite") + except ValueError: + pass + ch3 = Chart(candles=ser, scale=40, gap=14, body_w=9, width=200, + zones=[Zone(1, 3, "baza")], + arrows=[Arrow(0, "intrare\npe close", where="above"), + Arrow(3, "stop", where="below"), + Arrow(5, "ținta de 2R, foarte departe", where="right")]) + svg3 = ch3.render() + vw, vh = map(float, re.search(r'viewBox="0 0 ([\d.]+) ([\d.]+)"', svg3).groups()) + assert vw > 200, "textul săgeții din dreapta iese din pânză" + for x, y in re.findall(r'" in svg3 + + print("selftest ok: 2R la exact 2R, serie fără goluri, volum proporțional, zone+săgeți") if __name__ == "__main__":