Files
atm-curs-dl/gen/az_ym_divergenta.py
Claude Agent 8dcaa1b89f materialul de la autor (18.09), regula 1 in documente, predare
Trei capturi din platforma autorului, primite pe WhatsApp - prima sursa
din proiect care nu vine din audio->text. @YM, 18.09.2026, acelasi trade
urmarit pe trei niveluri de zoom: divergenta bear la maxim nou, trigger-ul
din banda M2D MAPS, si canalul descendent de toata ziua.

05_volum.md primeste sectiunea 10, cu doua diagrame generate din
nivelurile lui reale (maxim 52.380, ultimul pret 52.186). Cele ~6R din
tabel sunt marimea miscarii, nu rezultatul lui declarat: pe capturi nu e
marcata nicio intrare. Trei afirmatii ale lui nu se pot verifica din
imagini si sunt scrise explicit ca neconfirmate.

STYLE.md: capturile de la autor sunt acum un tip de sursa admis, cu
reguli - ticker real permis pentru ca nivelurile sunt reale, ce nu se
vede in captura nu se scrie ca regula, aritmetica verificata cu assert.

04_pivoti: regula rutinei de inceput de perioada, adaugata de agentul
redactor. Citatele verificate de mine in transcriere.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
2026-09-18 12:08:00 +00:00

108 lines
5.8 KiB
Python

"""Diagramele pentru postarea autorului din 18.09.2026 (@YM, Dow futures).
Sursa: trei capturi de ecran din platforma lui, in `docs/strategie/`, plus
mesajele de pe WhatsApp. Recolta: `harvest/2026-09-18-autor.md`.
Nivelurile sunt ale lui, citite din bara de stare a platformei si de pe axa:
maxim 52.380, minim 52.147, ultimul pret 52.186, plecarea de la ~52.160.
Structura barelor intre nivelurile alea e construita de mine, la scara -
capturile n-au fiecare bara lizibila.
Ticker real, pentru ca nivelurile sunt reale (regula din STYLE.md); legenda
spune la fiecare diagrama ce e al lui si ce e construit.
"""
import sys; sys.path.insert(0, "/workspace/atm-curs-dl")
from pathlib import Path
from svg_candles import Chart, Level, Mark, MA, from_closes
# ---------------------------------------------------------------- D1: ziua, pe 5 minute
# urcare de la ~52.160 (03:00) la 52.380 (~10:00), apoi canal descendent pana la 52.186
closes = [52168, 52178, 52172, 52190, 52205, 52198, 52218, 52232, 52226, 52248, # urcare, volum in crestere
52262, 52255, 52274, 52290, 52284, 52302, 52316, 52309, 52328, 52340, # volum incepe sa scada
52352, 52344, 52362, 52356, 52370, 52364, 52376, 52368, 52374, 52358, # maximele noi, volum tot mai mic
52336, 52318, 52330, 52300, 52282, 52294, 52264, 52246, 52258, 52228, # canalul descendent
52210, 52222, 52196, 52186]
# varfurile: maximul zilei 52.380 cade pe bara 26; minimul 52.147 pe bara 42
# tupla e (mecha de sus, mecha de jos); bara 26 e maximul zilei, 52.380
wicks = [(6, 6)] * 20 + [(7, 7), (6, 5), (6, 8), (5, 6), (6, 9), (5, 6), (4, 5), (2, 6), (4, 6), (4, 7)] \
+ [(9, 5), (8, 5), (6, 8), (9, 5), (8, 5), (6, 7), (9, 4), (9, 4), (6, 7), (10, 4)] \
+ [(9, 4), (6, 7), (14, 4), (9, 5)]
# volumul: varf pe la barele 8-12 (07:30-08:00), apoi scade pe maximele noi = divergenta
vols = [38, 42, 40, 48, 55, 52, 63, 71, 78, 84,
81, 76, 72, 68, 64, 61, 57, 54, 51, 48,
46, 43, 41, 39, 38, 36, 35, 34, 36, 44,
58, 62, 55, 68, 72, 64, 76, 81, 70, 88,
79, 71, 94, 83]
cds = from_closes([float(c) for c in closes], wicks=[(float(a), float(b)) for a, b in wicks],
vols=[float(v) for v in vols], start=52160.0)
top = max(c.h for c in cds[20:30])
ultim = cds[-1].c
vol_urcare = max(vols[5:15])
vol_varf = max(vols[22:30])
assert abs(top - 52380) < 2, top
assert abs(ultim - 52186) < 2, ultim
assert vol_varf < vol_urcare * 0.6, (vol_varf, vol_urcare)
# 52.147 e minimul SESIUNII din bara de stare, nu al ferestrei desenate (01:30-14:30);
# nu se poate plasa pe grafic din captura, deci nu apare pe el.
print(f"D1 maxim {top:.0f} (al lui: 52.380), ultimul pret {ultim:.0f} (al lui: 52.186), "
f"volum pe urcare {vol_urcare} -> pe maximele noi {vol_varf}")
puncte = top - 52186
print(f"D1 miscare {puncte:.0f} puncte = {puncte / 52380 * 100:.2f}%, "
f"{puncte * 5:.0f} $/contract la 5 $/punct; la un stop de 0.06% (~31 p) = {puncte / 31:.1f}R")
d1 = Chart(
candles=cds,
levels=[Level(52380, "maxim 52.380", "#c00"),
Level(52186, "ultimul pret 52.186", "#777")],
marks=[Mark(26, "maxim nou, volum mai mic", "#c00"),
Mark(38, "canal descendent", "#1a5fb4", "below")],
mas=[MA(20, "#b06000", dash="4 3")],
scale=1.0, gap=15, body_w=9, left=44, width=680, top=54, vol_h=70,
vol_label="volum", title="@YM (Dow futures) — 5 min, 18.09.2026",
caption="Ale lui: 52.380, 52.186 și citirea divergenței. Barele sunt construite de mine, la scară.")
# ---------------------------------------------------------------- D2: maximul, pe 15 secunde
# fereastra 09:40-10:10: maximul de 52.377, wedge-ul, ruperea, minimul de 52.330
c2 = [52362, 52366, 52361, 52369, 52364, 52371, 52367, 52373, 52369, 52375, # maximele noi
52371, 52373, 52369, 52371, 52367, 52369, 52365, 52367, 52363, 52365, # wedge: maxime tot mai jos
52361, 52355, 52358, 52349, 52342, 52346, 52338, 52333, 52336, 52330] # ruperea
w2 = [(2, 1)] * 9 + [(1, 2)] + [(2, 1)] * 10 + [(3, 2), (4, 2), (2, 3), (4, 2), (5, 2), (2, 3), (4, 2), (4, 2), (2, 3), (3, 2)]
v2 = [52, 48, 45, 43, 40, 38, 36, 34, 32, 30,
29, 27, 26, 24, 23, 22, 21, 20, 19, 18,
44, 51, 43, 58, 64, 49, 68, 72, 55, 61]
cds2 = from_closes([float(c) for c in c2], wicks=[(float(a), float(b)) for a, b in w2],
vols=[float(v) for v in v2], start=52358.0)
top2 = max(c.h for c in cds2[:12])
low2 = min(c.l for c in cds2[24:])
assert abs(top2 - 52377) < 2, top2
assert abs(low2 - 52330) < 3, low2
assert v2[19] < v2[0] * 0.5, (v2[0], v2[19])
print(f"D2 maxim {top2:.0f} (al lui: 52.377), minim {low2:.0f} (al lui: ~52.330), "
f"volum {v2[0]} -> {v2[19]} in wedge")
d2 = Chart(
candles=cds2,
levels=[Level(52377, "52.377", "#c00"),
Level(52330, "52.330 dupa rupere", "#1a5fb4")],
marks=[Mark(20, "M2D MAPS trece pe roșu", "#6a3d9a", "below", dy=52),
Mark(27, "ruperea", "#188a3e", "below")],
scale=5.0, gap=15, body_w=9, left=44, width=680, top=48, vol_h=70,
vol_label="volum", title="@YM — 15 secunde, 09:40-10:10, 18.09.2026",
caption="Ale lui: 52.377, ruperea spre 52.330 și săgeata spre banda M2D MAPS. Barele sunt ale mele.")
# ---------------------------------------------------------------- substitutie in .md
import re # noqa: E402
MD = Path("/workspace/atm-curs-dl/summaries/08_ANALIZA_ZILNICA/05_volum.md")
if MD.exists():
md = MD.read_text(encoding="utf-8")
for name, svg in [("ym_zi", d1.render()), ("ym_15sec", d2.render())]:
assert re.search(rf"<!--SVG:{name}-->", md), f"marcatorul {name} lipseste din .md"
md = re.sub(rf"<!--SVG:{name}-->(?:\n<svg.*?</svg>)?\n<!--/SVG-->",
lambda _m, name=name, svg=svg: f"<!--SVG:{name}-->\n{svg}\n<!--/SVG-->",
md, flags=re.S)
MD.write_text(md, encoding="utf-8")
print("scris", MD)