diff --git a/gen/strategii/mp2_ansamblu.py b/gen/strategii/mp2_ansamblu.py
index aca5334..7820894 100644
--- a/gen/strategii/mp2_ansamblu.py
+++ b/gen/strategii/mp2_ansamblu.py
@@ -1,139 +1,72 @@
-"""Diagrama de ansamblu MP² — bottom major NVDA (strategii/02_mp2.md, Nivel 0).
+"""MP² — tot trade-ul pe o singură diagramă (Nivelul 1 din `02_mp2.md`).
-„NVDA — weekly (pre-split 1:10)": downtrend masiv → bază/bottom oct. 2022 →
-crossing-ul pivotului weekly (mic) peste cel monthly (mare) → candela de
-trigger care închide peste pivotul mic (M+A) → intrare 13.80 → SL la swing
-low-ul absolut 10.63 (−23 %) → urcare spre TP 17.25 (+25 %, ~9 săptămâni).
+Aceeași serie ca restul capitolului (`mp2_serie.py`): 5 ședințe de câte 7
+bare de 60 de minute. Pe desen: pivotul weekly (mare) ca linie orizontală,
+pivotul daily (mic) ca linie în trepte care se recalculează în fiecare zi,
+crossing-ul, bara de trigger, stopul, TP1 și ieșirea pe trail.
-Cifrele (13.80 / 10.63 / 17.25 / −23 % / +25 %) sunt din
-`summaries/04_MODUL_3/04_strategia_2_mp_patrat.md:341-357,435`.
-Traseul de preț și cele două linii de pivot sunt schematice: cursul nu dă
-valorile pivoților, doar faptul că micul trece deasupra marelui la crossing
-(`...:326-335`).
-
-Rulează:
- python3 gen/strategii/mp2_ansamblu.py
-Scrie lângă el `mp2_ansamblu.svg`.
+Rulare: python3 gen/strategii/mp2_ansamblu.py
"""
import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
-from svg_candles import Chart, Level, Mark, from_closes # noqa: E402
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Arrow, Chart, Level, Zone # noqa: E402
+import mp2_serie as S # noqa: E402
-OUT = Path(__file__).resolve().parent / "mp2_ansamblu.svg"
+OUT = Path(__file__).with_suffix(".svg")
+GREEN, RED, BLUE, GRAY, ORANGE = "#188a3e", "#c00", "#1a5fb4", "#777", "#b06000"
+W = 720
-GRAY, RED, GREEN, BLUE = "#777", "#c00", "#188a3e", "#1a5fb4"
+zi4a, zi4b = S.ZI4 * S.BARE_ZI, (S.ZI4 + 1) * S.BARE_ZI - 1
-# ------------------------------------------------------------------ seria (38 bare)
-# 16 bare de downtrend 32.00 -> 11.40 (minimul absolut 10.63 e fitilul barei 15),
-# 10 bare de bază/recuperare 11.80 -> 13.80 (bara 25 = intrarea, după M+A),
-# 12 bare de urcare 14.10 -> 17.25 (ținta). open-ul = close-ul precedentului.
-DOWN = [32.00, 30.80, 29.60, 28.70, 27.40, 26.50, 25.30, 24.20, 23.60,
- 22.30, 21.10, 19.90, 18.50, 16.90, 15.20, 11.40] # 0-15
-BASE = [11.80, 12.10, 12.35, 12.20, 12.55, 12.85, 13.05, 13.35, 13.55,
- 13.80] # 16-25
-UP = [14.10, 14.45, 14.80, 15.10, 15.45, 15.80, 16.10, 15.90, 16.30,
- 16.60, 16.95, 17.25] # 26-37
-CLOSES = DOWN + BASE + UP
-assert len(CLOSES) == 38, len(CLOSES)
-
-CAPIT, ENTRY, LAST = 15, 25, 37
-
-# fitile (sus, jos) per bară; bara 15 are fitilul de jos până la minimul absolut
-WICKS = ([(0.35, 0.35)] * 14
- + [(0.30, 0.30)] # 14
- + [(0.20, 0.77)] # 15: low = 11.40 - 0.77 = 10.63
- + [(0.30, 0.30)] * 9 # 16-24
- + [(0.25, 0.20)] # 25: candela de intrare
- + [(0.30, 0.30)] * 12) # 26-37
-assert len(WICKS) == len(CLOSES)
-
-VOLS = ([52, 55, 50, 58, 54, 49, 56, 52, 60, 57, 63, 68, 72, 80, 90, 120] # 0-15
- + [100, 72, 60, 55, 58, 62, 66, 70, 78, 95] # 16-25
- + [88, 80, 74, 70, 68, 72, 76, 70, 74, 78, 84, 92]) # 26-37
-assert len(VOLS) == len(CLOSES)
-
-cds = from_closes(CLOSES, wicks=WICKS, vols=VOLS, start=32.60)
-
-# ------------------------------------------------- liniile de pivot (trepte)
-# Stepped, schematice (cursul nu dă valorile): monthly „mare" se recalculează
-# rar, weekly „mic" mai des. Crossing: micul trece deasupra marelui exact pe
-# candela de intrare.
-PMARE = [31.00] * 10 + [21.00] * 10 + [13.55] * 8 + [13.20] * 10 # monthly
-PMIC = ([30.50] * 5 + [29.00] * 5 + [20.00] * 4 + [17.00] * 4
- + [12.60] * 3 + [12.95] * 2 + [13.20] * 2 + [13.70] * 3
- + [14.20] * 4 + [14.60] * 6) # weekly
-assert len(PMARE) == len(PMIC) == len(CLOSES)
-
-# ---------------------------------------------------------- assert-urile din spec
-entry = cds[ENTRY].c
-sl, tp = 10.63, cds[LAST].c
-
-assert abs(entry - 13.80) < 0.05 # close-ul intrării == 13.80
-assert abs(sl - 10.63) < 0.05 and sl < entry # SL = swing low absolut, sub entry
-assert abs(tp - 17.25) < 0.10 and tp > entry # TP = 17.25, peste entry
-# spec: `abs((entry/sl - 1)*100 - 23)`; formula din spec e inversată (dă +29.8,
-# nu −23). Pierderea corectă din entry până la SL e (sl/entry - 1), deci o scriu așa:
-loss_pct = (sl / entry - 1) * 100
-assert abs(loss_pct + 23) < 1.5, loss_pct # SL ≈ −23 %
-assert abs((tp / entry - 1) * 100 - 25) < 1.5 # TP ≈ +25 %
-assert abs(min(c.l for c in cds) - 10.63) < 0.01 # minimul absolut al seriei = SL
-assert min(c.l for c in cds[-5:-1]) > 10.63 # stopul de 4 bare ar fi mult mai sus
-# crossing-ul pivoților, înainte/după candela de intrare
-assert all(PMIC[i] < PMARE[i] for i in range(ENTRY - 4, ENTRY)), "mic < mare înainte de intrare"
-assert all(PMIC[i] > PMARE[i] for i in range(ENTRY, ENTRY + 4)), "mic > mare după intrare"
-assert cds[ENTRY].c > PMIC[ENTRY], "candela de trigger nu închide peste pivotul mic"
-assert abs(cds[CAPIT].l - sl) < 1e-9, "fitilul barei 15 nu atinge exact SL-ul"
-
-levels = [
- Level(13.80, "entry ~13.80 (după M+A)", GREEN, label_at="left"),
- Level(sl, "SL swing low absolut 10.63, −23%", RED, label_at="left"),
- Level(tp, "TP ~+25% (17.25), ~9 săpt.", BLUE, label_at="left"),
-]
-marks = [
- Mark(CAPIT, f"minim absolut {sl:.2f}", RED, "below", dy=-6),
- Mark(ENTRY, "M+A", BLUE, "above"),
-]
-
-ch = Chart(candles=cds, levels=levels, marks=marks,
- scale=17.0, gap=15, body_w=9, left=44, width=720, top=64, vol_h=70,
- vol_label="volum", title="NVDA — weekly (pre-split 1:10)",
- caption="Bottom oct. 2022: entry ~13.80, −23%, ~+25% în ~9 săpt. "
- "Traseu și pivoți construiți (cursul nu dă valorile lor).")
+ch = Chart(
+ candles=S.CDS,
+ levels=[Level(S.TP1, f"TP1 {S.TP1:.2f} — poziția 1", GREEN, "2 3", "left"),
+ Level(S.ENTRY, f"intrarea {S.ENTRY:.2f}", "#333", "4 3", "left"),
+ Level(S.SL, f"stopul {S.SL:.2f}", RED, "6 3", "left"),
+ Level(S.PPW, f"pivot weekly (mare) {S.PPW:.2f}", GRAY, "8 4", "right")],
+ zones=[Zone(zi4a, zi4b, "ziua a 4-a: pivotul mic e deja peste cel mare", BLUE)],
+ arrows=[
+ Arrow(S.TRIGGER, f"aici intri: {S.ENTRY:.2f}\nprima bară care ÎNCHIDE\npeste pivotul mic",
+ where="above", color=GREEN, dx=-118, dy=-6),
+ Arrow(22, f"stopul: {S.SL:.2f}\nminimul ultimelor {S.BARE_STOP} bare —\n"
+ f"sub el, cumpărătorii nu mai au controlul",
+ where="below", price=S.SL, color=RED, dx=126, dy=4),
+ Arrow(S.I_TP1, f"poziția 1 iese la {S.TP1:.2f}:\nexact cât ai riscat (1:1)",
+ where="right", price=S.TP1, color=GREEN, dx=78, dy=-40),
+ Arrow(S.IESIRE, f"poziția 2 iese la {S.IES_PRET:.2f},\nprima închidere sub trail",
+ where="right", color=ORANGE, dy=44),
+ ],
+ scale=17.0, gap=15, body_w=9, left=52, width=W, top=40, vol_h=64,
+ vol_label="volum", title="Exemplu construit — bare de 60 de minute, 5 ședințe",
+ caption=f"Crossing: pivotul mic urcă de la {S.PPD[S.ZI4 - 1]:.2f} la {S.PPD[S.ZI4]:.2f}, "
+ f"peste cel mare ({S.PPW:.2f}) — de-abia de acolo cauți trigger-ul.")
svg = ch.render()
-
-
-def step_points(vals: list[float]) -> str:
- """Polilinie în trepte: orizontal pe fiecare palier, vertical la schimbare."""
- pts: list[tuple[float, float]] = []
- for i, v in enumerate(vals):
- x, y = ch._cx(i), ch._y(v)
- if i == 0:
- pts.append((x, y))
- elif v != vals[i - 1]:
- pts.append((x, ch._y(vals[i - 1]))) # orizontal până la bara nouă
- pts.append((x, y)) # salt vertical la nivelul nou
- else:
- pts.append((x, y))
- return " ".join(f"{x:.1f},{y:.1f}" for x, y in pts)
-
-
-# injectate imediat după tag-ul de deschidere => desenate în spatele candelelor
+off = S.offset(svg, ch)
+y_ppd = ch._y(S.PPD[-1]) + off
inject = [
- f'',
- f'',
- f''
- f'pivot weekly (mic)',
- f''
- f'pivot monthly (mare)',
+ f'',
+ f''
+ f'pivot daily (mic)',
]
-i = svg.index(">") + 1
-svg = svg[:i] + "\n " + "\n ".join(inject) + svg[i:]
+# marcajul crossing-ului: treapta verticală a pivotului mic, între ziua 3 și 4
+xc = ch._cx(zi4a) - 7.5
+y_de, y_la = ch._y(S.PPD[S.ZI4 - 1]) + off, ch._y(S.PPD[S.ZI4]) + off
+inject += [
+ f'',
+ f'crossing',
+]
+svg = S.injecteaza(svg, inject)
-assert svg.count("\n\n") == 0, "linie goală în SVG rupe blocul din markdown"
-OUT.write_text(svg)
-print(f"scris {OUT.name}: {len(cds)} candele, entry {entry:.2f}, "
- f"SL {sl:.2f} ({loss_pct:+.1f}%), TP {tp:.2f} "
- f"({(tp/entry - 1) * 100:+.1f}%), crossing la bara {ENTRY}")
+assert y_de > y_la, "crossing-ul nu urcă pe desen"
+assert abs((ch._y(S.SL) - ch._y(S.ENTRY)) - (ch._y(S.ENTRY) - ch._y(S.TP1))) < 0.01, \
+ "1R în sus nu e desenat cât 1R în jos"
+h = float(svg.split('viewBox="0 0 ')[1].split('"')[0].split()[1])
+w = float(svg.split('viewBox="0 0 ')[1].split()[0])
+S.scrie(OUT, svg, w, h)
diff --git a/gen/strategii/mp2_ansamblu.svg b/gen/strategii/mp2_ansamblu.svg
index e602d3d..52c528d 100644
--- a/gen/strategii/mp2_ansamblu.svg
+++ b/gen/strategii/mp2_ansamblu.svg
@@ -1,132 +1,143 @@
-
\ No newline at end of file
+Legendă: ce separă cele două sunt nivelurile independente dedesubte (suport quarterly + double bottom + neckline),nu un filtru pus în scaner. Panoul din dreapta e exemplu construit, nu date reale.Cifrele A+ sunt din material; trimiterile stau în fișa de surse a capitolului.
\ No newline at end of file
diff --git a/gen/strategii/mp2_bottom.py b/gen/strategii/mp2_bottom.py
new file mode 100644
index 0000000..4fc61a9
--- /dev/null
+++ b/gen/strategii/mp2_bottom.py
@@ -0,0 +1,142 @@
+"""MP² la un bottom major — NVDA (strategii/02_mp2.md, Nivelul 3).
+
+Excepția de la regula stopului: la un bottom/top major stopul nu se
+măsoară pe 4 candele, ci la swing low-ul absolut al mișcării.
+
+„NVDA — weekly (pre-split 1:10)": downtrend masiv → bază/bottom oct. 2022 →
+crossing-ul pivotului weekly (mic) peste cel monthly (mare) → candela de
+trigger care închide peste pivotul mic (M+A) → intrare 13.80 → SL la swing
+low-ul absolut 10.63 (−23 %) → urcare spre TP 17.25 (+25 %, ~9 săptămâni).
+
+Cifrele (13.80 / 10.63 / 17.25 / −23 % / +25 %) sunt din
+`summaries/04_MODUL_3/04_strategia_2_mp_patrat.md:341-357,435`.
+Traseul de preț și cele două linii de pivot sunt schematice: cursul nu dă
+valorile pivoților, doar faptul că micul trece deasupra marelui la crossing
+(`...:326-335`).
+
+Rulează:
+ python3 gen/strategii/mp2_bottom.py
+Scrie lângă el `mp2_bottom.svg`.
+"""
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+from svg_candles import Chart, Level, Mark, from_closes # noqa: E402
+
+OUT = Path(__file__).resolve().parent / "mp2_bottom.svg"
+
+GRAY, RED, GREEN, BLUE = "#777", "#c00", "#188a3e", "#1a5fb4"
+
+# ------------------------------------------------------------------ seria (38 bare)
+# 16 bare de downtrend 32.00 -> 11.40 (minimul absolut 10.63 e fitilul barei 15),
+# 10 bare de bază/recuperare 11.80 -> 13.80 (bara 25 = intrarea, după M+A),
+# 12 bare de urcare 14.10 -> 17.25 (ținta). open-ul = close-ul precedentului.
+DOWN = [32.00, 30.80, 29.60, 28.70, 27.40, 26.50, 25.30, 24.20, 23.60,
+ 22.30, 21.10, 19.90, 18.50, 16.90, 15.20, 11.40] # 0-15
+BASE = [11.80, 12.10, 12.35, 12.20, 12.55, 12.85, 13.05, 13.35, 13.55,
+ 13.80] # 16-25
+UP = [14.10, 14.45, 14.80, 15.10, 15.45, 15.80, 16.10, 15.90, 16.30,
+ 16.60, 16.95, 17.25] # 26-37
+CLOSES = DOWN + BASE + UP
+assert len(CLOSES) == 38, len(CLOSES)
+
+CAPIT, ENTRY, LAST = 15, 25, 37
+
+# fitile (sus, jos) per bară; bara 15 are fitilul de jos până la minimul absolut
+WICKS = ([(0.35, 0.35)] * 14
+ + [(0.30, 0.30)] # 14
+ + [(0.20, 0.77)] # 15: low = 11.40 - 0.77 = 10.63
+ + [(0.30, 0.30)] * 9 # 16-24
+ + [(0.25, 0.20)] # 25: candela de intrare
+ + [(0.30, 0.30)] * 12) # 26-37
+assert len(WICKS) == len(CLOSES)
+
+VOLS = ([52, 55, 50, 58, 54, 49, 56, 52, 60, 57, 63, 68, 72, 80, 90, 120] # 0-15
+ + [100, 72, 60, 55, 58, 62, 66, 70, 78, 95] # 16-25
+ + [88, 80, 74, 70, 68, 72, 76, 70, 74, 78, 84, 92]) # 26-37
+assert len(VOLS) == len(CLOSES)
+
+cds = from_closes(CLOSES, wicks=WICKS, vols=VOLS, start=32.60)
+
+# ------------------------------------------------- liniile de pivot (trepte)
+# Stepped, schematice (cursul nu dă valorile): monthly „mare" se recalculează
+# rar, weekly „mic" mai des. Crossing: micul trece deasupra marelui exact pe
+# candela de intrare.
+PMARE = [31.00] * 10 + [21.00] * 10 + [13.55] * 8 + [13.20] * 10 # monthly
+PMIC = ([30.50] * 5 + [29.00] * 5 + [20.00] * 4 + [17.00] * 4
+ + [12.60] * 3 + [12.95] * 2 + [13.20] * 2 + [13.70] * 3
+ + [14.20] * 4 + [14.60] * 6) # weekly
+assert len(PMARE) == len(PMIC) == len(CLOSES)
+
+# ---------------------------------------------------------- assert-urile din spec
+entry = cds[ENTRY].c
+sl, tp = 10.63, cds[LAST].c
+
+assert abs(entry - 13.80) < 0.05 # close-ul intrării == 13.80
+assert abs(sl - 10.63) < 0.05 and sl < entry # SL = swing low absolut, sub entry
+assert abs(tp - 17.25) < 0.10 and tp > entry # TP = 17.25, peste entry
+# spec: `abs((entry/sl - 1)*100 - 23)`; formula din spec e inversată (dă +29.8,
+# nu −23). Pierderea corectă din entry până la SL e (sl/entry - 1), deci o scriu așa:
+loss_pct = (sl / entry - 1) * 100
+assert abs(loss_pct + 23) < 1.5, loss_pct # SL ≈ −23 %
+assert abs((tp / entry - 1) * 100 - 25) < 1.5 # TP ≈ +25 %
+assert abs(min(c.l for c in cds) - 10.63) < 0.01 # minimul absolut al seriei = SL
+assert min(c.l for c in cds[-5:-1]) > 10.63 # stopul de 4 bare ar fi mult mai sus
+# crossing-ul pivoților, înainte/după candela de intrare
+assert all(PMIC[i] < PMARE[i] for i in range(ENTRY - 4, ENTRY)), "mic < mare înainte de intrare"
+assert all(PMIC[i] > PMARE[i] for i in range(ENTRY, ENTRY + 4)), "mic > mare după intrare"
+assert cds[ENTRY].c > PMIC[ENTRY], "candela de trigger nu închide peste pivotul mic"
+assert abs(cds[CAPIT].l - sl) < 1e-9, "fitilul barei 15 nu atinge exact SL-ul"
+
+levels = [
+ Level(13.80, "entry ~13.80 (după M+A)", GREEN, label_at="left"),
+ Level(sl, "SL swing low absolut 10.63, −23%", RED, label_at="left"),
+ Level(tp, "TP ~+25% (17.25), ~9 săpt.", BLUE, label_at="left"),
+]
+marks = [
+ Mark(CAPIT, f"minim absolut {sl:.2f}", RED, "below", dy=-6),
+ Mark(ENTRY, "M+A", BLUE, "above"),
+]
+
+ch = Chart(candles=cds, levels=levels, marks=marks,
+ scale=17.0, gap=15, body_w=9, left=44, width=720, top=64, vol_h=70,
+ vol_label="volum", title="NVDA — weekly (pre-split 1:10)",
+ caption="Bottom oct. 2022: entry ~13.80, −23%, ~+25% în ~9 săpt. "
+ "Traseu și pivoți construiți (cursul nu dă valorile lor).")
+
+svg = ch.render()
+
+
+def step_points(vals: list[float]) -> str:
+ """Polilinie în trepte: orizontal pe fiecare palier, vertical la schimbare."""
+ pts: list[tuple[float, float]] = []
+ for i, v in enumerate(vals):
+ x, y = ch._cx(i), ch._y(v)
+ if i == 0:
+ pts.append((x, y))
+ elif v != vals[i - 1]:
+ pts.append((x, ch._y(vals[i - 1]))) # orizontal până la bara nouă
+ pts.append((x, y)) # salt vertical la nivelul nou
+ else:
+ pts.append((x, y))
+ return " ".join(f"{x:.1f},{y:.1f}" for x, y in pts)
+
+
+# injectate imediat după tag-ul de deschidere => desenate în spatele candelelor
+inject = [
+ f'',
+ f'',
+ f''
+ f'pivot weekly (mic)',
+ f''
+ f'pivot monthly (mare)',
+]
+i = svg.index(">") + 1
+svg = svg[:i] + "\n " + "\n ".join(inject) + svg[i:]
+
+assert svg.count("\n\n") == 0, "linie goală în SVG rupe blocul din markdown"
+OUT.write_text(svg)
+print(f"scris {OUT.name}: {len(cds)} candele, entry {entry:.2f}, "
+ f"SL {sl:.2f} ({loss_pct:+.1f}%), TP {tp:.2f} "
+ f"({(tp/entry - 1) * 100:+.1f}%), crossing la bara {ENTRY}")
diff --git a/gen/strategii/mp2_bottom.svg b/gen/strategii/mp2_bottom.svg
new file mode 100644
index 0000000..22245f3
--- /dev/null
+++ b/gen/strategii/mp2_bottom.svg
@@ -0,0 +1,132 @@
+
+
+
+ pivot weekly (mic)
+ pivot monthly (mare)
+ NVDA — weekly (pre-split 1:10)
+
+ entry ~13.80 (după M+A)
+
+ SL swing low absolut 10.63, −23%
+
+ TP ~+25% (17.25), ~9 săpt.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ volum
+ minim absolut 10.63
+ M+A
+ Bottom oct. 2022: entry ~13.80, −23%, ~+25% în ~9 săpt. Traseu și pivoți construiți (cursul nu dă valorile lor).
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_crossing.svg b/gen/strategii/mp2_crossing.svg
index 8ccd8cd..7506a78 100644
--- a/gen/strategii/mp2_crossing.svg
+++ b/gen/strategii/mp2_crossing.svg
@@ -1,13 +1,13 @@
-
- pivot daily (cel MIC)
+
+ pivot daily (cel MIC)DA — crossing (+2)pivot weekly (cel MARE) 62.00
-
- crossing: 61.70 → 62.20
- intrare: trigger
+
+ crossing: 61.70 → 62.20
+ intrare: trigger
@@ -54,8 +54,8 @@
-
- pivot daily (cel MIC)
+
+ pivot daily (cel MIC)NU — continuare/buy the dip (+1)pivot weekly (cel MARE) 62.00
diff --git a/gen/strategii/mp2_iesire.py b/gen/strategii/mp2_iesire.py
new file mode 100644
index 0000000..9d8e636
--- /dev/null
+++ b/gen/strategii/mp2_iesire.py
@@ -0,0 +1,70 @@
+"""MP² — ieșirea în două poziții (Pasul 6 din `02_mp2.md`).
+
+Aceeași serie, de la bara dinaintea trigger-ului încolo. Poziția 1 iese la
+TP1 (1:1). Poziția 2 nu are țintă fixă: merge pe bull trail — low-ul
+fiecărei bare care face un maxim nou — și iese la prima ÎNCHIDERE sub linie.
+Între timp, când prețul a făcut 60 % din drumul spre TP1, stopul amândurora
+urcă la break-even, adică la prețul de intrare.
+
+Rulare: python3 gen/strategii/mp2_iesire.py
+"""
+import re
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Arrow, Chart, Level # noqa: E402
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
+W, A = 720, 21
+
+cds = S.CDS[A:]
+# linia de trail contează pentru poziția 2, adică de la TP1 încolo
+trail = [v if i + A >= S.I_TP1 else None for i, v in enumerate(S.TRAIL[A:])]
+i_tp1, i_be, i_out, i_tr = S.I_TP1 - A, S.I_BE - A, S.IESIRE - A, S.TRIGGER - A
+R_OUT = round((S.IES_PRET - S.ENTRY) / S.R, 2)
+
+assert trail[i_out] is not None and cds[i_out].c < trail[i_out]
+assert cds[i_be].h >= S.BE and cds[i_be - 1].h < S.BE, "BE atins în altă bară"
+assert S.IES_PRET > S.TP1 > S.BE > S.ENTRY
+
+ch = Chart(
+ candles=cds,
+ levels=[Level(S.TP1, f"TP1 {S.TP1:.2f} = intrarea + 1R", GREEN, "2 3", "left"),
+ Level(S.BE, f"{S.BE:.2f} = 60 % din drum", ORANGE, "1 3", "left"),
+ Level(S.ENTRY, f"intrarea {S.ENTRY:.2f}", "#333", "4 3", "left"),
+ Level(S.SL, f"stopul inițial {S.SL:.2f}", RED, "6 3", "right")],
+ arrows=[
+ Arrow(i_tp1, f"poziția 1 (jumătate) iese la {S.TP1:.2f}\nexact cât riscai: 1:1, "
+ f"fără discuție",
+ where="above", price=S.TP1, color=GREEN, dx=-110, dy=-8),
+ Arrow(i_out, f"poziția 2 iese la {S.IES_PRET:.2f}\nprima ÎNCHIDERE sub linia de trail "
+ f"({trail[i_out]:.2f}),\nnu primul fitil care o atinge = +{R_OUT:.2f}R",
+ where="below", color=ORANGE, dx=-74, dy=34),
+ ],
+ scale=17.0, gap=32, body_w=15, left=58, width=W, top=40,
+ title="Pasul 6 — o jumătate la țintă fixă, cealaltă pe trail",
+ caption="Linia portocalie = bull trail: low-ul ultimei bare cu maxim nou. "
+ f"Rezultat: +1R pe o jumătate, +{R_OUT:.2f}R pe cealaltă.")
+
+svg = ch.render()
+off = S.offset(svg, ch)
+inject = [
+ f'',
+]
+# bara la care stopul urcă la break-even
+x = ch._cx(i_be)
+inject.append(f'')
+inject.append(f'stopul urcă la break-even')
+svg = S.injecteaza(svg, inject)
+
+h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
+w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
+S.scrie(OUT, svg, w, h)
diff --git a/gen/strategii/mp2_iesire.svg b/gen/strategii/mp2_iesire.svg
new file mode 100644
index 0000000..5b734d3
--- /dev/null
+++ b/gen/strategii/mp2_iesire.svg
@@ -0,0 +1,52 @@
+
+
+
+ stopul urcă la break-even
+ Pasul 6 — o jumătate la țintă fixă, cealaltă pe trail
+
+ TP1 598.00 = intrarea + 1R
+
+ 595.60 = 60 % din drum
+
+ intrarea 592.00
+
+ stopul inițial 586.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ poziția 1 (jumătate) iese la 598.00
+ exact cât riscai: 1:1, fără discuție
+
+
+ poziția 2 iese la 599.80
+ prima ÎNCHIDERE sub linia de trail (600.75),
+ nu primul fitil care o atinge = +1.30R
+ Linia portocalie = bull trail: low-ul ultimei bare cu maxim nou. Rezultat: +1R pe o jumătate, +1.30R pe cealaltă.
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_perechi_tf.py b/gen/strategii/mp2_perechi_tf.py
new file mode 100644
index 0000000..e815d8a
--- /dev/null
+++ b/gen/strategii/mp2_perechi_tf.py
@@ -0,0 +1,302 @@
+#!/usr/bin/env python3
+"""MP² — perechea de timeframe-uri, cu lupă (Pasul 1 din `02_mp2.md`).
+
+Stânga: graficul daily, unde trăiesc cei doi pivoți și unde se vede
+crossing-ul. Dreapta: graficul de 60 de minute, unde intri.
+
+Graficul din dreapta NU e o serie care vine după cel din stânga: e
+**descompunerea reală** a ultimelor două candele daily. O ședință = 7 bare
+de 60 de minute (9:30-16:00 înseamnă 6 ore și jumătate, deci ultima bară a
+zilei e de 30 de minute), cu același open, același close, același maxim și
+același minim — verificat bară cu bară prin assert. Sursa de adevăr e seria
+fină din `mp2_serie.py`; candelele daily se calculează din ea prin agregare.
+
+Caseta punctată de pe panoul mare arată exact ce bucată e mărită; ghidajele
+îi leagă colțurile de cadrul mic; cele două linii de pivot sunt trasate pe
+ambele panouri, cu același număr de ambele părți, iar conectorul subțire
+leagă cele două înălțimi ale aceluiași preț. Nu se pot alinia: scările au
+pante diferite, e o lupă, nu o eroare.
+
+Rulare: python3 gen/strategii/mp2_perechi_tf.py
+"""
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+W, PLOT_H = 720, 190
+GREEN, RED, GRAY, INK, BLUE, ORANGE = "#188a3e", "#c00", "#888", "#333", "#1a5fb4", "#b06000"
+LINK = "#aaa"
+BX0, BGAP = 96, 22 # panoul daily
+SX0, SGAP = 374, 15 # panoul de 60 min
+BODY_W = 9
+FRAME_L = SX0 - 9
+COL_X = 586
+MIDX = FRAME_L - 20 # granița stânga/dreapta pentru verificări
+PAD = 0.06 # aer sus/jos pe panoul mic
+TOP = 86
+
+# --- zilele dinaintea ferestrei fine, ca daily (open = close precedent) -------
+DOWN_C = [634.00, 626.00, 629.00, 618.00, 610.00, 612.00, 598.00, 585.00]
+DOWN_W = 2.5
+ZI_FINA = 2 # câte ședințe sunt desfăcute în panoul mic
+
+
+def daily_din_closes(closes, start, w):
+ out, o = [], start
+ for c in closes:
+ out.append((o, max(o, c) + w, min(o, c) - w, c))
+ o = c
+ return out
+
+
+A_FIN, B_FIN = (S.ZI4 + 1 - ZI_FINA) * S.BARE_ZI, (S.ZI4 + 1) * S.BARE_ZI
+zile = S.zilnice(S.CDS)
+fine = [(c.o, c.h, c.l, c.c) for c in S.CDS[A_FIN:B_FIN]]
+zoom = [(z.o, z.h, z.l, z.c) for z in zile[S.ZI4 + 1 - ZI_FINA:S.ZI4 + 1]]
+base = (daily_din_closes(DOWN_C, 640.00, DOWN_W)
+ + [(z.o, z.h, z.l, z.c) for z in zile[:S.ZI4 + 1 - ZI_FINA]])
+big = base + zoom
+PPD_ZI = [None] * len(DOWN_C) + S.PPD[:S.ZI4 + 1] # pivotul mic, pe candele daily
+PPD_FIN = S.PPD_BARA[A_FIN:B_FIN]
+N_BASE = len(base)
+
+# --- ce afirmă desenul, verificat pe serii ------------------------------------
+for nume, bars in (("daily", big), ("60 min", fine)):
+ for i, (o, h, l, c) in enumerate(bars):
+ assert h >= max(o, c) and l <= min(o, c), f"{nume}[{i}] h/l incoerent"
+ if i:
+ assert abs(o - bars[i - 1][3]) < 1e-9, f"{nume}[{i}] open != close precedent"
+assert len(fine) == S.BARE_ZI * ZI_FINA
+# 1. descompunerea e reală: fiecare candelă daily mărită = 7 bare de 60 min
+for j, (o, h, l, c) in enumerate(zoom):
+ part = fine[j * S.BARE_ZI:(j + 1) * S.BARE_ZI]
+ assert (o, c) == (part[0][0], part[-1][3])
+ assert h == max(b[1] for b in part) and l == min(b[2] for b in part)
+# 2. lupa se leagă de restul graficului mare
+assert abs(fine[0][0] - base[-1][3]) < 1e-9, "open-ul primei bare fine != close-ul ultimei daily"
+# 3. trigger-ul cade în a doua candelă daily mărită, nu în prima
+I_TRIG = S.TRIGGER - A_FIN
+assert I_TRIG // S.BARE_ZI == 1, "trigger-ul nu cade în ultima candelă daily"
+assert PPD_FIN[I_TRIG] == S.PPD[S.ZI4] > S.PPW > PPD_FIN[0], "crossing-ul nu e în fereastră"
+# 4. trade-ul pe TF-ul mic
+ENTRY, SL, R, TP1 = S.ENTRY, S.SL, S.R, S.TP1
+assert SL == min(b[2] for b in fine[I_TRIG - S.BARE_STOP + 1:I_TRIG + 1])
+PCT = R / ENTRY * 100
+# 5. același setup, dacă ai fi intrat pe daily: alt trigger, alt stop
+B_ENTRY = big[-1][3] # close-ul candelei daily de trigger
+B_SL = min(b[2] for b in big[-S.BARE_STOP:]) # low-ul ultimelor 4 candele daily
+B_R = round(B_ENTRY - B_SL, 2)
+B_PCT = B_R / B_ENTRY * 100
+assert B_SL == S.SWING_LOW == 580.00 and B_R == 18.20, (B_SL, B_R)
+RAPORT = B_PCT / PCT
+assert 2.9 <= RAPORT <= 3.1, f"raportul stopurilor e {RAPORT:.2f}"
+# 6. cadrul mic cuprinde și pivotul mare, ca nivelul comun să aibă unde sta
+ZLO, ZHI = min(b[2] for b in fine), max(b[1] for b in fine)
+assert ZLO == min(b[2] for b in zoom) and ZHI == max(b[1] for b in zoom)
+assert S.PPW < ZLO, "pivotul mare e în interiorul barelor mici; verifică scara"
+
+lo_, hi_ = min(ZLO, S.PPW), ZHI
+pad = PAD * (hi_ - lo_)
+LO, HI = lo_ - pad, hi_ + pad
+
+bmax = max(b[1] for b in big)
+bmin = min(min(b[2] for b in big), B_SL, LO)
+bs, ss = PLOT_H / (bmax - bmin), PLOT_H / (HI - LO)
+assert ss / bs > 2.5, f"lupa mărește de doar {ss / bs:.1f} ori"
+
+
+def yb(p):
+ return TOP + (bmax - p) * bs
+
+
+def ys(p):
+ return TOP + (HI - p) * ss
+
+
+# --- desen --------------------------------------------------------------------
+out, LABELS = [], []
+
+
+def text(x, y, s, fill=INK, anchor="start", bold=False, size=12):
+ st = [f"font-size:{size}px"] + (["font-weight:bold"] if bold else [])
+ a = f' text-anchor="{anchor}"' if anchor != "start" else ""
+ w = len(s) * (5.7 if size >= 12 else size * 0.5)
+ x0 = x if anchor == "start" else (x - w / 2 if anchor == "middle" else x - w)
+ assert 4 <= x0 and x0 + w <= W - 4, f"text iese din pânză: {s!r} ({x0:.0f}..{x0 + w:.0f})"
+ LABELS.append((x0, x0 + w, y, s))
+ out.append(f'{s}')
+
+
+def hline(x1, x2, y, color, dash, width=1.5):
+ out.append(f'')
+
+
+def line(x1, y1, x2, y2, color, dash="", width=1.2, marker=""):
+ d = f' stroke-dasharray="{dash}"' if dash else ""
+ mk = f' marker-end="url(#{marker})"' if marker else ""
+ out.append(f'')
+
+
+def rect(x0, y0, x1, y1, color, fill_op=0.10, dash=""):
+ d = f' stroke-dasharray="{dash}"' if dash else ""
+ out.append(f'')
+
+
+def candles(bars, x0, gap, yf):
+ for i, (o, h, l, c) in enumerate(bars):
+ cx = x0 + i * gap
+ line(cx, yf(h), cx, yf(l), "#1a1a1a", width=1.2)
+ top_ = yf(max(o, c))
+ out.append(f'= o else RED}"/>')
+
+
+def trepte(vals, x0, gap, yf):
+ pts = []
+ for i, v in enumerate(vals):
+ if v is None:
+ continue
+ x, y = x0 + i * gap, yf(v)
+ if pts and vals[i - 1] is not None and v != vals[i - 1]:
+ pts.append((x, yf(vals[i - 1])))
+ pts.append((x, y))
+ return " ".join(f"{x:.1f},{y:.1f}" for x, y in pts)
+
+
+def bracket(x, ya, yb_, color, label, side="right", below=False):
+ tip = x + 5 if side == "right" else x - 5
+ out.append(f'')
+ if below:
+ text((x + tip) / 2, max(ya, yb_) + 14, label, fill=color, anchor="middle", bold=True, size=11)
+ else:
+ text(tip + 4, (ya + yb_) / 2 + 4, label, fill=color, bold=True, size=11)
+
+
+def stack(items, x_line):
+ y_prev = None
+ for y, lines, fill in sorted(items, key=lambda t: t[0]):
+ y_lab = y if y_prev is None or y >= y_prev + 15 else y_prev + 15
+ out.append(f'')
+ for j, s in enumerate(lines):
+ text(COL_X, y_lab + j * 13, s, fill=fill, size=10)
+ y_prev = y_lab + (len(lines) - 1) * 13
+
+
+out.append('')
+text(20, 22, "Pasul 1 — perechea de timeframe-uri: pivoții stau pe daily, intrarea se face pe 60 min",
+ bold=True, size=13)
+text(20, 40, "Graficul din dreapta e aceeași bucată de piață, mărită: fiecare candelă daily din "
+ "caseta punctată", fill="#555", size=11)
+text(20, 54, f"e desfăcută în {S.BARE_ZI} bare de 60 de minute (ședința are 6 ore și jumătate, "
+ f"deci ultima bară a zilei e de 30 min).", fill="#555", size=11)
+text(20, TOP - 8, "daily: direcția", fill="#555", size=11)
+text(FRAME_L, TOP - 8, f"60 min: ultimele {ZI_FINA} candele daily, desfăcute", fill="#555", size=11)
+
+# ---- panoul daily ------------------------------------------------------------
+lx0, lx1 = BX0 + N_BASE * BGAP - 9, BX0 + (len(big) - 1) * BGAP + 10
+ly0, ly1 = yb(HI), yb(LO)
+rect(lx0, ly0, lx1, ly1, BLUE, fill_op=0.06, dash="4 3")
+hline(BX0 - 18, lx1, yb(S.PPW), GRAY, "8 4")
+out.append(f'')
+candles(big, BX0, BGAP, yb)
+text(BX0 - 8, yb(S.PPW) + 14, f"pivot weekly (mare) {S.PPW:.2f}", fill="#666", size=11)
+text(BX0 + 2 * BGAP, yb(bmin) + 16, "pivot daily (mic), în trepte", fill=BLUE, size=11)
+# stopul, dacă ai fi măsurat pe daily
+bracket(34, yb(B_ENTRY), yb(B_SL), RED, f"stop {B_PCT:.2f} %".replace(".", ","), below=True)
+
+# ---- ghidajele de lupă -------------------------------------------------------
+guides = [((lx1, ly0), (FRAME_L, TOP)), ((lx1, ly1), (FRAME_L, TOP + PLOT_H))]
+for a_, b_ in guides:
+ line(a_[0], a_[1], b_[0], b_[1], BLUE, dash="5 3", width=1.1)
+
+# ---- conectorul nivelului comun ----------------------------------------------
+# Aceeași linie de pivot weekly cade la înălțimi diferite: scările au pante
+# diferite. Conectorul le leagă; „același preț" e scris o singură dată, în cot.
+ycb, ycs = yb(S.PPW), ys(S.PPW)
+mid = (lx1 + FRAME_L) / 2
+out.append(f'')
+text(mid + 4, (ycb + ycs) / 2 + 4, "același preț", fill="#999", size=10)
+
+# ---- panoul de 60 min --------------------------------------------------------
+frame_r = SX0 + (len(fine) - 1) * SGAP + 9
+rect(FRAME_L, TOP, frame_r, TOP + PLOT_H, BLUE, fill_op=0.03)
+y_e, y_sl, y_tp = ys(ENTRY), ys(SL), ys(TP1)
+assert abs((y_sl - y_e) - (y_e - y_tp)) < 1e-6, "1R în sus nu e desenat cât 1R în jos"
+assert TOP + PLOT_H - ys(S.PPW) > 6, "linia pivotului mare e lipită de marginea cadrului"
+# stopul e minimul ULTIMELOR 4 bare, nu al întregii ferestre: ziua dinainte
+# coboară mai jos, iar acele bare nu intră la socoteală
+assert y_sl < ys(ZLO), "stopul de 4 bare ar trebui să stea peste minimul ferestrei"
+# zona verde peste bara de trigger
+sx0, sx1 = SX0 + I_TRIG * SGAP - 9, SX0 + I_TRIG * SGAP + 9
+rect(sx0, y_e - 6, sx1, ys(ZLO) + 4, GREEN)
+line((sx0 + sx1) / 2, TOP + PLOT_H, (sx0 + sx1) / 2, TOP + PLOT_H + 26, GREEN, width=1)
+text((sx0 + sx1) / 2, TOP + PLOT_H + 38, "închide peste pivotul mic: aici intri", fill=GREEN,
+ anchor="middle", bold=True, size=11)
+hline(FRAME_L, frame_r, ys(S.PPW), GRAY, "8 4")
+out.append(f'')
+hline(FRAME_L, frame_r, y_e, GREEN, "6 3")
+hline(FRAME_L, frame_r, y_sl, RED, "6 3")
+hline(FRAME_L, frame_r, y_tp, GREEN, "2 3")
+candles(fine, SX0, SGAP, ys)
+stack([(y_tp + 4, [f"TP1 {TP1:.2f}"], GREEN),
+ (y_e + 4, [f"intrare {ENTRY:.2f}"], GREEN),
+ (y_sl + 4, [f"stop {SL:.2f}", f"minimul ultimelor", f"{S.BARE_STOP} bare de 60 min"], RED),
+ (ys(S.PPW) + 4, [f"pivot weekly", f"(mare) {S.PPW:.2f}"], "#666")], frame_r)
+kx = SX0 + (I_TRIG + 1) * SGAP + BODY_W / 2 + 1
+bracket(kx, y_e, y_sl, RED, f"stop {PCT:.2f} %".replace(".", ","))
+
+# ---- de ce merită lupa -------------------------------------------------------
+ya = TOP + PLOT_H + 62
+line(34, ya, kx, ya, RED, width=1.6, marker="pt")
+text((34 + kx) / 2, ya + 17, f"același setup, stop de {RAPORT:.1f} ori mai mic".replace(".", ","),
+ fill=RED, anchor="middle", bold=True, size=11)
+text((34 + kx) / 2, ya + 31, f"→ de {RAPORT:.1f} ori mai multe acțiuni la același risc în bani"
+ .replace(".", ","), fill=RED, anchor="middle", bold=True, size=11)
+text(20, ya + 52, f"Pe daily ai fi intrat la close-ul zilei ({B_ENTRY:.2f}) cu stopul sub "
+ f"minimul ultimelor {S.BARE_STOP} zile ({B_SL:.2f}).", fill="#555", size=11)
+text(20, ya + 66, "Pe 60 de minute vezi unde s-a oprit coborârea, deci ai de unde măsura un stop "
+ "mult mai strâns.", fill="#555", size=11)
+
+# --- fiecare preț stă pe panoul lui, cu excepția nivelului comun --------------
+COMUN = f"{S.PPW:.2f}"
+MARE = {"B_ENTRY": B_ENTRY, "B_SL": B_SL}
+MIC = {"ENTRY": ENTRY, "SL": SL, "TP1": TP1}
+for x0, _x1, _y, s in LABELS:
+ pe_mic = x0 >= MIDX
+ for k, v in (MARE if pe_mic else MIC).items():
+ assert f"{v:.2f}" not in s, f"eticheta {s!r} poartă prețul {k} al celuilalt panou"
+st = [s for x0, _1, _2, s in LABELS if COMUN in s and x0 < MIDX]
+dr = [s for x0, _1, _2, s in LABELS if COMUN in s and x0 >= MIDX]
+assert st and dr, f"nivelul comun {COMUN} nu apare pe ambele panouri ({st} / {dr})"
+for k, v in MIC.items():
+ assert any(f"{v:.2f}" in s and x0 >= MIDX for x0, _1, _2, s in LABELS), f"{k} lipsește de pe mic"
+
+H = ya + 76
+for a in range(len(LABELS)):
+ assert 0 < LABELS[a][2] < H, f"etichetă în afara pânzei: {LABELS[a][3]!r}"
+ for b in range(a + 1, len(LABELS)):
+ xa0, xa1, ya_, sa = LABELS[a]
+ xb0, xb1, yb_, sb = LABELS[b]
+ assert not (abs(ya_ - yb_) < 13 and xa0 < xb1 - 4 and xb0 < xa1 - 4), \
+ f"etichete suprapuse: {sa!r} / {sb!r}"
+
+svg = (f'\n ' + "\n ".join(out) + "\n")
+S.scrie(OUT, svg, W, H)
+print(f"lupă x{ss / bs:.1f} | daily: entry {B_ENTRY:.2f} SL {B_SL:.2f} = {B_PCT:.2f} % | "
+ f"60 min: entry {ENTRY:.2f} SL {SL:.2f} = {PCT:.2f} % | raport {RAPORT:.2f}")
diff --git a/gen/strategii/mp2_perechi_tf.svg b/gen/strategii/mp2_perechi_tf.svg
new file mode 100644
index 0000000..dccb505
--- /dev/null
+++ b/gen/strategii/mp2_perechi_tf.svg
@@ -0,0 +1,98 @@
+
+
+ Pasul 1 — perechea de timeframe-uri: pivoții stau pe daily, intrarea se face pe 60 min
+ Graficul din dreapta e aceeași bucată de piață, mărită: fiecare candelă daily din caseta punctată
+ e desfăcută în 7 bare de 60 de minute (ședința are 6 ore și jumătate, deci ultima bară a zilei e de 30 min).
+ daily: direcția
+ 60 min: ultimele 2 candele daily, desfăcute
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pivot weekly (mare) 584.00
+ pivot daily (mic), în trepte
+
+ stop 3,04 %
+
+
+
+ același preț
+
+
+
+ închide peste pivotul mic: aici intri
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TP1 598.00
+
+ intrare 592.00
+
+ stop 586.00
+ minimul ultimelor
+ 4 bare de 60 min
+
+ pivot weekly
+ (mare) 584.00
+
+ stop 1,01 %
+
+ același setup, stop de 3,0 ori mai mic
+ → de 3,0 ori mai multe acțiuni la același risc în bani
+ Pe daily ai fi intrat la close-ul zilei (598.20) cu stopul sub minimul ultimelor 4 zile (580.00).
+ Pe 60 de minute vezi unde s-a oprit coborârea, deci ai de unde măsura un stop mult mai strâns.
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_pivoti.py b/gen/strategii/mp2_pivoti.py
new file mode 100644
index 0000000..87513f3
--- /dev/null
+++ b/gen/strategii/mp2_pivoti.py
@@ -0,0 +1,79 @@
+"""MP² — cei doi pivoți și condiția M (Pasul 2 din `02_mp2.md`).
+
+Aceeași serie ca tot capitolul. Aici nu e niciun trade: doar cele două linii
+de pivot și granița dintre „nu ai voie long" și „ai voie să cauți trigger".
+Dedesubt, aritmetica: pivotul mic al zilei 4 iese din OHLC-ul zilei 3, cu
+formula cursului. Cifrele nu sunt scrise de mână — ies din serie.
+
+Rulare: python3 gen/strategii/mp2_pivoti.py
+"""
+import re
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Chart, Level, Zone # noqa: E402
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+RED, BLUE, GRAY, GREEN = "#c00", "#1a5fb4", "#777", "#188a3e"
+W = 720
+
+zi = S.zilnice(S.CDS)
+z3 = zi[S.ZI4 - 1] # ziua 3, cea din care iese pivotul zilei 4
+assert S.pp(z3.h, z3.l, z3.c) == S.PPD[S.ZI4]
+assert S.pp(*S.PPW_OHLC) == S.PPW
+
+hot = S.ZI4 * S.BARE_ZI # prima bară a zilei 4
+
+ch = Chart(
+ candles=S.CDS,
+ levels=[Level(S.PPW, f"pivot weekly (mare) {S.PPW:.2f} — nu se mișcă toată săptămâna",
+ GRAY, "8 4", "right")],
+ zones=[Zone(0, hot - 1, "pivotul mic e SUB cel mare: M neîndeplinit, nu cauți long", RED),
+ Zone(hot, len(S.CDS) - 1, "pivotul mic e PESTE cel mare: M îndeplinit", GREEN)],
+ scale=15.0, gap=15, body_w=9, left=52, width=W, top=40,
+ title="Pasul 2 — cei doi pivoți: unde stă cel mic față de cel mare")
+
+svg = ch.render()
+off = S.offset(svg, ch)
+inject = [
+ f'',
+]
+# doar cele două valori care contează: ultima de sub pivotul mare și prima de peste
+for d, dy_, b in ((S.ZI4 - 1, 14, 3), (S.ZI4, -7, 6)):
+ inject.append(
+ f'{S.PPD[d]:.2f}')
+
+svg = S.injecteaza(svg, inject)
+
+# --- aritmetica, sub grafic ---------------------------------------------------
+h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
+linii = [
+ ("Linia albastră în trepte e pivotul daily (mic), recalculat în fiecare ședință; "
+ "linia gri e pivotul weekly (mare).", "#333"),
+ ("Pivotul mare, al săptămânii încheiate: PP = (High + Low + Close) / 3 = "
+ f"({S.PPW_OHLC[0]:.2f} + {S.PPW_OHLC[1]:.2f} + {S.PPW_OHLC[2]:.2f}) / 3 = "
+ f"{S.PPW:.2f}", GRAY),
+ ("Pivotul mic al zilei a 4-a, din ziua a 3-a încheiată: "
+ f"({z3.h:.2f} + {z3.l:.2f} + {z3.c:.2f}) / 3 = {S.PPD[S.ZI4]:.2f}", BLUE),
+ (f"{S.PPD[S.ZI4]:.2f} este peste {S.PPW:.2f}, iar în ziua a 3-a era "
+ f"{S.PPD[S.ZI4 - 1]:.2f}, adică dedesubt: M îndeplinit, printr-un crossing proaspăt.",
+ GREEN),
+]
+blocs = [f'{t}'
+ for i, (t, c) in enumerate(linii)]
+H = h + 6 + 19 * len(linii)
+svg = svg.replace(f'viewBox="0 0 {W} {h:.0f}"', f'viewBox="0 0 {W} {H:.0f}"', 1)
+if f'viewBox="0 0 {W} {H:.0f}"' not in svg: # lățimea a fost lărgită
+ vb = re.search(r'viewBox="0 0 ([\d.]+) ([\d.]+)"', svg)
+ svg = svg.replace(vb.group(0), f'viewBox="0 0 {vb.group(1)} {H:.0f}"', 1)
+svg = svg.replace("", " " + "\n ".join(blocs) + "\n")
+
+w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
+assert max(len(t) for t, _ in linii) * 5.7 + 24 < w, "linia de aritmetică iese din pânză"
+S.scrie(OUT, svg, w, H)
diff --git a/gen/strategii/mp2_pivoti.svg b/gen/strategii/mp2_pivoti.svg
new file mode 100644
index 0000000..6a33e4a
--- /dev/null
+++ b/gen/strategii/mp2_pivoti.svg
@@ -0,0 +1,86 @@
+
+
+ 583.20
+ 587.13
+ Pasul 2 — cei doi pivoți: unde stă cel mic față de cel mare
+
+ pivotul mic e SUB cel mare: M neîndeplinit, nu cauți long
+
+ pivotul mic e PESTE cel mare: M îndeplinit
+
+ pivot weekly (mare) 584.00 — nu se mișcă toată săptămâna
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Linia albastră în trepte e pivotul daily (mic), recalculat în fiecare ședință; linia gri e pivotul weekly (mare).
+ Pivotul mare, al săptămânii încheiate: PP = (High + Low + Close) / 3 = (588.00 + 580.00 + 584.00) / 3 = 584.00
+ Pivotul mic al zilei a 4-a, din ziua a 3-a încheiată: (588.80 + 584.20 + 588.40) / 3 = 587.13
+ 587.13 este peste 584.00, iar în ziua a 3-a era 583.20, adică dedesubt: M îndeplinit, printr-un crossing proaspăt.
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_pivoti_excel.py b/gen/strategii/mp2_pivoti_excel.py
index d93c5c9..fe6f235 100644
--- a/gen/strategii/mp2_pivoti_excel.py
+++ b/gen/strategii/mp2_pivoti_excel.py
@@ -195,14 +195,11 @@ def build():
13, "400", GRAY))
p.append(txt(W / 2, 358, "nu sunt date reale de piață.", 13, "400", GRAY))
p.append(txt(W / 2, 386,
- "crossing = PPD trece deasupra PPW; dacă rămâne deasupra — "
- "continuare (09_QA/16:35-43).", 13, "400", BLACK))
+ "crossing = PPD trece deasupra PPW; dacă rămâne deasupra, "
+ "e continuare, nu crossing.", 13, "400", BLACK))
p.append(txt(W / 2, 408,
- "Surse formule: 03_MODUL_2/02_zone_cerere_oferta_support_"
- "resistance.md:42-50", 13, "400", GRAY))
- p.append(txt(W / 2, 426,
- "Calcul Excel 1-la-1, MP² = comparația a doi pivoți: "
- "09_QA/09_2025-12-09.md:1176-1180.", 13, "400", GRAY))
+ "Formula pivotului e cea predată în Modul 2; autorul a confirmat "
+ "că se calculează 1 la 1 în Excel.", 13, "400", GRAY))
p.append('')
return "\n".join(p) + "\n"
@@ -299,7 +296,7 @@ def verify(svg):
"22.13", "21.23", "22.47", "20.67",
"PPD 21.57 > PPW 21.37", "CROSSING BULL (long)",
"exemplu construit", "nu sunt date reale de piață",
- "09_QA/16:35-43", "09_QA/09_2025-12-09.md:1176-1180",
+ "e continuare, nu crossing", "se calculează 1 la 1 în Excel",
):
assert cheie in plain, f"lipsește din desen: {cheie!r}"
diff --git a/gen/strategii/mp2_pivoti_excel.svg b/gen/strategii/mp2_pivoti_excel.svg
index 7cf2e72..ee19362 100644
--- a/gen/strategii/mp2_pivoti_excel.svg
+++ b/gen/strategii/mp2_pivoti_excel.svg
@@ -75,7 +75,6 @@
PPD 21.57 > PPW 21.37 → CROSSING BULL (long)Cifrele sunt un exemplu construit, cu valori rotunde, pe TLV —nu sunt date reale de piață.
-crossing = PPD trece deasupra PPW; dacă rămâne deasupra — continuare (09_QA/16:35-43).
-Surse formule: 03_MODUL_2/02_zone_cerere_oferta_support_resistance.md:42-50
-Calcul Excel 1-la-1, MP² = comparația a doi pivoți: 09_QA/09_2025-12-09.md:1176-1180.
+crossing = PPD trece deasupra PPW; dacă rămâne deasupra, e continuare, nu crossing.
+Formula pivotului e cea predată în Modul 2; autorul a confirmat că se calculează 1 la 1 în Excel.
diff --git a/gen/strategii/mp2_serie.py b/gen/strategii/mp2_serie.py
new file mode 100644
index 0000000..58df7d9
--- /dev/null
+++ b/gen/strategii/mp2_serie.py
@@ -0,0 +1,268 @@
+"""Seria comună a capitolului `17_STRATEGII/02_mp2.md` — un singur trade.
+
+Toate diagramele din Nivelul 1 și Nivelul 2 ale capitolului desenează ACELAȘI
+trade, din aceeași serie. Așa nu se poate întâmpla ca două diagrame să
+folosească două reguli de stop diferite, fiecare etichetată corect local.
+
+Ce e din material și ce e construit
+-----------------------------------
+Din material (rezumatul Q&A, exemplul ilustrativ al mecanicii celor două
+poziții): intrare 592.00, SL 586.00, 1R = 6.00, TP1 598.00, mutarea SL-ului
+la break-even la 60 % din drum, mărimea totală multiplu de 2.
+Construit de mine: traseul barelor de 60 de minute care produce exact
+cifrele alea, și pivoții — care NU sunt scriși de mână, ci calculați din
+serie cu formula cursului, PP = (High + Low + Close) / 3 al perioadei
+încheiate. Fără ticker: e un exemplu construit, nu date reale de piață.
+
+Structura: 5 zile × 7 bare de 60 de minute (ședința 9:30-16:00 are 6 ore și
+jumătate, deci ultima bară a zilei e de 30 de minute).
+
+ ziua 1 bare 0-6 coborâre
+ ziua 2 bare 7-13 minimul și întoarcerea
+ ziua 3 bare 14-20 ziua verde care ridică pivotul zilnic peste cel weekly
+ ziua 4 bare 21-27 crossing-ul e pe tablă: dip, trigger la 592.00, TP1
+ ziua 5 bare 28-34 poziția 2 pe trail, ieșire la 599.80
+
+Rulat direct, verifică toate afirmațiile capitolului:
+ python3 gen/strategii/mp2_serie.py
+"""
+import re
+import sys
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+from svg_candles import Candle, from_closes # noqa: E402
+
+BARE_ZI = 7 # bare de 60 min într-o ședință
+ZILE = 5
+
+# pivotul săptămânal (MARE): al săptămânii încheiate, H 588.00 / L 580.00 /
+# C 584.00. E un dat din afara ferestrei desenate — săptămâna trecută nu
+# încape pe grafic — deci îl declar aici, cu OHLC-ul din care iese.
+PPW_OHLC = (588.00, 580.00, 584.00)
+# pivotul zilnic al PRIMEI zile: al ședinței de vineri, dinaintea ferestrei.
+PPD0_OHLC = (586.00, 581.00, 582.60)
+
+START = 585.00 # open-ul primei bare
+CLOSES = [
+ # ziua 1 — coborâre
+ 584.20, 583.40, 583.90, 582.60, 581.80, 582.20, 581.20,
+ # ziua 2 — minimul (580.00) și întoarcerea
+ 580.60, 581.40, 580.90, 582.30, 583.10, 583.80, 584.60,
+ # ziua 3 — ziua verde; închiderile ei sunt peste pivotul zilnic, dar
+ # pivotul zilnic e încă sub cel weekly, deci NU e trigger
+ 585.10, 584.70, 585.60, 586.40, 587.20, 587.80, 588.40,
+ # ziua 4 — dip sub pivotul zilnic nou, apoi trigger-ul
+ 586.90, 586.30, 586.80, 592.00, 593.40, 595.90, 598.20,
+ # ziua 5 — poziția 2 pe trail
+ 599.60, 601.20, 600.40, 602.30, 601.10, 599.80, 598.90,
+]
+W = [(0.25, 0.25)] * 35 # fitile (sus, jos); excepțiile fixează extremele zilei
+W[0] = (0.40, 0.25) # H zi 1 = 585.40
+W[6] = (0.25, 0.60) # L zi 1 = 580.60
+W[7] = (0.25, 0.60) # L zi 2 = 580.00
+W[13] = (0.40, 0.25) # H zi 2 = 585.00
+W[14] = (0.25, 0.40) # L zi 3 = 584.20
+W[20] = (0.40, 0.25) # H zi 3 = 588.80
+W[21] = (0.30, 0.30)
+W[22] = (0.30, 0.30) # L = 586.00 — minimul celor 4 bare de la trigger
+W[23] = (0.30, 0.20)
+W[24] = (0.40, 0.30) # bara de trigger
+W[25] = (0.35, 0.40)
+W[26] = (0.35, 0.40)
+W[27] = (0.35, 0.40)
+for i in range(28, 35):
+ W[i] = (0.35, 0.35)
+
+VOLS = [46, 40, 38, 42, 39, 36, 44,
+ 58, 52, 44, 41, 38, 36, 40,
+ 44, 38, 41, 45, 48, 44, 52,
+ 50, 46, 42, 118, 86, 78, 82,
+ 64, 58, 46, 62, 44, 56, 48]
+
+ZI3, ZI4 = 2, 3 # indexul zilei verzi și al zilei de trigger
+TRIGGER = 24 # bara de trigger (ziua 4, a 4-a oră)
+PREA_DEVREME = 16 # închidere peste pivotul mic cu M neîndeplinit
+NU_INCHIDE = 22 # trece peste pivot în timpul barei, dar nu închide
+BARE_STOP = 4 # stopul: extrema ultimelor 4 bare, de la trigger
+PRAG_BE = 0.60 # la 60 % din drumul spre TP1, SL-ul merge la BE
+PRAG_90 = 0.90
+
+
+def pp(h, l, c):
+ """Pivotul clasic al unei perioade încheiate (formula cursului)."""
+ return round((h + l + c) / 3, 2)
+
+
+def serie(closes=None, wicks=None, start=None):
+ return from_closes(closes or CLOSES, wicks=wicks or W, vols=VOLS,
+ start=START if start is None else start)
+
+
+def zilnice(cds):
+ """Agregă barele de 60 min în candele zilnice: 7 bare = o ședință."""
+ out = []
+ for d in range(ZILE):
+ p = cds[d * BARE_ZI:(d + 1) * BARE_ZI]
+ out.append(Candle(p[0].o, max(c.h for c in p), min(c.l for c in p), p[-1].c))
+ return out
+
+
+def pivoti(cds, ppw_ohlc=PPW_OHLC, ppd0_ohlc=PPD0_OHLC):
+ """(PPW, PPD pe zi, PPD pe bară). PPD al zilei N = pivotul zilei N-1."""
+ zi = zilnice(cds)
+ ppw = pp(*ppw_ohlc)
+ ppd = [pp(*ppd0_ohlc)] + [pp(z.h, z.l, z.c) for z in zi[:-1]]
+ return ppw, ppd, [ppd[i // BARE_ZI] for i in range(len(cds))]
+
+
+def trail(cds, de_la):
+ """Bull trail: low-ul fiecărei bare care face un maxim nou, de la `de_la`.
+
+ Întoarce (linia pe bară, indexul barei de ieșire) — ieșirea e prima
+ închidere sub linie, nu primul fitil sub ea.
+ """
+ linie, nivel, hmax, iesire = [], None, cds[de_la].h, None
+ for i, c in enumerate(cds):
+ if i >= de_la:
+ if c.h >= hmax:
+ hmax, nivel = c.h, c.l
+ if iesire is None and nivel is not None and i > de_la and c.c < nivel:
+ iesire = i
+ linie.append(nivel)
+ return linie, iesire
+
+
+def oglinda(a=246.40, f=0.2):
+ """Aceeași structură, întoarsă: p' = a - f*p. Transformarea e afină, deci
+ agregarea zilnică și pivoții se păstrează; short-ul nu e „e invers", are
+ desenul lui complet. Cu f = 0.2 toate prețurile rămân exacte la 2 zecimale."""
+ m = lambda p: round(a - f * p, 2) # noqa: E731
+ cds = [Candle(m(c.o), m(c.l), m(c.h), m(c.c), vol=c.vol) for c in serie()]
+ ppw = m(pp(*PPW_OHLC))
+ zi = zilnice(cds)
+ ppd = [m(pp(*PPD0_OHLC))] + [pp(z.l, z.h, z.c) for z in zi[:-1]]
+ return cds, ppw, ppd, [ppd[i // BARE_ZI] for i in range(len(cds))]
+
+
+# ---------------------------------------------------------------- cifrele
+CDS = serie()
+PPW, PPD, PPD_BARA = pivoti(CDS)
+ENTRY = CDS[TRIGGER].c
+SL = min(c.l for c in CDS[TRIGGER - BARE_STOP + 1:TRIGGER + 1])
+R = round(ENTRY - SL, 2)
+TP1 = round(ENTRY + R, 2)
+BE = round(ENTRY + PRAG_BE * R, 2)
+P90 = round(ENTRY + PRAG_90 * R, 2)
+SWING_LOW = min(c.l for c in CDS) # varianta de bottom major
+TRAIL, IESIRE = trail(CDS, TRIGGER)
+IES_PRET = CDS[IESIRE].c
+I_TP1 = next(i for i in range(TRIGGER + 1, len(CDS)) if CDS[i].h >= TP1)
+I_BE = next(i for i in range(TRIGGER + 1, len(CDS)) if CDS[i].h >= BE)
+
+# mărimea poziției: regula de risc a cursului (0,5 % pe prop), contul e al meu
+CONT, RISC_PCT = 50_000, 0.005
+BUCATI = int(CONT * RISC_PCT / R) // 2 * 2 # multiplu de 2: două ordine egale
+RISC_REAL = round(BUCATI * R, 2)
+
+
+def _verifica():
+ for i, c in enumerate(CDS):
+ assert c.l <= min(c.o, c.c) and c.h >= max(c.o, c.c), f"bara {i}: h/l nu cuprind o/c"
+ if i:
+ assert abs(c.o - CDS[i - 1].c) < 1e-9, f"bara {i}: open != close precedent"
+ assert len(CDS) == BARE_ZI * ZILE == 35
+ # 1. cifrele din material ies din serie, nu sunt scrise de mână
+ assert (ENTRY, SL, R, TP1) == (592.00, 586.00, 6.00, 598.00), (ENTRY, SL, R, TP1)
+ assert BE == 595.60 and P90 == 597.40
+ # 2. M: pivotul mic e sub cel mare până în ziua 4, și peste din ziua 4
+ assert all(PPD[d] < PPW for d in range(ZI4)), PPD
+ assert PPD[ZI4] > PPW, (PPD[ZI4], PPW)
+ assert PPD[ZI4] - PPW > 2.5, "crossing-ul e prea strâns ca să se vadă pe desen"
+ # 3. crossing PROASPĂT, nu continuare: în ziua dinainte era de partea cealaltă
+ assert PPD[ZI4 - 1] < PPW < PPD[ZI4]
+ assert PPD[ZI4 + 1] > PPW, "ziua 5 e continuare (+1), nu crossing"
+ # 4. trigger-ul: PRIMA închidere peste pivotul mic din ziua în care M e îndeplinit
+ zi4 = range(ZI4 * BARE_ZI, (ZI4 + 1) * BARE_ZI)
+ assert TRIGGER == next(i for i in zi4 if CDS[i].c > PPD_BARA[i]), "nu e prima închidere"
+ assert CDS[TRIGGER].c > CDS[TRIGGER].o, "bara de trigger nu e verde"
+ # 5. NU — prea devreme: închidere peste pivotul mic cu M neîndeplinit
+ assert CDS[PREA_DEVREME].c > PPD_BARA[PREA_DEVREME] > 0
+ assert PPD_BARA[PREA_DEVREME] < PPW, "în ziua 3 M ar fi îndeplinit"
+ assert CDS[PREA_DEVREME].c > CDS[PREA_DEVREME].o, "bara „prea devreme” nu e verde"
+ # 6. NU — trece peste pivot în timpul barei, dar nu închide peste
+ assert CDS[NU_INCHIDE].h > PPD_BARA[NU_INCHIDE] > CDS[NU_INCHIDE].c
+ # 7. stopul: minimul celor 4 bare, și e minimul lor strict
+ assert SL == CDS[22].l and SL < min(CDS[i].l for i in (21, 23, 24))
+ assert SWING_LOW < SL, "varianta de bottom major ar coincide cu stopul de 4 bare"
+ assert round(SL - SWING_LOW, 2) == 6.00, round(SL - SWING_LOW, 2)
+ # 8. ieșirile, în ordine: BE, TP1, apoi trail-ul
+ assert I_BE == 26 and I_TP1 == 27 and IESIRE == 33, (I_BE, I_TP1, IESIRE)
+ assert CDS[IESIRE].c < TRAIL[IESIRE] and all(
+ CDS[i].c >= TRAIL[i] for i in range(TRIGGER + 1, IESIRE)), "ieșire greșită pe trail"
+ assert round((IES_PRET - ENTRY) / R, 2) == 1.30, (IES_PRET - ENTRY) / R
+ # 9. mărimea poziției
+ assert BUCATI == 40 and RISC_REAL == 240.00 and RISC_REAL <= CONT * RISC_PCT
+ # 10. oglinda păstrează structura
+ o_cds, o_ppw, o_ppd, _ = oglinda()
+ assert all(o_ppd[d] > o_ppw for d in range(ZI4)) and o_ppd[ZI4] < o_ppw
+ o_entry = o_cds[TRIGGER].c
+ o_sl = max(c.h for c in o_cds[TRIGGER - BARE_STOP + 1:TRIGGER + 1])
+ assert (o_entry, o_sl) == (128.00, 129.20), (o_entry, o_sl)
+ assert round(o_sl - o_entry, 2) == 1.20
+
+
+_verifica()
+
+
+# -------------------------------------------------- ajutoare pentru desen
+def offset(svg, ch):
+ """Câți px a coborât `render()` graficul față de ce întoarce acum ch._y().
+
+ `render()` mută `top` ca să facă loc titlului/săgeților și îl restaurează
+ la final, deci ch._y() de după randare e deplasat. Citim deplasarea din
+ prima linie de Level desenată, ca ce injectăm pe urmă să cadă exact peste
+ candele (bug real: liniile de pivot cu 22 px mai sus decât candelele).
+ """
+ y = float(re.search(r'") + 1
+ return svg[:i] + "\n " + "\n ".join(bucati) + svg[i:]
+
+
+def scrie(out, svg, w, h):
+ assert "\n\n" not in svg, "linie goală în SVG rupe blocul din markdown"
+ assert ".md:" not in svg, "trimitere fișier:linie în SVG"
+ for x, y in re.findall(r' {PPD[ZI4]:.2f}, peste {PPW:.2f}")
+ print(f"trigger bara {TRIGGER}: close {ENTRY:.2f} peste pivotul mic {PPD[ZI4]:.2f}")
+ print(f"SL {SL:.2f} (minimul barelor {TRIGGER - 3}-{TRIGGER}), 1R = {R:.2f} "
+ f"({R / ENTRY * 100:.2f} %), TP1 {TP1:.2f} la bara {I_TP1}")
+ print(f"BE {BE:.2f} la bara {I_BE}; trail: ieșire la bara {IESIRE}, "
+ f"{IES_PRET:.2f} = {(IES_PRET - ENTRY) / R:.2f}R")
+ print(f"swing low absolut {SWING_LOW:.2f} (varianta de bottom major)")
+ print(f"mărime: {BUCATI} bucăți (2 x {BUCATI // 2}), risc real {RISC_REAL:.2f} $")
+ print("toate verificările trec")
diff --git a/gen/strategii/mp2_short.py b/gen/strategii/mp2_short.py
new file mode 100644
index 0000000..ac1bac4
--- /dev/null
+++ b/gen/strategii/mp2_short.py
@@ -0,0 +1,87 @@
+"""MP² pe short — aceeași procedură, întoarsă (oglinda din `02_mp2.md`).
+
+Alt simbol, altă scară de preț (în jur de 128 $, nu 590 $): structura e
+aceeași serie, întoarsă cu p' = 246.40 − 0.2·p. Transformarea e afină și
+descrescătoare, deci agregarea zilnică, pivoții și linia de trail se
+păstrează exact — bull trail-ul devine bear trail fără să recalculez nimic.
+
+Ce se schimbă față de long:
+ M pivotul mic e SUB cel mare, nu peste;
+ crossing pivotul mic coboară prin cel mare;
+ trigger prima bară care ÎNCHIDE sub pivotul mic;
+ stopul cel mai SUS high din ultimele 4 bare;
+ ținta la aceeași distanță, în jos.
+
+Rulare: python3 gen/strategii/mp2_short.py
+"""
+import re
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Arrow, Chart, Level, Zone # noqa: E402
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+A, F = 246.40, 0.2
+RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
+W = 720
+
+
+def m(p):
+ return round(A - F * p, 2)
+
+
+cds, ppw, ppd, ppd_bara = S.oglinda(A, F)
+entry = cds[S.TRIGGER].c
+sl = max(c.h for c in cds[S.TRIGGER - S.BARE_STOP + 1:S.TRIGGER + 1])
+r = round(sl - entry, 2)
+tp1 = round(entry - r, 2)
+trail = [None if v is None or i < S.I_TP1 else m(v) for i, v in enumerate(S.TRAIL)]
+ies = cds[S.IESIRE].c
+zi4a = S.ZI4 * S.BARE_ZI
+
+# tot ce scriu pe desen iese din serie
+assert (entry, sl, tp1, r) == (128.00, 129.20, 126.80, 1.20), (entry, sl, tp1, r)
+assert all(ppd[d] > ppw for d in range(S.ZI4)) and ppd[S.ZI4] < ppw, ppd
+assert cds[S.TRIGGER].c < ppd_bara[S.TRIGGER] and cds[S.TRIGGER].c < cds[S.TRIGGER].o
+assert S.TRIGGER == next(i for i in range(zi4a, zi4a + S.BARE_ZI)
+ if cds[i].c < ppd_bara[i]), "nu e prima închidere sub pivotul mic"
+assert cds[S.IESIRE].c > trail[S.IESIRE] and min(c.l for c in cds[S.TRIGGER:S.I_TP1 + 1]) <= tp1
+assert round((entry - ies) / r, 2) == 1.30
+
+ch = Chart(
+ candles=cds,
+ levels=[Level(ppw, f"pivot weekly (mare) {ppw:.2f}", GRAY, "8 4", "right"),
+ Level(sl, f"stopul {sl:.2f}", RED, "6 3", "right"),
+ Level(entry, f"intrarea (short) {entry:.2f}", "#333", "4 3", "right"),
+ Level(tp1, f"TP1 {tp1:.2f} = intrarea − 1R", GREEN, "2 3", "left")],
+ zones=[Zone(zi4a, len(cds) - 1, "pivotul mic e deja SUB cel mare", BLUE)],
+ arrows=[
+ Arrow(S.TRIGGER, f"aici intri short: {entry:.2f}\nprima bară care ÎNCHIDE "
+ f"sub pivotul mic",
+ where="below", color=RED, dx=-108, dy=26),
+ Arrow(S.I_TP1, f"poziția 1 iese la {tp1:.2f} (1:1)", where="right", price=tp1,
+ color=GREEN, dx=78, dy=30),
+ Arrow(S.IESIRE, f"poziția 2 iese la {ies:.2f},\nprima închidere peste trail",
+ where="right", color=ORANGE, dy=-34),
+ ],
+ scale=55.0, gap=15, body_w=9, left=52, width=W, top=40,
+ title="Oglinda — Sell / short: alt simbol, altă scară, aceleași reguli",
+ caption="Albastru în trepte = pivotul daily (mic); portocaliu = bear trail, "
+ "high-ul ultimei bare cu minim nou.")
+
+svg = ch.render()
+off = S.offset(svg, ch)
+svg = S.injecteaza(svg, [
+ f'',
+ f'',
+ f'{ppd[S.ZI4]:.2f}: crossing bear',
+])
+h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
+w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
+S.scrie(OUT, svg, w, h)
diff --git a/gen/strategii/mp2_short.svg b/gen/strategii/mp2_short.svg
new file mode 100644
index 0000000..a1387e6
--- /dev/null
+++ b/gen/strategii/mp2_short.svg
@@ -0,0 +1,98 @@
+
+
+
+ 128.97: crossing bear
+ Oglinda — Sell / short: alt simbol, altă scară, aceleași reguli
+
+ pivotul mic e deja SUB cel mare
+
+ pivot weekly (mare) 129.60
+
+ stopul 129.20
+
+ intrarea (short) 128.00
+
+ TP1 126.80 = intrarea − 1R
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aici intri short: 128.00
+ prima bară care ÎNCHIDE sub pivotul mic
+
+
+ poziția 1 iese la 126.80 (1:1)
+
+
+ poziția 2 iese la 126.44,
+ prima închidere peste trail
+ Albastru în trepte = pivotul daily (mic); portocaliu = bear trail, high-ul ultimei bare cu minim nou.
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_stop.py b/gen/strategii/mp2_stop.py
new file mode 100644
index 0000000..659b2d5
--- /dev/null
+++ b/gen/strategii/mp2_stop.py
@@ -0,0 +1,74 @@
+"""MP² — stopul și mărimea poziției (Pasul 5 din `02_mp2.md`).
+
+Aceeași serie. Numeri 4 bare înapoi, începând cu bara de trigger, iei cea
+mai joasă dintre ele și acolo stă stopul. Pe desen mai apare și varianta de
+la bottom major: swing low-ul absolut al mișcării, mult mai jos — regula
+alternativă a cursului, nu o a doua regulă pentru trade-ul obișnuit.
+
+Rulare: python3 gen/strategii/mp2_stop.py
+"""
+import re
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Arrow, Chart, Level, Zone # noqa: E402
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
+W, B = 720, 30
+cds = S.CDS[:B + 1]
+i_low = min(range(len(cds)), key=lambda i: cds[i].l)
+R_MARE = round(S.ENTRY - S.SWING_LOW, 2)
+
+assert i_low == 7 and cds[i_low].l == S.SWING_LOW
+assert S.SL == min(c.l for c in cds[S.TRIGGER - 3:S.TRIGGER + 1])
+assert R_MARE == 12.00 and R_MARE == 2 * S.R
+
+ch = Chart(
+ candles=cds,
+ levels=[Level(S.ENTRY, f"intrarea {S.ENTRY:.2f}", "#333", "4 3", "right"),
+ Level(S.SL, f"stopul din regulă {S.SL:.2f} — 1R = {S.R:.2f}", RED, "6 3", "left"),
+ Level(S.SWING_LOW, f"swing low absolut {S.SWING_LOW:.2f}", ORANGE, "2 4", "right")],
+ zones=[Zone(S.TRIGGER - S.BARE_STOP + 1, S.TRIGGER,
+ f"cele {S.BARE_STOP} bare pe care le numeri", BLUE)],
+ arrows=[
+ Arrow(22, f"cea mai joasă dintre cele {S.BARE_STOP}: {S.SL:.2f}\nacolo pui stopul, "
+ f"nu mai jos și nu mai aproape",
+ where="below", price=S.SL, color=RED, dx=-120, dy=6),
+ Arrow(i_low, f"minimul întregii mișcări: {S.SWING_LOW:.2f}\nasta folosești DOAR la un "
+ f"bottom major,\ncând retesturile dese te-ar scoate degeaba — 1R devine {R_MARE:.2f}",
+ where="below", price=S.SWING_LOW, color=ORANGE, dx=180, dy=48),
+ Arrow(S.TRIGGER, f"bara de trigger: {S.ENTRY:.2f}\nde aici numeri înapoi",
+ where="above", color=GREEN, dx=-96, dy=-4),
+ ],
+ scale=14.0, gap=20, body_w=11, left=56, width=W, top=40,
+ title="Pasul 5 — numeri 4 bare înapoi de la trigger și iei cea mai joasă")
+
+svg = ch.render()
+off = S.offset(svg, ch)
+y_num = ch._y(S.SL) + off + 20
+nums = [f'{k + 1}' for k in range(S.BARE_STOP)]
+svg = S.injecteaza(svg, nums)
+
+h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
+w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
+linii = [
+ ("Mărimea poziției: riscul în bani se împarte la distanța până la stop.", "#333"),
+ (f"Cont {S.CONT:,.0f} $".replace(",", ".") +
+ f" × {S.RISC_PCT * 100:.1f} % = {S.CONT * S.RISC_PCT:.0f} $ de risc; "
+ f"{S.CONT * S.RISC_PCT:.0f} / {S.R:.2f} = {S.CONT * S.RISC_PCT / S.R:.1f} bucăți → "
+ f"{S.BUCATI} bucăți, adică două ordine de câte {S.BUCATI // 2}.", BLUE),
+ (f"Risc real: {S.BUCATI} × {S.R:.2f} = {S.RISC_REAL:.0f} $, adică "
+ f"{S.RISC_REAL / S.CONT * 100:.2f} % din cont — sub pragul de "
+ f"{S.RISC_PCT * 100:.1f} %.", GREEN),
+]
+blocs = [f'{t}' for i, (t, c) in enumerate(linii)]
+H = h + 6 + 19 * len(linii)
+svg = re.sub(r'viewBox="0 0 ([\d.]+) [\d.]+"', rf'viewBox="0 0 \1 {H:.0f}"', svg, count=1)
+svg = svg.replace("", " " + "\n ".join(blocs) + "\n")
+assert max(len(t) for t, _ in linii) * 5.7 + 24 < w, "linia de calcul iese din pânză"
+S.scrie(OUT, svg, w, H)
diff --git a/gen/strategii/mp2_stop.svg b/gen/strategii/mp2_stop.svg
new file mode 100644
index 0000000..b845f11
--- /dev/null
+++ b/gen/strategii/mp2_stop.svg
@@ -0,0 +1,93 @@
+
+ 1
+ 2
+ 3
+ 4
+ Pasul 5 — numeri 4 bare înapoi de la trigger și iei cea mai joasă
+
+ cele 4 bare pe care le numeri
+
+ intrarea 592.00
+
+ stopul din regulă 586.00 — 1R = 6.00
+
+ swing low absolut 580.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cea mai joasă dintre cele 4: 586.00
+ acolo pui stopul, nu mai jos și nu mai aproape
+
+
+ minimul întregii mișcări: 580.00
+ asta folosești DOAR la un bottom major,
+ când retesturile dese te-ar scoate degeaba — 1R devine 12.00
+
+
+ bara de trigger: 592.00
+ de aici numeri înapoi
+ Mărimea poziției: riscul în bani se împarte la distanța până la stop.
+ Cont 50.000 $ × 0.5 % = 250 $ de risc; 250 / 6.00 = 41.7 bucăți → 40 bucăți, adică două ordine de câte 20.
+ Risc real: 40 × 6.00 = 240 $, adică 0.48 % din cont — sub pragul de 0.5 %.
+
\ No newline at end of file
diff --git a/gen/strategii/mp2_trigger.py b/gen/strategii/mp2_trigger.py
new file mode 100644
index 0000000..72bdde0
--- /dev/null
+++ b/gen/strategii/mp2_trigger.py
@@ -0,0 +1,67 @@
+"""MP² — trigger valid și trigger fals (Pasul 4 din `02_mp2.md`).
+
+Lupa pe ultimele două ședințe ale seriei comune: trei bare care seamănă și
+care nu înseamnă același lucru.
+
+ NU — prea devreme: închidere verde peste pivotul mic, dar pivotul mic e
+ încă sub cel mare (M neîndeplinit).
+ NU — n-a închis: bara trece peste pivotul mic în timpul ei, dar se
+ închide sub el. Contează închiderea, nu atingerea.
+ DA: prima închidere peste pivotul mic după ce pivotul mic
+ a trecut peste cel mare.
+
+Rulare: python3 gen/strategii/mp2_trigger.py
+"""
+import sys
+from pathlib import Path
+
+sys.path.insert(0, "/workspace/atm-curs-dl")
+sys.path.insert(0, str(Path(__file__).parent))
+from svg_candles import Arrow, Chart, Level # noqa: E402
+import mp2_serie as S # noqa: E402
+
+OUT = Path(__file__).with_suffix(".svg")
+RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
+W, A, B = 720, 14, 27 # fereastra desenată: barele A..B
+
+cds = S.CDS[A:B + 1]
+ppd = S.PPD_BARA[A:B + 1]
+d_devreme, d_nu, d_da = S.PREA_DEVREME - A, S.NU_INCHIDE - A, S.TRIGGER - A
+
+# ce afirmă fiecare etichetă, verificat pe serie
+assert cds[d_devreme].c > ppd[d_devreme] and ppd[d_devreme] < S.PPW
+assert cds[d_nu].h > ppd[d_nu] > cds[d_nu].c and ppd[d_nu] > S.PPW
+assert cds[d_da].c > ppd[d_da] > S.PPW
+assert all(cds[i].c <= ppd[i] for i in range(d_nu - 1, d_da)), "ar fi existat un trigger mai devreme"
+
+ch = Chart(
+ candles=cds,
+ levels=[Level(S.PPW, f"pivot weekly (mare) {S.PPW:.2f}", GRAY, "8 4", "right")],
+ arrows=[
+ Arrow(d_devreme, "NU — prea devreme\nînchide peste pivotul mic, dar pivotul\n"
+ f"mic ({ppd[d_devreme]:.2f}) e încă SUB cel mare ({S.PPW:.2f})",
+ where="below", color=RED, dx=8, dy=48),
+ Arrow(d_nu, "NU — n-a închis peste\n"
+ f"urcă peste {ppd[d_nu]:.2f} în timpul barei,\n"
+ f"dar se închide la {cds[d_nu].c:.2f}, sub el",
+ where="below", color=ORANGE, dx=150, dy=110),
+ Arrow(d_da, f"DA — trigger\nprima ÎNCHIDERE ({cds[d_da].c:.2f}) peste pivotul\n"
+ f"mic {ppd[d_da]:.2f}, cu pivotul mic peste cel mare",
+ where="above", color=GREEN, dx=-118, dy=-6),
+ ],
+ scale=20.0, gap=32, body_w=15, left=58, width=W, top=40,
+ title="Pasul 4 — aceeași linie de pivot, trei bare, un singur trigger",
+ caption="Contează închiderea barei, nu cât de sus a urcat în timpul ei.")
+
+svg = ch.render()
+off = S.offset(svg, ch)
+svg = S.injecteaza(svg, [
+ f'',
+ f'pivot daily (mic) {ppd[-1]:.2f}',
+ f'pivot daily (mic) {ppd[0]:.2f}',
+])
+w = float(svg.split('viewBox="0 0 ')[1].split()[0])
+h = float(svg.split('viewBox="0 0 ')[1].split('"')[0].split()[1])
+S.scrie(OUT, svg, w, h)
diff --git a/gen/strategii/mp2_trigger.svg b/gen/strategii/mp2_trigger.svg
new file mode 100644
index 0000000..1cb927f
--- /dev/null
+++ b/gen/strategii/mp2_trigger.svg
@@ -0,0 +1,52 @@
+
+
+ pivot daily (mic) 587.13
+ pivot daily (mic) 583.20
+ Pasul 4 — aceeași linie de pivot, trei bare, un singur trigger
+
+ pivot weekly (mare) 584.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NU — prea devreme
+ închide peste pivotul mic, dar pivotul
+ mic (583.20) e încă SUB cel mare (584.00)
+
+
+ NU — n-a închis peste
+ urcă peste 587.13 în timpul barei,
+ dar se închide la 586.30, sub el
+
+
+ DA — trigger
+ prima ÎNCHIDERE (592.00) peste pivotul
+ mic 587.13, cu pivotul mic peste cel mare
+ Contează închiderea barei, nu cât de sus a urcat în timpul ei.
+
\ No newline at end of file
diff --git a/summaries/17_STRATEGII/02_mp2.html b/summaries/17_STRATEGII/02_mp2.html
index d2c886a..ffed558 100644
--- a/summaries/17_STRATEGII/02_mp2.html
+++ b/summaries/17_STRATEGII/02_mp2.html
@@ -3,7 +3,7 @@
-2. MP2 (Strategia 2, pivoti dubli)
+2. MP² (Strategia 2, pivoți dubli)
-
2. MP2 (Strategia 2, pivoti dubli)
-
Etichete:longshort · swing / position · acțiuni US / futures / BVB ·
-dificultate 3/5 (judecata mea) · merge pe prop: da, cu ajustări (doar MP²-1) ·
-merge pe BVB: parțial — confirmat de autor
Mulțimea se uită la un singur nivel desenat cu ochiul (un suport, un pattern) sau la
-momentum-ul prețului. MP² nu se uită la niciunul: direcția o dă poziția relativă a doi
-pivoți din două perioade diferite — pivotul mic (daily) față de cel mare (weekly). Când
-pivotul daily trece deasupra celui weekly, înseamnă că prețul mediu al ultimei zile a
-urcat peste prețul mediu al ultimei săptămâni. Sursa explică mecanismul pe cazul invers
-(pivot daily sub weekly): „cumpărătorii care au intrat săptămâna trecută sunt acum, în
-medie, pe pierdere. Ei devin vânzători la prima revenire spre breakeven"
-(09_QA/01_2026-08-25.md:50-56); pentru long, oglinda mecanică (deducția mea — sursa
-explică doar cazul invers) e că vânzătorii de săptămâna trecută sunt cei prinși în pierdere.
-
A doua ineficiență, cea asupra căreia cursul revine cel mai des: majoritatea confundă
-crossing-ul (pivotul mic traversează pivotul mare) cu buy the dip (pivotul mic a
-rămas deasupra și doar prețul mai face o candelă peste el). Arată aproape la fel pe
-grafic, dar au statistici diferite: semnalele care au mers erau crossing-uri, cele care
-n-au mers erau buy-the-dip-uri (09_QA/16_2025-10-07.md:35-43).
-Cursul insistă că e cea mai bună strategie a lui tocmai pentru schimbări majore de
-trend (topuri/bottom-uri), pentru că un crossing two-timeframe e o confirmare mai
-puternică decât un pattern vizual izolat (04_MODUL_3/04_strategia_2_mp_patrat.md:4-14).
-
Diagrama de ansamblu
+
2. MP² (Strategia 2, pivoți dubli)
+
Etichete:longshort · swing / position · acțiuni USfuturesBVB ·
+dificultate 3/5 (judecata mea) · merge pe prop (cont finanțat de o firmă): da, cu ajustări ·
+merge pe BVB: parțial, doar long
+
Cum citești capitolul: textul e explicația mea a materialului de curs și
+nu adaugă reguli peste el; acolo unde materialul nu spune, completez, iar
+bucata aceea începe cu Completare proprie. Diagramele de la nivelurile 1
+și 2 sunt un exemplu construit, fără ticker: traseul e desenat ca cifrele
+din material să iasă din serie, iar pivoții se calculează din ea cu formula
+cursului. Exemplele cu ticker (SPY, NVDA) au cifrele din curs. Trimiterile
+la lecțiile din care vine fiecare pas stau separat, în
+fise/02_mp2_surse.md.
+
Nivelul 1 — Din avion
+
Ce face strategia
+
MP² nu se uită la niciun nivel desenat cu mâna. Se uită la doi pivoți —
+doi „prețuri medii" calculate, unul pe o perioadă scurtă și unul pe o
+perioadă lungă — și la ce poziție are cel scurt față de cel lung. Când cel
+scurt trece de deasupra celui lung, prețul mediu al ultimei zile a urcat
+peste prețul mediu al ultimei săptămâni: cine a cumpărat săptămâna trecută e
+acum, în medie, pe profit, iar cine a vândut e pe pierdere și trebuie să
+cumpere înapoi. Asta e traversarea, crossing-ul.
+
Crossing-ul nu e semnal de intrare. E permisiunea. Intri abia la prima bară
+care se închide de partea corectă a pivotului scurt, pui stopul la
+extrema ultimelor 4 bare, iei jumătate din poziție la o țintă egală cu
+riscul și lași cealaltă jumătate pe o linie care urcă în urma prețului.
+
Dă puține semnale — de ordinul a 29 de tranzacții pe an dacă iei numai
+crossing-uri — iar cifra raportată în material pentru 2025 e 61,9 % semnale
+câștigătoare, cu un câștig mediu de circa 8 %. Deci aproape patru din zece
+pierd, și stopul nu e opțional.
+
+ pivot daily (mic)
+
+ crossing
+ Exemplu construit — bare de 60 de minute, 5 ședințe
+
+ ziua a 4-a: pivotul mic e deja peste cel mare
+
+ TP1 598.00 — poziția 1
+
+ intrarea 592.00
+
+ stopul 586.00
+
+ pivot weekly (mare) 584.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ volum
+
+
+ aici intri: 592.00
+ prima bară care ÎNCHIDE
+ peste pivotul mic
+
+
+ stopul: 586.00
+ minimul ultimelor 4 bare —
+ sub el, cumpărătorii nu mai au controlul
+
+
+ poziția 1 iese la 598.00:
+ exact cât ai riscat (1:1)
+
+
+ poziția 2 iese la 599.80,
+ prima închidere sub trail
+ Crossing: pivotul mic urcă de la 583.20 la 587.13, peste cel mare (584.00) — de-abia de acolo cauți trigger-ul.
-
Exemplul din curs: NVDA, bottom octombrie 2022, combinația weekly/monthly (cifre
-pre-split 1:10) — downtrend masiv → crossing → intrare, SL și țintă pe același grafic.
-
Fraza de decizie
+
De la stânga la dreapta: patru ședințe de câte șapte bare de 60 de minute.
+Linia gri e pivotul weekly (cel mare), 584.00, care nu se mișcă toată
+săptămâna. Linia albastră în trepte e pivotul daily (cel mic), recalculat
+în fiecare ședință: 583.20 în ziua a treia, apoi 587.13 în a patra — acolo
+trece peste cel mare, acolo e crossing-ul. Prima bară care se închide peste
+587.13 se închide la 592.00: acolo intri. Stopul merge la 586.00, cel mai
+jos minim al ultimelor patru bare, deci riști 6.00 pe acțiune. Jumătate din
+poziție iese la 598.00, tot la 6.00 distanță. Cealaltă jumătate iese la
+599.80, la prima închidere sub linia de trail.
+
Fraza de decizie
-
Când pivotul mic traversează pivotul mare (crossing, nu continuare), intru pe prima
-candelă care închide de partea corectă a pivotului mic; stop la extrema ultimelor 4
-candele, jumătate din poziție iese la 1:1, restul pe trail.
+
Cumpăr când pivotul mic tocmai a trecut peste cel mare (crossing, nu
+continuare) și o bară se închide peste pivotul mic; stopul e la cel mai
+jos minim al ultimelor 4 bare, jumătate din poziție iese la o țintă egală
+cu riscul, iar restul pe trail.
-
Când NU o folosești
+
Pe short: vând în lipsă când pivotul mic tocmai a trecut sub cel mare și
+o bară se închide sub pivotul mic, cu stopul deasupra celui mai înalt
+maxim al ultimelor 4 bare și cu ținta la aceeași distanță în jos.
+
Mini-glosar
-
Când nu ai un crossing nou. Dacă pivotul mic a rămas tot timpul deasupra (long) și
- doar prețul a mai făcut o închidere peste el, e buy the dip — altă strategie, cu altă
- statistică (09_QA/16_2025-10-07.md:35-43).
-
Când ai pus un filtru peste ea. „Pe MP pătrat n-am scris nimic de niciun filtru. […]
- Tot ce pui peste este discreționar" (09_QA/16_2025-10-07.md:88-89). Filtrată, nu mai
- poți invoca win rate-ul strategiei de bază.
-
Pe combinațiile weekly/monthly și monthly/quarterly pe un cont cu drawdown zilnic.
- Înseamnă „2-3 ani în tranzacție" (04_MODUL_3/04_strategia_2_mp_patrat.md:30-31);
- nu are ce căuta pe prop.
-
Pe un simbol nelichid. Filtrul de lichiditate se pune primul, înaintea setup-ului
- (09_QA/09_2025-12-09.md:436-448).
-
Fără short, dacă instrumentul nu permite short. Pe BVB (și pe unele conturi de
- prop) jumătatea short a strategiei cade — vezi Transfer.
+
Bară (candelă) — un dreptunghi care rezumă o perioadă. Are patru
+ prețuri: cu cât a deschis perioada (open), cu cât a închis (close),
+ cât de sus a urcat (high) și cât de jos a coborât (low). Corpul e
+ între open și close, fitilele merg până la high și low.
+
Timeframe (TF) — cât timp acoperă o bară: pe daily, o ședință; pe
+ weekly, o săptămână; pe 60 de minute, o oră. O ședință americană ține de
+ la 9:30 la 16:00, adică 6 ore și jumătate, deci are 7 bare de 60 de
+ minute, ultima de o jumătate de oră.
+
Pivot (PP) — prețul de referință al unei perioade încheiate:
+ PP = (High + Low + Close) / 3. Pivotul daily al zilei de azi se calculează
+ din ziua de ieri; cel weekly, din săptămâna trecută. În exemplul din
+ capitol: ziua a treia a avut high 588.80, low 584.20 și close 588.40, deci
+ pivotul zilei a patra e (588.80 + 584.20 + 588.40) / 3 = 587.13.
+
Pivotul mic și pivotul mare — „mic" e cel al perioadei scurte (daily),
+ „mare" e cel al perioadei lungi (weekly). Nu se referă la valoare: pivotul
+ mic poate fi numeric mai mare decât cel mare, și exact asta cauți la long.
+
M — condiția de poziție relativă: pivotul mic e peste cel mare
+ pentru long, sub el pentru short. În exemplu: 587.13 peste 584.00.
+
Crossing — pivotul mic tocmai a traversat pivotul mare: în perioada
+ dinainte era de cealaltă parte. În exemplu: 583.20 (dedesubt) în ziua a
+ treia, 587.13 (deasupra) în a patra. În scaner e valoarea +2 la long și
+ −2 la short.
+
Continuare — pivotul mic e de partea corectă, dar era acolo și înainte,
+ nimic nu s-a traversat. În scaner e +1 / −1. Nu e un semnal de căutare.
+
Buy the dip — cumperi o coborâre scurtă într-un trend care merge deja
+ în sus. Seamănă cu MP² pe grafic: și acolo o bară se închide peste pivotul
+ mic. Diferența e că pivotul mic n-a recăzut niciodată sub cel mare, deci
+ n-a fost nicio traversare. Panoul de jos al diagramei de la pasul 3 e exact
+ asta.
+
Trigger — evenimentul care îți dă voie să intri. Aici: o bară care se
+ închide peste (long) sau sub (short) pivotul mic, cu M îndeplinit.
+
Buy momentum (BIM) / sell momentum (SLM) — săgeata unui indicator
+ propriu al cursului, care se aprinde o singură dată, la schimbarea de
+ trend, când prețul trece cu forță printr-un nivel vechi. Când apare fix pe
+ bara care închide peste pivotul mic, ai două motive în loc de unul. Pe BVB
+ nu există; îi ține locul o bară obișnuită care închide peste pivot.
+
Long și short — „long" înseamnă că ai cumpărat și câștigi dacă prețul
+ urcă. „Short" e invers: vinzi acum acțiuni împrumutate de la broker și le
+ cumperi înapoi mai târziu, deci câștigi dacă prețul scade.
+
Swing și position — un swing ține câteva zile (MP² pe daily/weekly stă
+ 1-3 zile); o poziție de tip „position" ține luni sau ani (MP² pe
+ weekly/monthly sau monthly/quarterly).
+
Stop-loss (SL) — prețul la care ieși automat cu pierdere, pentru că
+ ideea s-a dovedit greșită. Îl pui în platformă odată cu intrarea.
+
1R — cât pierzi pe acțiune dacă te lovește stopul. Intri la 592.00,
+ stopul e la 586.00, deci 1R = 6.00; „+1,30R" înseamnă 7.80 pe acțiune.
+
Take-profit (TP1) — prima țintă. Aici e la fix 1R deasupra intrării:
+ 592.00 + 6.00 = 598.00. Asta înseamnă „1:1".
+
Break-even (BE) — stopul mutat exact la prețul de intrare: de acolo
+ încolo, cel mai rău caz e să ieși pe zero.
+
Bull trail / bear trail — o linie care urcă (long) sau coboară (short)
+ în trepte în urma prețului și nu se întoarce niciodată. La long: low-ul
+ ultimei bare care a făcut un maxim nou. Ieși la prima bară care se
+ închide de partea greșită a liniei, nu la primul fitil care o atinge.
+ În exemplu, linia ajunge la 600.75, iar prima bară care se închide sub ea se închide la 599.80.
+
Bull reversal / bear reversal — chiar momentul în care o bară închide
+ de partea greșită a liniei de trail. Bear reversal (închidere sub bull
+ trail) e semnalul de ieșire pentru poziția rămasă la long.
+
Poziții (tranșe) — poziția împărțită în bucăți care se închid separat:
+ 40 de acțiuni cumpărate ca 20 + 20, ca să poți ieși cu exact jumătate la
+ prima țintă.
+
Swing low / swing high — minimul, respectiv maximul, al întregii
+ mișcări, nu doar al ultimelor bare. În exemplu, swing low-ul e 580.00, cu
+ 6.00 mai jos decât stopul din regulă.
+
Lichiditate — cât de ușor intri și ieși fără să miști prețul. Se
+ măsoară în acțiuni tranzacționate pe zi (în SUA) sau în bani rulați pe zi
+ (la BVB).
+
Gap — un gol între bare: prețul deschide mult peste sau sub închiderea
+ precedentă, fără să treacă prin prețurile dintre ele.
+
Spread — diferența dintre prețul la care poți cumpăra și cel la care
+ poți vinde în același moment. E un cost, și mănâncă direct din R.
Restul capitolului lucrează pe prima linie: pivot daily = mic, pivot weekly
+= mare, execuție pe 60 de minute.
+
Filtrele de simbol se pun înaintea setup-ului, nu după: volum zilnic peste
+0,1 milioane de acțiuni și volum mediu peste 1 milion, preț de închidere
+peste 10 $. Un simbol pe care nu poți ieși nu e un setup, e o capcană.
+
+
+
+ Pasul 1 — perechea de timeframe-uri: pivoții stau pe daily, intrarea se face pe 60 min
+ Graficul din dreapta e aceeași bucată de piață, mărită: fiecare candelă daily din caseta punctată
+ e desfăcută în 7 bare de 60 de minute (ședința are 6 ore și jumătate, deci ultima bară a zilei e de 30 min).
+ daily: direcția
+ 60 min: ultimele 2 candele daily, desfăcute
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pivot weekly (mare) 584.00
+ pivot daily (mic), în trepte
+
+ stop 3,04 %
+
+
+
+ același preț
+
+
+
+ închide peste pivotul mic: aici intri
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TP1 598.00
+
+ intrare 592.00
+
+ stop 586.00
+ minimul ultimelor
+ 4 bare de 60 min
+
+ pivot weekly
+ (mare) 584.00
+
+ stop 1,01 %
+
+ același setup, stop de 3,0 ori mai mic
+ → de 3,0 ori mai multe acțiuni la același risc în bani
+ Pe daily ai fi intrat la close-ul zilei (598.20) cu stopul sub minimul ultimelor 4 zile (580.00).
+ Pe 60 de minute vezi unde s-a oprit coborârea, deci ai de unde măsura un stop mult mai strâns.
+
+
+
+
În stânga e graficul daily: acolo se vede că pivotul mic a trecut peste cel
+mare. În dreapta e aceeași bucată de piață, mărită: fiecare candelă daily
+din caseta punctată e desfăcută în cele 7 bare de 60 de minute din care e
+făcută, cu același open, același close, același maxim și același minim.
+Ghidajele leagă colțurile casetei de colțurile cadrului mic, iar pivotul
+weekly, 584.00, e trasat pe amândouă panourile, cu același număr de ambele
+părți; conectorul subțire dintre panouri leagă cele două înălțimi ale
+aceluiași preț — nu se pot alinia, pentru că scările au pante diferite.
+
De ce te uiți acolo: pe daily vezi că s-a schimbat direcția, dar nu vezi
+unde s-a oprit coborârea. Dacă ai intra pe daily, ai intra la închiderea
+zilei, 598.20, cu stopul sub minimul ultimelor 4 zile, 580.00 — adică 3,04 %
+risc. Pe 60 de minute intri la 592.00 cu stopul la 586.00, adică 1,01 %. La
+același risc în bani, de trei ori mai multe acțiuni.
+
Treci mai departe doar dacă ai ales perechea, ai deschis graficul pe care
+vei intra și simbolul trece filtrele de lichiditate și de preț.
+
+
Pasul 2 — Tragi cei doi pivoți și verifici M
+
Calculezi sau afișezi pivotul perioadei mici și pe al celei mari și te uiți
+care e deasupra.
+
Formula e una singură, pentru orice perioadă: PP = (High + Low + Close) / 3,
+al perioadei încheiate. Platforma îi desenează singură; la BVB îi
+calculezi în Excel (mai jos, la transfer).
+
+
+
+ 583.20
+ 587.13
+ Pasul 2 — cei doi pivoți: unde stă cel mic față de cel mare
+
+ pivotul mic e SUB cel mare: M neîndeplinit, nu cauți long
+
+ pivotul mic e PESTE cel mare: M îndeplinit
+
+ pivot weekly (mare) 584.00 — nu se mișcă toată săptămâna
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Linia albastră în trepte e pivotul daily (mic), recalculat în fiecare ședință; linia gri e pivotul weekly (mare).
+ Pivotul mare, al săptămânii încheiate: PP = (High + Low + Close) / 3 = (588.00 + 580.00 + 584.00) / 3 = 584.00
+ Pivotul mic al zilei a 4-a, din ziua a 3-a încheiată: (588.80 + 584.20 + 588.40) / 3 = 587.13
+ 587.13 este peste 584.00, iar în ziua a 3-a era 583.20, adică dedesubt: M îndeplinit, printr-un crossing proaspăt.
+
+
+
+
Cât timp pivotul mic e sub cel mare, nu cauți long: prețul mediu al ultimei
+zile e încă sub media săptămânii, adică cei care au cumpărat săptămâna
+trecută sunt pe pierdere și vând la prima revenire. Când pivotul mic e
+deasupra, rolurile se inversează și ai voie să cauți trigger.
+
Merge pe orice pereche de pivoți — zilnic/săptămânal, săptămânal/lunar,
+lunar/trimestrial. Ce se schimbă e cât ții poziția, nu regula.
+
Treci mai departe doar dacă pivotul mic e peste cel mare (long) sau sub
+el (short).
+
+
Pasul 3 — Verifici că e crossing proaspăt, nu continuare
+
Te uiți la perioada dinainte: pivotul mic trebuie să fi fost de cealaltă
+parte a pivotului mare.
+
Ăsta e criteriul pe care cursul revine cel mai des, în patru sesiuni de
+întrebări diferite: semnalele care au mers erau traversări, cele care n-au
+mers erau intrări într-un trend deja pornit. În scaner e diferența dintre
++2 (crossing) și +1 (continuare).
-
- pivot daily (cel MIC)
+
+ pivot daily (cel MIC)NU — continuare/buy the dip (+1)pivot weekly (cel MARE) 62.00
@@ -416,232 +698,434 @@ candele, jumătate din poziție iese la 1:1, restul pe trail.
+
Diagrama e pe alt simbol, deci are alte prețuri; regulile sunt aceleași. Sus,
+pivotul mic urcă de la 61.70 la 62.20 și traversează pivotul mare, 62.00:
+crossing. Jos, pivotul mic e de la bun început deasupra lui 62.00 și rămâne
+acolo; prețul face închideri peste el, dar nu s-a re-încrucișat nimic, deci
+fiecare astfel de închidere e buy the dip, nu MP². Arată aproape la fel și
+au statistici diferite.
+
Continuarea nu e inutilă, dar are un singur context în care are sens: când
+ai prins deja un bottom și ești într-un trend nou. Ca listă de scanare,
+crossing.
+
Mai există o capcană de platformă: scanerul vede doar bara închisă, deci
+îți dă setup-ul cu o bară întârziere. Pe intraday se compensează cu Radar
+Screen.
+
Treci mai departe doar dacă pivotul mic era de cealaltă parte în perioada
+precedentă. Dacă nu, ești pe altă strategie — lasă simbolul.
+
+
Pasul 4 — Aștepți bara care închide de partea corectă
+
Notezi pivotul mic și aștepți prima bară care se ÎNCHIDE peste el.
+
Nu contează cât de sus urcă bara în timpul ei, contează unde se închide.
+Dacă indicatorul de buy momentum se aprinde pe bara aia, cu atât mai bine —
+dar trigger-ul e închiderea, nu săgeata. Dacă ești deja într-un trend de
+câteva zile și pivotul mic prinde din urmă pivotul mare fără nicio săgeată
+nouă, trigger-ul rămâne tot prima închidere peste pivotul mic; altfel n-ai
+avea niciodată semnal.
+
+
+
+ pivot daily (mic) 587.13
+ pivot daily (mic) 583.20
+ Pasul 4 — aceeași linie de pivot, trei bare, un singur trigger
+
+ pivot weekly (mare) 584.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NU — prea devreme
+ închide peste pivotul mic, dar pivotul
+ mic (583.20) e încă SUB cel mare (584.00)
+
+
+ NU — n-a închis peste
+ urcă peste 587.13 în timpul barei,
+ dar se închide la 586.30, sub el
+
+
+ DA — trigger
+ prima ÎNCHIDERE (592.00) peste pivotul
+ mic 587.13, cu pivotul mic peste cel mare
+ Contează închiderea barei, nu cât de sus a urcat în timpul ei.
+
+
+
+
Trei bare, o singură intrare. Prima, verde, închide peste pivotul mic, dar
+pivotul mic e încă la 583.20, sub cel mare: M nu e îndeplinit, deci nu e
+trigger, oricât de convingătoare arată bara. A doua urcă peste 587.13 în
+timpul ei, dar se închide la 586.30, sub el: nu e trigger. A treia se închide
+la 592.00, peste 587.13, cu pivotul mic deja peste cel mare: acolo intri.
+
Dacă primul semnal te-a scos pe stop, ai voie să iei al doilea — dar primul e
+cel bun statistic, și nu sări niciunul: probabilitățile strategiei se
+calculează pe toate semnalele, nu pe cele pe care le-ai ales tu.
+
Treci mai departe doar dacă o bară s-a închis de partea corectă a
+pivotului mic, cu M îndeplinit.
+
+
Pasul 5 — Pui stopul și calculezi mărimea poziției
+
Numeri 4 bare înapoi, începând cu bara de trigger, iei cel mai jos minim
+dintre ele și acolo pui stopul.
+
+
+ 1
+ 2
+ 3
+ 4
+ Pasul 5 — numeri 4 bare înapoi de la trigger și iei cea mai joasă
+
+ cele 4 bare pe care le numeri
+
+ intrarea 592.00
+
+ stopul din regulă 586.00 — 1R = 6.00
+
+ swing low absolut 580.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cea mai joasă dintre cele 4: 586.00
+ acolo pui stopul, nu mai jos și nu mai aproape
+
+
+ minimul întregii mișcări: 580.00
+ asta folosești DOAR la un bottom major,
+ când retesturile dese te-ar scoate degeaba — 1R devine 12.00
+
+
+ bara de trigger: 592.00
+ de aici numeri înapoi
+ Mărimea poziției: riscul în bani se împarte la distanța până la stop.
+ Cont 50.000 $ × 0.5 % = 250 $ de risc; 250 / 6.00 = 41.7 bucăți → 40 bucăți, adică două ordine de câte 20.
+ Risc real: 40 × 6.00 = 240 $, adică 0.48 % din cont — sub pragul de 0.5 %.
+
+
+
+
În exemplu, cele patru bare au minimele 586.60, 586.00, 586.10 și 586.50:
+stopul e 586.00, deci 1R = 6.00, adică 1,01 % din preț. Regula e aceeași ca
+la M2D, iar cursul nu-i dă o explicație; a mea, prin analogie cu
+regula de trail, e că sub acel nivel valul de cumpărare care ținea mișcarea
+s-a rupt, deci ideea nu mai e adevărată.
+
Nu există un procent fix: depinde de cât de volatil e simbolul. Pe SPY,
+materialul dă un stop de 3,92 %; pe BRK.B, unul de 0.76 pe acțiune.
+
Două excepții:
-
Alege perechea. Pentru MP²-1 (swing, 1-3 zile): pivot daily = mic, pivot
- weekly = mare, execuție pe 60 min (04_MODUL_3/04_strategia_2_mp_patrat.md:24-28;
- 09_QA/10_2025-12-02.md:761-762).
-
Calculează/desenează cei doi pivoți. PP = (High + Low + Close) / 3 al perioadei
- încheiate (03_MODUL_2/02_zone_cerere_oferta_support_resistance.md:42-45).
-
Confirmă M. Pivotul daily (mic) e deja deasupra pivotului weekly (mare) dacă
- vrei long, sub dacă vrei short (04_MODUL_3/04_strategia_2_mp_patrat.md:35-36;
- 09_QA/01_2026-08-25.md:15-19). Merge pe orice pereche: PPD/PPW, PPW/PPM, PPM/PPQ —
- „nu contează că e PPD, PPV, PPM sau PPQ, orice variantă funcționează"
- (09_QA/01_2026-08-25.md:45-48).
-
Confirmă că e crossing proaspăt. Pivotul mic a fost sub cel mare (long) în
- perioada precedentă și tocmai l-a traversat. Dacă a rămas tot timpul deasupra, orice
- intrare ulterioară e buy the dip (09_QA/16_2025-10-07.md:35-43).
-
Trigger (A). Primul Buy Momentum (BIM) sau prima candelă verde după BIM care
- închide deasupra pivotului mic. Nu contează suportul/rezistența — doar linia de
- pivot (04_MODUL_3/04_strategia_2_mp_patrat.md:38-40). BIM/SLM = săgeata buy/sell a
- indicatorului propriu Buy/Sell Momentum Trigger (jbv2, două MA + săgeți), care apare
- o singură dată, la schimbarea de trend (03_MODUL_2/10_buysell_momentum_trigger.md:4-9,29-30).
- Pe short, oglindit: primul SLM
- sau prima candelă roșie care închide sub pivotul mic (04_MODUL_3/04_strategia_2_mp_patrat.md:288-296).
-
Cazul „deja în Buy". Dacă ești deja în uptrend de câteva zile și pivotul mic
- „prinde din urmă" pivotul mare fără BIM proaspăt, trigger-ul e prima candelă care
- închide peste pivotul mic — altfel n-ai avea niciodată trigger
- (04_MODUL_3/04_strategia_2_mp_patrat.md:97-103).
+
Trigger cu gap. Dacă bara de trigger deschide cu un gol față de
+ precedenta, stopul e minimul barei de trigger însăși. Varianta cu stopul
+ la jumătatea gap-ului e pentru cine are deja experiență.
+
Bottom sau top major. Acolo retesturile dese te scot degeaba din
+ poziție, iar stopul merge la swing low-ul absolut al mișcării — pe desen,
+ 580.00 în loc de 586.00, adică 1R devine 12.00 în loc de 6.00. E o regulă
+ alternativă a cursului, nu o a doua regulă de zi cu zi: o aplici doar când
+ știi că ești la un bottom major, și accepți că poziția se înjumătățește.
-
NU: o candelă verde puternică („BIM") care închide deasupra pivotului mic dar cu M
-neîndeplinit (pivotul mic încă sub cel mare) nu e trigger (04_MODUL_3/04_strategia_2_mp_patrat.md:327-337).
-
1.3 Trigger
-
-
-
-
-
Condiție
-
Exemplu cu cifre
-
-
-
-
-
DA
-
primul BIM / SLM (sau prima candelă de culoare după el) care închide de partea corectă a pivotului mic, cu M îndeplinit
-
LEG: pivot daily sub weekly → se deschide săptămâna și trece deasupra; prima candelă verde = trigger, SL sub low-ul de acolo (09_QA/10_2025-12-02.md:750-753)
-
-
-
DA — crossing fără BIM proaspăt (prețul deja în Buy; nu e „continuarea" ±1 din scaner)
-
prima candelă care închide peste pivotul mic, chiar fără BIM „proaspăt", când pivotul mic tocmai trece peste cel mare, iar prețul e deja în trend
-
„deja în uptrend, fără BIM nou" (04_MODUL_3/04_strategia_2_mp_patrat.md:97-103)
-
-
-
NU — prea devreme
-
candelă verde puternică (BIM) dar M nu e îndeplinit (pivotul mic încă sub cel mare)
-
punctul „NU" din diagrama cursului (04_MODUL_3/04_strategia_2_mp_patrat.md:327-337)
-
-
-
NU — invalidat
-
închideri peste pivotul mic după primul crossing, fără ca pivotul mic să fi recăzut sub cel mare = buy the dip, nu crossing
-
Honeywell: primul semnal → SL, următoarele semnale erau buy-the-dip-uri (09_QA/16_2025-10-07.md:15-43)
-
-
-
NU
-
„o candelă bullish care vine după un sell nu e trigger"
-
TMO pe MP² 60 min (09_QA/26_2025-06-11.md:841)
-
-
-
-
Notă: dacă primul semnal nu e valid, poți lua al doilea — dar primul e cel bun
-statistic (09_QA/01_2026-08-25.md:272-275).
-
1.4 Stop-loss
-
Unde: low-ul cel mai jos din ultimele 4 candele, calculat înapoi de la candela de
-trigger (long) / high-ul cel mai sus din 4 candele (short)
-(04_MODUL_3/04_strategia_2_mp_patrat.md:42-44,293-294).
-
De ce acolo: regula de 4 candele e aceeași ca la M2D (03_MODUL_2/14_strategia_1_m2d.md:57-58);
-sursa nu dă motivul. Deducția mea, prin analogie cu explicația trail-ului
-(03_MODUL_2/14_strategia_1_m2d.md:150-154): e nivelul care, dacă e violat, arată că valul
-de cumpărare care ținea mișcarea s-a rupt.
-
Cât e în %/R: nu există un procent fix — depinde de volatilitatea simbolului (deducția
-mea; cursul nu leagă stopul de ATR). Cifre reale din
-material: SPY long, 1R = 22.60 = 3.92% (09_QA/01_2026-08-25.md:392,492); BRK.B,
-risc 0.76 (09_QA/23_2025-07-29.md:563-564). La bottom/top major, stop-ul de 4
-candele se înlocuiește cu swing low/high-ul absolut al mișcării — asumat mult mai larg,
-exemplu NVDA −23% (04_MODUL_3/04_strategia_2_mp_patrat.md:180-188).
-
Excepție gap: dacă trigger-ul vine cu gap, SL = low-ul (high-ul) candelei de trigger
-însăși; variantă avansată, doar cu experiență: jumătatea gap-ului
-(04_MODUL_3/04_strategia_2_mp_patrat.md:45-48,105-116). Caz înrudit, dar nu aceeași
-situație: la AMD trigger-ul a venit la 19:30, iar gap-up-ul a venit după trigger, a
-doua zi; low-uri citite 141.60 și 141.90 (09_QA/24_2025-07-15.md:463-466). Sursa nu
-spune unde a fost pus SL-ul, deci nu e un exemplu al regulii de gap.
-
1.5 Take-profit și tranșe
-
-
-
-
Tranșă
-
Ieșire la
-
De unde vine ținta
-
Ce faci cu stopul
-
-
-
-
-
Poziția 1 (1/2)
-
TP1 = entry + (entry − SL)
-
aceeași distanță ca riscul, risc/recompensă 1:1 (04_MODUL_3/04_strategia_2_mp_patrat.md:49)
-
înainte de TP1: la 60% din drum muți SL la break-even; la 90% la 1:2 (04_MODUL_3/04_strategia_2_mp_patrat.md:278-286)
-
-
-
Poziția 2 (1/2)
-
fără TP fix — bull trail (long) / bear trail (short), pe candelă închisă
după TP1 poziția rămasă e pe trail, nu pe SL fix (09_QA/01_2026-08-25.md:148-151)
-
-
-
Peste TP1 (opțional)
-
euristică: încă o tranșă la ~dublul lui TP1, restul pe trailing
-
de la TP2 în sus devine discreționar; euristica e generală, dată pe un exemplu Google cu intrare în trei bucăți, nu specifică MP² (09_QA/14_2025-10-21.md:264-280)
-
trail pe swing low închis
-
-
-
-
Trail-ul poziției 2: bull trail = low-ul fiecărei candele care face un maxim nou (long);
-bear trail = high-ul fiecărei candele care face un minim nou (short). Ieși la prima
-candelă închisă de partea greșită a liniei, nu la wick
-(04_MODUL_3/04_strategia_2_mp_patrat.md:317-325; 03_MODUL_2/14_strategia_1_m2d.md:150-159).
-
Două poziții înseamnă mărime totală multiplu de 2 (20 = 2×10; 100 = 50+50), ca să
-poți închide exact jumătate. Verifică înainte de trade că platforma permite închiderea
-parțială (09_QA/01_2026-08-25.md:60-73).
-
1.6 Mărimea poziției
-
Regula de risc: maxim 0.5% din cont per tranzacție pe cont prop, maxim 2% pe
-cont personal; la volatilitate mare, 1% (04_MODUL_3/04_strategia_2_mp_patrat.md:52-54;
-03_MODUL_2/14_strategia_1_m2d.md:66-68). Formula: bucăți = (cont × risc%) / (entry − SL),
-rotunjit în jos, împărțit în două ordine egale.
-
Exemplu numeric (SPY, cifrele din material): entry 577.00, SL 554.40 →
-1R = 22.60. Cont prop 50.000 $, risc 0.5% = 250 $ → 250 / 22.60 = 11.06 →
-10 acțiuni (5 + 5). Risc real = 10 × 22.60 = 226 $ = 0.45% din cont. Dacă pierzi
-două semnale în aceeași zi (rar la 29 de tranzacții/an), 2 × 0.5% = 1.0% — sub o
-limită zilnică de 5% (prag presupus de mine, nu din curs; verifică-l pe contul tău). Observă că stopul larg (3.92%) taie poziția la 10 bucăți
-dintr-un cont de 50.000 $ — asta e corect, nu o eroare (09_QA/01_2026-08-25.md:381-394,492).
-
După o serie de pierderi în parametrii normali, nu renunța la strategie: dacă știi că
-poate avea, de exemplu, 6 pierderi consecutive și tocmai le-ai luat, following-ul e mai
-probabil să apară tranzacția care recuperează, nu momentul să te retragi
-(04_MODUL_3/04_strategia_2_mp_patrat.md:630-633).
-
1.7 Checklist de tipărit
-
-
[ ] Perechea de pivoți aleasă și TF-ul de execuție e cel din tabel (C5).
-
[ ] Scanerul are nota și TF-ul prețului în pereche (C6).
-
[ ] Simbolul trece filtrul de lichiditate (C3) și de preț (C4).
-
[ ] M e îndeplinit: pivot mic peste (long) / sub (short) pivot mare.
-
[ ] E crossing nou — pivotul mic a recăzut/fost de partea cealaltă și tocmai traversează; nu e buy the dip.
-
[ ] Trigger: prima candelă (BIM/SLM sau următoarea) care închide de partea corectă a pivotului mic.
-
[ ] SL = low/high-ul ultimelor 4 candele de la trigger; la gap, low/high-ul candelei de trigger.
-
[ ] Mărimea totală e multiplu de 2, împărțită egal; risc ≤ 0.5% pe prop.
-
[ ] Ambele ordine au același SL; alerta de TP1 e pusă.
-
[ ] La bottom/top major: am înlocuit SL de 4 candele cu swing low/high-ul absolut (dacă e cazul).
-
+
Mărimea vine din regula de risc: cel mult 0,5 % din cont pe o tranzacție pe
+un cont de prop, cel mult 2 % pe cont personal, 1 % când volatilitatea e
+mare. Numărul de acțiuni e riscul în bani împărțit la distanța până la stop,
+rotunjit în jos la un multiplu de 2, ca să poți închide exact jumătate.
+
+
Completare proprie (mărimea contului e a mea, pragul de 0,5 % e al
+cursului): pe un cont de 50.000 $ riști cel mult 250 $. La 6.00 pe acțiune,
+250 / 6.00 = 41,7, deci cumperi 40 de acțiuni, ca două ordine de câte 20.
+Riscul real e 240 $, adică 0,48 % din cont. Ambele ordine au același
+stop, deci cele 250 $ se împart între ele, nu se adună.
+
+
Treci mai departe doar dacă știi prețul exact al stopului, numărul de
+acțiuni e un multiplu de 2 și pierderea maximă încape în regula ta de risc.
+
+
Pasul 6 — Ieși în două jumătăți: una la 1:1, una pe trail
+
Pui prima țintă la aceeași distanță deasupra intrării la care stă stopul
+dedesubt, iar a doua jumătate o lași pe linia de trail.
+
+
+
+
+ stopul urcă la break-even
+ Pasul 6 — o jumătate la țintă fixă, cealaltă pe trail
+
+ TP1 598.00 = intrarea + 1R
+
+ 595.60 = 60 % din drum
+
+ intrarea 592.00
+
+ stopul inițial 586.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ poziția 1 (jumătate) iese la 598.00
+ exact cât riscai: 1:1, fără discuție
+
+
+ poziția 2 iese la 599.80
+ prima ÎNCHIDERE sub linia de trail (600.75),
+ nu primul fitil care o atinge = +1.30R
+ Linia portocalie = bull trail: low-ul ultimei bare cu maxim nou. Rezultat: +1R pe o jumătate, +1.30R pe cealaltă.
+
+
+
+
Ordinea, pe exemplul din diagramă:
+
+
La 60 % din drumul spre țintă — 592.00 + 0,6 × 6.00 = 595.60 — muți
+ stopul la break-even, adică la 592.00. De acolo încolo nu mai poți pierde.
+
Prima jumătate iese la 598.00, exact cât ai riscat. Cursul e categoric
+ că ținta fixă e 1:1.
+
A doua jumătate merge pe bull trail. Linia urcă la low-ul fiecărei bare
+ care face un maxim nou; ajunge la 600.75, iar prima bară care se închide
+ sub ea se închide la 599.80. Acolo ieși, cu +1,30R.
+
+
Pe tot trade-ul: ai riscat 6.00 și ai luat +1R pe o jumătate și +1,30R pe
+cealaltă.
+
Două lucruri de verificat înainte, nu după: că platforma îți permite
+închiderea parțială a unei poziții, și că alerta de la TP1 e pusă. Fără
+prima, „două poziții" e doar o vorbă.
+
Treci la trade-ul următor doar după ce amândouă jumătățile au ieșit — la
+țintă, pe trail sau la stop.
-
Nivel 2 — Nuanțele
-
2.1 Ce dă edge — ordonat după cât de des apare în material
-
-
-
-
#
-
Criteriu / indicator
-
De ce dă edge
-
Cât de confirmat
-
Sursă
-
-
-
-
-
1
-
Crossing (±2), nu continuare (±1)
-
„Statistic am văzut din backtesting-urile noastre că sunt mai mari șanse să funcționeze cu crossing-ul" — continuarea e bună doar după un bottom deja prins
-
4 ședințe Q&A distincte (oct. 2025 – apr. 2026); cel mai repetat criteriu
Context de bottom/top major (+ confluență de niveluri, ca observație)
-
bottom/topul major e spus de curs: MP² e „ideal pentru bottom-uri și topuri mari"; explicația cu confluența (trei niveluri = ordine de la participanți diferiți) nu e a lui Bogdan, e completarea rezumatului Q&A
-
contextul: 1 ședință Q&A + fișierul cursului; confluența: doar completarea rezumatului, pe un singur exemplu (SPY)
orice filtru îl face discreționar, iar statisticile originale nu se mai aplică
-
o singură ședință, dar formulat ca interdicție explicită; se bate cu fluxul de selecție a simbolului din analiza zilnică, care pune filtre (sector, RS, relative volume) înainte de trigger (08_ANALIZA_ZILNICA/11_selectia_simbolului.md:18-20)
-
09_QA/16_2025-10-07.md:83-106
-
-
-
5
-
Volumul ca filtru opțional: ReVol > 100%
-
„urcarea fără volum este pump before the dump"; cu trigger de buy momentum și ReVol peste 100% („nu mai zic dacă ai 150% sau 120%"), probabilitatea urcă la peste 70% de continuare a doua zi
probabilitățile se calculează pe eșantion complet; un semnal ratat poate fi cel care ducea 7 tranzacții obișnuite la profit
-
1 sursă (fișierul cursului)
-
04_MODUL_3/04_strategia_2_mp_patrat.md:622-625
-
-
-
7
-
Continuarea (±1) are sens doar imediat după un bottom prins
-
dacă ești jos de tot într-un trend nou, continuările merg; nu ca semnal de căutare
-
1 ședință
-
09_QA/09_2025-12-09.md:85-98
-
-
-
8
-
Semnal precursor: două închideri daily consecutive față de pivot
-
la bottom, două zile cu închidere deasupra pivotului daily = schimbare bull; cu pivoții deja unul sub altul se poate ajunge la MP²
-
1 ședință
-
09_QA/25_2025-07-08.md:167-178
-
-
-
-
2.2 Setup A+ vs. setup mediocru
+
+
Oglinda — MP² pe short
+
Exemplul de mai jos e alt simbol, pe altă scară de preț (în jur de 128 $, nu
+590 $); structura e aceeași, întoarsă. Pașii sunt aceiași, cu semnele opuse:
+
+
M: pivotul mic e sub cel mare;
+
crossing: pivotul mic coboară prin cel mare, după ce fusese
+ deasupra;
+
trigger: prima bară care se închide sub pivotul mic;
+
stopul: cel mai sus maxim din ultimele 4 bare;
+
ținta: la aceeași distanță, în jos; a doua jumătate merge pe bear
+ trail, linia care coboară în trepte deasupra prețului.
+
+
+
+
+
+ 128.97: crossing bear
+ Oglinda — Sell / short: alt simbol, altă scară, aceleași reguli
+
+ pivotul mic e deja SUB cel mare
+
+ pivot weekly (mare) 129.60
+
+ stopul 129.20
+
+ intrarea (short) 128.00
+
+ TP1 126.80 = intrarea − 1R
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aici intri short: 128.00
+ prima bară care ÎNCHIDE sub pivotul mic
+
+
+ poziția 1 iese la 126.80 (1:1)
+
+
+ poziția 2 iese la 126.44,
+ prima închidere peste trail
+ Albastru în trepte = pivotul daily (mic); portocaliu = bear trail, high-ul ultimei bare cu minim nou.
+
+
+
+
Pe diagramă: pivotul mic coboară la 128.97, sub pivotul mare 129.60. Prima
+bară care se închide sub 128.97 se închide la 128.00 — acolo intri short.
+Stopul e la 129.20, cel mai sus maxim al ultimelor 4 bare, deci riști 1.20.
+Prima jumătate iese la 126.80, la aceeași distanță în jos. A doua iese la
+126.44, prima închidere peste linia de bear trail, tot +1,30R.
+
Ce se adaugă la short: pe BVB și pe multe conturi de prop nu poți shorta
+deloc, deci jumătatea asta a strategiei pur și simplu dispare. Vezi
+transferul.
+
+
+
Nivelul 3 — Rafinări
+
Astea se citesc după ce ai făcut 20 de trade-uri mecanic, nu înainte.
+
Ce face un setup A+
+
Regulile de la nivelul 2 sunt minimul. Ce separă un setup bun de unul doar
+valid nu e un filtru pus în scaner, ci ce e dedesubt: dacă sub intrare
+stau mai multe niveluri independente, prima corecție normală are unde se
+opri; dacă nu stă nimic, între intrare și stop nu e nimic care să țină
+prețul.
MP² crossing long — setup A+ vs. setup mediocru (aceeași strategie)A+ — crossing la confluență (SPY, aprilie)
@@ -863,80 +1347,31 @@ probabil să apară tranzacția care recuperează, nu momentul să te retragi
volumcrossing (mijloc)exemplu construit, nu date reale — SL nu stă pe niciun pivot
-Legendă: ce separă cele două sunt nivelurile independente dedesubte (suport quarterly + double bottom + neckline),nu un filtru pus în scaner. Panoul din dreapta e exemplu construit, nu date reale.Surse A+: 09_QA/01_2026-08-25.md:389-394, 485-490, 501-507.
+Legendă: ce separă cele două sunt nivelurile independente dedesubte (suport quarterly + double bottom + neckline),nu un filtru pus în scaner. Panoul din dreapta e exemplu construit, nu date reale.Cifrele A+ sunt din material; trimiterile stau în fișa de surse a capitolului.
-
A+ (SPY, bottom aprilie): crossing-ul cade fix pe un suport quarterly 554.00, cu
-double bottom și Inverted Head & Shoulders (umăr stâng 566 / head 555 / umăr
-drept 568), neckline 578.00. Intrarea (577.00) e prima candelă verde după umărul drept;
-SL 554.40 stă chiar peste suportul quarterly; 1R = 22.60; real +12% (~3R) într-o lună
-(09_QA/01_2026-08-25.md:372-394,501-507).
-
Mediocru (construit, schematic): un crossing care se produce la mijlocul unui range,
-fără niciun suport/pivot dedesubt și fără volum. Setup-ul e „valid" după regulile MP²,
-dar nu are decât structura lui: dacă vine prima corecție normală, nu există nimic care să
-oprească prețul între intrare și SL.
-
Ce le separă (deducție, nu regula cursului): nu un filtru pus în scaner, ci ce e
-dedesubt. Ideea că confluența de niveluri independente face diferența între un breakout
-care ține și unul care eșuează e completarea autorului rezumatului Q&A, marcată acolo
-„completarea mea" (09_QA/01_2026-08-25.md:501-507), nu spusa lui Bogdan. Atenție: asta e o observație despre context, nu o
-regulă de adăugat — autorul spune explicit că MP² nu are filtre și că orice pui peste
-devine discreționar (09_QA/16_2025-10-07.md:83-106). Practic: nu filtrezi scanerul cu
-„confluență", dar când ai două semnale valide și alegi pe care pui risc, cel cu suport
-major dedesubt e cel care merită.
-
2.3 Gotchas
-
-
Nu sări niciun semnal. Probabilitățile se calculează pe eșantion complet. Dacă
- ratezi unul, aștepți următorul — un singur semnal ratat poate fi cel care ducea 7
- tranzacții obișnuite la profit (04_MODUL_3/04_strategia_2_mp_patrat.md:622-625).
-
La bottom-uri/topuri majore nu folosi stop-ul standard de 4 candele. Retesturile
- dese te scot prea devreme; pune-l la swing low/high-ul absolut al mișcării
- (04_MODUL_3/04_strategia_2_mp_patrat.md:626-627; 09_QA/23_2025-07-29.md:1666-1667).
-
Crossing vs. buy the dip. Dacă pivotul mic n-a recăzut sub cel mare, nu s-a
- re-încrucișat nimic; intri pe altă strategie și îți schimbi statisticile
- (09_QA/16_2025-10-07.md:35-43).
-
Nota scanerului și TF-ul prețului merg în pereche. Nota 1-2 → 60 min; nota 3-6 →
- daily. Nepotrivirea nu dă eroare, dă rezultate false
- (09_QA/09_2025-12-09.md:39-48).
-
Scanerul nu vede candela în formare — găsește setup-ul cu o candelă întârziere;
- pe intraday se folosește Radar Screen (09_QA/09_2025-12-09.md:151-155).
-
„Și" vs. „sau" în scaner. Două condiții opuse (+2 și −2) în același scan =
- zero rezultate; scanere separate (09_QA/09_2025-12-09.md:107-129).
-
-
2.4 Contradicții și puncte neclare din material
-
1. Ce face poziția 2: bear reversal sau break-even?
-- Fișierul principal spune: „Poziția 1 iese la TP1, poziția 2 iese la bear reversal
- (violarea bull trail-ului)" (04_MODUL_3/04_strategia_2_mp_patrat.md:52-53).
-- Q&A citează slide-ul oficial ca spunând: „poziția 1 la TP1, poziția 2 la BE"
- (09_QA/01_2026-08-25.md:62-63).
-- Sesiunea clarifică apoi că, după TP1, poziția rămasă e oricum pe trail, nu pe SL
- fix (09_QA/01_2026-08-25.md:148-151) — deci formularea „la BE" din slide pare o
- etichetare greșită, dar cele două surse nu coincid literal.
-- Practic: până nu lămurești, nu trata poziția 2 ca având un TP fix. Fie o ții pe
- trail (cum spune fișierul principal), fie, dacă ești set-and-forget, folosești
- varianta cu SL mutat la BE după TP1 — regula e dată pentru MBAP, nu pentru MP²;
- aplicarea ei la MP² e analogia mea (09_QA/09_2025-12-09.md:993-1006). Ambele te
- scot din poziție diferit; alege-o pe cea pe care o poți executa disciplinat.
-
2. TP1 e 1:1 sau primul prag e la ~2R?
-- Regula din fișierul principal: TP1 = aceeași distanță ca riscul → 1:1
- (04_MODUL_3/04_strategia_2_mp_patrat.md:49).
-- Exemplul BRK.B raportează: risc 0.76, primul high 1.58, al doilea 2.21;
- 2.21/0.76 ≈ 1:3. Primul prag (1.58) e la ~2R față de riscul 0.76 — fie TP1 din
- exemplu nu e pragul 1:1, fie raportarea nu e pe unități de R. Transcrierea nu
- precizează unitățile (09_QA/23_2025-07-29.md:563-566).
-- Practic: nu folosi exemplul BRK.B ca sursă pentru nivelul lui TP1. Pentru regula
- executabilă, folosește 1:1 (Cursul + exemplul SPY din 2.5, unde aritmetica iese exact).
-
3. „Doar ±2" vs. „continuările nu sunt inutile" (nuanță, nu contradicție dură).
-- 02.12.2025: „Recomandarea lui e fermă: folosește doar ±2, crossing-urile"
- (09_QA/10_2025-12-02.md:728-730).
-- 09.12.2025: „continuările nu sunt inutile, doar că au sens într-un context anume —
- imediat după un bottom deja identificat" (09_QA/09_2025-12-09.md:85-98).
-- Practic: pentru semnal de căutare/când nu ai poziție, crossing. Continuarea e
- permisă doar dacă ai deja un bottom confirmat — nu o folosi ca listă de scanare.
-
Punct neclar rămas deschis: echivalența „MP4-1 long" = „MP² 1" (uneori scris „MP
-pătrat 1") nu e confirmată de fișierul principal al strategiei, care nu pomenește deloc
-„MP4". Însuși documentul care le tratează o marchează ca „citirea mea" din context,
-pentru că transcrierea scrie în ambele feluri (08_ANALIZA_ZILNICA/02_mbt10.md:225-241).
-
2.5 Exemplul complet, pas cu pas
+
Panoul din stânga e SPY, bottom-ul de aprilie, cu cifrele din material:
+crossing-ul cade fix pe un suport trimestrial la 554.00, unde sunt și două
+minime la același nivel (double bottom) și un Inverted Head &
+Shoulders — un cap și doi umeri întorși cu susul în jos, cu umărul stâng la
+566, capul la 555 și umărul drept la 568, iar linia care unește vârfurile
+dintre ei (neckline) la 578.00. Intrarea, 577.00, e prima bară verde de
+după umărul drept; stopul, 554.40, stă chiar peste suport; 1R = 22.60.
+Panoul din dreapta e construit: un crossing la mijlocul unui interval, fără
+nimic dedesubt.
+
Atenție la nuanță: asta e o observație despre context, nu o regulă de
+adăugat. Autorul spune explicit că MP² nu are filtre și că orice pui
+peste el îl face discreționar — iar dacă l-ai filtrat, nu mai poți invoca
+statisticile strategiei de bază. Practic: nu filtrezi scanerul după
+„confluență", dar când ai două semnale valide și trebuie să alegi pe care
+pui risc, îl iei pe cel cu suport major dedesubt.
+
Un filtru de volum apare totuși ca opțional în material: ReVol (volumul
+de azi față de media lui) peste 100 % pe bara de trigger. Motivul, în cuvinte
+din curs, e că „urcarea fără volum este pump before the dump".
+
Alte lucruri citate mai rar: nu sări niciun semnal, pentru că probabilitățile
+se calculează pe eșantion complet; și, la un bottom, două închideri daily
+consecutive peste pivotul daily sunt un semn precursor că urmează crossing-ul.
+
Exemplul complet: SPY, bottom-ul de aprilie
SPY — daily
@@ -1078,212 +1513,186 @@ pentru că transcrierea scrie în ambele feluri (08_ANALIZA_ZILNICA/02_mbt
-
SPY — LONG la bottom-ul de aprilie, grafic daily (Q&A 25.08.2026; sursa nu spune pe ce
-combinație de pivoți).
-- Context: suport quarterly la 554.00; double bottom și Inverted Head &
- Shoulders (umăr stâng 566, head 555, umăr drept 568), neckline 578.00.
-- M + A: pivotul mic închide deasupra pivotului mare (MP² long); trigger = prima
- candelă verde după formarea umărului drept.
-- Intrare:577.00.
-- SL:554.40 — chiar peste suportul quarterly; risc 22.60 = 3.92%.
-- Ținta: 4R = 667.00 (+16%). Rezultat real:646.00 ≈ +12% (~3R),
- într-o lună (început aprilie → început mai).
-- De ce a mers (completarea rezumatului Q&A, nu explicația lui Bogdan): nu doar
- patternul, ci trei niveluri independente suprapuse —
- suport quarterly, double bottom, neckline I&S.
-- Ce lipsește din material: componența exactă a celor două poziții și nivelul la care
- s-a mutat stopul pe parcurs; cursul dă doar intrarea, SL și rezultatul.
- (09_QA/01_2026-08-25.md:372-394,492-507.)
-
Mecanica celor 2 poziții, pe aceeași regulă (exemplu ilustrativ construit în rezumatul
-Q&A, în diagramă; nu sunt cifre date de Bogdan): intrare
-592.00, SL 586.00 (1R = 6.00) pe ambele poziții; TP1 598.00 (1:1) închide
-poziția 1; la 595.60 (= 60% din drumul spre TP1) SL se mută la break-even; după TP1,
-poziția 2 rămâne pe trail. Mărime totală 100 bucăți = 2 ordine × 50
-(09_QA/01_2026-08-25.md:75-146).
-
-
Transfer
-
-
Tot ce urmează în secțiunea asta e judecata mea, nu materialul cursului.
-Unde cursul chiar spune ceva despre prop sau despre BVB, citatul e marcat
-cu trimitere; restul e extrapolare și poate fi greșit.
-
-
Pe cont de prop
-
-
-
-
Regulă de prop
-
Ce strică
-
Ajustarea
-
-
-
-
-
drawdown zilnic (presupun 5%, judecata mea — verifică contul tău), calculat și pe poziții deschise
-
limita se atinge pe pierderea flotantă; ți s-au închis tranzacții care erau pe profit (09_QA/26_2025-06-11.md:214-222)
-
risc 0.5%/trade → chiar 2 pierderi în aceeași zi = 1%, cu marjă 5× sub limită; nu ține mai multe poziții MP² deschise simultan în aceeași zi
-
-
-
drawdown total (presupun 10%, judecata mea)
-
seria de pierderi consecutive (strategia are 29 de tranzacții/an la crossing-only, deci puține, dar posibile grupate)
-
0.5%/trade, ca să încapă o serie lungă de pierderi sub limită; nu te opri după o serie în parametrii normali — cursul cere explicit să nu renunți (04_MODUL_3/04_strategia_2_mp_patrat.md:630-633)
-
-
-
interdicție overnight / weekend
-
MP²-1 stă 1-3 zile, deci are overnight (09_QA/10_2025-12-02.md:793; 09_QA/18_2025-09-23.md:78)
-
nu poți rula MP²-1 pe un cont care interzice overnight; cursul spune că daily/weekly e „swing trading, uneori day trading" (04_MODUL_3/04_strategia_2_mp_patrat.md:26), dar nu dă reguli pentru varianta intraday; verifică regula contului înainte
-
-
-
news lockout
-
SL-ul de 4 candele e mic, iar un raport macro mișcă peste el
-
nu deschide poziții MP²-1 cu 1-2 zile înainte de CPI/Fed/NFP; dacă ai TP1 atins, marchează măcar 1/2 (regulă generală de risc, judecata mea — nu o regulă MP²)
-
-
-
consistency rule (o zi nu poate fi > X% din profit)
-
cu 29 de tranzacții/an, o singură zi bună poate deveni disproporționat de mare în total
-
dacă regula există, nu concentra; ține mărimea constantă, nu mări pe „ziua sigură"
-
-
-
-
Sizing-ul, calculat înapoi din limită: pe 50.000 $ prop, 0.5% = 250 $/tranzacție.
-Exemplul SPY (entry 577.00, SL 554.40, 1R = 22.60) → 10 acțiuni. Cea mai proastă zi
-realistă = 2 pierderi × 0.5% = 1.0%; chiar dublată (2.0%) rămâne ≤ 5%. Dacă stopul e
-mai larg (ex. bottom major, −23% pe NVDA), poziția scade proporțional: 250 / (0.23 ×
-13.80) ≈ 78 acțiuni — riscul în bani rămâne 250 $, se schimbă doar mărimea. Regula
-„2 poziții" nu dublează riscul: ambele ordine au același SL, deci cele 250 $ se
-împart, nu se adună.
-
Verdict: merge cu ajustările de mai sus — doar MP²-1 (daily/weekly, trigger
-60 min, poziție 1-3 zile, risc 0.5%). Combinațiile weekly/monthly și monthly/quarterly
-(luni-ani în tranzacție) nu au ce căuta pe un cont cu drawdown zilnic și interdicție
-de overnight.
-
Pe BVB (swing)
-
Ce cere strategia vs. ce există:
-
-
-
-
Ce cere
-
Există la BVB?
-
Înlocuitorul concret
-
-
-
-
-
scaner #MP_patrat_scan (ATM)
-
nu
-
listă manuală de 8-10 nume BET (mai jos), verificată la închiderea zilei; pivoții se calculează în Excel
-
-
-
trigger Buy/Sell Momentum (jbv2, două MA + săgeți)
-
nu — indicator propriu, „nu se poate replica" (09_QA/09_2025-12-09.md:1184-1186)
-
nimic 1:1; folosești un trigger standard de candelă: prima candelă care închide peste pivotul mic, ideal confirmată cu buy doji/hammer; pierzi filtrul fin, nu semnalul
-
-
-
short
-
practic nu
-
rămâi long-only; din strategie dispare simetricul short (M pe sub, SL pe high, TP în jos)
-
-
-
volum mediu > prag US (0.1M acțiuni / 1M acțiuni medie) și preț > 10$
-
nu — praguri US, în acțiuni, fără sens la BVB
-
recalibrate pe valoare tranzacționată, nu număr de acțiuni: ceri rulaj mediu zilnic de ordinul a ~1-2 milioane RON și preț > ~5-10 RON (judecata mea, de verificat pe bvb.ro); rămâne principiul: lichiditatea e primul filtru (09_QA/09_2025-12-09.md:436-448)
-
-
-
date fundamentale trimestriale
-
da
-
raportările periodice de pe bvb.ro; nu e condiție a strategiei, doar filtru de selecție (08_ANALIZA_ZILNICA/11_selectia_simbolului.md:5-9)
-
-
-
proiecții PPA și pivoți modificați
-
nu — „nu se poate replica" (09_QA/09_2025-12-09.md:1184-1186)
-
nu le folosești; rămâi la pivoții clasici, care „sunt 1 la 1" (09_QA/09_2025-12-09.md:1177-1178)
-
-
-
OBV și ATR
-
da, standard pe orice platformă
-
le folosești ca alternativă de volum, respectiv ca măsură a „sănătății" trendului (09_QA/09_2025-12-09.md:1181-1182)
-
-
-
-
Universul propus (judecata mea — ordinea de lichiditate trebuie verificată pe bvb.ro,
-nu o lua ca dată):
-
-
-
-
Simbol
-
De ce e pe listă
-
Ce pierzi
-
Derivate
-
-
-
-
-
TLV (Banca Transilvania)
-
cel mai lichid nume din BET, spread tipic mic
-
nimic notabil
-
futures pe BET, nu pe acțiune
-
-
-
SNP (OMV Petrom)
-
rulaj mare, preț mic → bucăți multe, spread mic
-
mișcări lente, ATR mic
-
—
-
-
-
H2O (Hidroelectrica)
-
lichiditate bună, greutate mare în indice
-
preț mare pe unitate → poziții mici
-
—
-
-
-
BRD
-
lichid, spread rezonabil
-
volum mai mic decât primele 3
-
—
-
-
-
SNG (Romgaz)
-
lichid, mișcări pe știri
-
gap-uri la raportări
-
—
-
-
-
SNN (Nuclearelectrica)
-
lichid, corelație cu energie
-
spread ceva mai larg la volum mare
-
—
-
-
-
EL (Electrica)
-
lichid, volatilitate medie
-
ATR mic
-
—
-
-
-
FP (Fondul Proprietatea)
-
lichid, preț mic
-
discount de holding, mișcări independente
-
—
-
-
-
DIGI
-
lichid, dar spread mai larg
-
lichiditate mai subțire decât TLV/SNP
-
—
-
-
-
M (MedLife)
-
volatil, bun pentru swing
-
lichiditate mică, spread poate sări
-
—
-
-
-
-
Nu pune pe listă nume de sub ~1 milion RON rulaj mediu zilnic: acolo stopul e jucărie.
-BVB nu are opțiuni listate pe acțiuni; există futures pe indici (BET, BET-TR) — util
-doar dacă vrei să exprimi direcția pe indice, nu pe symbol.
-
Pivoții în Excel
-
Autorul a confirmat că pivoții clasici se calculează în Excel din OHLC, „sunt 1 la 1", iar
-MP² e doar comparația a doi pivoți (09_QA/09_2025-12-09.md:1177-1180). Formula e cea
-standard, predată în Modul 2 (03_MODUL_2/02_zone_cerere_oferta_support_resistance.md:42-54):
+
Ce e real: cifrele. Sursa nu spune pe ce combinație de pivoți a fost dat
+semnalul.
+
+
Contextul: suport trimestrial 554.00, double bottom, Inverted Head &
+ Shoulders cu neckline 578.00.
+
Intrarea: 577.00, prima bară verde după umărul drept, cu pivotul mic
+ închis peste cel mare.
+
Stopul: 554.40, chiar peste suport. Riscul, 22.60, adică 3,92 % — un
+ stop larg, care taie poziția la 10 acțiuni pe un cont de 50.000 $ cu risc
+ de 0,5 %. Asta e corect, nu o greșeală de calcul.
+
Ținta 1:1 ar fi fost 599.60; ținta declarată, de 4R, 667.00.
+
Rezultatul real: 646.00, adică circa +12 % (în jur de 3R), într-o lună.
+
Ce lipsește din material: cum au fost împărțite cele două poziții și
+ unde s-a mutat stopul pe parcurs.
+
+
Bottom major: NVDA, și de ce se schimbă stopul acolo
Diagrama e pe alt simbol și pe altă scară (cifre dinainte de split-ul 1:10),
+iar traseul dintre niveluri e construit: cursul dă doar nivelurile. După un
+downtrend masiv, pivotul mic trece peste cel mare, intrarea e la 13.80, iar
+stopul nu e la minimul ultimelor 4 candele, ci la swing low-ul absolut al
+mișcării, 10.63 — adică 23 % mai jos. Ținta a venit la 17.25, circa +25 % în
+vreo nouă săptămâni.
+
E singurul loc din capitol unde stopul se măsoară altfel, și e o decizie
+conștientă: la un bottom major retesturile dese ar mătura un stop de 4
+candele. Costul e că poziția se micșorează în aceeași proporție: riscul în
+bani rămâne același, se schimbă numărul de acțiuni.
+
+
Transfer (judecata mea, nu a cursului)
+
Pe prop (cont de la o firmă, cu limită zilnică de pierdere): limita se
+calculează și pe pozițiile deschise, nu doar pe cele închise, așa că o
+pierdere flotantă poate să te scoată din tranzacții care erau pe profit. Cu
+risc de 0,5 % pe tranzacție, chiar două pierderi în aceeași zi înseamnă 1 %,
+adică mult sub o limită zilnică tipică. Problema reală e alta: MP²-1 stă 1-3
+zile, deci are overnight — poziție ținută peste noapte — iar multe
+conturi de prop o interzic. Verifică regula înainte, pentru că varianta
+intraday nu e descrisă în material. Combinațiile weekly/monthly și
+monthly/quarterly, care înseamnă luni sau ani în tranzacție, n-au ce căuta
+acolo. Și nu deschide poziții cu o zi-două înainte de un raport macro mare:
+stopul de 4 bare e mai mic decât mișcarea pe care o face o astfel de știre.
+
Pe BVB: rămâi long-only, pe 8-10 nume lichide din BET verificate manual
+(TLV, SNP, H2O, BRD, SNG, SNN, EL, FP, DIGI, M). Ce se poate replica 1 la 1
+sunt pivoții clasici, calculați în Excel — autorul a confirmat asta explicit.
+Ce nu se poate: scanerul, indicatorul de buy/sell momentum și proiecțiile de
+pivoți; le ții locul cu o listă manuală și cu trigger-ul de candelă simplu
+(prima închidere peste pivotul mic). OBV și ATR există pe orice platformă.
@@ -1362,91 +1771,75 @@ standard, predată în Modul 2 (03_MODUL_2/02_zone_cerere_oferta_support_r
PPD 21.57 > PPW 21.37 → CROSSING BULL (long)Cifrele sunt un exemplu construit, cu valori rotunde, pe TLV —nu sunt date reale de piață.
-crossing = PPD trece deasupra PPW; dacă rămâne deasupra — continuare (09_QA/16:35-43).
-Surse formule: 03_MODUL_2/02_zone_cerere_oferta_support_resistance.md:42-50
-Calcul Excel 1-la-1, MP² = comparația a doi pivoți: 09_QA/09_2025-12-09.md:1176-1180.
+crossing = PPD trece deasupra PPW; dacă rămâne deasupra, e continuare, nu crossing.
+Formula pivotului e cea predată în Modul 2; autorul a confirmat că se calculează 1 la 1 în Excel.
+
Pașii, pe scurt: aduni OHLC-ul perioadei încheiate, calculezi
+PP = (H + L + C) / 3, repeți pentru săptămâna încheiată și compari cele două
+valori. Crossing bull = pivotul zilnic a fost sub cel săptămânal și acum e
+deasupra.
+
Ce se rupe din cauza lichidității, ca ordin de mărime: spread-ul de
+0,5-1 % la numele medii mănâncă o bucată serioasă dintr-o țintă 1:1 de 1,5 %;
+stopul de 4 bare cade des în zona zgomotului zilnic, iar soluția e să-l
+lărgești și să micșorezi poziția, nu să-l apropii; iar licitația de
+deschidere poate sări peste el cu un gap. Practic: merge degradat,
+undeva la 60-70 % din strategie, doar pe long.
+
Unde se contrazice materialul
-
Adună OHLC perioadei încheiate. Pentru MP²-1 ai nevoie de două foi: una pentru
- ziua încheiată (pivotul daily, PPD) și una pentru săptămâna încheiată (pivotul weekly,
- PPW).
-
Calculează PP:PP = (High + Low + Close) / 3. În Excel, dacă H e în B2, L în C2,
- C în D2: = (B2+C2+D2)/3.
-
Derivează nivelurile (opțional pentru MP², obligatoriu dacă le folosești ca
- suport/rezistență): R1 = 2*PP − Low → =2*E2-C2; S1 = 2*PP − High → =2*E2-B2;
- R2 = PP + (High − Low) → =E2+(B2-C2); S2 = PP − (High − Low) → =E2-(B2-C2).
-
Repetă pe weekly și adu PPW în aceeași foaie.
-
Compară PPD cu PPW. Crossing bull = PPD a fost sub PPW și acum e deasupra.
- Crossing bear = invers. Continuare = PPD e deasupra, dar a rămas deasupra de mai
- multe perioade — acela nu e crossing (09_QA/16_2025-10-07.md:35-43).
+
Ce face poziția 2. Fișierul principal spune că iese la bear reversal
+ (violarea bull trail-ului); un slide citat într-o sesiune de întrebări
+ spune „la break-even". Aceeași sesiune clarifică apoi că, după prima
+ țintă, poziția rămasă e oricum pe trail. Practic: nu-i da un TP fix.
+ Alege între trail și „stop la break-even, apoi las-o să meargă", și
+ ține-te de alegere.
+
Unde e primul prag. Regula scrisă e 1:1. Exemplul BRK.B raportează
+ risc 0.76 și un prim vârf la 1.58, adică aproape 2R — dar transcrierea nu
+ spune în ce unități e raportarea. Practic: folosește 1:1, și nu lua
+ exemplul BRK.B ca sursă pentru nivelul primei ținte.
+
„La 90 % la 1:2". Regula de mutare a stopului are două praguri: la
+ 60 % din drumul spre prima țintă, stopul merge la break-even — asta e
+ clar, e 595.60 în exemplul din capitol. Ce se întâmplă la 90 % (597.40)
+ nu e clar din material: „la 1:2" poate însemna și mutarea stopului, și o a
+ doua țintă. Până se lămurește, nu construi nimic pe pragul ăsta.
+
Doar crossing-uri, sau și continuări? O sesiune spune ferm „doar ±2";
+ alta spune că și continuările au sens, dar numai imediat după un bottom
+ deja identificat. Practic: pentru căutare, crossing.
+
Punct rămas deschis: echivalența „MP4-1 long" = „MP² 1" nu e
+ confirmată de fișierul principal al strategiei, care nu pomenește deloc
+ „MP4".
-
Exemplu numeric construit (cifre rotunde, nu date reale de piață, ca să se vadă
-geometria; simbol TLV):
-- Săptămâna încheiată: H = 22.00, L = 20.50, C = 21.60 → PPW = (22.00+20.50+21.60)/3
- = 21.3667 ≈ 21.37.
-- Ziua încheiată: H = 21.90, L = 21.00, C = 21.80 → PPD = (21.90+21.00+21.80)/3
- = 21.5667 ≈ 21.57.
-- PPD (21.57) > PPW (21.37) → M îndeplinit. E crossing doar dacă în ziua precedentă
- PPD era sub PPW (exemplul nu arată ziua precedentă; presupune-o). Trigger = prima candelă de
- 60 min care închide peste PPD curent. SL = low-ul cel mai jos din ultimele 4
- candele de 60 min de la trigger. Dacă low-ul e 21.10, 1R = entry − 21.10; TP1 = entry
- + 1R.
-
Ce se rupe din cauza lichidității (ordine de mărime — judecata mea):
-- Spread-ul mănâncă din R. La numele mari (TLV, SNP) spread-ul tipic e de ordinul
- a 1-2 tick-uri (~0.1-0.3%); la cele medii (M, DIGI) poate fi 0.5-1%. Un TP de 1:1
- la 2-3% supraviețuiește; un TP de 1:1 la ~1.5% e mâncat pe 20-40% de spread-ul
- dus-întors.
-- SL-ul de 4 candele e prins de zgomot. Range-ul zilnic tipic la numele BET mari
- e ~1-2%; low-ul a 4 candele poate cădea la 2-4% sub intrare, adică exact în zona
- zgomotului normal. Rezultatul: mai multe stop-uri pe wick, apoi revers. Soluția nu e
- să apropii stopul, ci să-l lărgești și să micșorezi poziția.
-- Gap-uri la deschidere. Licitația de la 10:00 și știrile locale pot deschide peste
- SL-ul de 4 candele (1-3% gap); stopul se execută la deschidere, nu la nivelul dorit.
-- Short-ul lipsește. Jumătate din simetrie (M pe sub, SL pe high, TP în jos) cade;
- rămâne doar long.
-- Fără scaner, screening-ul pe zeci-sute de simboluri dispare; rămâi cu 8-10 nume
- verificate manual.
-
Verdict:merge degradat. Pivoții clasici și comparația celor doi pivoți se pot
-replica 1:1 în Excel, iar OBV/ATR există peste tot. Ce nu se poate replica sunt
-trigger-ele fine (buy/sell momentum) și detecția automată.
-
Cât din strategie supraviețuiește, în procente (judecata mea): ~60-70%, doar
-long-only. Rămâne miezul logic — doi pivoți, crossing, close peste pivotul mic, SL la
-4 candele (sau swing low la bottom major), TP1 1:1 și trail. Se pierde trigger-ul fin
-(înlocuit cu un trigger standard de candelă), scanerul, short-ul și proiecțiile PPA.
-
-
Ce trebuie să exersezi ca s-o poți folosi
+
Ce trebuie să exersezi
-
Calculează 20 de pivoți în Excel, pe 5 simboluri, timp de 4 săptămâni. Verifică
- că PPD și PPW concordă cu ce arată platforma (dacă o ai). Scop măsurabil: 20 de
- perechi de pivoți calculate corect, la mână.
-
Marchează retroactiv 20 de crossing-uri pe grafice daily/weekly (le poți căuta
- pe 2-3 ani de istoric). Pentru fiecare, notează: era crossing nou sau buy the dip?
- Care a fost prima candelă de trigger? Unde era SL-ul la 4 candele?
-
Fă distincția crossing vs. buy the dip pe 20 de semnale, cu etichetele „DA
- crossing" / „NU buy the dip". Scop: să refuzi un semnal care arată aproape identic.
-
Backtest manual ~100 de tranzacții (cursul cere ~300, cu durată realistă de ~2
- luni — 09_QA/16_2025-10-07.md:161-172; 100 e pragul meu de pornire, nu al cursului): crossing-only, primul semnal, SL la 4 candele,
- TP1 1:1. Numără win rate-ul și câștigul mediu și compară cu 61.9% / ~8% (2025)
- din material (09_QA/06_2026-04-28.md:18-21).
-
Ține un jurnal cu 3 coloane: a fost crossing sau buy the dip, a fost primul
- semnal, a fost vreun filtru pus peste. După 20 de rânduri, ar trebui să vezi singur
- de ce filtrul și buy-the-dip-ul strică statisticile.
+
Calculează 20 de perechi de pivoți în Excel, pe 5 simboluri, timp de 4
+ săptămâni, și verifică-le față de ce arată platforma.
+
Marchează retroactiv 20 de crossing-uri pe grafice daily/weekly și
+ notează, pentru fiecare: era crossing sau buy the dip, care a fost prima
+ bară de trigger, unde cădea stopul de 4 bare.
+
Fă distincția crossing / buy the dip pe 20 de semnale, cu etichete „DA" și
+ „NU" — scopul e să refuzi un semnal care arată aproape identic.
+
Backtestează manual în jur de 100 de tranzacții (cursul cere vreo 300, cu
+ o durată realistă de două luni; 100 e pragul meu de pornire): numai
+ crossing-uri, numai primul semnal, stop la 4 bare, prima țintă 1:1.
+ Compară rezultatul cu 61,9 % și circa 8 % din material.
+
Legături: 03_m2d.md (același stop la 4 bare, același trail —
+diferă doar sursa direcției), 01_buy_doji.md (MP² spune
+unde, buy doji spune când), 04_selectia.md (filtrele
+dinainte de strategie), A1_risc.md.
-
Legături
+
+
Checklist de tipărit
-
Se leagă direct de M2D (03_m2d.md): același SL la 4 candele, același bull/bear
- trail, aceeași regulă de poziții multiple (M2D permite 2-3, MP² 2 — 03_MODUL_2/14_strategia_1_m2d.md:64-66) — diferă doar sursa direcției (M2D = momentum pe
- două TF-uri; MP² = doi pivoți). Când ai ambele semnale în același punct, le citesc ca
- confirmări independente (judecata mea; la BRK.B au apărut împreună, M2D cu o candelă
- înainte — 09_QA/23_2025-07-29.md:552-560).
-
Se completează cu Buy Doji / Sell Doji (01_buy_doji.md): pe BVB, MP² dă unde
- (bottom-ul, crossing-ul), iar buy doji dă când (trigger-ul de candelă standard).