Nivelurile 1-2-3, cei 6 pasi cu diagrama fiecare, mini-glosar de 34 de termeni, oglinda pe short cu diagrama ei proprie, checklist. Sursele in fise/02_mp2_surse.md. Toate diagramele procedurii ies acum dintr-o singura serie (mp2_serie.py), deci capitolul nu mai poate avea doua reguli numerice. Ansamblul folosea NVDA cu stop la swing low absolut (-23 %), adica alta regula decat procedura celor 4 bare; NVDA a devenit "bottom", la nivelul 3, marcat explicit ca exceptie. perechi_tf e diagrama cu doua timeframe-uri: panoul mic e descompunerea reala a ultimelor 2 candele daily (1 zi = 7 bare de 60 min), cu pivotul weekly pe ambele panouri si conector. Pivotii se calculeaza din serie, nu sunt scrisi de mana. Reparate: trail-ul din proza era 600.05, calculul din serie da 600.75; doua SVG-uri aveau trimiteri fisier:linie desenate pe ele. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
73 lines
3.4 KiB
Python
73 lines
3.4 KiB
Python
"""MP² — tot trade-ul pe o singură diagramă (Nivelul 1 din `02_mp2.md`).
|
|
|
|
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.
|
|
|
|
Rulare: python3 gen/strategii/mp2_ansamblu.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, Zone # noqa: E402
|
|
import mp2_serie as S # noqa: E402
|
|
|
|
OUT = Path(__file__).with_suffix(".svg")
|
|
GREEN, RED, BLUE, GRAY, ORANGE = "#188a3e", "#c00", "#1a5fb4", "#777", "#b06000"
|
|
W = 720
|
|
|
|
zi4a, zi4b = S.ZI4 * S.BARE_ZI, (S.ZI4 + 1) * S.BARE_ZI - 1
|
|
|
|
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()
|
|
off = S.offset(svg, ch)
|
|
y_ppd = ch._y(S.PPD[-1]) + off
|
|
inject = [
|
|
f'<polyline points="{S.trepte(ch, S.PPD_BARA, off)}" fill="none" stroke="{BLUE}" '
|
|
f'stroke-width="1.8"/>',
|
|
f'<text x="{W - 16}" y="{y_ppd - 7:.1f}" fill="{BLUE}" text-anchor="end">'
|
|
f'pivot daily (mic)</text>',
|
|
]
|
|
# 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'<circle cx="{xc:.1f}" cy="{(y_de + y_la) / 2:.1f}" r="{(y_de - y_la) / 2 + 4:.1f}" '
|
|
f'fill="none" stroke="{BLUE}" stroke-width="1.4" stroke-dasharray="3 2"/>',
|
|
f'<text x="{xc:.1f}" y="{y_de + 20:.1f}" fill="{BLUE}" text-anchor="middle" '
|
|
f'style="font-weight:bold">crossing</text>',
|
|
]
|
|
svg = S.injecteaza(svg, inject)
|
|
|
|
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)
|