Files
atm-curs-dl/gen/strategii/mp2_short.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

88 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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