diff --git a/gen/strategii/mdsrt_ansamblu.py b/gen/strategii/mdsrt_ansamblu.py index 88241e4..1a3e13a 100644 --- a/gen/strategii/mdsrt_ansamblu.py +++ b/gen/strategii/mdsrt_ansamblu.py @@ -37,7 +37,7 @@ GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000" MARJA = 0.10 # stopul, sub low-ul piciorului 2 SUPORT = 590.00 # pivotul daily (nivelul de pe TF-ul mare) LEG1, TRIG, CONF = 10, 18, 19 # indicii: piciorul 1, candela-trigger, candela de intrare -STOP_BARS = 4 # low-ul se caută pe ultimele 4 candele, ca la Buy Doji +STOP_BARS = 4 # 4 candele: regula cursului (transcrierea MDSRT, linia 71) CLOSES = [ 596.00, 595.20, 595.60, 594.80, 594.10, 593.40, 593.70, 592.90, # 0-7 diff --git a/gen/strategii/mdsrt_aplus.py b/gen/strategii/mdsrt_aplus.py index 34d195a..8434cf7 100644 --- a/gen/strategii/mdsrt_aplus.py +++ b/gen/strategii/mdsrt_aplus.py @@ -3,20 +3,20 @@ Citește `gen/strategii/mdsrt_aplus.spec.txt` (marcajul ``). Același schelet (downtrend -> al doilea picior -> trigger de candelă), context opus: -- stânga (A+): downtrend ~15 candele până la pivotul monthly 94.00; piciorul 1 +- sus (A+): downtrend ~15 candele până la pivotul monthly 94.00; piciorul 1 (bara 18) face low 94.55; piciorul 2 (bara 24, Buy Hammer) coboară la 93.20, scalpând stopurile chiar sub nivel, dar închide 94.10 înapoi peste suport; bara 25 sparge high-ul trigger-ului (94.30) și închide 94.40 = intrare, SL 93.10 (sub low-ul piciorului 2), TP1 95.70 (1:1). Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. -- dreapta (NU): coborâre fără oprire la un nivel; bara 18 = primul low 94.60; - bara 25 închide 92.00, sub pivotul 94.00 ȘI sub primul low -> breakdown, - nu setup; prețul continuă spre 90.80. +- jos (NU): pivotul monthly 94.00 e trasat și aici, dar coborârea trece prin el + fără să se oprească; bara 18 = primul low 94.60; bara 25 închide 92.00, sub + pivot ȘI sub primul low -> breakdown, nu setup; prețul continuă spre 90.80. Materialul dă regulile, nu prețurile; nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu (spec, liniile 18-19). -Două `Chart`-uri randate separat și lipite într-un wrapper SVG, ca la -`buy_doji_aplus.py` — coordonatele fiecărui panou rămân corecte. +Două `Chart`-uri stivuite în aceeași pânză, ca la `mdsrt_stop.py`: panourile +alăturate dădeau 1080 px, pe care capitolul îi scala la 0,67x. Rulează: python3 gen/strategii/mdsrt_aplus.py Scrie: gen/strategii/mdsrt_aplus.svg @@ -26,7 +26,9 @@ 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, "/workspace/atm-curs-dl/gen") +from svg_candles import Arrow, Candle, Chart, Level, Mark, from_closes # noqa: E402 +from eticheta_libera import eticheta_libera # noqa: E402 OUT = Path(__file__).resolve().parent / "mdsrt_aplus.svg" @@ -138,125 +140,137 @@ print(f"NU primul low {cds_n[18].l:.2f} close 25 {cds_n[25].c:.2f} " f"(< {SUPORT:.2f} și < 94.60) vol {VOLS_N[24]} > {VOLS_N[18]}") # ============================================================ desenele celor două panouri -PW = 520 +# Panourile stau unul sub altul, nu alăturate: la 1080 px lățime capitolul le +# scala la 0,67x și textul se citea la ~8 px. Stivuite, fiecare are toți cei +# 700 px ai coloanei, deci și loc în dreapta pentru etichetele de nivel. +W, VGAP = 700, 18 SCALE = 20.0 +common: dict = dict(scale=SCALE, gap=15, body_w=8, left=150, width=W, + vol_h=60, vol_label="volum") + +# Nivelurile trade-ului (intrare / SL / TP1) pornesc de la bara 25: liniile lor +# pe toată lățimea tăiau eticheta „pivot monthly 94.00" din stânga. +# Picioarele sunt săgeți, nu Mark: un Mark „below" ar fi pus „picior 1: 94.55" +# sub linia de 94.00, adică la înălțimea lui ~93.5. ch_a = Chart( candles=cds_a, levels=[Level(SUPORT, "pivot monthly 94.00", ORANGE, label_at="left"), - Level(ENTRY, "intrare 94.40", GREEN), - Level(SL, "SL 93.10", RED), - Level(TP1, "TP1 95.70 (1:1)", BLUE, label_at="left")], - marks=[Mark(18, "picior 1: 94.55", ORANGE, "below"), - Mark(24, "picior 2: 93.20", RED, "below")], - scale=SCALE, gap=15, body_w=8, left=44, width=PW, vol_h=60, - vol_label="volum", + Level(TP1, "TP1 95.70 (1:1)", BLUE, i0=25), + Level(ENTRY, "intrare 94.40", GREEN, i0=25), + Level(SL, "SL 93.10", RED, i0=25)], + arrows=[Arrow(18, "picior 1: 94.55", price=LOW1, where="left", + color=ORANGE, dy=-3), + Arrow(24, "picior 2: 93.20", price=LOW2, where="left", color=RED)], title="A+ — al doilea picior la suport, divergență, trigger", caption="Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2.", + **common, ) ch_n = Chart( candles=cds_n, levels=[Level(SUPORT, "pivot monthly 94.00", ORANGE, label_at="left"), - Level(94.60, "primul low 94.60", GRAY), + Level(94.60, "primul low 94.60", GRAY, i0=18), + Level(92.00, "close 92.00", RED, i0=25), Level(90.80, "spre 90.80", RED, label_at="left")], - marks=[Mark(18, "primul low", ORANGE, "above", dy=-2), - Mark(25, "close 92.00 = breakdown", RED, "below", dy=12)], - scale=SCALE, gap=15, body_w=8, left=44, width=PW, vol_h=60, - vol_label="volum", + marks=[Mark(18, "primul low", ORANGE, "above", dy=-2)], title="NU — close sub pivot și sub primul low = breakdown", caption="Fără trigger: close sub pivot și sub primul low.", + **common, ) -# ============================================================ wrapper: două panouri alăturate -def inner(svg: str) -> str: - """Conținutul dintre tag-urile ale unui panou, fără elementul rădăcină.""" - return svg[svg.index(">") + 1:svg.rindex("")] + +def panou(ch, sus_de=0.0): + """Randează un panou deja deplasat cu `sus_de` px, ca la `mdsrt_stop.py`.""" + ch.top += sus_de + svg = ch.render() + h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1)) + return svg[svg.index(">") + 1:svg.rindex("")].strip(), h -def vb_height(svg: str) -> float: - m = re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg) - assert m, "nu găsesc viewBox în panoul randat" - return float(m.group(1)) +FOOTER = ["Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu —", + "materialul dă regulile, nu prețurile."] - -PANEL_GAP, PAD, TITLE_H, FOOTER_H = 24, 8, 8, 26 -svg_a, svg_n = ch_a.render(), ch_n.render() -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" - -TOTAL_W = PAD + PW + PANEL_GAP + PW + PAD -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 = ("Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite " - "ca exemplu — materialul dă regulile, nu prețurile.") - -wrapper = ( - f'' - f'{inner(svg_a)}' - f'{inner(svg_n)}' - f'{FOOTER}' - f'' -) +body_a, h_a = panou(ch_a) +body_n, h_n = panou(ch_n, h_a + VGAP) +H = h_n + 12 + 17 * len(FOOTER) +svg = "\n ".join([ + f'', + body_a, + f'', + body_n, + *(f'{t}' + for k, t in enumerate(FOOTER)), +]) + "\n" # ============================================================ verificare pe SVG-ul final -def texts(svg: str): - """Toate (x, y, text-anchor, text) din elementele ale unui fragment.""" +assert "\n\n" not in svg, "linie goală în SVG" +CW = 6.2 + + +def texts(frag: str): + """(x, y, ancoră, text) din fiecare care nu e doar un wrapper.""" out = [] - for m in re.finditer(r']*)>(.*?)', svg): - x, y, attrs, t = float(m.group(1)), float(m.group(2)), m.group(3), m.group(4) - if t.startswith("<"): + for m in re.finditer(r']*)>(.*?)', frag): + if m.group(4).startswith("<"): continue - am = re.search(r'text-anchor="(\w+)"', attrs) - out.append((x, y, am.group(1) if am else "start", t)) + am = re.search(r'text-anchor="(\w+)"', m.group(3)) + out.append((float(m.group(1)), float(m.group(2)), + am.group(1) if am else "start", m.group(4))) return out def span(x: float, anchor: str, t: str) -> tuple[float, float]: - """Intervalul orizontal aproximativ al unui text, față de ancora lui.""" - w = len(t) * 12 * 0.56 + w = len(t) * CW left = x - w if anchor == "end" else (x - w / 2 if anchor == "middle" else x) return left, left + w -assert wrapper.count("\n\n") == 0, "linie goală în SVG" +all_txt = texts(svg) +assert len(all_txt) >= 12, f"prea puține etichete: {len(all_txt)}" +for x, y, anchor, t in all_txt: + l, r = span(x, anchor, t) + assert -1 <= l and r <= W + 1, f"text iese din pânză: {t!r} ({l:.0f}..{r:.0f})" + assert 0 <= y <= H, f"text ieșit pe verticală: {t!r} ({y:.0f})" -# fiecare text (după translatarea panoului) e în întregime în interiorul pânzei -all_txt = [] -for frag, (ox, oy) in ((inner(svg_a), OFF_A), (inner(svg_n), OFF_N)): - for x, y, anchor, t in texts(frag): - gx, gy = x + ox, y + oy - gl, gr = gx + span(0, anchor, t)[0], gx + span(0, anchor, t)[1] - assert ox <= gl and gr <= ox + PW, f"text iese din panou: {t!r} ({gl:.0f}..{gr:.0f})" - assert -1 <= gl and gr <= TOTAL_W + 1, f"text ieșit pe orizontală: {t!r} ({gl:.0f}..{gr:.0f})" - assert 0 <= gy <= TOTAL_H, f"text ieșit pe verticală: {t!r} ({gy:.0f})" - all_txt.append((gx, gy, anchor, t)) -# footer-ul, în coordonate globale -fl, fr = span(TOTAL_W / 2, "middle", FOOTER) -assert -1 <= fl and fr <= TOTAL_W + 1, "footer iese din pânză" -all_txt.append((TOTAL_W / 2, TOTAL_H - PAD, "middle", FOOTER)) -assert len(all_txt) >= 8, "prea puține etichete" - -# nu se suprapun două texte pe aceeași poziție sau pe rândul apropiat -for i in range(len(all_txt)): - xi, yi, ai, si = all_txt[i] - li, ri = xi + span(0, ai, si)[0], xi + span(0, ai, si)[1] - for j in range(i + 1, len(all_txt)): - xj, yj, aj, sj = all_txt[j] - lj, rj = xj + span(0, aj, sj)[0], xj + span(0, aj, sj)[1] +# două etichete nu stau pe același rând, una peste alta +for i, (xi, yi, ai, si) in enumerate(all_txt): + li, ri = span(xi, ai, si) + for xj, yj, aj, sj in all_txt[i + 1:]: + lj, rj = span(xj, aj, sj) if abs(yi - yj) < 12 and li < rj - 4 and lj < ri - 4: raise AssertionError(f"texte suprapuse: {si!r} / {sj!r}") # etichetele cerute de spec există în desen for cheie in ("pivot monthly 94.00", "intrare 94.40", "SL 93.10", "TP1 95.70 (1:1)", - "picior 1: 94.55", "picior 2: 93.20", "primul low", - "close 92.00 = breakdown", "spre 90.80", + "picior 1: 94.55", "picior 2: 93.20", "primul low 94.60", + "primul low", "close 92.00", "spre 90.80", "A+ — al doilea picior la suport, divergență, trigger", "NU — close sub pivot și sub primul low = breakdown"): - assert cheie in wrapper, f"lipsește din desen: {cheie!r}" + assert cheie in svg, f"lipsește din desen: {cheie!r}" -OUT.write_text(wrapper, encoding="utf-8") -print(f"scris {OUT.name}: {TOTAL_W}x{TOTAL_H:.0f}, " - f"{len(all_txt)} etichete, verificare OK") +# nicio etichetă de preț peste o linie desenată sau peste un corp de candelă: +# exact defectul din 02.10.2026 („picior 1: 94.55" sub linia de 94.00, +# „close 92.00" lipită de linia lui 90.80). +eticheta_libera(svg, "aplus", {"primul low"}, rects=True) +# etichetele de săgeată stau lipite de coada propriei săgeți prin construcție, +# deci la ele se verifică doar corpurile de candelă... +eticheta_libera(svg, "aplus-sageti", {"picior 1: 94.55", "picior 2: 93.20"}, + rects=True, segmente=False) +# ...plus înălțimea, care e defectul raportat pe 02.10.2026: „picior 1: 94.55" +# era tipărită sub linia pivotului de 94.00, deci se citea ca ~93.5. +y_pivot = float(re.search(rf']*>{eticheta}<', body_a).group(1)) + asteptat = y_pivot - (pret - SUPORT) * SCALE + assert abs(y - asteptat) <= 8, (f"{eticheta!r} e la y={y:.0f}, dar prețul " + f"{pret:.2f} cade la y={asteptat:.0f}") +eticheta_libera(svg, "aplus-niveluri", + {"pivot monthly 94.00", "intrare 94.40", "SL 93.10", + "TP1 95.70 (1:1)", "primul low 94.60", "close 92.00", + "spre 90.80"}, + min_px=2.0, rects=True) # min_px=2: eticheta stă la 6 px peste + # linia ei, deci doar liniile străine + +OUT.write_text(svg, encoding="utf-8") +print(f"scris {OUT.name}: {W}x{H:.0f}, {len(all_txt)} etichete, verificare OK") diff --git a/gen/strategii/mdsrt_aplus.spec.txt b/gen/strategii/mdsrt_aplus.spec.txt index 45afaeb..f0a995b 100644 --- a/gen/strategii/mdsrt_aplus.spec.txt +++ b/gen/strategii/mdsrt_aplus.spec.txt @@ -1,10 +1,10 @@ -TIP: PRET (două panouri alăturate) +TIP: PRET (două panouri stivuite) CHEIE: aplus LOC: strategii/07_mdsrt.md, Nivel 2, §2.2 „Setup A+ vs. setup mediocru" MARCAJ .md: (înainte de tabelul din 2.2) CE ARATĂ -Două panouri cu același schelet MDSRT (downtrend → al doilea picior → trigger +Două panouri stivuite, cu același schelet MDSRT (downtrend → al doilea picior → trigger de candelă), context opus: - Panoul A+: downtrend de ~15 candele care se oprește la suportul/pivotul monthly 94.00; al doilea picior (bara 24 = Buy Hammer) coboară la 93.20 — @@ -12,7 +12,8 @@ de candelă), context opus: stopurilor; hammer-ul închide 94.10, înapoi peste suport; intrare 94.40 (bara 25 sparge high-ul trigger-ului), SL 93.10 (sub low-ul piciorului 2), TP1 95.70 (1:1). Divergență bull (lower low pe preț, higher low pe volum). -- Panoul NU: coborâre fără oprire la un nivel; „al doilea picior" închide +- Panoul NU: pivotul monthly 94.00 e trasat și aici, dar coborârea trece prin + el fără să se oprească; „al doilea picior" închide 92.00, sub pivotul 94.00 **și** sub primul low 94.60 → breakdown, nu setup; volumul face și el lower low (fără divergență); prețul continuă spre 90.80. Materialul dă **regulile**, nu prețurile; nivelurile 94.00 / 94.55 / 93.20 / @@ -90,7 +91,8 @@ Panoul NU: Ambele: 12. Fiecare open == close-ul barei anterioare. 13. Panoul A+ are 29 de candele, panoul NU are 29 de candele. -STIL: două panouri alăturate, fiecare 29 candele, gap=15, body_w=8, vol_h=60 +STIL: două panouri stivuite (nu alăturate: la 1080 px capitolul le scala la +0,67x), lățime 700, fiecare 29 candele, gap=15, body_w=8, vol_h=60 (volumul e argumentul diferenței). Titluri „A+ — al doilea picior la suport, divergență, trigger" / „NU — close sub pivot și sub primul low = breakdown". Fără linie goală în SVG. diff --git a/gen/strategii/mdsrt_aplus.svg b/gen/strategii/mdsrt_aplus.svg index 028651d..1dc4975 100644 --- a/gen/strategii/mdsrt_aplus.svg +++ b/gen/strategii/mdsrt_aplus.svg @@ -1,203 +1,210 @@ - + A+ — al doilea picior la suport, divergență, trigger - - pivot monthly 94.00 - - intrare 94.40 - - SL 93.10 - - TP1 95.70 (1:1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - picior 1: 94.55 - picior 2: 93.20 - Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. - - NU — close sub pivot și sub primul low = breakdown - - pivot monthly 94.00 - - primul low 94.60 - - spre 90.80 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - primul low - close 92.00 = breakdown - Fără trigger: close sub pivot și sub primul low. -Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — materialul dă regulile, nu prețurile. \ No newline at end of file + + pivot monthly 94.00 + + TP1 95.70 (1:1) + + intrare 94.40 + + SL 93.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + picior 1: 94.55 + + + picior 2: 93.20 + Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. + + NU — close sub pivot și sub primul low = breakdown + + pivot monthly 94.00 + + primul low 94.60 + + close 92.00 + + spre 90.80 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + primul low + Fără trigger: close sub pivot și sub primul low. + Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — + materialul dă regulile, nu prețurile. + \ No newline at end of file diff --git a/gen/strategii/mdsrt_short.py b/gen/strategii/mdsrt_short.py index ddbc175..f8f11b6 100644 --- a/gen/strategii/mdsrt_short.py +++ b/gen/strategii/mdsrt_short.py @@ -18,6 +18,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, Mark, Zone, Arrow # noqa: E402 +sys.path.insert(0, "/workspace/atm-curs-dl/gen") +from eticheta_libera import eticheta_libera # noqa: E402 from mdsrt_ansamblu import (serie, SUPORT, LEG1, TRIG, CONF, EXIT_I, # noqa: E402 ENTRY, SL, R, TP1, MARJA, STOP_BARS) @@ -73,7 +75,10 @@ ch = Chart( levels=[ Level(REZ, f"pivot daily {REZ:.2f} — zona, sus", BLUE, label_at="left"), Level(sl, f"SL {sl:.2f} = {MARJA:.2f} peste piciorul 2", RED, "4 3"), - Level(entry, f"intrare short {entry:.2f}", GREEN, "6 3"), + # eticheta coboară sub propria linie, în stânga: la dreapta, pe + # înălțimea ei, o tăia linia pivotului de 100.00 (0.20 mai sus) + Level(entry, f"intrare short {entry:.2f}", GREEN, "6 3", + label_at="left", label_dy=18), Level(tp1, f"TP1 {tp1:.2f} = 1:1", GREEN, "2 2", label_at="left"), ], marks=[Mark(ex - S, f"ieșire pe trail {cds[ex].c:.2f} = {r_exit:.2f}R", GREEN, "below")], @@ -98,5 +103,12 @@ assert "\n\n" not in svg, "linie goală în SVG" H = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1)) for x, y in re.findall(r' Oglinda pe short (serie construită prin răsturnarea exemplului long) - - pivot daily 100.00 — zona, sus - + + pivot daily 100.00 — zona, sus + SL 100.60 = 0.10 peste piciorul 2 - - intrare short 99.80 - - TP1 99.00 = 1:1 + + intrare short 99.80 + + TP1 99.00 = 1:1 diff --git a/gen/strategii/mdsrt_stop.py b/gen/strategii/mdsrt_stop.py index 2d22e50..2f65b16 100644 --- a/gen/strategii/mdsrt_stop.py +++ b/gen/strategii/mdsrt_stop.py @@ -6,9 +6,11 @@ Jos: același trade, cu o continuare construită în care prețul retestează nivelul. Stopul „la ochi", pus sub candela de intrare, e măturat de retest; stopul din regulă ține, iar trade-ul ajunge la țintă. -Cursul lasă două variante de stop (extrema ultimelor N candele sau ATR) și nu -dă valoarea lui N; N = 4 e valoarea folosită la celelalte strategii mecanice -ale cursului, iar marja de 0.10 e regula acestui capitol. +Cursul lasă două variante de stop (extrema ultimelor N candele sau ATR), iar +N = 4 e al lui: transcrierea MDSRT spune „în loc de SL-ul minim în patru +candele, se poate folosi stop loss bazat pe ATR" +(`transcripts/05_MODUL_4/02_3_STRATEGIA_5_MDSRT.txt:71`). Doar marja de 0.10 +e regula acestui capitol. Rulează: python3 gen/strategii/mdsrt_stop.py """ @@ -19,6 +21,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, "/workspace/atm-curs-dl/gen") +from eticheta_libera import eticheta_libera # noqa: E402 from mdsrt_ansamblu import (serie, SUPORT, TRIG, CONF, ENTRY, SL, R, TP1, # noqa: E402 MARJA, STOP_BARS) @@ -85,7 +89,9 @@ gata = Chart( candles=jos, levels=[Level(TP1, f"ținta 1:1: {TP1:.2f}", GREEN, "2 2", label_at="left"), Level(ENTRY, f"intrarea: {ENTRY:.2f}", GRAY, "4 3", label_at="left"), - Level(OCHI, f"stop pus la ochi: {OCHI:.2f}", ORANGE, "4 3"), + # linia „la ochi" pornește de la bara de intrare: pe toată lățimea + # tăia eticheta „stopul din regulă: 589.40" din stânga (0.25 mai jos) + Level(OCHI, f"stop pus la ochi: {OCHI:.2f}", ORANGE, "4 3", i0=cf), Level(SL, f"stopul din regulă: {SL:.2f}", RED, "4 3", label_at="left")], zones=[Zone(cf + 1, cf + 1, "", RED, p_top=OCHI, p_bot=SL)], arrows=[ @@ -105,7 +111,7 @@ 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)) - off = float(re.search(r'") + 1:svg.rindex("")].strip(), h, off @@ -134,5 +140,12 @@ svg = "\n ".join([ assert "\n\n" not in svg, "linie goală în SVG" for x, y in re.findall(r'Pasul 5 — stopul: 4 candele înapoi de la intrare, minus 0.10 numeri 4 candele înapoi, de la intrare - - pivot daily 590.00 - - stopul din regulă: 589.40 + + pivot daily 590.00 + + stopul din regulă: 589.40 @@ -45,14 +45,14 @@ Același trade, cu un retest: stopul „la ochi” e măturat, cel din regulă nu - - ținta 1:1: 591.00 - - intrarea: 590.20 - + + ținta 1:1: 591.00 + + intrarea: 590.20 + stop pus la ochi: 589.65 - - stopul din regulă: 589.40 + + stopul din regulă: 589.40 diff --git a/summaries/17_STRATEGII/07_mdsrt.html b/summaries/17_STRATEGII/07_mdsrt.html index effa1be..1c7c7a7 100644 --- a/summaries/17_STRATEGII/07_mdsrt.html +++ b/summaries/17_STRATEGII/07_mdsrt.html @@ -307,8 +307,8 @@ aceleași reguli, întoarse. Varianta asta e reconstrucția mea, nu a cursului.< sunt un pullback; dacă prețul rupe 589.50, minimul de plecare e rupt — nu mai e pullback.
  • Retest — prețul revine la un nivel pe care tocmai l-a depășit, înainte - să-și continue drumul. După intrarea la 590.20, o coborâre înapoi la 590.00 - și de acolo în sus e retestul pivotului.
  • + să-și continue drumul. După intrarea la 590.20, o coborâre înapoi până la + 590.05, în pragul pivotului de 590.00, și de acolo în sus e retestul lui.
  • 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. Aici: 589.40.
  • 1R — cât pierzi pe unitate dacă te lovește stopul. Intri la 590.20, stopul @@ -743,10 +743,10 @@ care intri, și pui stopul cu 0.10 sub el.

    Pasul 5 — stopul: 4 candele înapoi de la intrare, minus 0.10 numeri 4 candele înapoi, de la intrare - - pivot daily 590.00 - - stopul din regulă: 589.40 + + pivot daily 590.00 + + stopul din regulă: 589.40 @@ -786,14 +786,14 @@ care intri, și pui stopul cu 0.10 sub el.

    Același trade, cu un retest: stopul „la ochi” e măturat, cel din regulă nu - - ținta 1:1: 591.00 - - intrarea: 590.20 - + + ținta 1:1: 591.00 + + intrarea: 590.20 + stop pus la ochi: 589.65 - - stopul din regulă: 589.40 + + stopul din regulă: 589.40 @@ -975,14 +975,14 @@ Trail).

    Oglinda pe short (serie construită prin răsturnarea exemplului long) - - pivot daily 100.00 — zona, sus - + + pivot daily 100.00 — zona, sus + SL 100.60 = 0.10 peste piciorul 2 - - intrare short 99.80 - - TP1 99.00 = 1:1 + + intrare short 99.80 + + TP1 99.00 = 1:1 @@ -1109,221 +1109,229 @@ care nu acoperă short-ul):

    trade, cu atât e mai bun — dar materialul nu cere o poziție mai mare pentru un setup mai bun.

    -

    +

    A+ — al doilea picior la suport, divergență, trigger - - pivot monthly 94.00 - - intrare 94.40 - - SL 93.10 - - TP1 95.70 (1:1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - picior 1: 94.55 - picior 2: 93.20 - Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. - - NU — close sub pivot și sub primul low = breakdown - - pivot monthly 94.00 - - primul low 94.60 - - spre 90.80 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - primul low - close 92.00 = breakdown - Fără trigger: close sub pivot și sub primul low. -Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — materialul dă regulile, nu prețurile.

    + + pivot monthly 94.00 + + TP1 95.70 (1:1) + + intrare 94.40 + + SL 93.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + picior 1: 94.55 + + + picior 2: 93.20 + Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. + + NU — close sub pivot și sub primul low = breakdown + + pivot monthly 94.00 + + primul low 94.60 + + close 92.00 + + spre 90.80 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + primul low + Fără trigger: close sub pivot și sub primul low. + Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — + materialul dă regulile, nu prețurile. +

    Cele două panouri sunt ilustrații separate, pe alt simbol decât exemplul din pași (în jur de 94 $); nu sunt aceeași serie, de aceea primul low diferă ușor -între ele (94.55 în A+, 94.60 în „NU"). În stânga, A+: coborârea se oprește la +între ele (94.55 în A+, 94.60 în „NU"). Sus, A+: coborârea se oprește la pivotul monthly 94.00, piciorul 2 coboară la 93.20 — sub nivel și sub piciorul 1, care era la 94.55 — cu volum mai mare, iar hammer-ul se închide înapoi peste pivot; intrare 94.40, -stop 93.10, țintă 95.70. În dreapta, cazul „NU": coborâre fără oprire la -nivel, iar candela care ar fi trebuit să fie trigger închide la 92.00, sub -pivotul 94.00 și sub primul low 94.60, cu volum care face și el lower low. -Nu e setup, e breakdown.

    +stop 93.10, țintă 95.70. Jos, cazul „NU": pivotul monthly 94.00 e +trasat și acolo, dar coborârea trece prin el fără să se oprească, iar candela +care ar fi trebuit să fie trigger închide la 92.00, sub pivot și sub primul +low 94.60, cu volum care face și el lower low. Panoul cade pe primul și pe +ultimul rând al tabelului de mai jos: nu e setup, e breakdown.

    @@ -1336,7 +1344,7 @@ Nu e setup, e breakdown.

    - + diff --git a/summaries/17_STRATEGII/07_mdsrt.md b/summaries/17_STRATEGII/07_mdsrt.md index 77408fc..ceb9569 100644 --- a/summaries/17_STRATEGII/07_mdsrt.md +++ b/summaries/17_STRATEGII/07_mdsrt.md @@ -283,8 +283,8 @@ aceleași reguli, întoarse. Varianta asta e reconstrucția mea, nu a cursului. sunt un pullback; dacă prețul rupe 589.50, minimul de plecare e rupt — nu mai e pullback. - **Retest** — prețul revine la un nivel pe care tocmai l-a depășit, înainte - să-și continue drumul. După intrarea la 590.20, o coborâre înapoi la 590.00 - și de acolo în sus e retestul pivotului. + să-și continue drumul. După intrarea la 590.20, o coborâre înapoi până la + 590.05, în pragul pivotului de 590.00, și de acolo în sus e retestul lui. - **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. Aici: 589.40. - **1R** — cât pierzi pe unitate dacă te lovește stopul. Intri la 590.20, stopul @@ -755,10 +755,10 @@ care intri, și pui stopul cu 0.10 sub el.** Pasul 5 — stopul: 4 candele înapoi de la intrare, minus 0.10 numeri 4 candele înapoi, de la intrare - - pivot daily 590.00 - - stopul din regulă: 589.40 + + pivot daily 590.00 + + stopul din regulă: 589.40 @@ -798,14 +798,14 @@ care intri, și pui stopul cu 0.10 sub el.** Același trade, cu un retest: stopul „la ochi” e măturat, cel din regulă nu - - ținta 1:1: 591.00 - - intrarea: 590.20 - + + ținta 1:1: 591.00 + + intrarea: 590.20 + stop pus la ochi: 589.65 - - stopul din regulă: 589.40 + + stopul din regulă: 589.40 @@ -996,14 +996,14 @@ Trail). Oglinda pe short (serie construită prin răsturnarea exemplului long) - - pivot daily 100.00 — zona, sus - + + pivot daily 100.00 — zona, sus + SL 100.60 = 0.10 peste piciorul 2 - - intrare short 99.80 - - TP1 99.00 = 1:1 + + intrare short 99.80 + + TP1 99.00 = 1:1 @@ -1136,225 +1136,233 @@ trade, cu atât e mai bun — dar materialul nu cere o poziție mai mare pentru setup mai bun. - + A+ — al doilea picior la suport, divergență, trigger - - pivot monthly 94.00 - - intrare 94.40 - - SL 93.10 - - TP1 95.70 (1:1) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - picior 1: 94.55 - picior 2: 93.20 - Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. - - NU — close sub pivot și sub primul low = breakdown - - pivot monthly 94.00 - - primul low 94.60 - - spre 90.80 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - volum - primul low - close 92.00 = breakdown - Fără trigger: close sub pivot și sub primul low. -Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — materialul dă regulile, nu prețurile. + + pivot monthly 94.00 + + TP1 95.70 (1:1) + + intrare 94.40 + + SL 93.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + + + picior 1: 94.55 + + + picior 2: 93.20 + Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2. + + NU — close sub pivot și sub primul low = breakdown + + pivot monthly 94.00 + + primul low 94.60 + + close 92.00 + + spre 90.80 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + volum + primul low + Fără trigger: close sub pivot și sub primul low. + Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — + materialul dă regulile, nu prețurile. + Cele două panouri sunt ilustrații separate, pe alt simbol decât exemplul din pași (în jur de 94 $); nu sunt aceeași serie, de aceea primul low diferă ușor -între ele (94.55 în A+, 94.60 în „NU"). În stânga, A+: coborârea se oprește la +între ele (94.55 în A+, 94.60 în „NU"). Sus, A+: coborârea se oprește la pivotul monthly 94.00, piciorul 2 coboară la 93.20 — sub nivel și sub piciorul 1, care era la 94.55 — cu volum mai mare, iar hammer-ul se închide înapoi peste pivot; intrare 94.40, -stop 93.10, țintă 95.70. În dreapta, cazul „NU": coborâre fără oprire la -nivel, iar candela care ar fi trebuit să fie trigger închide la 92.00, sub -pivotul 94.00 **și** sub primul low 94.60, cu volum care face și el lower low. -Nu e setup, e breakdown. +stop 93.10, țintă 95.70. Jos, cazul „NU": pivotul monthly 94.00 e +trasat și acolo, dar coborârea trece prin el fără să se oprească, iar candela +care ar fi trebuit să fie trigger închide la 92.00, sub pivot **și** sub primul +low 94.60, cu volum care face și el lower low. Panoul cade pe primul și pe +ultimul rând al tabelului de mai jos: nu e setup, e breakdown. | Criteriu | A+ | Mediocru sau NU | |---|---|---| -| Coborârea dinainte | 5-10+ candele, se oprește la un nivel | coborâre fără nivel dedesubt | +| Coborârea dinainte | 5-10+ candele, se oprește la un nivel | coborâre care nu se oprește la un nivel | | Al doilea picior | mai jos, într-un pivot sau suport | mai jos, în gol | | Divergența | Power plus încă unul; Trinity, ideal | nimic, sau indicatorul face și el lower low | | Trigger | Buy Momentum / Hammer / Doji, după M complet | nicio candelă, sau close sub nivel și sub primul low |
    Coborârea dinainte 5-10+ candele, se oprește la un nivelcoborâre fără nivel dedesubtcoborâre care nu se oprește la un nivel
    Al doilea picior