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; ``-urile imbricate rămân sisteme + separate, ca până acum (scanarea se face oricum panou cu panou). + """ + if "transform=" not in svg: + return svg + taieturi, stiva = [], [ID] + for m in _TAG.finditer(svg): + inchis, tag, attrs = m.group(1), m.group(2).lower(), m.group(3) + gol = attrs.rstrip().endswith("/") + if tag == "g": + if inchis: + if len(stiva) > 1: + stiva.pop() + elif not gol: + stiva.append(_ctm(attrs, stiva[-1])) + continue + if inchis or stiva[-1] == ID: + continue + taieturi.append((m.start(3), m.end(3), _rescrie(attrs, stiva[-1], tag))) + for a, b, nou in reversed(taieturi): + svg = svg[:a] + nou + svg[b:] + return svg + + def _bbox(m, min_px): """Caseta etichetei, lărgită cu marginea cerută.""" tx, ty, attrs, s = float(m.group(1)), float(m.group(2)), m.group(3), m.group(4) - w = CW * len(s) + k = float(re.search(r'data-sx="([\d.]+)"', attrs).group(1)) if "data-sx=" in attrs else 1.0 + w = CW * len(s) * k # fara text-anchor, SVG aliniaza la stanga (start), nu centrat. Presupunerea # ca e centrat dadea alarme false pe etichetele de Level cu label_at="left", # care se deseneaza fara anchor. x0 = tx - w if 'anchor="end"' in attrs else tx if 'anchor="middle"' not in attrs else tx - w / 2 - return s, (x0 - min_px, x0 + w + min_px, ty - 9 - min_px, ty + 3 + min_px) + return s, (x0 - min_px, x0 + w + min_px, ty - 9 * k - min_px, ty + 3 * k + min_px) def _segmente(svg): @@ -60,6 +144,7 @@ def eticheta_libera(svg, name, etichete, min_px=5.0, rects=False, segmente=True) `segmente=False` pentru etichetele de nivel: alea stau lipite de linia lor prin construcție (y − 6), deci doar candelele sunt o suprapunere reală. """ + svg = _aplatizeaza(svg) segs = list(_segmente(svg)) if segmente else [] boxes = [] if rects: @@ -99,6 +184,35 @@ def demo(): else: raise AssertionError(f"'{et}' trebuia prinsa") eticheta_libera(svg, "demo", {"libera"}, rects=True) + + # --- transformări: un panou mutat cu ------ + # 1. etichetă și linie în ACELAȘI (imbricat), suprapuse: trebuie prinsă. + # 2. etichetă și linie în -uri DIFERITE, care s-ar suprapune în + # coordonate brute (ambele pe y≈50) dar nu în cele finale. + mutat = ('' + '' + 'in panoul mutat' + 'sus' + '' + '') + try: + eticheta_libera(mutat, "demo", {"in panoul mutat"}) + except AssertionError: + pass + else: + raise AssertionError("'in panoul mutat' trebuia prinsa (translate ignorat?)") + eticheta_libera(mutat, "demo", {"sus"}) # 250px mai jos decat linia ei + + # scale: o candela de 20x40 scalata x2 ajunge sub eticheta de la y=620 + scalat = ('' + '' + 'pe candela scalata') + try: + eticheta_libera(scalat, "demo", {"pe candela scalata"}, rects=True) + except AssertionError: + pass + else: + raise AssertionError("'pe candela scalata' trebuia prinsa") print("eticheta_libera: ok") diff --git a/gen/strategii/atmi_orizont.py b/gen/strategii/atmi_orizont.py index c93eca0..f77b15b 100644 --- a/gen/strategii/atmi_orizont.py +++ b/gen/strategii/atmi_orizont.py @@ -20,9 +20,13 @@ Barele sunt pe o axă comună 0 → 1 an, ca diferența să fie vizibilă; bara Rulare: python3 gen/strategii/atmi_orizont.py -> gen/strategii/atmi_orizont.svg """ import re +import sys from pathlib import Path from xml.sax.saxutils import escape +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, H = 700, 670 @@ -114,7 +118,9 @@ def build(): p.append(line(AX_X0 + LEN_PROP, 290, AX_X0 + LEN_PROP, 360, ORANGE, 1.2, "4 3")) p.append(line(AX_X0 + LEN_PROP, BAR_PROP_Y + BAR_H / 2, CARD_X, BAR_PROP_Y + BAR_H / 2, ORANGE, 1.0, "3 3")) - p.append(txt(AX_X0 + 30, 312, "2 săptămâni", 11, "700", ORANGE, "start")) + # sub bară, nu lângă ea: la y=312 ultimele litere intrau sub marginea din + # stânga a cardului (CARD_X=160) și se citea „2 săptămân" + p.append(txt(AX_X0 + 12, 368, "2 săptămâni", 11, "700", ORANGE, "start")) p.append(f'') @@ -221,6 +227,13 @@ def verify(svg): assert not re.search(r"\.(md|txt):\d", svg), \ "eticheta SVG nu are voie să conțină trimitere fișier:linie" + # 6c. etichetele cu cifre nu stau sub niciun dreptunghi desenat (cardul de + # citat a mâncat odată „i"-ul din „2 săptămâni"). Fundalul paginii se scoate: + # e un dreptunghi cât toată pânza, altfel iese sub orice etichetă. + eticheta_libera(re.sub(r'', "", svg), "atmi_orizont", + {"2 săptămâni", "TP1 atins — aproximativ un an mai târziu"}, + rects=True, segmente=False) + # 7. fără cifre de preț inventate for interzis in ("$", "USD", "SL ", "intrare "): assert interzis not in svg, f"nu ar trebui să apară preț: {interzis!r}" diff --git a/gen/strategii/atmi_orizont.svg b/gen/strategii/atmi_orizont.svg index 33b172c..6658c2d 100644 --- a/gen/strategii/atmi_orizont.svg +++ b/gen/strategii/atmi_orizont.svg @@ -30,7 +30,7 @@ -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/gen/strategii/buy_doji_stop.py b/gen/strategii/buy_doji_stop.py index be48ec1..05a4313 100644 --- a/gen/strategii/buy_doji_stop.py +++ b/gen/strategii/buy_doji_stop.py @@ -17,6 +17,8 @@ from pathlib import Path 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 +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) +from eticheta_libera import eticheta_libera # noqa: E402 from buy_doji_ansamblu import serie, DOJI, CONF, DOJI_L, ENTRY, SL, TP1, R # noqa: E402 OUT = Path(__file__).with_suffix(".svg") @@ -84,7 +86,11 @@ 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"), + # linia „la ochi" pornește de la bara de intrare, iar eticheta ei + # stă în dreapta: pe toată lățimea, în stânga, cele două stopuri + # cădeau la 12 px unul sub altul și linia portocalie trecea prin + # eticheta celui din regulă — nu puteai atribui liniile + Level(OCHI, "stop pus la ochi: 49.70", ORANGE, "4 3", i0=cf), 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ă @@ -111,7 +117,11 @@ def panou(ch, sus_de=0.0): 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 @@ -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 confirmare numeri 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 corect mai erai în trade Barele 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 long Acelaș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"(?:

\s*)?(?:\s*

)?", + lambda m: svgs[int(m.group(1))], body) + assert " -

+ Ce e un doji și ce nu — aceeași bară, 50.10 sus și 49.25 jos doji @@ -98,7 +98,7 @@ perioada aceea cumpărătorii și vânzătorii au fost la egalitate.

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.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 construit weekly: 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.00 Liniile albastre punctate sunt aceleași niveluri pe ambele panouri: high-ul și low-ul doji-ului daily. Seria e construită: un singur caz ilustrează regula, nu o dovedește. -

+

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 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 @@ -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 nivel NU — 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.25 DA — 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 confirmare numeri 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 corect mai erai în trade Barele 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.

6 7 8 -

+

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.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 @@ -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 mari A. 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 TradeStation ordinea 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.26 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. -

    +

    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 — daily 1. 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:1 Procentele (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 confirmare numeri 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 corect mai erai în trade Barele 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ă intrarea Graficul 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 long Acelaș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 long Acelaș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 cumperi fără stop-loss standard — nicio linie sub intrare SPY — 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 tot 100.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 precedent trimestrul precedent @@ -442,7 +442,7 @@ târziu, la ETF-urile cu levier.

    swing high 100.00 corecție 4,0 % — prețul intră în zona PPQ: treci la pasul 2 Completare 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 cumperi calea 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 daily Fiecare 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 trimestrial DA — 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ăderea 24 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 zero TP Cifra 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ția Contribuț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.17 intrare 117.43 @@ -1238,7 +1238,7 @@ vezi 00_harta.md.

    după TP: capital + profit → cash până la următorul trigger valid TP1: 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: