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
This commit is contained in:
67
gen/strategii/mp2_trigger.py
Normal file
67
gen/strategii/mp2_trigger.py
Normal file
@@ -0,0 +1,67 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user