strategii: si ultima diagrama, mdsrt_aplus, dupa relansare

37 din 37. Toate marcajele din capitole sunt substituite.

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-18 19:44:50 +00:00
parent ccfc4a7f7f
commit 10e14aa923
3 changed files with 668 additions and 1 deletions

View File

@@ -0,0 +1,262 @@
"""MDSRT — setup A+ vs. setup ratat (două panouri, exemple construite).
Citește `gen/strategii/mdsrt_aplus.spec.txt` (marcajul `<!-- DIAGRAMA: aplus -->`).
Același schelet (downtrend -> al doilea picior -> trigger de candelă), context opus:
- stânga (A+): downtrend ~15 candele până la pivotul monthly 94.00; piciorul 1
(bara 18) face low 94.55; piciorul 2 (bara 24, Buy Hammer) coboară la 93.20,
scalpând stopurile chiar sub nivel, dar închide 94.10 înapoi peste suport;
bara 25 sparge high-ul trigger-ului (94.30) și închide 94.40 = intrare,
SL 93.10 (sub low-ul piciorului 2), TP1 95.70 (1:1). Divergență bull:
low mai jos pe preț, volum mai mare la piciorul 2.
- dreapta (NU): coborâre fără oprire la un nivel; bara 18 = primul low 94.60;
bara 25 închide 92.00, sub pivotul 94.00 ȘI sub primul low -> breakdown,
nu setup; prețul continuă spre 90.80.
Materialul dă regulile, nu prețurile; nivelurile 94.00 / 94.55 / 93.20 /
94.40 / 93.10 / 95.70 sunt construite ca exemplu (spec, liniile 18-19).
Două `Chart`-uri randate separat și lipite într-un wrapper SVG, ca la
`buy_doji_aplus.py` — coordonatele fiecărui panou rămân corecte.
Rulează: python3 gen/strategii/mdsrt_aplus.py
Scrie: gen/strategii/mdsrt_aplus.svg
"""
import re
import sys
from pathlib import Path
sys.path.insert(0, "/workspace/atm-curs-dl")
from svg_candles import Candle, Chart, Level, Mark, from_closes # noqa: E402
OUT = Path(__file__).resolve().parent / "mdsrt_aplus.svg"
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
SUPORT = 94.00
ENTRY = 94.40
SL = 93.10
TP1 = 95.70
LOW1, LOW2 = 94.55, 93.20
# ============================================================ PANOUL A+ (29 bare)
CLOSES_A = [
104.0, 103.2, 102.5, 102.9, 101.8, 101.0, 100.3, 100.7, 99.8, 99.2,
98.6, 98.0, 97.4, 96.8, 96.3, 95.8,
95.40, 95.60, 94.60, # 18 = picior 1 (low 94.55)
94.90, 95.20, 94.80, 94.40, 93.80,
94.10, # 24 = Buy Hammer / picior 2 (low 93.20)
94.40, # 25 = intrare (close 94.40 > high 94.30)
94.80, 95.30, 95.70, # 28 = TP1 1:1
]
assert len(CLOSES_A) == 29, len(CLOSES_A)
WICKS_A = [(0.15, 0.15)] * 29
WICKS_A[18] = (0.10, 0.05) # high 95.70, low 94.60 - 0.05 = 94.55
WICKS_A[24] = (0.20, 0.60) # high 94.30, low 93.80 - 0.60 = 93.20
WICKS_A[25] = (0.10, 0.05) # high 94.50, low 94.05
VOLS_A = [
58, 56, 54, 52, 55, 50, 48, 46, 49, 45,
43, 41, 44, 42, 40, 38,
36, 34, 40, 44, 46, 42, 44, 46,
78, # 24: volum mare la piciorul 2
70, 60, 52, 48,
]
assert len(VOLS_A) == 29, len(VOLS_A)
cds_a = from_closes(CLOSES_A, wicks=WICKS_A, vols=VOLS_A, start=104.6)
# ============================================================ PANOUL NU (29 bare)
CLOSES_N = [
104.0, 103.0, 102.2, 101.4, 100.6, 99.9, 99.2, 98.5, 97.9, 97.3,
96.7, 96.1, 95.6, 95.1, 94.8, 94.4,
94.20, 94.60, 94.60, # 18 = „primul low" 94.60
94.10, 93.70, 93.40, 93.10, 92.80, 92.40,
92.00, # 25 = close sub pivot ȘI sub primul low
91.60, 91.20, 90.80,
]
assert len(CLOSES_N) == 29, len(CLOSES_N)
WICKS_N = [(0.10, 0.10)] * 29
WICKS_N[25] = (0.05, 0.40) # high 92.45, low 92.00 - 0.40 = 91.60
VOLS_N = [
60, 58, 56, 54, 52, 50, 49, 47, 48, 46,
44, 43, 42, 41, 40, 42,
41, 39, 38, 41, 43, 45, 48, 52,
68, # 24: presiune în creștere pe coborâre
74, 70, 66, 62,
]
assert len(VOLS_N) == 29, len(VOLS_N)
cds_n = from_closes(CLOSES_N, wicks=WICKS_N, vols=VOLS_N, start=104.4)
# ============================================================ assert-urile din spec
# (1) piciorul 2 e mai jos decât piciorul 1
assert abs(cds_a[18].l - LOW1) < 1e-9, cds_a[18].l
assert abs(cds_a[24].l - LOW2) < 1e-9, cds_a[24].l
assert cds_a[24].l < cds_a[18].l
# (2) piciorul 2 rupe suportul 94.00
assert cds_a[24].l < SUPORT
# (3) distanța dintre swing low-uri >= 5 candele (minimul cerut)
assert 24 - 18 == 6
# (4) hammer-ul închide înapoi peste suport
assert abs(cds_a[24].c - 94.10) < 1e-9 and cds_a[24].c > SUPORT
# (5) condiția de „hammer": coada de jos > corp ȘI corp <= 0.5 * range
h = cds_a[24]
corp = abs(h.o - h.c)
coada = min(h.o, h.c) - h.l
rng = h.h - h.l
assert abs(corp - 0.30) < 1e-9, corp
assert coada > corp, (coada, corp)
assert corp <= 0.5 * rng, (corp, rng)
# (6) intrarea = close 25 > high-ul trigger-ului (high 24 = 94.30)
assert abs(cds_a[25].c - ENTRY) < 1e-9, cds_a[25].c
assert cds_a[25].c > cds_a[24].h
# (7) TP1 e exact 1:1 față de risc
assert abs((ENTRY - SL) - (TP1 - ENTRY)) < 1e-9
# (8) divergență bull: low mai jos pe preț, volum mai mare la piciorul 2
assert VOLS_A[24] > VOLS_A[18]
# (9) NU: close sub pivot ȘI sub primul low
assert abs(cds_n[25].c - 92.00) < 1e-9, cds_n[25].c
assert cds_n[25].c < SUPORT and cds_n[25].c < 94.60
# (10) NU: coborâre fără trigger
assert cds_n[25].c < cds_n[24].c < cds_n[23].c
# (11) NU: fără divergență (lower low pe preț și pe volum, conform assert-ului)
assert VOLS_N[24] > VOLS_N[18] and cds_n[24].l < cds_n[18].l
# (12) fiecare open = close-ul barei anterioare
for cds, tag in ((cds_a, "A+"), (cds_n, "NU")):
for a, b in zip(cds, cds[1:]):
assert abs(a.c - b.o) < 1e-9, f"{tag}: gol artificial între bare"
# (13) 29 de candele în fiecare panou
assert len(cds_a) == 29 and len(cds_n) == 29
print(f"A+ picior1 low {cds_a[18].l:.2f} picior2 low {cds_a[24].l:.2f} "
f"(< {SUPORT:.2f}) close {cds_a[24].c:.2f} intrare {cds_a[25].c:.2f} "
f"vol {VOLS_A[24]} > {VOLS_A[18]}")
print(f"NU primul low {cds_n[18].l:.2f} close 25 {cds_n[25].c:.2f} "
f"(< {SUPORT:.2f} și < 94.60) vol {VOLS_N[24]} > {VOLS_N[18]}")
# ============================================================ desenele celor două panouri
PW = 520
SCALE = 20.0
ch_a = Chart(
candles=cds_a,
levels=[Level(SUPORT, "pivot monthly 94.00", ORANGE, label_at="left"),
Level(ENTRY, "intrare 94.40", GREEN),
Level(SL, "SL 93.10", RED),
Level(TP1, "TP1 95.70 (1:1)", BLUE, label_at="left")],
marks=[Mark(18, "picior 1: 94.55", ORANGE, "below"),
Mark(24, "picior 2: 93.20", RED, "below")],
scale=SCALE, gap=15, body_w=8, left=44, width=PW, vol_h=60,
vol_label="volum",
title="A+ — al doilea picior la suport, divergență, trigger",
caption="Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2.",
)
ch_n = Chart(
candles=cds_n,
levels=[Level(SUPORT, "pivot monthly 94.00", ORANGE, label_at="left"),
Level(94.60, "primul low 94.60", GRAY),
Level(90.80, "spre 90.80", RED, label_at="left")],
marks=[Mark(18, "primul low", ORANGE, "above", dy=-2),
Mark(25, "close 92.00 = breakdown", RED, "below", dy=12)],
scale=SCALE, gap=15, body_w=8, left=44, width=PW, vol_h=60,
vol_label="volum",
title="NU — close sub pivot și sub primul low = breakdown",
caption="Fără trigger: close sub pivot și sub primul low.",
)
# ============================================================ wrapper: două panouri alăturate
def inner(svg: str) -> str:
"""Conținutul dintre tag-urile <svg> ale unui panou, fără elementul rădăcină."""
return svg[svg.index(">") + 1:svg.rindex("</svg>")]
def vb_height(svg: str) -> float:
m = re.search(r'viewBox="0 0 [\d.]+ ([\d.]+)"', svg)
assert m, "nu găsesc viewBox în panoul randat"
return float(m.group(1))
PANEL_GAP, PAD, TITLE_H, FOOTER_H = 24, 8, 8, 26
svg_a, svg_n = ch_a.render(), ch_n.render()
HA, HN = vb_height(svg_a), vb_height(svg_n)
assert svg_a.count("\n\n") == 0 and svg_n.count("\n\n") == 0, "linie goală în panou"
TOTAL_W = PAD + PW + PANEL_GAP + PW + PAD
TOTAL_H = PAD + TITLE_H + max(HA, HN) + FOOTER_H + PAD
OFF_A = (PAD, PAD + TITLE_H)
OFF_N = (PAD + PW + PANEL_GAP, PAD + TITLE_H)
FOOTER = ("Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite "
"ca exemplu — materialul dă regulile, nu prețurile.")
wrapper = (
f'<svg viewBox="0 0 {TOTAL_W} {TOTAL_H:.0f}" width="{TOTAL_W}" height="{TOTAL_H:.0f}" '
f'xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">'
f'<g transform="translate({OFF_A[0]},{OFF_A[1]})">{inner(svg_a)}</g>'
f'<g transform="translate({OFF_N[0]},{OFF_N[1]})">{inner(svg_n)}</g>'
f'<text x="{TOTAL_W / 2:.0f}" y="{TOTAL_H - PAD:.0f}" fill="#555" '
f'text-anchor="middle">{FOOTER}</text>'
f'</svg>'
)
# ============================================================ verificare pe SVG-ul final
def texts(svg: str):
"""Toate (x, y, text-anchor, text) din elementele <text> ale unui fragment."""
out = []
for m in re.finditer(r'<text x="([-\d.]+)" y="([-\d.]+)"([^>]*)>(.*?)</text>', svg):
x, y, attrs, t = float(m.group(1)), float(m.group(2)), m.group(3), m.group(4)
if t.startswith("<"):
continue
am = re.search(r'text-anchor="(\w+)"', attrs)
out.append((x, y, am.group(1) if am else "start", t))
return out
def span(x: float, anchor: str, t: str) -> tuple[float, float]:
"""Intervalul orizontal aproximativ al unui text, față de ancora lui."""
w = len(t) * 12 * 0.56
left = x - w if anchor == "end" else (x - w / 2 if anchor == "middle" else x)
return left, left + w
assert wrapper.count("\n\n") == 0, "linie goală în SVG"
# fiecare text (după translatarea panoului) e în întregime în interiorul pânzei
all_txt = []
for frag, (ox, oy) in ((inner(svg_a), OFF_A), (inner(svg_n), OFF_N)):
for x, y, anchor, t in texts(frag):
gx, gy = x + ox, y + oy
gl, gr = gx + span(0, anchor, t)[0], gx + span(0, anchor, t)[1]
assert ox <= gl and gr <= ox + PW, f"text iese din panou: {t!r} ({gl:.0f}..{gr:.0f})"
assert -1 <= gl and gr <= TOTAL_W + 1, f"text ieșit pe orizontală: {t!r} ({gl:.0f}..{gr:.0f})"
assert 0 <= gy <= TOTAL_H, f"text ieșit pe verticală: {t!r} ({gy:.0f})"
all_txt.append((gx, gy, anchor, t))
# footer-ul, în coordonate globale
fl, fr = span(TOTAL_W / 2, "middle", FOOTER)
assert -1 <= fl and fr <= TOTAL_W + 1, "footer iese din pânză"
all_txt.append((TOTAL_W / 2, TOTAL_H - PAD, "middle", FOOTER))
assert len(all_txt) >= 8, "prea puține etichete"
# nu se suprapun două texte pe aceeași poziție sau pe rândul apropiat
for i in range(len(all_txt)):
xi, yi, ai, si = all_txt[i]
li, ri = xi + span(0, ai, si)[0], xi + span(0, ai, si)[1]
for j in range(i + 1, len(all_txt)):
xj, yj, aj, sj = all_txt[j]
lj, rj = xj + span(0, aj, sj)[0], xj + span(0, aj, sj)[1]
if abs(yi - yj) < 12 and li < rj - 4 and lj < ri - 4:
raise AssertionError(f"texte suprapuse: {si!r} / {sj!r}")
# etichetele cerute de spec există în desen
for cheie in ("pivot monthly 94.00", "intrare 94.40", "SL 93.10", "TP1 95.70 (1:1)",
"picior 1: 94.55", "picior 2: 93.20", "primul low",
"close 92.00 = breakdown", "spre 90.80",
"A+ — al doilea picior la suport, divergență, trigger",
"NU — close sub pivot și sub primul low = breakdown"):
assert cheie in wrapper, f"lipsește din desen: {cheie!r}"
OUT.write_text(wrapper, encoding="utf-8")
print(f"scris {OUT.name}: {TOTAL_W}x{TOTAL_H:.0f}, "
f"{len(all_txt)} etichete, verificare OK")

View File

@@ -0,0 +1,203 @@
<svg viewBox="0 0 1080 510" width="1080" height="510" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif"><g transform="translate(8,16)">
<text x="24" y="48" fill="#333" style="font-weight:bold">A+ — al doilea picior la suport, divergență, trigger</text>
<line x1="24" y1="271.0" x2="506" y2="271.0" stroke="#b06000" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="265.0" fill="#b06000">pivot monthly 94.00</text>
<line x1="24" y1="263.0" x2="506" y2="263.0" stroke="#188a3e" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="492" y="257.0" fill="#188a3e" text-anchor="end">intrare 94.40</text>
<line x1="24" y1="289.0" x2="506" y2="289.0" stroke="#c00" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="492" y="283.0" fill="#c00" text-anchor="end">SL 93.10</text>
<line x1="24" y1="237.0" x2="506" y2="237.0" stroke="#1a5fb4" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="231.0" fill="#1a5fb4">TP1 95.70 (1:1)</text>
<line x1="44.0" y1="56.0" x2="44.0" y2="74.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="40.0" y="59.0" width="8" height="12.0" fill="#c00"/>
<line x1="59.0" y1="68.0" x2="59.0" y2="90.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="55.0" y="71.0" width="8" height="16.0" fill="#c00"/>
<line x1="74.0" y1="84.0" x2="74.0" y2="104.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="70.0" y="87.0" width="8" height="14.0" fill="#c00"/>
<line x1="89.0" y1="90.0" x2="89.0" y2="104.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="85.0" y="93.0" width="8" height="8.0" fill="#188a3e"/>
<line x1="104.0" y1="90.0" x2="104.0" y2="118.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="100.0" y="93.0" width="8" height="22.0" fill="#c00"/>
<line x1="119.0" y1="112.0" x2="119.0" y2="134.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="115.0" y="115.0" width="8" height="16.0" fill="#c00"/>
<line x1="134.0" y1="128.0" x2="134.0" y2="148.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="130.0" y="131.0" width="8" height="14.0" fill="#c00"/>
<line x1="149.0" y1="134.0" x2="149.0" y2="148.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="145.0" y="137.0" width="8" height="8.0" fill="#188a3e"/>
<line x1="164.0" y1="134.0" x2="164.0" y2="158.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="160.0" y="137.0" width="8" height="18.0" fill="#c00"/>
<line x1="179.0" y1="152.0" x2="179.0" y2="170.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="175.0" y="155.0" width="8" height="12.0" fill="#c00"/>
<line x1="194.0" y1="164.0" x2="194.0" y2="182.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="190.0" y="167.0" width="8" height="12.0" fill="#c00"/>
<line x1="209.0" y1="176.0" x2="209.0" y2="194.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="205.0" y="179.0" width="8" height="12.0" fill="#c00"/>
<line x1="224.0" y1="188.0" x2="224.0" y2="206.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="220.0" y="191.0" width="8" height="12.0" fill="#c00"/>
<line x1="239.0" y1="200.0" x2="239.0" y2="218.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="235.0" y="203.0" width="8" height="12.0" fill="#c00"/>
<line x1="254.0" y1="212.0" x2="254.0" y2="228.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="250.0" y="215.0" width="8" height="10.0" fill="#c00"/>
<line x1="269.0" y1="222.0" x2="269.0" y2="238.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="265.0" y="225.0" width="8" height="10.0" fill="#c00"/>
<line x1="284.0" y1="232.0" x2="284.0" y2="246.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="280.0" y="235.0" width="8" height="8.0" fill="#c00"/>
<line x1="299.0" y1="236.0" x2="299.0" y2="246.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="295.0" y="239.0" width="8" height="4.0" fill="#188a3e"/>
<line x1="314.0" y1="237.0" x2="314.0" y2="260.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="310.0" y="239.0" width="8" height="20.0" fill="#c00"/>
<line x1="329.0" y1="250.0" x2="329.0" y2="262.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="325.0" y="253.0" width="8" height="6.0" fill="#188a3e"/>
<line x1="344.0" y1="244.0" x2="344.0" y2="256.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="340.0" y="247.0" width="8" height="6.0" fill="#188a3e"/>
<line x1="359.0" y1="244.0" x2="359.0" y2="258.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="355.0" y="247.0" width="8" height="8.0" fill="#c00"/>
<line x1="374.0" y1="252.0" x2="374.0" y2="266.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="370.0" y="255.0" width="8" height="8.0" fill="#c00"/>
<line x1="389.0" y1="260.0" x2="389.0" y2="278.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="385.0" y="263.0" width="8" height="12.0" fill="#c00"/>
<line x1="404.0" y1="265.0" x2="404.0" y2="287.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="400.0" y="269.0" width="8" height="6.0" fill="#188a3e"/>
<line x1="419.0" y1="261.0" x2="419.0" y2="270.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="415.0" y="263.0" width="8" height="6.0" fill="#188a3e"/>
<line x1="434.0" y1="252.0" x2="434.0" y2="266.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="430.0" y="255.0" width="8" height="8.0" fill="#188a3e"/>
<line x1="449.0" y1="242.0" x2="449.0" y2="258.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="445.0" y="245.0" width="8" height="10.0" fill="#188a3e"/>
<line x1="464.0" y1="234.0" x2="464.0" y2="248.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="460.0" y="237.0" width="8" height="8.0" fill="#188a3e"/>
<line x1="24" y1="375.0" x2="506" y2="375.0" stroke="#888"/>
<rect x="40.0" y="330.4" width="8" height="44.6" fill="#c00" opacity="0.55"/>
<rect x="55.0" y="331.9" width="8" height="43.1" fill="#c00" opacity="0.55"/>
<rect x="70.0" y="333.5" width="8" height="41.5" fill="#c00" opacity="0.55"/>
<rect x="85.0" y="335.0" width="8" height="40.0" fill="#188a3e" opacity="0.55"/>
<rect x="100.0" y="332.7" width="8" height="42.3" fill="#c00" opacity="0.55"/>
<rect x="115.0" y="336.5" width="8" height="38.5" fill="#c00" opacity="0.55"/>
<rect x="130.0" y="338.1" width="8" height="36.9" fill="#c00" opacity="0.55"/>
<rect x="145.0" y="339.6" width="8" height="35.4" fill="#188a3e" opacity="0.55"/>
<rect x="160.0" y="337.3" width="8" height="37.7" fill="#c00" opacity="0.55"/>
<rect x="175.0" y="340.4" width="8" height="34.6" fill="#c00" opacity="0.55"/>
<rect x="190.0" y="341.9" width="8" height="33.1" fill="#c00" opacity="0.55"/>
<rect x="205.0" y="343.5" width="8" height="31.5" fill="#c00" opacity="0.55"/>
<rect x="220.0" y="341.2" width="8" height="33.8" fill="#c00" opacity="0.55"/>
<rect x="235.0" y="342.7" width="8" height="32.3" fill="#c00" opacity="0.55"/>
<rect x="250.0" y="344.2" width="8" height="30.8" fill="#c00" opacity="0.55"/>
<rect x="265.0" y="345.8" width="8" height="29.2" fill="#c00" opacity="0.55"/>
<rect x="280.0" y="347.3" width="8" height="27.7" fill="#c00" opacity="0.55"/>
<rect x="295.0" y="348.8" width="8" height="26.2" fill="#188a3e" opacity="0.55"/>
<rect x="310.0" y="344.2" width="8" height="30.8" fill="#c00" opacity="0.55"/>
<rect x="325.0" y="341.2" width="8" height="33.8" fill="#188a3e" opacity="0.55"/>
<rect x="340.0" y="339.6" width="8" height="35.4" fill="#188a3e" opacity="0.55"/>
<rect x="355.0" y="342.7" width="8" height="32.3" fill="#c00" opacity="0.55"/>
<rect x="370.0" y="341.2" width="8" height="33.8" fill="#c00" opacity="0.55"/>
<rect x="385.0" y="339.6" width="8" height="35.4" fill="#c00" opacity="0.55"/>
<rect x="400.0" y="315.0" width="8" height="60.0" fill="#188a3e" opacity="0.55"/>
<rect x="415.0" y="321.2" width="8" height="53.8" fill="#188a3e" opacity="0.55"/>
<rect x="430.0" y="328.8" width="8" height="46.2" fill="#188a3e" opacity="0.55"/>
<rect x="445.0" y="335.0" width="8" height="40.0" fill="#188a3e" opacity="0.55"/>
<rect x="460.0" y="338.1" width="8" height="36.9" fill="#188a3e" opacity="0.55"/>
<text x="24" y="309.0" fill="#555">volum</text>
<text x="314.0" y="280.0" fill="#b06000" text-anchor="middle" style="font-weight:bold">picior 1: 94.55</text>
<text x="404.0" y="303.0" fill="#c00" text-anchor="middle" style="font-weight:bold">picior 2: 93.20</text>
<text x="24" y="405" fill="#555">Divergență bull: low mai jos pe preț, volum mai mare la piciorul 2.</text>
</g><g transform="translate(552,16)">
<text x="24" y="48" fill="#333" style="font-weight:bold">NU — close sub pivot și sub primul low = breakdown</text>
<line x1="24" y1="266.0" x2="506" y2="266.0" stroke="#b06000" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="260.0" fill="#b06000">pivot monthly 94.00</text>
<line x1="24" y1="254.0" x2="506" y2="254.0" stroke="#777" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="492" y="248.0" fill="#777" text-anchor="end">primul low 94.60</text>
<line x1="24" y1="330.0" x2="506" y2="330.0" stroke="#c00" stroke-width="1.5" stroke-dasharray="4 3"/>
<text x="30" y="324.0" fill="#c00">spre 90.80</text>
<line x1="44.0" y1="56.0" x2="44.0" y2="68.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="40.0" y="58.0" width="8" height="8.0" fill="#c00"/>
<line x1="59.0" y1="64.0" x2="59.0" y2="88.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="55.0" y="66.0" width="8" height="20.0" fill="#c00"/>
<line x1="74.0" y1="84.0" x2="74.0" y2="104.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="70.0" y="86.0" width="8" height="16.0" fill="#c00"/>
<line x1="89.0" y1="100.0" x2="89.0" y2="120.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="85.0" y="102.0" width="8" height="16.0" fill="#c00"/>
<line x1="104.0" y1="116.0" x2="104.0" y2="136.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="100.0" y="118.0" width="8" height="16.0" fill="#c00"/>
<line x1="119.0" y1="132.0" x2="119.0" y2="150.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="115.0" y="134.0" width="8" height="14.0" fill="#c00"/>
<line x1="134.0" y1="146.0" x2="134.0" y2="164.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="130.0" y="148.0" width="8" height="14.0" fill="#c00"/>
<line x1="149.0" y1="160.0" x2="149.0" y2="178.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="145.0" y="162.0" width="8" height="14.0" fill="#c00"/>
<line x1="164.0" y1="174.0" x2="164.0" y2="190.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="160.0" y="176.0" width="8" height="12.0" fill="#c00"/>
<line x1="179.0" y1="186.0" x2="179.0" y2="202.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="175.0" y="188.0" width="8" height="12.0" fill="#c00"/>
<line x1="194.0" y1="198.0" x2="194.0" y2="214.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="190.0" y="200.0" width="8" height="12.0" fill="#c00"/>
<line x1="209.0" y1="210.0" x2="209.0" y2="226.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="205.0" y="212.0" width="8" height="12.0" fill="#c00"/>
<line x1="224.0" y1="222.0" x2="224.0" y2="236.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="220.0" y="224.0" width="8" height="10.0" fill="#c00"/>
<line x1="239.0" y1="232.0" x2="239.0" y2="246.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="235.0" y="234.0" width="8" height="10.0" fill="#c00"/>
<line x1="254.0" y1="242.0" x2="254.0" y2="252.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="250.0" y="244.0" width="8" height="6.0" fill="#c00"/>
<line x1="269.0" y1="248.0" x2="269.0" y2="260.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="265.0" y="250.0" width="8" height="8.0" fill="#c00"/>
<line x1="284.0" y1="256.0" x2="284.0" y2="264.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="280.0" y="258.0" width="8" height="4.0" fill="#c00"/>
<line x1="299.0" y1="252.0" x2="299.0" y2="264.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="295.0" y="254.0" width="8" height="8.0" fill="#188a3e"/>
<line x1="314.0" y1="252.0" x2="314.0" y2="256.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="310.0" y="254.0" width="8" height="1.6" fill="#188a3e"/>
<line x1="329.0" y1="252.0" x2="329.0" y2="266.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="325.0" y="254.0" width="8" height="10.0" fill="#c00"/>
<line x1="344.0" y1="262.0" x2="344.0" y2="274.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="340.0" y="264.0" width="8" height="8.0" fill="#c00"/>
<line x1="359.0" y1="270.0" x2="359.0" y2="280.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="355.0" y="272.0" width="8" height="6.0" fill="#c00"/>
<line x1="374.0" y1="276.0" x2="374.0" y2="286.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="370.0" y="278.0" width="8" height="6.0" fill="#c00"/>
<line x1="389.0" y1="282.0" x2="389.0" y2="292.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="385.0" y="284.0" width="8" height="6.0" fill="#c00"/>
<line x1="404.0" y1="288.0" x2="404.0" y2="300.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="400.0" y="290.0" width="8" height="8.0" fill="#c00"/>
<line x1="419.0" y1="297.0" x2="419.0" y2="314.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="415.0" y="298.0" width="8" height="8.0" fill="#c00"/>
<line x1="434.0" y1="304.0" x2="434.0" y2="316.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="430.0" y="306.0" width="8" height="8.0" fill="#c00"/>
<line x1="449.0" y1="312.0" x2="449.0" y2="324.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="445.0" y="314.0" width="8" height="8.0" fill="#c00"/>
<line x1="464.0" y1="320.0" x2="464.0" y2="332.0" stroke="#1a1a1a" stroke-width="1.2"/>
<rect x="460.0" y="322.0" width="8" height="8.0" fill="#c00"/>
<line x1="24" y1="418.0" x2="506" y2="418.0" stroke="#888"/>
<rect x="40.0" y="369.4" width="8" height="48.6" fill="#c00" opacity="0.55"/>
<rect x="55.0" y="371.0" width="8" height="47.0" fill="#c00" opacity="0.55"/>
<rect x="70.0" y="372.6" width="8" height="45.4" fill="#c00" opacity="0.55"/>
<rect x="85.0" y="374.2" width="8" height="43.8" fill="#c00" opacity="0.55"/>
<rect x="100.0" y="375.8" width="8" height="42.2" fill="#c00" opacity="0.55"/>
<rect x="115.0" y="377.5" width="8" height="40.5" fill="#c00" opacity="0.55"/>
<rect x="130.0" y="378.3" width="8" height="39.7" fill="#c00" opacity="0.55"/>
<rect x="145.0" y="379.9" width="8" height="38.1" fill="#c00" opacity="0.55"/>
<rect x="160.0" y="379.1" width="8" height="38.9" fill="#c00" opacity="0.55"/>
<rect x="175.0" y="380.7" width="8" height="37.3" fill="#c00" opacity="0.55"/>
<rect x="190.0" y="382.3" width="8" height="35.7" fill="#c00" opacity="0.55"/>
<rect x="205.0" y="383.1" width="8" height="34.9" fill="#c00" opacity="0.55"/>
<rect x="220.0" y="383.9" width="8" height="34.1" fill="#c00" opacity="0.55"/>
<rect x="235.0" y="384.8" width="8" height="33.2" fill="#c00" opacity="0.55"/>
<rect x="250.0" y="385.6" width="8" height="32.4" fill="#c00" opacity="0.55"/>
<rect x="265.0" y="383.9" width="8" height="34.1" fill="#c00" opacity="0.55"/>
<rect x="280.0" y="384.8" width="8" height="33.2" fill="#c00" opacity="0.55"/>
<rect x="295.0" y="386.4" width="8" height="31.6" fill="#188a3e" opacity="0.55"/>
<rect x="310.0" y="387.2" width="8" height="30.8" fill="#188a3e" opacity="0.55"/>
<rect x="325.0" y="384.8" width="8" height="33.2" fill="#c00" opacity="0.55"/>
<rect x="340.0" y="383.1" width="8" height="34.9" fill="#c00" opacity="0.55"/>
<rect x="355.0" y="381.5" width="8" height="36.5" fill="#c00" opacity="0.55"/>
<rect x="370.0" y="379.1" width="8" height="38.9" fill="#c00" opacity="0.55"/>
<rect x="385.0" y="375.8" width="8" height="42.2" fill="#c00" opacity="0.55"/>
<rect x="400.0" y="362.9" width="8" height="55.1" fill="#c00" opacity="0.55"/>
<rect x="415.0" y="358.0" width="8" height="60.0" fill="#c00" opacity="0.55"/>
<rect x="430.0" y="361.2" width="8" height="56.8" fill="#c00" opacity="0.55"/>
<rect x="445.0" y="364.5" width="8" height="53.5" fill="#c00" opacity="0.55"/>
<rect x="460.0" y="367.7" width="8" height="50.3" fill="#c00" opacity="0.55"/>
<text x="24" y="352.0" fill="#555">volum</text>
<text x="314.0" y="240.0" fill="#b06000" text-anchor="middle" style="font-weight:bold">primul low</text>
<text x="419.0" y="346.0" fill="#c00" text-anchor="middle" style="font-weight:bold">close 92.00 = breakdown</text>
<text x="24" y="448" fill="#555">Fără trigger: close sub pivot și sub primul low.</text>
</g><text x="540" y="502" fill="#555" text-anchor="middle">Nivelurile 94.00 / 94.55 / 93.20 / 94.40 / 93.10 / 95.70 sunt construite ca exemplu — materialul dă regulile, nu prețurile.</text></svg>

After

Width:  |  Height:  |  Size: 16 KiB