Files
atm-curs-dl/gen/strategii/mp2_trigger.py
Claude Agent 2ea599f265 02_mp2: capitol reconstruit dupa sablon
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
2026-09-20 12:51:58 +00:00

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)