From 29dc93dfad71e75f06e13729a4c2f98941e94d1b Mon Sep 17 00:00:00 2001
From: Claude Agent
Date: Fri, 2 Oct 2026 05:59:11 +0000
Subject: [PATCH] etichete: cele trei care mint, si doua bug-uri de
infrastructura
Cele trei, toate verificate pe ecran dupa reparatie: "minimul din care a
pornit miscarea 99.80" intra sub o candela si se citea "99.8" (m2d_directie);
"2 saptamani" era acoperita de caseta de citat si se citea "2 saptaman"
(atmi_orizont); cele doua stopuri de la buy_doji_stop stateau la 12 px cu
liniile incrucisate peste etichete, iar diagrama e tocmai despre diferenta
dintre ele - acum fiecare sta la capatul propriei linii.
Doua bug-uri gasite pe drum, mai grave decat ce reparam:
1. render_html trecea SVG-urile prin markdown. In mp2_pivoti_excel cele doua
asteriscuri din formulele Excel (=2*E2-C2) deveneau un pus peste
, iar parserul browserului arunca restul SVG-ului: jumatate de tabel
lipsea din pagina, fara niciun semn in .md sau in audit. Acum SVG-urile sunt
scoase din calea lui markdown si puse inapoi dupa, cu assert ca nu ramane
niciun marcaj.
2. eticheta_libera nu citea , deci la diagramele cu panouri
compara coordonate din sisteme diferite si rata suprapuneri reale. Acum
aplatizeaza translate/scale pe -uri imbricate. Prima diagrama pe care a
prins-o dupa reparatie e chiar una deja comisa, din capitolul 10.
Co-Authored-By: Claude Opus 5
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
---
gen/eticheta_libera.py | 118 ++++++++++++++++++-
gen/strategii/atmi_orizont.py | 15 ++-
gen/strategii/atmi_orizont.svg | 2 +-
gen/strategii/buy_doji_stop.py | 28 ++++-
gen/strategii/buy_doji_stop.svg | 22 ++--
gen/strategii/m2d_directie.py | 17 ++-
gen/strategii/m2d_directie.svg | 120 +++++++++----------
render_html.py | 24 +++-
summaries/17_STRATEGII/01_buy_doji.html | 78 ++++++-------
summaries/17_STRATEGII/01_buy_doji.md | 22 ++--
summaries/17_STRATEGII/03_m2d.html | 148 ++++++++++++------------
summaries/17_STRATEGII/03_m2d.md | 120 +++++++++----------
summaries/17_STRATEGII/05_atmi.html | 38 +++---
summaries/17_STRATEGII/05_atmi.md | 2 +-
svg_candles.py | 4 +-
15 files changed, 469 insertions(+), 289 deletions(-)
diff --git a/gen/eticheta_libera.py b/gen/eticheta_libera.py
index 98046e3..d11a315 100644
--- a/gen/eticheta_libera.py
+++ b/gen/eticheta_libera.py
@@ -12,6 +12,10 @@ Verificarea e opt-in, pe etichete numite: pe un grafic de candele aproape
orice text atinge ceva, iar o regulă globală ar bloca tot repo-ul.
eticheta_libera(svg, "wedge_desc", {"baza = 4.00"}, rects=True)
+
+Coordonatele se aplatizează înainte de comparație: la diagramele cu panouri
+wrapper-ul e ``, deci fără asta se comparau
+coordonate din sisteme diferite și suprapunerile reale treceau nevăzute.
"""
import re
@@ -19,15 +23,95 @@ CW = 6.2 # lățimea unui caracter bold de 11-12px
WICK = "#1a1a1a" # fitilele: desenul le traversează oricum, prin construcție
+# --- aplatizarea transformărilor -------------------------------------------
+XA = ("x", "x1", "x2", "cx")
+YA = ("y", "y1", "y2", "cy")
+WA = ("width", "rx")
+HA = ("height", "ry")
+ID = (0.0, 0.0, 1.0, 1.0)
+_ATTR = re.compile(r'([a-zA-Z][\w-]*)="(-?[\d.]+)"')
+_TAG = re.compile(r'<(/?)([a-zA-Z]+)((?:"[^"]*"|[^>"])*)>')
+
+
+def _ctm(attrs, base):
+ """Transformarea cumulată: cea de pe `` compusă peste cea moștenită."""
+ tx, ty, sx, sy = base
+ t = re.search(r'transform="([^"]*)"', attrs)
+ for fn, args in re.findall(r"(\w+)\(([^)]*)\)", t.group(1) if t else ""):
+ v = [float(a) for a in re.split(r"[,\s]+", args.strip()) if a]
+ if fn == "translate" and v:
+ tx, ty = tx + sx * v[0], ty + sy * (v[1] if len(v) > 1 else 0.0)
+ elif fn == "scale" and v:
+ sx, sy = sx * v[0], sy * (v[1] if len(v) > 1 else v[0])
+ # rotate/matrix/skew: ignorate, ca înainte — nu apar în repo, iar
+ # caseta unui text rotit n-ar fi oricum un dreptunghi drept.
+ return tx, ty, sx, sy
+
+
+def _rescrie(attrs, ctm, tag):
+ tx, ty, sx, sy = ctm
+
+ def unu(m):
+ k, v = m.group(1), float(m.group(2))
+ if k in XA:
+ v = tx + sx * v
+ elif k in YA:
+ v = ty + sy * v
+ elif k in WA:
+ v = abs(sx) * v
+ elif k in HA:
+ v = abs(sy) * v
+ else:
+ return m.group(0)
+ return f'{k}="{v:.4f}"'
+
+ out = _ATTR.sub(unu, attrs)
+ out = re.sub(r'points="([^"]+)"', lambda m: 'points="%s"' % " ".join(
+ "{:.4f},{:.4f}".format(tx + sx * float(p.split(",")[0]),
+ ty + sy * float(p.split(",")[1]))
+ for p in m.group(1).split()), out)
+ if tag == "text" and sx != 1.0:
+ out += f' data-sx="{sx:g}"' # lățimea casetei se scalează cu el
+ return out
+
+
+def _aplatizeaza(svg):
+ """Rescrie coordonatele în sistemul rădăcinii, ținând cont de ``.
+
+ ``-urile pot fi imbricate; `")].strip(), h, off
@@ -131,7 +141,7 @@ nums.append(f''
h_sus = max(h_sus, y_sub + 12)
body_jos, h_jos, off_jos = panou(gata, h_sus + VGAP)
-zx = gata._cx(cf + 3) + 10
+zx = gata._cx(cf + 4) + 10 # dupa corpul candelei 14, nu peste el
banda = (f'pe aici trece al doilea picior')
H = h_jos + 8
@@ -145,5 +155,17 @@ svg = "\n ".join([
assert "\n\n" not in svg and "Pasul 5 — stopul: numeri 4 candele înapoi de la confirmarenumeri 4 candele, începând cu confirmarea
-
- stopul: 49.20
+
+ stopul: 49.20
@@ -48,14 +48,14 @@
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
+
+ ținta 1: 51.60
+
+ intrarea: 50.40
+
+ stop pus la ochi: 49.70
+
+ stopul din regulă: 49.20
@@ -108,5 +108,5 @@
dar numai cu stopul corectmai erai în tradeBarele de după intrare și stopul la ochi sunt construite, pentru contrast.
- pe aici trece al doilea picior
+ pe aici trece al doilea picior
\ No newline at end of file
diff --git a/gen/strategii/m2d_directie.py b/gen/strategii/m2d_directie.py
index 482554f..a401fcd 100644
--- a/gen/strategii/m2d_directie.py
+++ b/gen/strategii/m2d_directie.py
@@ -20,9 +20,11 @@ sys.path.insert(0, "/workspace/atm-curs-dl")
sys.path.insert(0, str(Path(__file__).resolve().parent))
from svg_candles import Arrow, Candle, Chart, Mark # noqa: E402
import m2d_duo as duo # noqa: E402
+sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
+from eticheta_libera import eticheta_libera # noqa: E402
OUT = Path(__file__).with_suffix(".svg")
-W, SCALE, GAP, LEFT = 680, 46.0, 46, 74
+W, SCALE, GAP, LEFT = 680, 46.0, 46, 60 # LEFT 74->60: eticheta cyan din dreapta atingea corpul ultimei candele
GREEN, RED, BLUE, CYAN, GREY = "#188a3e", "#c00", "#1a5fb4", "#0891b2", "#555"
# --- aceleași candele de 15 min ca în diagrama de ansamblu -----------------
@@ -49,6 +51,9 @@ assert DA[:SIG + 2] == NU[:SIG + 2], "panourile nu pornesc din aceeași serie"
SEMNAL = BASE[SIG][3] # 100.60 — același nivel ca în diagrama de ansamblu
REF_LOW = BASE[SIG][2] # 99.80 — minimul din care a pornit mișcarea
assert BASE[SIG][3] > BASE[SIG][0], "candela de semnal nu e verde"
+# pe un rând, eticheta ajungea cu „99.80" sub corpul candelei 4 (99.30-99.85)
+# și se citea „99.8"; pe două rânduri se termină înainte de candela 2
+REF_TXT = ["minimul din care a pornit", "mișcarea 99.80"]
# DA: nicio candelă de după semnal nu se închide sub minimul de referință
assert all(b[3] > REF_LOW for b in DA[SIG + 1:]), "DA: o candelă închide sub referință"
@@ -94,14 +99,12 @@ extra_da = (duo.titlu(TITLU_DA, color=GREEN)
+ duo.zone(ch_da, SIG, 7, "zona în care ai voie long", GREEN, pad=20, lift=26)
+ duo.level(ch_da, SEMNAL, ["close-ul candelei de semnal 100.60"], CYAN, W,
below=False, at_left=False)
- + duo.level(ch_da, REF_LOW, ["minimul din care a pornit mișcarea 99.80"],
- GREY, W, below=True, dash="2 3"))
+ + duo.level(ch_da, REF_LOW, REF_TXT, GREY, W, below=True, dash="2 3"))
extra_nu = (duo.titlu(TITLU_NU, color=RED)
+ duo.zone(ch_nu, 7, 8, "setup anulat", RED, pad=20)
+ duo.level(ch_nu, SEMNAL, ["close-ul candelei de semnal 100.60"], CYAN, W,
below=False, at_left=False)
- + duo.level(ch_nu, REF_LOW, ["minimul din care a pornit mișcarea 99.80"],
- GREY, W, below=True, dash="2 3"))
+ + duo.level(ch_nu, REF_LOW, REF_TXT, GREY, W, below=True, dash="2 3"))
svg, H, n = duo.build(
[("DA", body_da, h_da, extra_da), ("NU", body_nu, h_nu, extra_nu)],
@@ -109,6 +112,10 @@ svg, H, n = duo.build(
"Pe 15 min se citește DIRECȚIA, nu intrarea. Intrarea vine de pe 3 min (pasul 3)."],
W)
duo.fara_preturi_straine(svg, [SEMNAL, REF_LOW, NU[7][3]])
+# etichetele de nivel stau lipite de linia lor prin construcție, deci pentru ele
+# contează doar corpurile candelelor (`segmente=False`)
+eticheta_libera(svg, "m2d_directie", set(REF_TXT) | {
+ "close-ul candelei de semnal 100.60"}, rects=True, segmente=False)
OUT.write_text(svg, encoding="utf-8")
print(f"scris {OUT} ({W}x{H:.0f}), {n} etichete | semnal {SEMNAL:.2f}, referință {REF_LOW:.2f} | "
f"DA: ultima închidere {DA[-1][3]:.2f} | NU: candela 7 închide {NU[7][3]:.2f}")
diff --git a/gen/strategii/m2d_directie.svg b/gen/strategii/m2d_directie.svg
index b96e4e8..8f1f38b 100644
--- a/gen/strategii/m2d_directie.svg
+++ b/gen/strategii/m2d_directie.svg
@@ -1,65 +1,65 @@
- DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- candelă roșie pe 15 min, dar close-ul
- rămâne peste 99.80: pullback, nu întoarcere
-
-
- aici cade trigger-ul de pe 3 min
+ DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ candelă roșie pe 15 min, dar close-ul
+ rămâne peste 99.80: pullback, nu întoarcere
+
+
+ aici cade trigger-ul de pe 3 min
- NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- close 99.30, sub 99.80: direcția mare
- s-a răsucit — nu mai intri long
-
-
- de aici cauți short, nu long
+ NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ close 99.30, sub 99.80: direcția mare
+ s-a răsucit — nu mai intri long
+
+
+ de aici cauți short, nu longAcelași grafic de 15 minute ca în diagrama de ansamblu; serie construită, fără ticker.Pe 15 min se citește DIRECȚIA, nu intrarea. Intrarea vine de pe 3 min (pasul 3).
diff --git a/render_html.py b/render_html.py
index d63a4e6..c402eef 100644
--- a/render_html.py
+++ b/render_html.py
@@ -146,10 +146,32 @@ def link_md_to_html(md_path: Path, body: str) -> str:
return re.sub(r'href="(?!https?:)([^":]+?)\.md(#[^"]*)?"', sub, body)
+def stash_svgs(text: str) -> tuple[str, list[str]]:
+ """Scoate ... din calea lui markdown și lasă un marcaj în loc.
+
+ Fără asta, markdown vede caracterele lui înăuntrul desenului: în
+ `mp2_pivoti_excel` cele două `*` din formulele Excel (`=2*E2-C2` …
+ `=2*E3-B3`) deveneau un `` pus peste ``, iar parserul
+ browserului arunca tot restul SVG-ului — jumătate de tabel lipsea din
+ pagină, fără niciun semn în .md sau în audit (02.10.2026).
+ """
+ pastrate: list[str] = []
+
+ def scoate(m: re.Match) -> str:
+ pastrate.append(m.group(0))
+ return f""
+
+ return re.sub(r"", scoate, text, flags=re.S), pastrate
+
+
def render_file(md_path: Path) -> tuple[Path, str]:
text = md_path.read_text(encoding="utf-8")
check_svgs(md_path, text)
- body = markdown.markdown(text, extensions=["extra", "toc"])
+ fara_svg, svgs = stash_svgs(text)
+ body = markdown.markdown(fara_svg, extensions=["extra", "toc"])
+ body = re.sub(r"(?:
+Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.25 josdoji
@@ -98,7 +98,7 @@ perioada aceea cumpărătorii și vânzătorii au fost la egalitate.
fără fitil susregula cere fitil în ambele părțiDoji = corpul e cel mult 10 % din înălțimea totală a barei (aici înălțimea e 0.85) și are fitil și sus, și jos.
-
+
Ce face strategia
@@ -113,7 +113,7 @@ 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
@@ -256,7 +256,7 @@ De aceea stopul e obligatoriu.
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),
@@ -353,7 +353,7 @@ 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 construitweekly: direcția
@@ -458,7 +458,7 @@ Un Sell Doji weekly „nu înseamnă neapărat că se va materializa", dar la
a scăzut o singură zi, până la 82.00Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: high-ul și low-ul doji-ului daily.Seria e construită: un singur caz ilustrează regula, nu o dovedește.
-
+
Diagrama e pe alt simbol decât exemplul din ceilalți pași, deci are alte
@@ -480,7 +480,7 @@ 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
@@ -565,7 +565,7 @@ astea nu ți le arată deloc.
Același doji, după un rangeACCEPTAT, semnal mai slabscannerul cu Since Bear ≥ 8 nu-l vede
-
+
Doji-ul îl verifici cu o împărțire, nu din ochi: corpul împărțit la
@@ -592,7 +592,7 @@ 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 lunari (exemplu construit)DA — doji la nivelNU — doji în aer
@@ -664,7 +664,7 @@ au motiv să apară.
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 49.25, iar
@@ -684,7 +684,7 @@ 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.25DA — confirmare la +2, în fereastră
@@ -748,7 +748,7 @@ trigger.
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,
@@ -767,12 +767,12 @@ execută ca ordine de cumpărare. De aceea mișcarea se întoarce brusc.
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 confirmarenumeri 4 candele, începând cu confirmarea
-
- stopul: 49.20
+
+ stopul: 49.20
@@ -817,14 +817,14 @@ dintre ele și pui stopul puțin sub el.
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
+
+ ținta 1: 51.60
+
+ intrarea: 50.40
+
+ stop pus la ochi: 49.70
+
+ stopul din regulă: 49.20
@@ -877,8 +877,8 @@ dintre ele și pui stopul puțin sub el.
dar numai cu stopul corectmai erai în tradeBarele de după intrare și stopul la ochi sunt construite, pentru contrast.
- pe aici trece al doilea picior
-
+ pe aici trece al doilea picior
+
Sus, candelele numerotate de la confirmare. Cel mai jos low e al doji-ului,
@@ -924,7 +924,7 @@ iar după ce e atinsă lași restul pe trailing stop.
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
@@ -1045,7 +1045,7 @@ nici stopul, ieși oricum, la close-ul celei de-a 8-a.
678
-
+
Sus, prima treime iese la 51.60. Apar două candele cu gap, care urcă linia
@@ -1075,7 +1075,7 @@ construite. Împărțirea în trei treimi e a sumarizatorului lecției; ținta
ținta e la aceeași distanță, în jos, iar linia de trail coboară.
-
+Sell Doji pe short — daily (exemplu construit)1. creșterea: 14 candele
@@ -1203,7 +1203,7 @@ construite. Împărțirea în trei treimi e a sumarizatorului lecției; ținta
trail-ul a coborât după preț (96.45);prima închidere peste el: ieși cu restul, 96.60Pe 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
@@ -1238,7 +1238,7 @@ același trade, cu atât e mai bun — dar materialul nu cere o poziție mai mar
Cele două panouri din diagramă sunt alte simboluri, cu alte prețuri (42 $ și
78 $).
-
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
@@ -1412,7 +1412,7 @@ Cele două panouri din diagramă sunt alte simboluri, cu alte prețuri (42 $ și
cade înapoi sub rezistența 78.50:semnalul a mințit
-volum slab: nimeni mare nu cumpără
+volum slab: nimeni mare nu cumpără
@@ -1496,7 +1496,7 @@ patru ori mai multe acțiuni.
daily. „MICI" e numele dat de curs variantei ținute luni de zile, pornită
dintr-un Buy Doji weekly.
-
+Aceeași regulă pe trei perechi — graficul mic e lupa pe ultimele candele mariA. weekly → daily
@@ -1774,7 +1774,7 @@ dintr-un Buy Doji weekly.
fără să rupă low-ul doji-ului daily (bifa din stânga)bifa de sub doji = 100.76, minimul care nu se rupe(șapte bare de 60 min pe zi: ședința 9:30-16:00 are 6 ore și jumătate — ultima bară a zilei e de 30 min)
-
+
@@ -1828,7 +1828,7 @@ multe doji-uri false; rata de 65-70 % nu e dată pe timeframe.
Scanerul, pe scurt
-
+Scanerul Buy Doji în TradeStationordinea filtrelor și capcanele
@@ -1887,7 +1887,7 @@ multe doji-uri false; rata de 65-70 % nu e dată pe timeframe.
→ o verifici pe grafic(pașii 2-6).Scanerul nu e undă verde.
-
+
Capcanele: intervalul indicatorului nu se aliniază singur cu TF-ul
@@ -1899,7 +1899,7 @@ Buy Doji nu apar deloc și le vezi doar cu ochiul.
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)
@@ -1964,7 +1964,7 @@ restul cu ordine limită (se execută doar la prețul dat sau mai bun) mai jos,
prețul mediu al celor trei tranșe: 50.26Paranteza 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.
-
+
Candela de confirmare are corpul între 49.90 și 50.40. O treime o cumperi la
@@ -1981,7 +1981,7 @@ prețuri calculezi ținta. Alege înainte de trade și ține-te de ea. Detalii:
Exemplul real: LABU, de la doji la +30 %
-
+LABU — daily1. setup: scădere lungă, apoi primul test al pivotului 86.00
@@ -2205,7 +2205,7 @@ prețuri calculezi ținta. Alege înainte de trade și ține-te de ea. Detalii:
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ă a 6-a bară după intrare: acolo vinzi o treime, restul merge mai departe — de asta nu vinzi tot la 1:1Procentele (stop 9 %, +30 %) sunt ale cursului; nivelurile de preț sunt puse de sumarizator.
-
+
Ce e real: doar procentele — stop de 9 %, +30 % într-o lună. Prețurile
diff --git a/summaries/17_STRATEGII/01_buy_doji.md b/summaries/17_STRATEGII/01_buy_doji.md
index eb05eda..35eaf30 100644
--- a/summaries/17_STRATEGII/01_buy_doji.md
+++ b/summaries/17_STRATEGII/01_buy_doji.md
@@ -782,8 +782,8 @@ dintre ele și pui stopul puțin sub el.**
Pasul 5 — stopul: numeri 4 candele înapoi de la confirmarenumeri 4 candele, începând cu confirmarea
-
- stopul: 49.20
+
+ stopul: 49.20
@@ -828,14 +828,14 @@ dintre ele și pui stopul puțin sub el.**
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
+
+ ținta 1: 51.60
+
+ intrarea: 50.40
+
+ stop pus la ochi: 49.70
+
+ stopul din regulă: 49.20
@@ -888,7 +888,7 @@ dintre ele și pui stopul puțin sub el.**
dar numai cu stopul corectmai erai în tradeBarele de după intrare și stopul la ochi sunt construite, pentru contrast.
- pe aici trece al doilea picior
+ pe aici trece al doilea picior
diff --git a/summaries/17_STRATEGII/03_m2d.html b/summaries/17_STRATEGII/03_m2d.html
index 55f316c..695424a 100644
--- a/summaries/17_STRATEGII/03_m2d.html
+++ b/summaries/17_STRATEGII/03_m2d.html
@@ -77,7 +77,7 @@ panoul de 15 minute: pe panoul mic e sub scara desenată, deci e marcat pe cel
mare și trimis acolo prin etichetă, nu printr-un conector. E o lupă, nu o
eroare de desen.
-
+M2D long, tot trade-ul: 15 min dă direcția, 3 min dă intrareaGraficul din dreapta nu e altă bucată de piață: e aceeași, mărită. O candelă de 15 min = 5 candele de 3 min.
@@ -187,7 +187,7 @@ eroare de desen.
pentru că 15 min e încă în Buy.Wick-urile nu contează: se citește close-ul.Serie construită, fără ticker. Risc = 100.40 − 99.90 = 0.50; TP1 la aceeași distanță în sus; ieșirea pe trail la 1.4R.
-
+
De la stânga la dreapta: pe 15 minute prețul urcă și dă semnalul de Buy
@@ -337,72 +337,72 @@ pentru pullback; pentru day trading 3×15, 5×25, 5×60 și 15×60; pentru swing
lista nu e închisă (sesiunile de întrebări adaugă 5×40 și 15×75), dar fiecare
pereche își are propria statistică, iar tu n-ai măsurat-o pe a ta.
-
- DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- candelă roșie pe 15 min, dar close-ul
- rămâne peste 99.80: pullback, nu întoarcere
-
-
- aici cade trigger-ul de pe 3 min
+
+ DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ candelă roșie pe 15 min, dar close-ul
+ rămâne peste 99.80: pullback, nu întoarcere
+
+
+ aici cade trigger-ul de pe 3 min
- NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- close 99.30, sub 99.80: direcția mare
- s-a răsucit — nu mai intri long
-
-
- de aici cauți short, nu long
+ NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ close 99.30, sub 99.80: direcția mare
+ s-a răsucit — nu mai intri long
+
+
+ de aici cauți short, nu longAcelași grafic de 15 minute ca în diagrama de ansamblu; serie construită, fără ticker.Pe 15 min se citește DIRECȚIA, nu intrarea. Intrarea vine de pe 3 min (pasul 3).
-
+
Sus, cazul bun: semnalul de Buy Momentum vine pe candela de 15 minute care se
@@ -425,7 +425,7 @@ forță, e o strategie de intrare pe reluare după pauză. Dac
bară după bară, fără nicio pauză în jos, nu ai unde să pui stopul: n-ai niciun
minim recent sub care ideea să fie moartă.
-
+DA — pullback pe 3 min, care nu rupe minimul de referințăM: pullbackminimul din care a pornit mișcarea 99.80 — sub el nu mai e pullbackcel mai jos punct al pullback-ului 99.90
@@ -496,7 +496,7 @@ minim recent sub care ideea să fie moartă.
Ambele panouri: 3 minute, serie construită, aceleași cifre ca în diagrama de ansamblu.Pullback nu înseamnă „nu mai face minim nou": înseamnă că nu rupe minimul din care a pornit mișcarea.
-
+
Sus, pullback corect: nouă bare de 3 minute care coboară de la 100.45 până la
@@ -526,7 +526,7 @@ treilea, ai altă strategie, construită din alegerile tale, cu o statistică pe
care n-o cunoaște nimeni. Iar dacă ai ratat semnalul, ai ratat trade-ul: nu
intri pe amintirea lui.
-
+DA — bara se închide peste capătaici se decide intrareacapătul pullback-ului 100.08peste el trebuie ÎNCHIS, nu doar atins
@@ -601,7 +601,7 @@ intri pe amintirea lui.
Primele 9 bare sunt identice pe ambele panouri; se schimbă doar ce urmează.Trigger-ul se citește pe bară ÎNCHISĂ, nu pe fitil — la fel se citește și ieșirea pe trail (pasul 5).
-
+
Sus: capătul pullback-ului e 100.08 și bara se închide la 100.40, peste el —
@@ -621,7 +621,7 @@ ele și pui stopul acolo. La short: cea mai înaltă.
capitolul. Materialul nu explică de ce 4 bare; o tratează ca regulă
mecanică, iar eu n-o să inventez o justificare.
-
+Metoda de bază — cele 4 bare4 bare, numărate de la trigger înapoiintrare 100.40stop 99.90 — risc 0.50 pe acțiune (0,50 %)
@@ -690,7 +690,7 @@ mecanică, iar eu n-o să inventez o justificare.
Jos: din curs sunt reale doar 517.78, ATR(10) = 2.88, 512.02 și 512.87; restul barelor sunt construite.ATR-ul dă un stop mai larg, deci un risc mai mare pe acțiune — și, la acelașirisc în dolari, mai puține acțiuni.
-
+
Sus, exemplul construit: cea mai joasă bară dintre cele 4 are minimul 99.90,
@@ -734,7 +734,7 @@ dedesubt, iar restul poziției îl ții pe trailing stop până la prima bară
low-uri. Regula standard rămâne cea de mai sus.
-
+LONG — bull trail: linia urcă, nu coboarăTP1 100.90 = 1:1intrare 100.40stop 99.90 (pasul 4)
@@ -808,7 +808,7 @@ dedesubt, iar restul poziției îl ții pe trailing stop până la prima bară
Serii construite, aceleași cifre ca în restul capitolului.Scara portocalie e linia de trail, palier cu palier.Panoul de jos e panoul de sus oglindit în jurul lui 100.00, calculat, nu desenat din ochi.
-
+
Sus, long: prima tranșă iese la 100.90. Scara portocalie e linia de trail,
@@ -834,7 +834,7 @@ ultimele 4 bare, ținta la aceeași distanță în jos, iar linia de trail coboa
în loc să urce. Diagrama de la pasul 5 arată oglinda pe serie construită; mai
jos e singurul trade short cu cifre reale din material.
-
+RIOT — 3 min (TF mare 15 min în Sell)SL 100.85 = +0.85%
@@ -968,7 +968,7 @@ jos e singurul trade short cu cifre reale din material.
bear trail
-
+
Riot, TF mare 15 minute, TF mic 3 minute. Graficul de 15 minute intră în
diff --git a/summaries/17_STRATEGII/03_m2d.md b/summaries/17_STRATEGII/03_m2d.md
index 00b7d07..eb54298 100644
--- a/summaries/17_STRATEGII/03_m2d.md
+++ b/summaries/17_STRATEGII/03_m2d.md
@@ -324,67 +324,67 @@ pereche își are propria statistică, iar tu n-ai măsurat-o pe a ta.
- DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- candelă roșie pe 15 min, dar close-ul
- rămâne peste 99.80: pullback, nu întoarcere
-
-
- aici cade trigger-ul de pe 3 min
+ DA — 15 min e încă în Buy când vine trigger-ul de pe 3 minzona în care ai voie longclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ candelă roșie pe 15 min, dar close-ul
+ rămâne peste 99.80: pullback, nu întoarcere
+
+
+ aici cade trigger-ul de pe 3 min
- NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornit mișcarea 99.80
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Buy Momentum pe 15 min:
- de aici ai voie doar long
-
-
- close 99.30, sub 99.80: direcția mare
- s-a răsucit — nu mai intri long
-
-
- de aici cauți short, nu long
+ NU — 15 min s-a închis Sell: setup-ul long e anulatsetup anulatclose-ul candelei de semnal 100.60minimul din care a pornitmișcarea 99.80
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Buy Momentum pe 15 min:
+ de aici ai voie doar long
+
+
+ close 99.30, sub 99.80: direcția mare
+ s-a răsucit — nu mai intri long
+
+
+ de aici cauți short, nu longAcelași grafic de 15 minute ca în diagrama de ansamblu; serie construită, fără ticker.Pe 15 min se citește DIRECȚIA, nu intrarea. Intrarea vine de pe 3 min (pasul 3).
diff --git a/summaries/17_STRATEGII/05_atmi.html b/summaries/17_STRATEGII/05_atmi.html
index aac559b..5ed2424 100644
--- a/summaries/17_STRATEGII/05_atmi.html
+++ b/summaries/17_STRATEGII/05_atmi.html
@@ -83,7 +83,7 @@ nu pui stop, și vinzi toată poziția când ai +10 %. Banii st
la următoarea ocazie, unde intră înapoi integral, plus o contribuție nouă.
Tot trade-ul, pe structura exemplului din curs:
-
+zona PPQ 95.80 — aici cumperifără stop-loss standard — nicio linie sub intrareSPY — daily: corecție ≥4 % → zona PPQ → BIM + verde → intrare → TP +10 %
@@ -197,7 +197,7 @@ la următoarea ocazie, unde intră înapoi integral, plus o contribuție nouă.<
ieși cu tot100.00 / 96.00 / 105.60 sunt cifrele exemplului din curs; PPQ 95.80 e calculatîn diagrama pasului 1 (cursul nu dă valorile pivoților).
-
+
De la stânga la dreapta: prețul urcă până la un maxim de 100.00, cade 4,0 %
@@ -318,7 +318,7 @@ prag de volum sau de preț pentru ATMI; singura grijă de lichiditate apare mai
târziu, la ETF-urile cu levier.
Nivelurile se calculează o dată la trei luni și rămân fixe pe tot trimestrul.
-
+SPY — daily: pivoții trimestrului nou, calculați din trimestrul precedenttrimestrul precedent
@@ -442,7 +442,7 @@ târziu, la ETF-urile cu levier.
swing high 100.00corecție 4,0 % — prețul intră în zona PPQ: treci la pasul 2Completare proprie: PPQ/SQ calculate din serie; cursul dă regula, nu valorile. Formula standard, confirmată în material.
-
+
Din trimestrul precedent iei maximul 100.80, minimul 90.40 și
@@ -466,7 +466,7 @@ chiar e mare. Pragul e al cursului și e dur: în material există cazul unei
corecții de 3,93 % (graficul lecției scrie 3,9 %) care nu se
marchează, oricât de abruptă pare linia.
-
+SPY — daily: aceeași corecție, 4.0 % (DA) vs. 3.9 % (NU)
@@ -584,7 +584,7 @@ marchează, oricât de abruptă pare linia.
zona PPQ 95.80 — aici cumpericalea DA (candelele)calea NU (continuă în jos)
-
+
Ambele trasee pornesc din același swing high, 100.00. Calea desenată cu
@@ -607,7 +607,7 @@ cobori pe graficul zilnic ca să vezi unde s-a oprit.
oprit: o singură candelă înghite o săptămână întreagă. De asta pasul ăsta are
două panouri.
-
+Nivelul trăiește pe weekly, declanșatorul pe dailyFiecare candelă weekly din casetă = 5 bare daily (o săptămână de bursă):
@@ -694,7 +694,7 @@ două panouri.
BIM: aici se oprește vânzarea(fundul e la 0,26 % de PPQ)Pe weekly nu vezi unde s-a oprit căderea; pe daily, da — de aceea intri de aici.
-
+
În stânga, săptămânalul: swing high-ul 100.00, scăderea de 4,0 % și cele
@@ -720,7 +720,7 @@ vânzarea s-a terminat. BIM e ce adaugă informația care lipsește — momentul
care presiunea de vânzare se oprește — iar candela verde de după el e dovada
că cineva chiar cumpără.
-
+zona de decizie: BIM + verdePPQ 95.80 — pivotul trimestrialDA — BIM, apoi prima candelă verde daily
@@ -781,7 +781,7 @@ că cineva chiar cumpără.
Aceleași patru bare de corecție pe ambele panouri, aceeași scară.PPQ 95.80 e calculat în diagrama pasului 1; intrarea 96.00 e close-ul candelei verzi.
-
+
Ambele panouri pornesc din exact aceleași patru bare de corecție. Sus, cazul
@@ -808,7 +808,7 @@ indicelui. Un stop ar transforma o teză de un an într-o ieșire pe zgomot de
două săptămâni.
Prețul îl plătești în drum:
-
+SPY — daily: fără stop, între intrare și țintă treci prin toată căderea24 de bare sub prețul de intrare, fără niciun ordin care să te scoată — ăsta e costul regulii „fără stop-loss".
@@ -933,7 +933,7 @@ două săptămâni.
abia aici ești pe zeroTPCifra de 20-30 % pe poziție fără levier e a cursului; Completare proprie: traseul barelor, ca să se vadă cât durează.
-
+
Același trade: intrare 96.00, țintă 105.60. Între ele, poziția coboară
@@ -971,7 +971,7 @@ ajung la +10 % cam în aceeași perioadă. Autorul le compară cu mai multe
depozite cu scadențe diferite.
Partea care produce rezultatul nu e ținta, e ce faci cu banii după:
-
+Ciclul ATMI: ieși cu tot la +10 %, stai în cash, reintri cu tot plus contribuțiaContribuție 600 $ la fiecare trigger valid; ținta +10 % pe poziție.
@@ -1008,7 +1008,7 @@ depozite cu scadențe diferite.
Ai pus în total 1.800 $, în trei contribuții egale.Cu reinvestire integrală: 2.184,60 $ · dacă lași profitul deoparte: 1.980 $ · diferența: 204,60 $Completare proprie: cifrele astea sunt calculate pe trei cicluri, nu backtest-ul cursului.
-
+
Trei cicluri, cu aceeași contribuție de 600 $ la fiecare semnal valid. Cu
@@ -1128,7 +1128,7 @@ vezi 00_harta.md.
Singurul trade cu cifre din curs: intrare pe 27 ianuarie 2005 la 117.43,
țintă +10 % = 129.17, atinsă „aproximativ un an mai târziu".
-
+SPY — monthly: intrare ianuarie 2005 la 117.43 → TP1 +10 % = 129.17intrare 117.43
@@ -1238,7 +1238,7 @@ vezi 00_harta.md.
după TP: capital + profit → cash până la următorul trigger validTP1: 13 candele lunare în desen; materialul spune „aproximativ un an" (ziua exactă e neclară în transcriere)Grafic lunar, ca să încapă orizontul poziției. Completare proprie: swing high-ul; restul e din material.
-
+
Graficul e lunar, ca să încapă tot orizontul poziției: o candelă e o lună.
@@ -1264,7 +1264,7 @@ ATMI ca investiție pe luni-ani, cu ținta atinsă după circa un an. O sesiune
întrebări descrie aceeași strategie ca swing de două săptămâni, ca mijloc
de a te califica pe un cont de prop.
-
+Cât ții poziția? Două descrieri, același nume
@@ -1296,7 +1296,7 @@ de a te califica pe un cont de prop.
-2 săptămâni
+2 săptămâni„aștepți o corecție și intri pe ATMI la suport quarterly,swing, 2 săptămâni în poziție”
@@ -1310,7 +1310,7 @@ de a te califica pe un cont de prop.
Notă: cele două descrieri nu se rezolvă aici — de clarificat cu autorul.Fără axe de preț și fără să alegem una dintre variante.Bara de 2 săptămâni e scurtă exact pentru că atât ține, pe aceeași scară.
-
+
Cele două descrieri, pe aceeași axă de timp. Nu le rezolv aici: varianta de
diff --git a/summaries/17_STRATEGII/05_atmi.md b/summaries/17_STRATEGII/05_atmi.md
index 671f69b..33f6437 100644
--- a/summaries/17_STRATEGII/05_atmi.md
+++ b/summaries/17_STRATEGII/05_atmi.md
@@ -1270,7 +1270,7 @@ de a te califica pe un cont de prop.
-2 săptămâni
+2 săptămâni„aștepți o corecție și intri pe ATMI la suport quarterly,swing, 2 săptămâni în poziție”
diff --git a/svg_candles.py b/svg_candles.py
index 0c6af16..5d4faf1 100644
--- a/svg_candles.py
+++ b/svg_candles.py
@@ -77,6 +77,8 @@ class Mark:
color: str = "#1a5fb4"
where: str = "above" # "above" | "below" — față de candelă
dy: float = 0.0 # ajustare fină, dacă se suprapune cu altceva
+ dx: float = 0.0 # idem, pe orizontală: la serii dese, singurul
+ # loc liber e lateral, nu mai sus (02.10.2026)
@dataclass
@@ -361,7 +363,7 @@ class Chart:
# etichete ancorate pe candele anume
for mk in self.marks:
cd = self.candles[mk.i]
- cx = self._cx(mk.i)
+ cx = self._cx(mk.i) + mk.dx
if mk.where == "above":
y = self._y(cd.h) - 10 + mk.dy
else: