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
68 lines
3.2 KiB
Python
68 lines
3.2 KiB
Python
"""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'<polyline points="{S.trepte(ch, ppd, off)}" fill="none" stroke="{BLUE}" stroke-width="1.8"/>',
|
|
f'<text x="{ch._cx(d_da + 2):.1f}" y="{ch._y(ppd[-1]) + off + 15:.1f}" fill="{BLUE}" '
|
|
f'text-anchor="middle" style="font-weight:bold">pivot daily (mic) {ppd[-1]:.2f}</text>',
|
|
f'<text x="{ch._cx(1):.1f}" y="{ch._y(ppd[0]) + off + 15:.1f}" fill="{BLUE}" '
|
|
f'style="font-weight:bold">pivot daily (mic) {ppd[0]:.2f}</text>',
|
|
])
|
|
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)
|