diagrame: trei desene care aratau altceva decat spune regula

m2d_exemplu (Riot): eticheta zicea 'close peste bear trail = iesi' pe o bara
care se inchidea SUB linie - doar fitilul trecea, adica exact cazul pe care
capitolul il interzice de trei ori. Seria refacuta, cu assert care recalculeaza
trail-ul din serie si cere ca bara de iesire sa inchida peste el.

mbp_exemplu: candela M se inchidea la 660.50 sub banda de 660.90, iar
generatorul chiar afirma relatia inversa ('assert BAND > c'); desenul arata un
setup invalid ca valid. Plus stopul 662.71, care plutea 1.71 deasupra extremei
celor 4 bare - exact marja pe care capitolul o declara absenta la MBP.
Ambele reparate, cu assert pe fiecare.

atmi_orizont: trei etichete purtau 'fisier:linie' in desen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
This commit is contained in:
Claude Agent
2026-09-22 20:08:48 +00:00
parent f80fef4e2f
commit c564bf1be5
7 changed files with 265 additions and 111 deletions

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""Orizontul de ținere al ATMI — două descrieri incompatibile, pe aceeași axă.
Pentru `strategii/03_atmi.md`, marcajul `<!-- DIAGRAMA: orizont -->`.
Pentru `strategii/05_atmi.md`, marcajul `<!-- DIAGRAMA: orizont -->`.
Nu e grafic de preț, e o linie de timp comparativă: SVG scris de mână, doar
stdlib — nu se folosește svg_candles / pchart.
@@ -19,6 +19,7 @@ Barele sunt pe o axă comună 0 → 1 an, ca diferența să fie vizibilă; bara
Rulare: python3 gen/strategii/atmi_orizont.py -> gen/strategii/atmi_orizont.svg
"""
import re
from pathlib import Path
from xml.sax.saxutils import escape
@@ -102,8 +103,7 @@ def build():
p.append(line(AX_X1, 164, AX_X1, 226, BLUE, 1.2, "4 3"))
p.append(txt(AX_X1, 244, "TP1 atins — aproximativ un an mai târziu",
13, "400", BLUE, "end"))
p.append(txt(AX_X0, 262, "Sursă: 04_MODUL_3/03_strategia_2_atmi.md:26-29; "
":358-363", 11, "400", GRAY, "start"))
p.append(txt(AX_X0, 262, "Sursă: lecția de ATMI", 11, "400", GRAY, "start"))
# ------- bara de jos: adaptarea pentru prop
p.append(txt(AX_X0, 282, "ATMI ca adaptare pentru prop — Q&A 11.06.2025",
@@ -127,7 +127,7 @@ def build():
"„Ai nevoie de 3 transacții să califici propul.”",
13, "400", BLACK))
p.append(txt(CARD_X + CARD_W / 2, 382,
"Sursă: 09_QA/26_2025-06-11.md:225-227", 11, "400", GRAY))
"Sursă: Q&A 11.06.2025", 11, "400", GRAY))
# ------- cutia de anotare
p.append(f'<rect x="{BOX_X}" y="{BOX_Y}" width="{BOX_W}" height="{BOX_H}" '
@@ -140,7 +140,7 @@ def build():
13, "400", BLACK, "start"))
p.append(txt(BOX_X + 20, 510, "iar la atingere pozițiile se pot închide — chiar în profit.",
13, "400", BLACK, "start"))
p.append(txt(BOX_X + 20, 530, "Sursă: 09_QA/26_2025-06-11.md:216-222",
p.append(txt(BOX_X + 20, 530, "Sursă: Q&A 11.06.2025",
11, "400", GRAY, "start"))
p.append(txt(BOX_X + 20, 560,
"Notă: cele două descrieri nu se rezolvă aici — de clarificat "
@@ -212,11 +212,15 @@ def verify(svg):
"limita zilnică se calculează",
"pozițiile se pot închide",
"nu se rezolvă aici",
"03_strategia_2_atmi.md:26-29",
"09_QA/26_2025-06-11.md:225-227",
"09_QA/26_2025-06-11.md:216-222"):
"Sursă: lecția de ATMI",
escape("Sursă: Q&A 11.06.2025")):
assert cheie in svg, f"lipsește din desen: {cheie!r}"
# 6b. nicio trimitere „fișier:linie” în etichetele SVG: sursele trăiesc
# doar în fișa capitolului (regulă din șablon, curățată și la cap. 06)
assert not re.search(r"\.(md|txt):\d", svg), \
"eticheta SVG nu are voie să conțină trimitere fișier:linie"
# 7. fără cifre de preț inventate
for interzis in ("$", "USD", "SL ", "intrare "):
assert interzis not in svg, f"nu ar trebui să apară preț: {interzis!r}"

View File

@@ -25,7 +25,7 @@
<text x="350.0" y="198.0" font-size="13" font-weight="400" fill="#000000" text-anchor="middle">„fără stop-loss, poziția ținută luni/ani”</text>
<line x1="650.0" y1="164.0" x2="650.0" y2="226.0" stroke="#1a5fb4" stroke-width="1.2" stroke-dasharray="4 3"/>
<text x="650.0" y="244.0" font-size="13" font-weight="400" fill="#1a5fb4" text-anchor="end">TP1 atins — aproximativ un an mai târziu</text>
<text x="60.0" y="262.0" font-size="11" font-weight="400" fill="#777777" text-anchor="start">Sursă: 04_MODUL_3/03_strategia_2_atmi.md:26-29; :358-363</text>
<text x="60.0" y="262.0" font-size="11" font-weight="400" fill="#777777" text-anchor="start">Sursă: lecția de ATMI</text>
<text x="60.0" y="282.0" font-size="15" font-weight="700" fill="#b06000" text-anchor="start">ATMI ca adaptare pentru prop — Q&amp;A 11.06.2025</text>
<rect x="60.0" y="298.0" width="22.7" height="42" rx="6" fill="#fdf0e0" stroke="#b06000" stroke-width="1.5"/>
<line x1="82.7" y1="290.0" x2="82.7" y2="360.0" stroke="#b06000" stroke-width="1.2" stroke-dasharray="4 3"/>
@@ -35,12 +35,12 @@
<text x="410.0" y="316.0" font-size="13" font-weight="400" fill="#000000" text-anchor="middle">„aștepți o corecție și intri pe ATMI la suport quarterly,</text>
<text x="410.0" y="334.0" font-size="13" font-weight="400" fill="#000000" text-anchor="middle">swing, 2 săptămâni în poziție”</text>
<text x="410.0" y="358.0" font-size="13" font-weight="400" fill="#000000" text-anchor="middle">„Ai nevoie de 3 transacții să califici propul.”</text>
<text x="410.0" y="382.0" font-size="11" font-weight="400" fill="#777777" text-anchor="middle">Sursă: 09_QA/26_2025-06-11.md:225-227</text>
<text x="410.0" y="382.0" font-size="11" font-weight="400" fill="#777777" text-anchor="middle">Sursă: Q&amp;A 11.06.2025</text>
<rect x="40.0" y="440.0" width="620.0" height="150.0" rx="8" fill="#fafafa" stroke="#777777" stroke-width="1.2"/>
<text x="60.0" y="466.0" font-size="14" font-weight="700" fill="#000000" text-anchor="start">Anotare separată — mecanismul care face diferența</text>
<text x="60.0" y="492.0" font-size="13" font-weight="400" fill="#000000" text-anchor="start">Pe prop, limita zilnică se calculează și pe pozițiile deschise,</text>
<text x="60.0" y="510.0" font-size="13" font-weight="400" fill="#000000" text-anchor="start">iar la atingere pozițiile se pot închide — chiar în profit.</text>
<text x="60.0" y="530.0" font-size="11" font-weight="400" fill="#777777" text-anchor="start">Sursă: 09_QA/26_2025-06-11.md:216-222</text>
<text x="60.0" y="530.0" font-size="11" font-weight="400" fill="#777777" text-anchor="start">Sursă: Q&amp;A 11.06.2025</text>
<text x="60.0" y="560.0" font-size="13" font-weight="700" fill="#000000" text-anchor="start">Notă: cele două descrieri nu se rezolvă aici — de clarificat cu autorul.</text>
<text x="350.0" y="626.0" font-size="12" font-weight="400" fill="#777777" text-anchor="middle">Fără axe de preț și fără să alegem una dintre variante.</text>
<text x="350.0" y="646.0" font-size="12" font-weight="400" fill="#777777" text-anchor="middle">Bara de 2 săptămâni e scurtă exact pentru că atât ține, pe aceeași scară.</text>

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -13,6 +13,12 @@ Legenda spune explicit lucrul ăsta.
Serie continuă de 30 de candele din lista de close-uri din specificație,
open = close-ul precedentului, wick-uri alese ca să scoată exact nivelurile
(candela 13: high 100.85 = SL), panou de volum dedesubt.
Bear trail-ul e calculat din serie cu regula capitolului (linia sare pe
high-ul barei care se închide sub low-ul precedentei; violare = o bară care
se închide PESTE linie) și desenat ca scară portocalie. Seria e construită
astfel încât fitilele să atingă linia de trei ori (barele 16, 20, 24) fără
s-o violeze, iar ieșirea să vină abia la bara 29, care închide peste linie.
"""
import re
import sys
@@ -34,22 +40,36 @@ closes = [
97.6, 97.1, 96.7, 96.3, 95.9, 95.6, 95.9, # 0-6 coborâre
96.4, 96.9, 97.5, 98.2, 99.0, 99.7, 100.3, # 7-13 pullback Buy (M)
100.00, # 14 trigger Sell (A)
99.5, 99.0, 98.5, 98.0, 97.6, 97.2, 96.9, 96.6, 96.3, 96.1,
95.8, 95.5, 95.2, 95.35, 95.45, # 15-29 bear trail
99.45, 99.80, 98.58, 98.10, 97.60, 97.95, 97.40, 96.90, 96.40, 96.75,
96.20, 95.70, 95.20, 95.00, 95.45, # 15-29 bear trail
]
assert len(closes) == 30, len(closes)
# wick-uri: candela 13 are nevoie de un wick sus până la 100.85 (SL-ul de 4
# candele); restul sunt mici, ca seria să arate ca un grafic real.
# candele); barele 16, 20 și 24 sunt retestări ale liniei de trail, deci au
# fitil lung în sus care atinge linia, dar se închid sub ea. Restul sunt mici,
# ca seria să arate ca un grafic real.
wicks = [
(0.15, 0.20), (0.12, 0.18), (0.15, 0.15), (0.10, 0.20), (0.12, 0.25),
(0.10, 0.30), (0.25, 0.15),
(0.20, 0.15), (0.15, 0.20), (0.20, 0.15), (0.20, 0.20), (0.20, 0.18),
(0.25, 0.15), (SL - 100.3, 0.15), # 13: high = 100.85
(0.15, 0.25), # 14: trigger Sell
(0.15, 0.20), (0.15, 0.18), (0.12, 0.20), (0.15, 0.18), (0.15, 0.20),
(0.12, 0.18), (0.15, 0.20), (0.12, 0.18), (0.15, 0.20), (0.12, 0.18),
(0.15, 0.20), (0.12, 0.18), (0.15, 0.20), (0.20, 0.15), (0.30, 0.10),
(0.15, 0.15), # 15
(0.45, 0.10), # 16 retest trail
(0.15, 0.15), # 17
(0.15, 0.15), # 18
(0.15, 0.15), # 19
(0.40, 0.10), # 20 retest trail
(0.15, 0.15), # 21
(0.15, 0.15), # 22
(0.15, 0.15), # 23
(0.40, 0.10), # 24 retest trail
(0.15, 0.15), # 25
(0.15, 0.15), # 26
(0.15, 0.15), # 27
(0.05, 0.05), # 28: coboară trail-ul
(0.20, 0.10), # 29: close peste trail
]
assert len(wicks) == 30, len(wicks)
@@ -95,6 +115,53 @@ for a, b in zip(cds, cds[1:]):
assert cds[14].c < cds[13].c, (cds[13].c, cds[14].c)
assert any(cds[i].c > cds[i].o for i in range(7, 14)), "pullback Buy absent"
# 10. bara 17 e la 1.42% profit (procentul real din curs)
assert abs((ENTRY - cds[17].c) / ENTRY - 0.0142) < 1e-4, cds[17].c
# ── bear trail, recalculat din serie cu regula capitolului ─────────────────
# Linia sare pe high-ul fiecărei bare care se închide sub low-ul precedentei;
# violarea = prima bară care se închide PESTE linie (fitilul singur nu scoate).
def bear_trail(candles, trig):
"""linie[i] = nivelul trail-ului în vigoare la începutul barei i (None până
se formează linia); iesire = prima bară închisă peste linie."""
linie, linie_la, iesire = None, [], None
for i, c in enumerate(candles):
linie_la.append(linie)
if i > trig and linie is not None and c.c > linie:
iesire = i
break
if i > trig:
p = candles[i - 1]
if c.c < p.l:
linie = c.h
while len(linie_la) < len(candles):
linie_la.append(linie)
return linie_la, iesire
LINIE, EXIT_BAR = bear_trail(cds, 14)
# 11. ieșirea e pe bara 29, care se închide PESTE linia de trail (nu doar fitilul)
assert EXIT_BAR == 29, f"ieșirea trebuie să fie pe bara 29, nu {EXIT_BAR}"
TRAIL_EXIT = LINIE[29]
assert TRAIL_EXIT is not None and cds[29].c > TRAIL_EXIT, (cds[29].c, TRAIL_EXIT)
# 12. linia nu urcă niciodată (e trail, nu nivel fix)
pas = [v for v in LINIE[15:30] if v is not None]
assert all(b <= a + 1e-9 for a, b in zip(pas, pas[1:])), pas
# 13. nicio bară dinainte de ieșire nu închide peste linie
for i in range(15, 29):
if LINIE[i] is not None:
assert cds[i].c < LINIE[i], (i, cds[i].c, LINIE[i])
# 14. fitilele au atins linia de mai multe ori fără s-o violeze pe close
atingeri = [i for i in range(15, 29) if LINIE[i] is not None
and cds[i].h >= LINIE[i] - 1e-9 and cds[i].c < LINIE[i]]
assert len(atingeri) >= 2, f"fitilele ating linia doar la barele {atingeri}"
assert set(atingeri) >= {16, 20, 24}, f"retestările lipsesc: {atingeri}"
# ── geometria, ca să așez marks-urile „below" fără suprapunere ─────────────
SCALE = 42
levels = [
@@ -177,8 +244,11 @@ definiții = [
def natural_y(i: int, where: str) -> float:
# „below": sub candelă, dar înainte de panoul de volum. Plafonul e cu 1 px
# sub limita de jos a candidaților, altfel când bara i are chiar minimul
# seriei nu mai rămâne niciun y întreg de testat și plasarea pică.
return (y(cds[i].h) - 10 if where == "above"
else min(y(cds[i].l) + 20, body_bottom + 14))
else min(y(cds[i].l) + 20, body_bottom + 13))
# candidați: toate y-urile care nu ating niciun corp de candelă, ordonate
@@ -239,6 +309,33 @@ ch = Chart(
svg = ch.render()
assert "<svg" in svg and svg.count("\n\n") == 0, "linie goală în SVG"
# ── linia de trail, desenată ca scară portocalie ───────────────────────────
# Nivelul desenat la bara i e cel în vigoare după bara i (linia sare pe bara
# care a închis sub low-ul precedentei). Eticheta stă la stânga primului
# palier, ca să nu treacă peste fitilul lung al barei 13.
def nivel_desen(i: int):
return LINIE[i + 1] if i + 1 < len(LINIE) else LINIE[i]
trail_parts, prev_y = [], None
for i in range(15, len(cds)):
v = nivel_desen(i)
if v is None:
continue
x0, x1, yv = cx(i) - GAP / 2, cx(i) + GAP / 2, y(v)
trail_parts.append(
f'<line x1="{x0:.1f}" y1="{yv:.1f}" x2="{x1:.1f}" y2="{yv:.1f}" '
f'stroke="#b06000" stroke-width="2"/>')
if prev_y is not None and abs(prev_y - yv) > 1e-9:
trail_parts.append(
f'<line x1="{x0:.1f}" y1="{prev_y:.1f}" x2="{x0:.1f}" y2="{yv:.1f}" '
f'stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>')
prev_y = yv
trail_parts.append(
f'<text x="{cx(13) - 6:.1f}" y="{y(nivel_desen(15)) - 14:.1f}" fill="#b06000" '
f'text-anchor="end" style="font-weight:bold">bear trail</text>')
svg = svg.replace("\n</svg>", "\n " + "\n ".join(trail_parts) + "\n</svg>")
# ── verificare: fiecare etichetă e în pânză și nu se suprapune alta ────────
m = re.search(r'viewBox="0 0 (\d+) (\d+)"', svg)
W, H = int(m.group(1)), int(m.group(2))

View File

@@ -34,9 +34,21 @@ Faza 2, candelele 7-13 — pullback în sus = Buy Momentum pe TF mic (M):
Faza 3, candela 14 — primul Sell după pullback = trigger (A):
open 100.30 (close-ul candelei 13), close 100.00.
Faza 4, candelele 15-29 — coborâre cu bear trail:
close-uri: 99.5, 99.0, 98.5, 98.0, 97.6, 97.2, 96.9, 96.6, 96.3, 96.1,
95.8, 95.5, 95.2, 95.35, 95.45
candela 29 (close 95.45) e ieșirea pe violarea bear trail-ului.
close-uri: 99.45, 99.80, 98.58, 98.10, 97.60, 97.95, 97.40, 96.90, 96.40,
96.75, 96.20, 95.70, 95.20, 95.00, 95.45
barele 16, 20 și 24 sunt retestări: fitil lung în sus care atinge linia de
trail, dar se închide sub ea (nu o violează). Candela 29 (close 95.45) e
ieșirea: se închide PESTE linia de trail (95.25), deci violarea e reală.
BEAR TRAIL (linia de trail, desenată ca scară portocalie)
---------------------------------------------------------
Regula capitolului: linia sare pe high-ul fiecărei bare care se închide sub
low-ul precedentei; violarea = prima bară care se închide PESTE linie.
Linia NU urcă niciodată. Seria e construită astfel încât fitilele barelor
16/20/24 să atingă linia fără s-o violeze, iar ieșirea să vină abia la bara
29, care închide peste linie (nu doar cu fitilul). Linia se desenează ca
scară (un palier pe bară, conector vertical între paliere), etichetă
„bear trail" lângă primul palier.
NIVELURI (Level) — exact acestea
--------------------------------
@@ -73,6 +85,15 @@ ASSERT-URI OBLIGATORII ÎN GENERATOR
8. Fiecare open == close-ul barei anterioare.
9. Candela 14 închide în jos față de candela 13 (trigger Sell după pullback Buy);
există cel puțin o candelă din 7-13 care închide în sus (pullback-ul Buy).
10. Bara 17 e la exact 1.42% profit față de intrare (procentul real din curs).
11. Bear trail recalculat din serie: ieșirea e pe bara 29, iar close-ul ei
(95.45) e PESTE linia de trail (95.25) — nu doar fitilul. (Pe seria veche
close-ul 95.45 era sub linia 95.65 și nu exista nicio ieșire.)
12. Linia de trail nu urcă niciodată (e trail, nu nivel fix).
13. Nicio bară dinainte de 29 nu închide peste linie (altfel ieșeai mai devreme).
14. Fitilele au atins linia de mai multe ori fără s-o violeze: barele 16, 20
și 24 au high ≥ linia în vigoare și close < ea. (Pe seria veche, pe
barele 15-28 niciun high nu ajungea la linie.)
SURSA CIFRELOR
--------------

View File

@@ -1,4 +1,4 @@
<svg viewBox="0 0 700 440" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">
<svg viewBox="0 0 700 444" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">
<text x="24" y="48" fill="#333" style="font-weight:bold">RIOT — 3 min (TF mare 15 min în Sell)</text>
<line x1="24" y1="56.0" x2="686" y2="56.0" stroke="#c00" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="672" y="50.0" fill="#c00" text-anchor="end">SL 100.85 = +0.85%</text>
@@ -39,71 +39,97 @@
<line x1="254.0" y1="72.8" x2="254.0" y2="102.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="249.0" y="79.1" width="10" height="12.6" fill="#c00"/>
<line x1="269.0" y1="85.4" x2="269.0" y2="121.1" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="264.0" y="91.7" width="10" height="21.0" fill="#c00"/>
<line x1="284.0" y1="106.4" x2="284.0" y2="141.3" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="279.0" y="112.7" width="10" height="21.0" fill="#c00"/>
<line x1="299.0" y1="128.7" x2="299.0" y2="163.1" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="294.0" y="133.7" width="10" height="21.0" fill="#c00"/>
<line x1="314.0" y1="148.4" x2="314.0" y2="183.3" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="309.0" y="154.7" width="10" height="21.0" fill="#c00"/>
<line x1="329.0" y1="169.4" x2="329.0" y2="200.9" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="324.0" y="175.7" width="10" height="16.8" fill="#c00"/>
<line x1="344.0" y1="187.5" x2="344.0" y2="216.9" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="339.0" y="192.5" width="10" height="16.8" fill="#c00"/>
<line x1="359.0" y1="203.0" x2="359.0" y2="230.3" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="354.0" y="209.3" width="10" height="12.6" fill="#c00"/>
<line x1="374.0" y1="216.9" x2="374.0" y2="242.1" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="369.0" y="221.9" width="10" height="12.6" fill="#c00"/>
<line x1="389.0" y1="228.2" x2="389.0" y2="255.5" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="384.0" y="234.5" width="10" height="12.6" fill="#c00"/>
<line x1="404.0" y1="242.1" x2="404.0" y2="263.1" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="399.0" y="247.1" width="10" height="8.4" fill="#c00"/>
<line x1="419.0" y1="249.2" x2="419.0" y2="276.5" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="414.0" y="255.5" width="10" height="12.6" fill="#c00"/>
<line x1="434.0" y1="263.1" x2="434.0" y2="288.3" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="429.0" y="268.1" width="10" height="12.6" fill="#c00"/>
<line x1="449.0" y1="274.4" x2="449.0" y2="301.7" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="444.0" y="280.7" width="10" height="12.6" fill="#c00"/>
<line x1="464.0" y1="278.6" x2="464.0" y2="299.6" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="459.0" y="287.0" width="10" height="6.3" fill="#188a3e"/>
<line x1="479.0" y1="270.2" x2="479.0" y2="291.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="474.0" y="282.8" width="10" height="4.2" fill="#188a3e"/>
<line x1="24" y1="397.7" x2="686" y2="397.7" stroke="#888"/>
<rect x="39.0" y="358.2" width="10" height="39.5" fill="#c00" opacity="0.55"/>
<rect x="54.0" y="360.6" width="10" height="37.1" fill="#c00" opacity="0.55"/>
<rect x="69.0" y="363.1" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="84.0" y="364.8" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="99.0" y="361.5" width="10" height="36.2" fill="#c00" opacity="0.55"/>
<rect x="114.0" y="356.5" width="10" height="41.2" fill="#c00" opacity="0.55"/>
<rect x="129.0" y="359.8" width="10" height="37.9" fill="#188a3e" opacity="0.55"/>
<rect x="144.0" y="363.1" width="10" height="34.6" fill="#188a3e" opacity="0.55"/>
<rect x="159.0" y="361.5" width="10" height="36.2" fill="#188a3e" opacity="0.55"/>
<rect x="174.0" y="364.8" width="10" height="32.9" fill="#188a3e" opacity="0.55"/>
<rect x="189.0" y="362.3" width="10" height="35.4" fill="#188a3e" opacity="0.55"/>
<rect x="204.0" y="359.0" width="10" height="38.7" fill="#188a3e" opacity="0.55"/>
<rect x="219.0" y="354.9" width="10" height="42.8" fill="#188a3e" opacity="0.55"/>
<rect x="234.0" y="341.7" width="10" height="56.0" fill="#188a3e" opacity="0.55"/>
<rect x="249.0" y="327.7" width="10" height="70.0" fill="#c00" opacity="0.55"/>
<rect x="264.0" y="348.3" width="10" height="49.4" fill="#c00" opacity="0.55"/>
<rect x="279.0" y="352.4" width="10" height="45.3" fill="#c00" opacity="0.55"/>
<rect x="294.0" y="354.9" width="10" height="42.8" fill="#c00" opacity="0.55"/>
<rect x="309.0" y="358.2" width="10" height="39.5" fill="#c00" opacity="0.55"/>
<rect x="324.0" y="359.8" width="10" height="37.9" fill="#c00" opacity="0.55"/>
<rect x="339.0" y="361.5" width="10" height="36.2" fill="#c00" opacity="0.55"/>
<rect x="354.0" y="363.1" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="369.0" y="364.8" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="384.0" y="362.3" width="10" height="35.4" fill="#c00" opacity="0.55"/>
<rect x="399.0" y="363.9" width="10" height="33.8" fill="#c00" opacity="0.55"/>
<rect x="414.0" y="361.5" width="10" height="36.2" fill="#c00" opacity="0.55"/>
<rect x="429.0" y="363.1" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="444.0" y="364.8" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="459.0" y="360.6" width="10" height="37.1" fill="#188a3e" opacity="0.55"/>
<rect x="474.0" y="338.4" width="10" height="59.3" fill="#188a3e" opacity="0.55"/>
<text x="24" y="321.7" fill="#555">volum</text>
<rect x="264.0" y="91.7" width="10" height="23.1" fill="#c00"/>
<line x1="284.0" y1="81.2" x2="284.0" y2="119.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="279.0" y="100.1" width="10" height="14.7" fill="#188a3e"/>
<line x1="299.0" y1="93.8" x2="299.0" y2="157.6" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="294.0" y="100.1" width="10" height="51.2" fill="#c00"/>
<line x1="314.0" y1="145.0" x2="314.0" y2="177.8" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="309.0" y="151.3" width="10" height="20.2" fill="#c00"/>
<line x1="329.0" y1="165.2" x2="329.0" y2="198.8" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="324.0" y="171.5" width="10" height="21.0" fill="#c00"/>
<line x1="344.0" y1="161.0" x2="344.0" y2="196.7" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="339.0" y="177.8" width="10" height="14.7" fill="#188a3e"/>
<line x1="359.0" y1="171.5" x2="359.0" y2="207.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="354.0" y="177.8" width="10" height="23.1" fill="#c00"/>
<line x1="374.0" y1="194.6" x2="374.0" y2="228.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="369.0" y="200.9" width="10" height="21.0" fill="#c00"/>
<line x1="389.0" y1="215.6" x2="389.0" y2="249.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="384.0" y="221.9" width="10" height="21.0" fill="#c00"/>
<line x1="404.0" y1="211.4" x2="404.0" y2="247.1" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="399.0" y="228.2" width="10" height="14.7" fill="#188a3e"/>
<line x1="419.0" y1="221.9" x2="419.0" y2="257.6" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="414.0" y="228.2" width="10" height="23.1" fill="#c00"/>
<line x1="434.0" y1="245.0" x2="434.0" y2="278.6" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="429.0" y="251.3" width="10" height="21.0" fill="#c00"/>
<line x1="449.0" y1="266.0" x2="449.0" y2="299.6" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="444.0" y="272.3" width="10" height="21.0" fill="#c00"/>
<line x1="464.0" y1="291.2" x2="464.0" y2="303.8" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="459.0" y="293.3" width="10" height="8.4" fill="#c00"/>
<line x1="479.0" y1="274.4" x2="479.0" y2="305.9" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="474.0" y="282.8" width="10" height="18.9" fill="#188a3e"/>
<line x1="24" y1="401.9" x2="686" y2="401.9" stroke="#888"/>
<rect x="39.0" y="362.4" width="10" height="39.5" fill="#c00" opacity="0.55"/>
<rect x="54.0" y="364.8" width="10" height="37.1" fill="#c00" opacity="0.55"/>
<rect x="69.0" y="367.3" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="84.0" y="369.0" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="99.0" y="365.7" width="10" height="36.2" fill="#c00" opacity="0.55"/>
<rect x="114.0" y="360.7" width="10" height="41.2" fill="#c00" opacity="0.55"/>
<rect x="129.0" y="364.0" width="10" height="37.9" fill="#188a3e" opacity="0.55"/>
<rect x="144.0" y="367.3" width="10" height="34.6" fill="#188a3e" opacity="0.55"/>
<rect x="159.0" y="365.7" width="10" height="36.2" fill="#188a3e" opacity="0.55"/>
<rect x="174.0" y="369.0" width="10" height="32.9" fill="#188a3e" opacity="0.55"/>
<rect x="189.0" y="366.5" width="10" height="35.4" fill="#188a3e" opacity="0.55"/>
<rect x="204.0" y="363.2" width="10" height="38.7" fill="#188a3e" opacity="0.55"/>
<rect x="219.0" y="359.1" width="10" height="42.8" fill="#188a3e" opacity="0.55"/>
<rect x="234.0" y="345.9" width="10" height="56.0" fill="#188a3e" opacity="0.55"/>
<rect x="249.0" y="331.9" width="10" height="70.0" fill="#c00" opacity="0.55"/>
<rect x="264.0" y="352.5" width="10" height="49.4" fill="#c00" opacity="0.55"/>
<rect x="279.0" y="356.6" width="10" height="45.3" fill="#188a3e" opacity="0.55"/>
<rect x="294.0" y="359.1" width="10" height="42.8" fill="#c00" opacity="0.55"/>
<rect x="309.0" y="362.4" width="10" height="39.5" fill="#c00" opacity="0.55"/>
<rect x="324.0" y="364.0" width="10" height="37.9" fill="#c00" opacity="0.55"/>
<rect x="339.0" y="365.7" width="10" height="36.2" fill="#188a3e" opacity="0.55"/>
<rect x="354.0" y="367.3" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="369.0" y="369.0" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="384.0" y="366.5" width="10" height="35.4" fill="#c00" opacity="0.55"/>
<rect x="399.0" y="368.1" width="10" height="33.8" fill="#188a3e" opacity="0.55"/>
<rect x="414.0" y="365.7" width="10" height="36.2" fill="#c00" opacity="0.55"/>
<rect x="429.0" y="367.3" width="10" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="444.0" y="369.0" width="10" height="32.9" fill="#c00" opacity="0.55"/>
<rect x="459.0" y="364.8" width="10" height="37.1" fill="#c00" opacity="0.55"/>
<rect x="474.0" y="342.6" width="10" height="59.3" fill="#188a3e" opacity="0.55"/>
<text x="24" y="325.9" fill="#555">volum</text>
<text x="32.0" y="123.0" fill="#c00" text-anchor="start" style="font-weight:bold">TF mare (15 min) în Sell</text>
<text x="149.0" y="307.0" fill="#0891b2" text-anchor="middle" style="font-weight:bold">M: Buy Momentum (pullback)</text>
<text x="254.0" y="294.0" fill="#c00" text-anchor="middle" style="font-weight:bold">A: primul Sell = trigger, intri short</text>
<text x="299.0" y="264.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">deja peste TP1 (1.42% din curs)</text>
<text x="479.0" y="312.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">close peste bear trail = ieși</text>
<text x="24" y="428" fill="#555">Axa de preț e construită (intrarea = 100.00); procentele sunt reale din curs.</text>
<text x="299.0" y="251.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">deja peste TP1 (1.42% din curs)</text>
<text x="479.0" y="319.9" fill="#188a3e" text-anchor="middle" style="font-weight:bold">close peste bear trail = ieși</text>
<text x="24" y="432" fill="#555">Axa de preț e construită (intrarea = 100.00); procentele sunt reale din curs.</text>
<line x1="261.5" y1="85.4" x2="276.5" y2="85.4" stroke="#b06000" stroke-width="2"/>
<line x1="276.5" y1="85.4" x2="291.5" y2="85.4" stroke="#b06000" stroke-width="2"/>
<line x1="291.5" y1="93.8" x2="306.5" y2="93.8" stroke="#b06000" stroke-width="2"/>
<line x1="291.5" y1="85.4" x2="291.5" y2="93.8" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="306.5" y1="145.0" x2="321.5" y2="145.0" stroke="#b06000" stroke-width="2"/>
<line x1="306.5" y1="93.8" x2="306.5" y2="145.0" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="321.5" y1="165.2" x2="336.5" y2="165.2" stroke="#b06000" stroke-width="2"/>
<line x1="321.5" y1="145.0" x2="321.5" y2="165.2" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="336.5" y1="165.2" x2="351.5" y2="165.2" stroke="#b06000" stroke-width="2"/>
<line x1="351.5" y1="171.5" x2="366.5" y2="171.5" stroke="#b06000" stroke-width="2"/>
<line x1="351.5" y1="165.2" x2="351.5" y2="171.5" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="366.5" y1="194.6" x2="381.5" y2="194.6" stroke="#b06000" stroke-width="2"/>
<line x1="366.5" y1="171.5" x2="366.5" y2="194.6" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="381.5" y1="215.6" x2="396.5" y2="215.6" stroke="#b06000" stroke-width="2"/>
<line x1="381.5" y1="194.6" x2="381.5" y2="215.6" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="396.5" y1="215.6" x2="411.5" y2="215.6" stroke="#b06000" stroke-width="2"/>
<line x1="411.5" y1="221.9" x2="426.5" y2="221.9" stroke="#b06000" stroke-width="2"/>
<line x1="411.5" y1="215.6" x2="411.5" y2="221.9" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="426.5" y1="245.0" x2="441.5" y2="245.0" stroke="#b06000" stroke-width="2"/>
<line x1="426.5" y1="221.9" x2="426.5" y2="245.0" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="441.5" y1="266.0" x2="456.5" y2="266.0" stroke="#b06000" stroke-width="2"/>
<line x1="441.5" y1="245.0" x2="441.5" y2="266.0" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="456.5" y1="291.2" x2="471.5" y2="291.2" stroke="#b06000" stroke-width="2"/>
<line x1="456.5" y1="266.0" x2="456.5" y2="291.2" stroke="#b06000" stroke-width="1.2" stroke-dasharray="2 2"/>
<line x1="471.5" y1="291.2" x2="486.5" y2="291.2" stroke="#b06000" stroke-width="2"/>
<text x="233.0" y="71.4" fill="#b06000" text-anchor="end" style="font-weight:bold">bear trail</text>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,10 +1,11 @@
"""Diagrama din `gen/strategii/mbp_exemplu.spec.txt` (TIP: PRET).
Trade-ul short complet din material (SPY, 15 min, 25.11.2025): ~12 candele
de urcare violentă spre vârful ~661, candela M (verde, peste bandă + TICUS
≥ +1000), trigger Sell Momentum → intrare short 660.00, SL 662.71
(risc 0.41 %), TP1 657.29 (1:1) atins în prima candelă, apoi trail pe 7
candele de 15 min până la ieșirea la 646.80 = 2 % = ~4.9R.
de urcare violentă spre vârful 662.71, candela M (verde, close 660.50 peste
banda superioară + TICUS ≥ +1000), trigger Sell Momentum → intrare short
660.00, SL 662.71 = chiar maximul ultimelor 4 candele (risc 0.41 %), TP1
657.29 (1:1) atins în prima candelă, apoi trail pe 7 candele de 15 min până
la ieșirea la 646.80 = 2 % = ~4.9R.
Serie continuă de 32 de candele (`from_closes`, open = close anterior), cu
context înainte de urcare, panou TICUS dedesubt (bar ilustrativ la candela M)
@@ -28,7 +29,7 @@ ENTRY = 660.00 # 09_QA/11_2025-11-25.md:565, 632-636
SL = 662.71 # risc 0.41 % → (sl-entry)/entry*100
TP1 = 657.29 # entry - (sl - entry) = 1:1
EXIT = 646.80 # ieșire pe trail = 2 % = ~4.9R
BAND = 660.90 # bandă superioară schematică (peste close-ul lui M)
BAND = 660.20 # bandă superioară schematică (sub close-ul lui M)
W, GAP, BODY_W, LEFT = 660, 15, 9, 40
SCALE = 20.0
@@ -54,7 +55,7 @@ assert len(closes) == 32, len(closes)
wicks = [(0.35, 0.35)] * 12 # context
wicks += [(0.30, 0.25)] * (M_I - 12) # urcarea (idx 12..22)
wicks += [(0.50, 0.20)] # M: high = 661.00 (vârful)
wicks += [(SL - closes[M_I], 0.20)] # M: high = 662.71 = SL (vârful)
wicks += [(0.20, 0.40), # trigger
(0.25, 0.51), # TP1: low = 657.80-0.51 = 657.29
(0.30, 0.30), (0.30, 0.30), (0.30, 0.30),
@@ -80,7 +81,14 @@ assert abs((entry - exit_) / entry * 100 - 2.0) < 0.05, (entry - exit_) / entry
assert abs((entry - exit_) / (sl - entry) - 4.9) < 0.1, (entry - exit_) / (sl - entry)
assert EXIT_I - E_I == 7, EXIT_I - E_I
assert sl > entry > tp1, "short: SL deasupra intrării, TP1 sub intrare"
assert BAND > cds[M_I].c, "banda schematică nu e deasupra close-ului lui M"
assert cds[M_I].c > BAND, "candela M nu se închide peste banda superioară"
# stopul stă FIX pe cel mai înalt high al ultimelor 4 candele (trigger inclus)
FEREASTRA = cds[E_I - 3:E_I + 1]
assert len(FEREASTRA) == 4 and FEREASTRA[-1] is cds[E_I], "fereastra de stop nu are 4 bare"
assert abs(max(c.h for c in FEREASTRA) - sl) < 1e-9, \
f"stopul {sl:.2f} nu e fix pe maximul celor 4 bare " \
f"({max(c.h for c in FEREASTRA):.2f})"
# structura care susține afirmațiile din text
assert cds[M_I].c > cds[M_I].o, "candela M trebuie să fie verde"
@@ -96,13 +104,13 @@ assert all(cds[i].c > cds[i - 1].c for i in range(13, M_I + 1)), "urcarea nu e m
levels = [
Level(SL, "SL 662.71 (risc 0.41 %)", "#c00", label_at="right"),
Level(ENTRY, "intrare short 660.00", "#188a3e", label_at="left"),
Level(BAND, "bandă superioară (schematic)", "#777", dash="2 4", label_at="left"),
Level(BAND, "bandă superioară (schematic)", "#777", dash="2 4", label_at="right"),
Level(TP1, "TP1 657.29 (1:1)", "#1a5fb4", label_at="left"),
Level(EXIT, "ieșire trail 646.80 = 2 % = ~4.9R", "#1a5fb4", label_at="left"),
]
marks = [
Mark(M_I, "M: candelă verde peste bandă + TICUS ≥ +1000", "#188a3e", "above"),
Mark(M_I, "M: close peste bandă", "#188a3e", "above"),
]
cds[M_I].note = ("M: valori exacte NEACOPERIT în material (bandă + TICUS); "
@@ -118,7 +126,7 @@ ch = Chart(
marks=marks,
mas=[MA(20, "#b06000", dash="4 3", text="SMA-20")],
scale=SCALE, width=W, gap=GAP, body_w=BODY_W, left=LEFT,
title="SPY — 15 min: MBAP short 25.11.2025 (risc 0.41 % → ieșire 4.9R)",
title="SPY — 15 min: MBAP short 25.11.2025",
caption="",
)
price_svg = ch.render()
@@ -158,14 +166,14 @@ ticus = [
]
# ── legenda (cifrele/sursele) ───────────────────────────────────────────────
# Fără trimiteri „fișier:linie" în etichetele SVG: sursele trăiesc doar în
# fisa capitolului (STYLE.md, secțiunea Referințe).
legend = [
"Legendă: procentele (risc 0.41 %, ieșire 2 %) sunt ale instructorului.",
"Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator —",
"09_QA/11_2025-11-25.md:716-719.",
"Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator.",
"Structura de reținut: risc mic → TP1 (1:1) atins imediat → trail lung (7 candele de 15 min).",
"Valoarea exactă a benzii și a TICUS la candela M nu e dată în sesiune; bara ~+1000 e ilustrativă.",
"„Taurii urcă pe scări, urșii sar de la etaj\" — de ce short-ul se consumă în ore.",
"(09_QA/11_2025-11-25.md:643-648).",
]
cap_top = Y0 + TICUS_H + 20
H = cap_top + 16 * (len(legend) - 1) + 14

View File

@@ -1,12 +1,12 @@
<svg viewBox="0 0 660 730" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">
<svg viewBox="0 0 660 698" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">
<g transform="translate(0,0)">
<text x="24" y="48" fill="#333" style="font-weight:bold">SPY — 15 min: MBAP short 25.11.2025 (risc 0.41 % → ieșire 4.9R)</text>
<text x="24" y="48" fill="#333" style="font-weight:bold">SPY — 15 min: MBAP short 25.11.2025</text>
<line x1="24" y1="56.0" x2="646" y2="56.0" stroke="#c00" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="632" y="50.0" fill="#c00" text-anchor="end">SL 662.71 (risc 0.41 %)</text>
<line x1="24" y1="110.2" x2="646" y2="110.2" stroke="#188a3e" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="104.2" fill="#188a3e">intrare short 660.00</text>
<line x1="24" y1="92.2" x2="646" y2="92.2" stroke="#777" stroke-width="1.5" stroke-dasharray="2 4"/>
<text x="30" y="86.2" fill="#777">bandă superioară (schematic)</text>
<line x1="24" y1="106.2" x2="646" y2="106.2" stroke="#777" stroke-width="1.5" stroke-dasharray="2 4"/>
<text x="632" y="100.2" fill="#777" text-anchor="end">bandă superioară (schematic)</text>
<line x1="24" y1="164.4" x2="646" y2="164.4" stroke="#1a5fb4" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="158.4" fill="#1a5fb4">TP1 657.29 (1:1)</text>
<line x1="24" y1="374.2" x2="646" y2="374.2" stroke="#1a5fb4" stroke-width="1.5" stroke-dasharray="4 3"/>
@@ -59,7 +59,7 @@
<rect x="350.5" y="160.2" width="9" height="24.0" fill="#188a3e"/>
<line x1="370.0" y1="128.2" x2="370.0" y2="165.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="365.5" y="134.2" width="9" height="26.0" fill="#188a3e"/>
<line x1="385.0" y1="90.2" x2="385.0" y2="138.2" stroke="#1a1a1a" stroke-width="1.2"/>
<line x1="385.0" y1="56.0" x2="385.0" y2="138.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="380.5" y="100.2" width="9" height="34.0" fill="#188a3e"/>
<line x1="400.0" y1="96.2" x2="400.0" y2="118.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="395.5" y="100.2" width="9" height="10.0" fill="#c00"/>
@@ -77,7 +77,7 @@
<rect x="485.5" y="278.2" width="9" height="44.0" fill="#c00"/>
<line x1="505.0" y1="316.2" x2="505.0" y2="380.2" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="500.5" y="322.2" width="9" height="52.0" fill="#c00"/>
<text x="385.0" y="80.2" fill="#188a3e" text-anchor="middle" style="font-weight:bold">M: candelă verde peste bandă + TICUS ≥ +1000</text>
<text x="385.0" y="46.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">M: close peste bandă</text>
<text x="24" y="402.2" fill="#188a3e">M: valori exacte NEACOPERIT în material (bandă + TICUS); bara ~+1000 din panou e ilustrativă</text>
<text x="24" y="419.2" fill="#c00">trigger Sell Momentum → intrare short 660.00 (risc 0.41 % = 2.71)</text>
<text x="24" y="436.2" fill="#c00">TP1 657.29 (1:1) atins în prima candelă după intrare</text>
@@ -92,10 +92,8 @@
<text x="385.0" y="509.0" fill="#777" text-anchor="middle">ilustrativ</text>
<text x="385.0" y="600.0" fill="#777" text-anchor="middle">candela M</text>
<text x="24" y="620.0" fill="#555">Legendă: procentele (risc 0.41 %, ieșire 2 %) sunt ale instructorului.</text>
<text x="24" y="636.0" fill="#555">Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator —</text>
<text x="24" y="652.0" fill="#555">09_QA/11_2025-11-25.md:716-719.</text>
<text x="24" y="668.0" fill="#555">Structura de reținut: risc mic → TP1 (1:1) atins imediat → trail lung (7 candele de 15 min).</text>
<text x="24" y="684.0" fill="#555">Valoarea exactă a benzii și a TICUS la candela M nu e dată în sesiune; bara ~+1000 e ilustrativă.</text>
<text x="24" y="700.0" fill="#555">„Taurii urcă pe scări, urșii sar de la etaj" — de ce short-ul se consumă în ore.</text>
<text x="24" y="716.0" fill="#555">(09_QA/11_2025-11-25.md:643-648).</text>
<text x="24" y="636.0" fill="#555">Prețurile absolute (660.00 / 662.71 / 657.29 / 646.80) sunt construite de sumarizator.</text>
<text x="24" y="652.0" fill="#555">Structura de reținut: risc mic → TP1 (1:1) atins imediat → trail lung (7 candele de 15 min).</text>
<text x="24" y="668.0" fill="#555">Valoarea exactă a benzii și a TICUS la candela M nu e dată în sesiune; bara ~+1000 e ilustrativă.</text>
<text x="24" y="684.0" fill="#555">„Taurii urcă pe scări, urșii sar de la etaj" — de ce short-ul se consumă în ore.</text>
</svg>

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB