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
108 lines
5.8 KiB
Python
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)
|