From 70f5c195741437433596f8d92b91064723e11e11 Mon Sep 17 00:00:00 2001
From: Claude Agent
Date: Fri, 2 Oct 2026 05:18:02 +0000
Subject: [PATCH] 17_STRATEGII/07_mdsrt: patru restante aplicate, doua erau
deja facute
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Raportul verificatorului e din 21.09, iar primele doua probleme fusesera
reparate intre timp in 424ecf2 - in text. Ramasesera insa in generatoare:
docstring-ul lui mdsrt_stop si comentariul STOP_BARS din mdsrt_ansamblu inca
spuneau ca N nu e dat de curs. Un capitol poate fi corect si sa-si contrazica
generatorul.
Reparate acum: tabelul A+ descria "coborare fara nivel dedesubt" pentru un
panou in care pivotul 94.00 chiar e trasat si doar nu tine; layout-ul lui
mdsrt_aplus, unde "picior 1: 94.55" era tiparita sub linia de 94.00 (deci se
citea ca ~93.5) si "close 92.00" statea la inaltimea lui 90.80; doua etichete
taiate de linii in stop si short; si retestul din glosar, 590.05 nu 590.00.
Panourile A+ sunt acum stivuite, 700 px in loc de 1080, deci textul nu se mai
scaleaza la 0,67x. Assert nou: y-ul etichetei "picior 1" trebuie sa cada la
±8 px de unde cade pretul ei fata de linia pivotului - exact regresia
raportata.
Co-Authored-By: Claude Opus 5
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
---
gen/strategii/mdsrt_ansamblu.py | 2 +-
gen/strategii/mdsrt_aplus.py | 194 +++++------
gen/strategii/mdsrt_aplus.spec.txt | 10 +-
gen/strategii/mdsrt_aplus.svg | 411 ++++++++++++------------
gen/strategii/mdsrt_short.py | 14 +-
gen/strategii/mdsrt_short.svg | 14 +-
gen/strategii/mdsrt_stop.py | 23 +-
gen/strategii/mdsrt_stop.svg | 22 +-
summaries/17_STRATEGII/07_mdsrt.html | 464 ++++++++++++++-------------
summaries/17_STRATEGII/07_mdsrt.md | 464 ++++++++++++++-------------
10 files changed, 841 insertions(+), 777 deletions(-)
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 ")]
+
+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''
-)
+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'"
# ============================================================ 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 @@
-
\ 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.10numeri 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.10numeri 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.
-
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.
Coborârea dinainte
5-10+ candele, se oprește la un nivel
-
coborâre fără nivel dedesubt
+
coborâre care nu se oprește la un nivel
Al doilea picior
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.10numeri 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 |