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