"""MP² — tot trade-ul pe o singură diagramă (Nivelul 1 din `02_mp2.md`). Aceeași serie ca restul capitolului (`mp2_serie.py`): 5 ședințe de câte 7 bare de 60 de minute. Pe desen: pivotul weekly (mare) ca linie orizontală, pivotul daily (mic) ca linie în trepte care se recalculează în fiecare zi, crossing-ul, bara de trigger, stopul, TP1 și ieșirea pe trail. Rulare: python3 gen/strategii/mp2_ansamblu.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, Zone # noqa: E402 import mp2_serie as S # noqa: E402 OUT = Path(__file__).with_suffix(".svg") GREEN, RED, BLUE, GRAY, ORANGE = "#188a3e", "#c00", "#1a5fb4", "#777", "#b06000" W = 720 zi4a, zi4b = S.ZI4 * S.BARE_ZI, (S.ZI4 + 1) * S.BARE_ZI - 1 ch = Chart( candles=S.CDS, levels=[Level(S.TP1, f"TP1 {S.TP1:.2f} — poziția 1", GREEN, "2 3", "left"), Level(S.ENTRY, f"intrarea {S.ENTRY:.2f}", "#333", "4 3", "left"), Level(S.SL, f"stopul {S.SL:.2f}", RED, "6 3", "left"), Level(S.PPW, f"pivot weekly (mare) {S.PPW:.2f}", GRAY, "8 4", "right")], zones=[Zone(zi4a, zi4b, "ziua a 4-a: pivotul mic e deja peste cel mare", BLUE)], arrows=[ Arrow(S.TRIGGER, f"aici intri: {S.ENTRY:.2f}\nprima bară care ÎNCHIDE\npeste pivotul mic", where="above", color=GREEN, dx=-118, dy=-6), Arrow(22, f"stopul: {S.SL:.2f}\nminimul ultimelor {S.BARE_STOP} bare —\n" f"sub el, cumpărătorii nu mai au controlul", where="below", price=S.SL, color=RED, dx=126, dy=4), Arrow(S.I_TP1, f"poziția 1 iese la {S.TP1:.2f}:\nexact cât ai riscat (1:1)", where="right", price=S.TP1, color=GREEN, dx=78, dy=-40), Arrow(S.IESIRE, f"poziția 2 iese la {S.IES_PRET:.2f},\nprima închidere sub trail", where="right", color=ORANGE, dy=44), ], scale=17.0, gap=15, body_w=9, left=52, width=W, top=40, vol_h=64, vol_label="volum", title="Exemplu construit — bare de 60 de minute, 5 ședințe", caption=f"Crossing: pivotul mic urcă de la {S.PPD[S.ZI4 - 1]:.2f} la {S.PPD[S.ZI4]:.2f}, " f"peste cel mare ({S.PPW:.2f}) — de-abia de acolo cauți trigger-ul.") svg = ch.render() off = S.offset(svg, ch) y_ppd = ch._y(S.PPD[-1]) + off inject = [ f'', f'' f'pivot daily (mic)', ] # marcajul crossing-ului: treapta verticală a pivotului mic, între ziua 3 și 4 xc = ch._cx(zi4a) - 7.5 y_de, y_la = ch._y(S.PPD[S.ZI4 - 1]) + off, ch._y(S.PPD[S.ZI4]) + off inject += [ f'', f'crossing', ] svg = S.injecteaza(svg, inject) assert y_de > y_la, "crossing-ul nu urcă pe desen" assert abs((ch._y(S.SL) - ch._y(S.ENTRY)) - (ch._y(S.ENTRY) - ch._y(S.TP1))) < 0.01, \ "1R în sus nu e desenat cât 1R în jos" h = float(svg.split('viewBox="0 0 ')[1].split('"')[0].split()[1]) w = float(svg.split('viewBox="0 0 ')[1].split()[0]) S.scrie(OUT, svg, w, h)