"""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)