#!/usr/bin/env python3 """MBT-10 — singura bucată reconstituibilă: close peste pivotul daily. Aceleași bare ca la pasul „unde" (importate din `hammer_mbt10_mbt_confluente`), tăiate în jurul trigger-ului. Bara 18 atinge pivotul 89.60 în timpul zilei, dar se închide sub el: nu e semnal. Bara 19 se închide la 89.90, peste pivot: aici intri, la close. Rulare: python3 gen/strategii/hammer_mbt10_mbt_ppd.py """ import re import sys; sys.path.insert(0, "/workspace/atm-curs-dl") sys.path.insert(0, "/workspace/atm-curs-dl/gen/strategii") from pathlib import Path from hammer_mbt10_mbt_confluente import CLOSE_I, INTRARE, PPD, SUP_W, serie from svg_candles import Arrow, Chart, Level, Zone OUT = Path(__file__).with_suffix(".svg") GREEN, RED, BLUE, ORANGE, GREY = "#188a3e", "#c00", "#1a5fb4", "#b06000", "#555" cds = serie() I0, I1 = 9, 22 w = cds[I0:I1 + 1] sh = lambda i: i - I0 # noqa: E731 NU, DA = CLOSE_I - 1, CLOSE_I assert cds[NU].h > PPD > cds[NU].c, "bara 18 nu mai e contraexemplul așteptat" assert cds[DA].c > PPD and round(cds[DA].c, 2) == INTRARE assert 0 <= sh(NU) < len(w) and sh(DA) < len(w), "fereastra nu prinde cele două bare" assert max(c.c for c in cds[I0:DA]) < PPD, "o bară din fereastră închide deja peste pivot" ch = Chart( candles=w, levels=[Level(PPD, "pivotul daily 89.60", BLUE), Level(SUP_W, "suport weekly 87.50", GREY, label_at="left")], zones=[Zone(sh(NU), sh(DA), "cele două zile care se compară", ORANGE)], arrows=[ Arrow(sh(NU), "a atins 89.70 în timpul zilei,\ndar s-a închis la 89.40, sub pivot:\nnu e semnal", where="below", color=RED, dx=-190, dy=40), Arrow(sh(DA), "s-a închis la 89.90, peste pivot:\naici intri, la close-ul zilei", where="above", color=GREEN, dx=-70, dy=-20), ], scale=44.0, gap=26, body_w=13, left=64, width=680, vol_h=60, vol_label="volum", title="MBT-10 — condiția de preț: close peste pivotul daily (exemplu construit)", ) svg = ch.render() m = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg) W, H = int(m.group(1)), int(m.group(2)) linii = [ ("Pivotul daily se recalculează în fiecare zi din maximul, minimul și închiderea zilei " "precedente;", "#333"), ("linia desenată e valoarea din ziua intrării, 89.60, nu un nivel fix.", "#333"), ("Asta e tot ce se poate verifica din MBT-10 fără indicatorul proprietar — „prima " "componentă\" din el,", GREY), ("cum îi spune materialul; restul formulei nu e publicat nicăieri.", GREY), ] add = 16 * len(linii) + 10 svg = svg.replace(f'viewBox="0 0 {W} {H}"', f'viewBox="0 0 {W} {H + add}"') svg = svg.replace("", "".join( f'{t}' for i, (t, c) in enumerate(linii)) + "") assert "\n\n" not in svg, "linie goală în SVG" OUT.write_text(svg, encoding="utf-8") print(f"scris {OUT.name} ({W}x{H + add})")