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
88 lines
3.8 KiB
Python
88 lines
3.8 KiB
Python
"""MP² pe short — aceeași procedură, întoarsă (oglinda din `02_mp2.md`).
|
||
|
||
Alt simbol, altă scară de preț (în jur de 128 $, nu 590 $): structura e
|
||
aceeași serie, întoarsă cu p' = 246.40 − 0.2·p. Transformarea e afină și
|
||
descrescătoare, deci agregarea zilnică, pivoții și linia de trail se
|
||
păstrează exact — bull trail-ul devine bear trail fără să recalculez nimic.
|
||
|
||
Ce se schimbă față de long:
|
||
M pivotul mic e SUB cel mare, nu peste;
|
||
crossing pivotul mic coboară prin cel mare;
|
||
trigger prima bară care ÎNCHIDE sub pivotul mic;
|
||
stopul cel mai SUS high din ultimele 4 bare;
|
||
ținta la aceeași distanță, în jos.
|
||
|
||
Rulare: python3 gen/strategii/mp2_short.py
|
||
"""
|
||
import re
|
||
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, Zone # noqa: E402
|
||
import mp2_serie as S # noqa: E402
|
||
|
||
OUT = Path(__file__).with_suffix(".svg")
|
||
A, F = 246.40, 0.2
|
||
RED, BLUE, GRAY, GREEN, ORANGE = "#c00", "#1a5fb4", "#777", "#188a3e", "#b06000"
|
||
W = 720
|
||
|
||
|
||
def m(p):
|
||
return round(A - F * p, 2)
|
||
|
||
|
||
cds, ppw, ppd, ppd_bara = S.oglinda(A, F)
|
||
entry = cds[S.TRIGGER].c
|
||
sl = max(c.h for c in cds[S.TRIGGER - S.BARE_STOP + 1:S.TRIGGER + 1])
|
||
r = round(sl - entry, 2)
|
||
tp1 = round(entry - r, 2)
|
||
trail = [None if v is None or i < S.I_TP1 else m(v) for i, v in enumerate(S.TRAIL)]
|
||
ies = cds[S.IESIRE].c
|
||
zi4a = S.ZI4 * S.BARE_ZI
|
||
|
||
# tot ce scriu pe desen iese din serie
|
||
assert (entry, sl, tp1, r) == (128.00, 129.20, 126.80, 1.20), (entry, sl, tp1, r)
|
||
assert all(ppd[d] > ppw for d in range(S.ZI4)) and ppd[S.ZI4] < ppw, ppd
|
||
assert cds[S.TRIGGER].c < ppd_bara[S.TRIGGER] and cds[S.TRIGGER].c < cds[S.TRIGGER].o
|
||
assert S.TRIGGER == next(i for i in range(zi4a, zi4a + S.BARE_ZI)
|
||
if cds[i].c < ppd_bara[i]), "nu e prima închidere sub pivotul mic"
|
||
assert cds[S.IESIRE].c > trail[S.IESIRE] and min(c.l for c in cds[S.TRIGGER:S.I_TP1 + 1]) <= tp1
|
||
assert round((entry - ies) / r, 2) == 1.30
|
||
|
||
ch = Chart(
|
||
candles=cds,
|
||
levels=[Level(ppw, f"pivot weekly (mare) {ppw:.2f}", GRAY, "8 4", "right"),
|
||
Level(sl, f"stopul {sl:.2f}", RED, "6 3", "right"),
|
||
Level(entry, f"intrarea (short) {entry:.2f}", "#333", "4 3", "right"),
|
||
Level(tp1, f"TP1 {tp1:.2f} = intrarea − 1R", GREEN, "2 3", "left")],
|
||
zones=[Zone(zi4a, len(cds) - 1, "pivotul mic e deja SUB cel mare", BLUE)],
|
||
arrows=[
|
||
Arrow(S.TRIGGER, f"aici intri short: {entry:.2f}\nprima bară care ÎNCHIDE "
|
||
f"sub pivotul mic",
|
||
where="below", color=RED, dx=-108, dy=26),
|
||
Arrow(S.I_TP1, f"poziția 1 iese la {tp1:.2f} (1:1)", where="right", price=tp1,
|
||
color=GREEN, dx=78, dy=30),
|
||
Arrow(S.IESIRE, f"poziția 2 iese la {ies:.2f},\nprima închidere peste trail",
|
||
where="right", color=ORANGE, dy=-34),
|
||
],
|
||
scale=55.0, gap=15, body_w=9, left=52, width=W, top=40,
|
||
title="Oglinda — Sell / short: alt simbol, altă scară, aceleași reguli",
|
||
caption="Albastru în trepte = pivotul daily (mic); portocaliu = bear trail, "
|
||
"high-ul ultimei bare cu minim nou.")
|
||
|
||
svg = ch.render()
|
||
off = S.offset(svg, ch)
|
||
svg = S.injecteaza(svg, [
|
||
f'<polyline points="{S.trepte(ch, ppd_bara, off)}" fill="none" stroke="{BLUE}" '
|
||
f'stroke-width="1.8"/>',
|
||
f'<polyline points="{S.trepte(ch, trail, off)}" fill="none" stroke="{ORANGE}" '
|
||
f'stroke-width="1.8"/>',
|
||
f'<text x="{ch._cx(zi4a + 6):.1f}" y="{ch._y(ppd[S.ZI4]) + off + 15:.1f}" fill="{BLUE}" '
|
||
f'text-anchor="middle" style="font-weight:bold">{ppd[S.ZI4]:.2f}: crossing bear</text>',
|
||
])
|
||
h = float(re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg).group(1))
|
||
w = float(re.search(r'viewBox="0 0 ([\d.]+)', svg).group(1))
|
||
S.scrie(OUT, svg, w, h)
|