diagrame: ultimele patru etichete ramase in urma textului corectat
selectia_rvol: 'sub jumatate fata de normal' pentru 0,61 -> '61 % dintr-o zi normala'. mdsrt_exemplu: legenda spunea ca nivelurile SPY sunt 'reale, din curs'; sunt reconstruite dupa ilustratia unui sumar Q&A. mbt_iesire: 2.04R -> 2,0R, cifra sursei, prin rotunjire la afisare, fara sa se atinga nicio serie; assert-ul verifica acum textul din SVG-ul randat, nu doar valoarea bruta. atmi_exemplu: '13 luni mai tarziu' era citit ca fapt al materialului - acum spune ca 13 e cifra desenului, materialul da 'aproximativ un an'; si cele patru marcaje de completare din desenele atmi sunt uniformizate. Plus cei trei agenti opencode scrisi pentru rundele astea: verif_strat, corector_strat, reparator_grafic. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ThN7ixZrowca8aTGrK1MUJ
@@ -8,7 +8,7 @@ standard, urcare lentă până la TP1 +10 % = 129.17, atins ~1 an mai târziu
|
||||
Serie continuă de 38 de candele weekly (from_closes), panou de volum,
|
||||
niveluri reale (intrare / TP1) și marcaje ancorate. Toate cifrele vin din
|
||||
`summaries/04_MODUL_3/03_strategia_2_atmi.md` (liniile citate în spec);
|
||||
singurul număr construit de mine e swing high-ul ~123.00, care trebuie să
|
||||
singura completare proprie e swing high-ul ~123.00, care trebuie să
|
||||
conțină corecția de context.
|
||||
"""
|
||||
import sys
|
||||
@@ -22,7 +22,7 @@ OUT = Path(__file__).resolve().parent / "atmi_exemplu.svg"
|
||||
# ── cifrele din material ────────────────────────────────────────────────────
|
||||
ENTRY = 117.43 # 04_MODUL_3/03_strategia_2_atmi.md:358-363
|
||||
TP = 129.17 # TP1 = +10 % pe 117.43 → 129.17 (":170-171, 358-363")
|
||||
SWING_HIGH = 123.00 # construit de mine ca să conțină corecția ≥4 %
|
||||
SWING_HIGH = 123.00 # completare proprie, ca să conțină corecția ≥4 %
|
||||
ENTRY_I = 17 # candela de intrare (verde, precedată de BIM)
|
||||
TP_I = 30 # ultima candelă: TP1 atins
|
||||
BIM_I = ENTRY_I - 1 # BIM (bară de inversare bearish) înaintea candelei verzi
|
||||
@@ -76,10 +76,16 @@ assert any(c.vol is not None for c in cds), "lipsește panoul de volum"
|
||||
|
||||
LUNI = TP_I - ENTRY_I # câte candele lunare de la intrare la TP1
|
||||
assert 12 <= LUNI <= 14, LUNI # „aproximativ un an" din material
|
||||
assert LUNI == 13, f"desenul are {LUNI} candele lunare de la intrare la TP1"
|
||||
|
||||
TP_LABEL = f"TP1 atins {LUNI} luni mai târziu — „aproximativ un an\" în material "\
|
||||
"(ziua exactă e neclară în transcriere)"
|
||||
assert "aproximativ un an" in TP_LABEL
|
||||
# 13 e cifra desenului, „aproximativ un an" e a materialului: eticheta
|
||||
# trebuie să spună explicit care e care, altfel 13 se citește ca fapt al cursului.
|
||||
TP_LABEL = (f"TP1: {LUNI} candele lunare în desen; materialul spune "
|
||||
"„aproximativ un an\" (ziua exactă e neclară în transcriere)")
|
||||
assert f"{LUNI} candele lunare" in TP_LABEL, TP_LABEL
|
||||
assert "materialul spune" in TP_LABEL, TP_LABEL
|
||||
assert "aproximativ un an" in TP_LABEL, TP_LABEL
|
||||
assert "13 luni" not in TP_LABEL, "13 e cifra desenului, nu o lună a materialului"
|
||||
|
||||
levels = [
|
||||
Level(ENTRY, "intrare 117.43", "#188a3e", label_at="right"),
|
||||
@@ -112,8 +118,8 @@ ch = Chart(
|
||||
mas=[MA(20, "#b06000", dash="4 3")],
|
||||
scale=9.5, width=660, gap=15, body_w=9, left=40, vol_h=70,
|
||||
vol_label="volum", title="SPY — monthly: intrare ianuarie 2005 la 117.43 → TP1 +10 % = 129.17",
|
||||
caption="Grafic lunar, ca să încapă orizontul poziției. Swing high-ul e al meu; "
|
||||
"intrarea și ținta sunt din material.",
|
||||
caption="Grafic lunar, ca să încapă orizontul poziției. Completare proprie: "
|
||||
"swing high-ul; restul e din material.",
|
||||
)
|
||||
|
||||
svg = ch.render()
|
||||
|
||||
@@ -16,7 +16,7 @@ STRUCTURA SERIEI (35-40 candele weekly, lipite, gap=15-18, body_w=9-10)
|
||||
(`(123.00 - 117.43) / 123.00 ≈ 4.53 %`).
|
||||
- Candela de intrare: close = 117.43, precedată de BIM + candelă verde
|
||||
(`04_MODUL_3/03_strategia_2_atmi.md:156-162`).
|
||||
- ~20 de candele de urcare de la 117.43 spre 129.17, atins la finalul seriei
|
||||
- 13 candele de urcare de la 117.43 spre 129.17, atins la finalul seriei
|
||||
(~1 an mai târziu — `04_MODUL_3/03_strategia_2_atmi.md:358-363`).
|
||||
- Panou de volum dedesubt (`vol_h=70`).
|
||||
|
||||
@@ -25,11 +25,13 @@ NIVELURI EXACTE ȘI ETICHETE (fiecare cu sursa)
|
||||
- TP1 +10 % = 129.17: `04_MODUL_3/03_strategia_2_atmi.md:170-171, 358-363`.
|
||||
- Fără linie de stop-loss; etichetă „fără stop standard":
|
||||
`04_MODUL_3/03_strategia_2_atmi.md:164-169`.
|
||||
- Etichetă pe final: „TP1 atins ~1 an mai târziu (data exactă neclară în
|
||||
transcriere — ASR)" (`:358-363`).
|
||||
- Etichetă pe final: „TP1: 13 candele lunare în desen; materialul spune
|
||||
«aproximativ un an» (ziua exactă neclară în transcriere)" (`:358-363`).
|
||||
Cele 13 candele sunt o cifră a desenului, nu a materialului; eticheta o
|
||||
spune explicit, ca să nu se citească drept fapt al cursului.
|
||||
- Etichetă pe perioada de după TP: „capital + profit → cash până la următorul
|
||||
trigger valid" (`:176-179`).
|
||||
- Swing high-ul ~123.00 e al meu (construit ca să conțină corecția ≥4 %);
|
||||
- Swing high-ul ~123.00 e completare proprie (construit ca să conțină corecția ≥4 %);
|
||||
cifrele de intrare/țintă sunt ale materialului.
|
||||
|
||||
CE VERIFICĂ GENERATORUL CU assert
|
||||
@@ -42,6 +44,8 @@ CE VERIFICĂ GENERATORUL CU assert
|
||||
- assert nu există nicio linie de stop-loss în desen
|
||||
- assert numărul de candele de la intrare la TP acoperă ~1 an (~50 săptămâni
|
||||
nu încap; folosește weekly și etichetează intervalul ca „~1 an")
|
||||
- assert LUNI == 13 și eticheta spune „13 candele lunare în desen; materialul
|
||||
spune «aproximativ un an»" (13 = cifra desenului, nu a materialului)
|
||||
|
||||
STIL: ~37 candele weekly, fără linii goale în SVG. Marcaj pe candela de
|
||||
intrare cu data și prețul; marcaj pe TP.
|
||||
|
||||
@@ -106,6 +106,6 @@
|
||||
<text x="490.0" y="87.1" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">TP1</text>
|
||||
<text x="24" y="309.1" fill="#188a3e">trigger-ul (BIM + candela verde daily) se petrece în interiorul lunii de intrare — vezi diagrama pasului 4</text>
|
||||
<text x="24" y="326.1" fill="#188a3e">după TP: capital + profit → cash până la următorul trigger valid</text>
|
||||
<text x="24" y="343.1" fill="#188a3e">TP1 atins 13 luni mai târziu — „aproximativ un an" în material (ziua exactă e neclară în transcriere)</text>
|
||||
<text x="24" y="368" fill="#555">Grafic lunar, ca să încapă orizontul poziției. Swing high-ul e al meu; intrarea și ținta sunt din material.</text>
|
||||
<text x="24" y="343.1" fill="#188a3e">TP1: 13 candele lunare în desen; materialul spune „aproximativ un an" (ziua exactă e neclară în transcriere)</text>
|
||||
<text x="24" y="368" fill="#555">Grafic lunar, ca să încapă orizontul poziției. Completare proprie: swing high-ul; restul e din material.</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
@@ -90,8 +90,8 @@ zones = [Zone(0, NP - 1, "", GRAY), Zone(NP, len(cds) - 1, "", BLUE)]
|
||||
ch = Chart(candles=cds, levels=levels, marks=marks, zones=zones, arrows=arrows,
|
||||
scale=13.0, gap=16, body_w=9, left=52, width=720, vol_h=60, top=124,
|
||||
label_gap=54,
|
||||
caption="Cifrele PPQ/SQ sunt completarea mea: cursul dă regula, nu valorile. "
|
||||
"Formula e cea standard, confirmată în material pentru pivoți.")
|
||||
caption="Completare proprie: PPQ/SQ calculate din serie; cursul dă regula, "
|
||||
"nu valorile. Formula standard, confirmată în material.")
|
||||
svg = ch.render()
|
||||
|
||||
# formula, scrisă cu cifrele desenului, ca să nu rămână o regulă abstractă
|
||||
|
||||
@@ -121,5 +121,5 @@
|
||||
<text x="388.0" y="140.9" fill="#333" text-anchor="middle" style="font-weight:bold">C 96.20</text>
|
||||
<text x="484.0" y="124.4" fill="#c00" text-anchor="middle" style="font-weight:bold">swing high 100.00</text>
|
||||
<text x="532.0" y="225.5" fill="#7b2fbf" text-anchor="middle" style="font-weight:bold">corecție 4,0 % — prețul intră în zona PPQ: treci la pasul 2</text>
|
||||
<text x="24" y="389" fill="#555">Cifrele PPQ/SQ sunt completarea mea: cursul dă regula, nu valorile. Formula e cea standard, confirmată în material pentru pivoți.</text>
|
||||
<text x="24" y="389" fill="#555">Completare proprie: PPQ/SQ calculate din serie; cursul dă regula, nu valorile. Formula standard, confirmată în material.</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
@@ -114,7 +114,7 @@ text(34, yc + 17, f"Cu reinvestire integrală: "
|
||||
+ f" · dacă lași profitul deoparte: {fara:,.0f} $".replace(",", ".")
|
||||
+ f" · diferența: {CASTIG:,.2f} $".replace(",", "x").replace(".", ",").replace("x", "."),
|
||||
fill=INK, size=11)
|
||||
text(34, yc + 34, "Cifrele astea sunt calculul meu pe trei cicluri, nu backtest-ul cursului.",
|
||||
text(34, yc + 34, "Completare proprie: cifrele astea sunt calculate pe trei cicluri, nu backtest-ul cursului.",
|
||||
fill=GRAY, size=10)
|
||||
|
||||
H = yc + 56
|
||||
|
||||
@@ -34,5 +34,5 @@
|
||||
<rect x="24" y="326" width="652" height="56" fill="#f6f6f9" stroke="#ccc"/>
|
||||
<text x="34.0" y="342.0" fill="#333" style="font-size:11px;font-weight:bold">Ai pus în total 1.800 $, în trei contribuții egale.</text>
|
||||
<text x="34.0" y="359.0" fill="#333" style="font-size:11px">Cu reinvestire integrală: 2.184,60 $ · dacă lași profitul deoparte: 1.980 $ · diferența: 204,60 $</text>
|
||||
<text x="34.0" y="376.0" fill="#777" style="font-size:10px">Cifrele astea sunt calculul meu pe trei cicluri, nu backtest-ul cursului.</text>
|
||||
<text x="34.0" y="376.0" fill="#777" style="font-size:10px">Completare proprie: cifrele astea sunt calculate pe trei cicluri, nu backtest-ul cursului.</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
@@ -4,7 +4,7 @@ Același trade ca în restul capitolului (intrare 96.00, țintă +10 % = 105.60)
|
||||
dar arătând drumul, nu doar capetele: între intrare și țintă poziția trece
|
||||
printr-un drawdown — pierdere flotantă — de 20 % pe poziție, fără ca nimic
|
||||
să te scoată din ea. Cifra de 20-30 % pe poziție fără levier e a cursului
|
||||
(COVID 2020, 2018); traseul barelor e construit de mine.
|
||||
(COVID 2020, 2018); traseul barelor e completare proprie.
|
||||
|
||||
Coloana din dreapta traduce aceeași cădere de 20 % a indicelui în pierdere
|
||||
pe poziție, pe trei variante de instrument — calculul e în cod.
|
||||
@@ -75,8 +75,8 @@ marks = [
|
||||
ch = Chart(candles=cds, levels=levels, marks=marks,
|
||||
scale=5.6, gap=16, body_w=9, left=56, width=720, vol_h=60, top=152,
|
||||
label_gap=46,
|
||||
caption="Cifra de 20-30 % pe poziție fără levier e a cursului; traseul barelor "
|
||||
"e construit de mine, ca să se vadă cât durează.")
|
||||
caption="Cifra de 20-30 % pe poziție fără levier e a cursului; "
|
||||
"Completare proprie: traseul barelor, ca să se vadă cât durează.")
|
||||
svg = ch.render()
|
||||
|
||||
titlu = ('<text x="24" y="24" fill="#333" style="font-weight:bold">'
|
||||
|
||||
@@ -122,5 +122,5 @@
|
||||
<text x="328.0" y="327.3" fill="#c00" text-anchor="middle" style="font-weight:bold">-20 %: nimic nu te scoate</text>
|
||||
<text x="488.0" y="171.8" fill="#777" text-anchor="middle" style="font-weight:bold">abia aici ești pe zero</text>
|
||||
<text x="600.0" y="180.1" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">TP</text>
|
||||
<text x="24" y="429" fill="#555">Cifra de 20-30 % pe poziție fără levier e a cursului; traseul barelor e construit de mine, ca să se vadă cât durează.</text>
|
||||
<text x="24" y="429" fill="#555">Cifra de 20-30 % pe poziție fără levier e a cursului; Completare proprie: traseul barelor, ca să se vadă cât durează.</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
@@ -27,7 +27,10 @@ prim_tp = next(i for i in range(CLOSE_I + 1, len(cds)) if cds[i].h >= TP)
|
||||
# --- verificări -------------------------------------------------------------
|
||||
assert round(cds[VARF].h, 2) == TP, "ținta nu e high-ul vârfului"
|
||||
assert max(c.h for c in cds[VARF + 1:prim_tp]) < TP, "structura e depășită înainte de țintă"
|
||||
assert prim_tp == 26 and R_TINTA == 2.04, (prim_tp, R_TINTA)
|
||||
# cifra din material/fișă e 2,0R (summaries/08_ANALIZA_ZILNICA/02_mbt10.md:451):
|
||||
# raportul exact e 2.038, dar se rotunjește la o zecimală la 2.0 — verificăm
|
||||
# exact ce se afișează pe desen, nu valoarea brută.
|
||||
assert prim_tp == 26 and round(R_TINTA, 1) == 2.0, (prim_tp, R_TINTA)
|
||||
assert min(c.l for c in cds[CLOSE_I:]) > SL, "stopul ar fi fost atins înainte de țintă"
|
||||
assert cds[VARF].h > cds[CLOSE_I].c > SL, "ordinea vârf / intrare / stop e greșită"
|
||||
zile = prim_tp - CLOSE_I
|
||||
@@ -41,7 +44,7 @@ ch = Chart(
|
||||
zones=[Zone(VARF, VARF, "de aici a pornit coborârea", ORANGE, p_top=95.9),
|
||||
Zone(CLOSE_I, prim_tp, "drumul până la structură: 7 bare", GREEN)],
|
||||
arrows=[
|
||||
Arrow(prim_tp, f"ieși la 95.20 (+{R_TINTA:.2f}R):\nprima structură care a oprit\nprețul "
|
||||
Arrow(prim_tp, f"ieși la 95.20 (+{R_TINTA:.1f}R):\nprima structură care a oprit\nprețul "
|
||||
"ultima dată",
|
||||
price=TP, where="below", color=BLUE, dx=-200, dy=54),
|
||||
],
|
||||
@@ -56,7 +59,7 @@ linii = [
|
||||
"exemplele lui e că", "#333"),
|
||||
("ținta e o structură vizibilă în stânga: un vârf anterior, ultimul maxim mai jos, sau "
|
||||
"închiderea unui gap.", "#333"),
|
||||
(f"Aici: 89.90 → 95.20 = {R_TINTA:.2f}R, în {zile} bare. Cifrele trade-ului sunt din "
|
||||
(f"Aici: 89.90 → 95.20 = {R_TINTA:.1f}R, în {zile} bare. Cifrele trade-ului sunt din "
|
||||
"exemplul construit al materialului.", GREY),
|
||||
]
|
||||
add = 16 * len(linii) + 10
|
||||
@@ -65,5 +68,9 @@ svg = svg.replace("</svg>", "".join(
|
||||
f'<text x="24" y="{H + 10 + 16 * i}" fill="{c}">{t}</text>'
|
||||
for i, (t, c) in enumerate(linii)) + "</svg>")
|
||||
assert "\n\n" not in svg, "linie goală în SVG"
|
||||
# ce se vede pe desen: ambele etichete trebuie să spună 2,0R, ca în material
|
||||
assert f"(+{R_TINTA:.1f}R)" in svg and f"= {R_TINTA:.1f}R," in svg, \
|
||||
"eticheta de ieșire nu afișează 2,0R"
|
||||
assert "2.04R" not in svg, "a rămas eticheta veche cu 2.04R"
|
||||
OUT.write_text(svg, encoding="utf-8")
|
||||
print(f"scris {OUT.name} ({W}x{H + add}); ținta atinsă la bara {prim_tp} = +{R_TINTA}R")
|
||||
print(f"scris {OUT.name} ({W}x{H + add}); ținta atinsă la bara {prim_tp} = +{R_TINTA:.1f}R")
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
<text x="24" y="453.5" fill="#555">volum</text>
|
||||
<line x1="296.0" y1="382.5" x2="491.1" y2="131.9" stroke="#1a5fb4" stroke-width="1.8"/>
|
||||
<polygon points="496.0,125.6 494.2,134.4 487.9,129.5" fill="#1a5fb4"/>
|
||||
<text x="296.0" y="396.5" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">ieși la 95.20 (+2.04R):</text>
|
||||
<text x="296.0" y="396.5" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">ieși la 95.20 (+2.0R):</text>
|
||||
<text x="296.0" y="410.5" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">prima structură care a oprit</text>
|
||||
<text x="296.0" y="424.5" fill="#1a5fb4" text-anchor="middle" style="font-weight:bold">prețul ultima dată</text>
|
||||
<text x="24" y="555" fill="#333">Materialul nu dă o regulă proprie de take-profit la MBT-10. Ce au în comun toate exemplele lui e că</text><text x="24" y="571" fill="#333">ținta e o structură vizibilă în stânga: un vârf anterior, ultimul maxim mai jos, sau închiderea unui gap.</text><text x="24" y="587" fill="#555">Aici: 89.90 → 95.20 = 2.04R, în 7 bare. Cifrele trade-ului sunt din exemplul construit al materialului.</text></svg>
|
||||
<text x="24" y="555" fill="#333">Materialul nu dă o regulă proprie de take-profit la MBT-10. Ce au în comun toate exemplele lui e că</text><text x="24" y="571" fill="#333">ținta e o structură vizibilă în stânga: un vârf anterior, ultimul maxim mai jos, sau închiderea unui gap.</text><text x="24" y="587" fill="#555">Aici: 89.90 → 95.20 = 2.0R, în 7 bare. Cifrele trade-ului sunt din exemplul construit al materialului.</text></svg>
|
||||
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
@@ -1,15 +1,17 @@
|
||||
"""Diagrama din `gen/strategii/mdsrt_exemplu.spec.txt` (TIP: PRET).
|
||||
|
||||
Exemplul real din Q&A 15.07.2025 (`09_QA/24_2025-07-15.md`): SPY pe 5 min,
|
||||
double bottom cu al doilea picior mai jos (MDSRT pe 5 min, suportul = pivotul
|
||||
daily). Downtrend → picior 1 la 622.40 → revenire → picior 2 la 621.40 (rupe
|
||||
pivotul 622.00) → Buy Hammer care închide la 622.60, înapoi peste pivot. După
|
||||
trigger, un plan construit de mine (marcat) duce trade-ul până la TP1.
|
||||
Sesiunea de Q&A 15.07.2025 (`09_QA/24_2025-07-15.md`): SPY pe 5 min, double
|
||||
bottom cu al doilea picior mai jos (MDSRT pe 5 min, suportul = pivotul daily).
|
||||
Downtrend → picior 1 la 622.40 → revenire → picior 2 la 621.40 (rupe pivotul
|
||||
622.00) → Buy Hammer care închide la 622.60, înapoi peste pivot. După trigger,
|
||||
un plan construit de mine (marcat) duce trade-ul până la TP1.
|
||||
|
||||
Reale din curs: nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 bare
|
||||
dintre picioare. Construcția mea: entry 622.60, SL 621.30, TP1 623.90 (1:1) —
|
||||
materialul nu le dă (transcrierea planului se întrerupe). Volumele sunt
|
||||
relative, alese de generator.
|
||||
Nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 bare dintre picioare
|
||||
sunt reconstruite după ilustrația sumarului Q&A — NU sunt rostite în
|
||||
transcriere: sumarul însuși le dă ca „ale mele", construite
|
||||
(`09_QA/24_2025-07-15.md:601-602`). Construcția mea: entry 623.00, SL 621.30,
|
||||
TP1 624.70 (1:1) — materialul nu le dă (transcrierea planului se întrerupe).
|
||||
Volumele sunt relative, alese de generator.
|
||||
|
||||
Rulează:
|
||||
python3 gen/strategii/mdsrt_exemplu.py
|
||||
@@ -26,11 +28,11 @@ OUT = Path(__file__).resolve().parent / "mdsrt_exemplu.svg"
|
||||
|
||||
GRAY, RED, GREEN, BLUE, ORANGE = "#777", "#c00", "#188a3e", "#1a5fb4", "#b06000"
|
||||
|
||||
# ── nivelurile reale din curs + planul construit (marcat) ──────────────────
|
||||
PIVOT = 622.00 # pivot daily, suportul
|
||||
LEG1 = 622.40 # swing low picior 1
|
||||
LEG2 = 621.40 # picior 2 (mai jos, rupe pivotul)
|
||||
HAMMER_C = 622.60 # close-ul Buy Hammer — cifră reală, din sesiunea Q&A
|
||||
# ── nivelurile reconstruite din ilustrația sumarului + planul construit ────
|
||||
PIVOT = 622.00 # pivot daily, suportul (reconstruit după ilustrație)
|
||||
LEG1 = 622.40 # swing low picior 1 (reconstruit)
|
||||
LEG2 = 621.40 # picior 2 (mai jos, rupe pivotul; reconstruit)
|
||||
HAMMER_C = 622.60 # close-ul Buy Hammer — reconstruit după ilustrația sumarului
|
||||
ENTRY = 623.00 # close-ul candelei care sparge high-ul hammer-ului (construit)
|
||||
SL = 621.30 # 0.10 sub low-ul piciorului 2 (construit)
|
||||
TP1 = 624.70 # entry + risc = 1:1 (construit)
|
||||
@@ -112,9 +114,9 @@ assert risk == 1.70, risk
|
||||
# 7. TP1 simetric 1:1
|
||||
assert abs((ENTRY - SL) - (TP1 - ENTRY)) < 1e-9
|
||||
|
||||
# 8. după trigger, primul close care atinge 623.90 e bara 21 (nu mai devreme).
|
||||
# 8. după trigger, primul high care atinge TP1 624.70 e bara 25 (nu mai devreme).
|
||||
# Seria pornește la 627.00, deci „atinge" se citește de jos în sus, din zona
|
||||
# picioarelor: barele 10-20 rămân sub TP1, bara 21 îl atinge.
|
||||
# picioarelor: barele 19-24 rămân sub TP1, bara 25 îl atinge.
|
||||
assert max(c.h for c in cds[19:25]) < TP1, [c.h for c in cds[19:25]]
|
||||
assert cds[25].h >= TP1 > cds[25].o, (cds[25].h, cds[25].o)
|
||||
TP_BAR = 25
|
||||
@@ -162,11 +164,12 @@ ch = Chart(
|
||||
)
|
||||
svg = ch.render()
|
||||
|
||||
# ── legenda de onestitate (assert 11): ce e real, ce e construit ───────────
|
||||
# ── legenda de onestitate (assert 11): ce e reconstruit, ce e construit ────
|
||||
legend = [
|
||||
"Legendă: nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 candele dintre",
|
||||
"picioare sunt reale, din curs. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70",
|
||||
"sunt construcția mea — materialul nu le dă.",
|
||||
"picioare sunt reconstruite după ilustrația sumarului Q&A, nu valori rostite în",
|
||||
"transcriere. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70 sunt construcția mea —",
|
||||
"materialul nu le dă.",
|
||||
]
|
||||
m = re.search(r'viewBox="0 0 (\d+) ([0-9.]+)"', svg)
|
||||
W, H0 = int(m.group(1)), float(m.group(2))
|
||||
@@ -178,8 +181,16 @@ svg = re.sub(r'(viewBox="0 0 \d+ )[0-9.]+(")',
|
||||
svg = svg.replace("\n</svg>", "\n " + "\n ".join(legend_svg) + "\n</svg>")
|
||||
|
||||
assert svg.count("\n\n") == 0, "linie goală în SVG rupe blocul din markdown"
|
||||
assert "sunt reale, din curs" in svg and "construcția mea" in svg, \
|
||||
"legenda nu spune explicit ce e real și ce e construit"
|
||||
assert "reconstruite după ilustrația sumarului Q&A" in svg, \
|
||||
"legenda trebuie să spună că nivelurile sunt reconstruite după sumarul Q&A"
|
||||
assert "nu valori rostite în" in svg, \
|
||||
"legenda trebuie să nege că nivelurile ar fi rostite în transcriere"
|
||||
assert "construcția mea" in svg, \
|
||||
"legenda nu spune explicit ce e construit"
|
||||
# defectul vechi: legenda pretindea că nivelurile ar fi „reale, din curs",
|
||||
# deși vin din ilustrația sumarului, nu din transcriere.
|
||||
assert "reale, din curs" not in svg, \
|
||||
"legenda veche pretindea că nivelurile sunt reale, din curs"
|
||||
|
||||
# toate etichetele cerute de specificație sunt prezente
|
||||
for eticheta in ("pivot daily 622.00", "picior 1 = 622.40",
|
||||
|
||||
@@ -4,18 +4,19 @@ LOC: strategii/07_mdsrt.md, Nivel 2, §2.5 „Exemplul complet, pas cu pas"
|
||||
MARCAJ .md: <!-- DIAGRAMA: exemplu --> (imediat sub titlul 2.5)
|
||||
|
||||
CE ARATĂ
|
||||
Exemplul **real** din Q&A 15.07.2025: SPY pe 5 minute, double bottom cu al
|
||||
doilea picior mai jos, „este MDSRT pă 5 minute", suportul fiind pivotul daily.
|
||||
Sesiunea din Q&A 15.07.2025: SPY pe 5 minute, double bottom cu al doilea picior
|
||||
mai jos, „este MDSRT pă 5 minute", suportul fiind pivotul daily.
|
||||
Downtrend → picior 1 la 622.40 → revenire → picior 2 la 621.40 (mai jos, rupe
|
||||
pivotul 622.00) → Buy Hammer care închide la 622.60, înapoi peste pivot. După
|
||||
trigger, un plan construit de mine (marcat) duce trade-ul până la TP1.
|
||||
Banda de jos = volum, cu higher low pe volum la piciorul 2 (divergență).
|
||||
|
||||
SURSA CIFRELOR
|
||||
- Nivelurile reale, citite din transcriere: swing low picior 1 = 622.40,
|
||||
pivot daily = 622.00, picior 2 = 621.40, Buy Hammer închide 622.60;
|
||||
8 candele între picioare (minimul cerut 5):
|
||||
`09_QA/24_2025-07-15.md:12-14, 26-29, 121-128`.
|
||||
- Nivelurile picior 1 = 622.40, pivot daily = 622.00, picior 2 = 621.40, Buy
|
||||
Hammer închide 622.60 și cele 8 candele între picioare (minimul cerut 5) sunt
|
||||
**reconstruite după ilustrația sumarului Q&A** (`09_QA/24_2025-07-15.md`),
|
||||
NU rostite în transcriere. Sumarul însuși declară prețurile „ale mele",
|
||||
construite (`09_QA/24_2025-07-15.md:601-602`).
|
||||
- Context: „este MDSRT pă 5 minute", suportul = pivotul
|
||||
(`09_QA/24_2025-07-15.md:12-14`).
|
||||
- Divergență preț lower low / volum higher low:
|
||||
@@ -25,9 +26,9 @@ SURSA CIFRELOR
|
||||
`05_MODUL_4/02_strategia_5_mdsrt.md:325-327`). Regula de TP simetrică 1:1:
|
||||
`05_MODUL_4/02_strategia_5_mdsrt.md:322-324`. Stop sub low-ul piciorului 2:
|
||||
`09_QA/15_2025-10-14.md:140-145`.
|
||||
- **Entry 622.60 / SL 621.30 / TP1 623.90 sunt construcția MEA** (marcate în
|
||||
- **Entry 623.00 / SL 621.30 / TP1 624.70 sunt construcția MEA** (marcate în
|
||||
text ca atare), nu cifre din curs — le pun doar ca să existe un A-Z pe
|
||||
nivelurile reale ale exemplului.
|
||||
nivelurile reconstruite ale exemplului.
|
||||
|
||||
STRUCTURA SERIEI (30 candele, open = close-ul barei anterioare)
|
||||
Lista de close-uri:
|
||||
@@ -36,7 +37,8 @@ Lista de close-uri:
|
||||
622.40, # 10 = picior 1 (swing low 622.40)
|
||||
622.70, 623.10, 623.50, 623.20, 622.90, 622.60, 622.30,
|
||||
622.60, # 18 = picior 2: low 621.40, Buy Hammer care închide 622.60
|
||||
623.00, 623.40, 623.90, # 21 = TP1 1:1 (construit)
|
||||
623.00, # 19 = entry: close care sparge high-ul hammer-ului (622.70)
|
||||
623.40, 623.90,
|
||||
624.20, 624.00, 624.40, 624.80, 625.20, 625.60,
|
||||
625.30, 625.70]
|
||||
Mecioni:
|
||||
@@ -56,12 +58,14 @@ NIVELURILE ȘI ETICHETELE
|
||||
- „picior 1 = 622.40" — linie albastră; Mark pe bara 10.
|
||||
- „picior 2 = 621.40 (mai jos) · Buy Hammer" — Mark pe bara 18.
|
||||
- „hammer închide 622.60, înapoi peste pivot" — etichetă pe bara 18.
|
||||
- „intrare 622.60 (construit)" — Mark pe bara 18/19.
|
||||
- „intrare 623.00 (construit)" — linie verde (Mark pe bara 19, close peste
|
||||
high-ul hammer-ului).
|
||||
- „SL 621.30 (construit)" — linie roșie sub low-ul 621.40.
|
||||
- „TP1 623.90 = 1:1 (construit)" — linie verde.
|
||||
- Legendă jos: „nivelurile 622.40 / 622.00 / 621.40 / 622.60 și 8 candele sunt
|
||||
reale, din curs; intrarea, SL-ul și TP-ul sunt construcția mea — materialul
|
||||
nu le dă."
|
||||
- „TP1 624.70 = 1:1 (construit)" — linie verde.
|
||||
- Legendă jos: „nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 candele
|
||||
dintre picioare sunt reconstruite după ilustrația sumarului Q&A, nu valori
|
||||
rostite în transcriere; intrarea, SL-ul și TP-ul sunt construcția mea —
|
||||
materialul nu le dă."
|
||||
|
||||
CE VERIFICĂ GENERATORUL CU assert
|
||||
1. cds[10].l == 622.35 și cds[10].c == 622.40 (picior 1, swing low 622.40).
|
||||
@@ -72,13 +76,17 @@ CE VERIFICĂ GENERATORUL CU assert
|
||||
`09_QA/24_2025-07-15.md:128`; `09_QA/23_2025-07-29.md:869-874`).
|
||||
5. Assert „hammer": (min(o,c) - l) = 622.30 - 621.40 = 0.90 > corpul
|
||||
(|o-c| = 0.30) — coadă lungă în jos, corp mic sus.
|
||||
6. entry == 622.60 (close-ul trigger-ului, construit) și SL == 621.30
|
||||
(0.10 sub low-ul piciorului 2, construit); risk = 1.30.
|
||||
7. abs((entry - sl) - (tp1 - entry)) < 1e-9 (623.90 − 622.60 = 1.30).
|
||||
8. Primul close care atinge 623.90 e bara 21 (nu mai devreme).
|
||||
6. cds[19].c == 623.00 > cds[18].h (close-ul candelei care sparge high-ul
|
||||
hammer-ului, construit) și SL == 621.30 (0.10 sub low-ul piciorului 2,
|
||||
construit); risk = 1.70.
|
||||
7. abs((entry - sl) - (tp1 - entry)) < 1e-9 (624.70 − 623.00 = 1.70).
|
||||
8. Primul high care atinge 624.70 e bara 25 (nu mai devreme; close-ul barei 21,
|
||||
623.90, rămâne sub țintă).
|
||||
9. vol[18] > vol[10] (divergență), cu low[18] < low[10].
|
||||
10. Fiecare open == close-ul barei anterioare (serie continuă).
|
||||
11. Legendă care spune explicit care cifre sunt reale și care sunt construite.
|
||||
11. Legendă care spune explicit ce e reconstruit după ilustrația sumarului Q&A
|
||||
și ce e construcția mea; fără afirmația (falsă) că nivelurile ar fi „reale,
|
||||
din curs".
|
||||
STIL: gap=15, body_w=9, left=44, width=640, vol_h=70, scale lizibil pentru
|
||||
range-ul 621.40-627.00, MA(20) pe close-uri. Titlu: „SPY — 5 min (Q&A
|
||||
15.07.2025; intrare/SL/TP construite)". Fără linie goală în SVG.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<svg viewBox="0 0 640 603" xmlns="http://www.w3.org/2000/svg" style="width:100%;height:auto;font:12px sans-serif">
|
||||
<svg viewBox="0 0 640 620" 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">SPY — 5 min (Q&A 15.07.2025; intrare/SL/TP construite)</text>
|
||||
<line x1="24" y1="373.4" x2="626" y2="373.4" stroke="#b06000" stroke-width="1.5" stroke-dasharray="4 3"/>
|
||||
<text x="30" y="367.4" fill="#b06000">pivot daily 622.00</text>
|
||||
@@ -107,6 +107,7 @@
|
||||
<text x="314.0" y="278.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">hammer închide 622.60, înapoi peste pivot</text>
|
||||
<text x="329.0" y="232.0" fill="#188a3e" text-anchor="middle" style="font-weight:bold">intri aici: close peste high-ul hammer-ului (622.70)</text>
|
||||
<text x="24" y="555.0" fill="#555">Legendă: nivelurile 622.40 / 622.00 / 621.40 / 622.60 și cele 8 candele dintre</text>
|
||||
<text x="24" y="572.0" fill="#555">picioare sunt reale, din curs. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70</text>
|
||||
<text x="24" y="589.0" fill="#555">sunt construcția mea — materialul nu le dă.</text>
|
||||
<text x="24" y="572.0" fill="#555">picioare sunt reconstruite după ilustrația sumarului Q&A, nu valori rostite în</text>
|
||||
<text x="24" y="589.0" fill="#555">transcriere. Intrarea 623.00, SL-ul 621.30 și TP-ul 624.70 sunt construcția mea —</text>
|
||||
<text x="24" y="606.0" fill="#555">materialul nu le dă.</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.3 KiB |
@@ -168,7 +168,7 @@ p += panou("hig", PAN_AX, AZI_HIG, GREEN,
|
||||
"se tranzacționează dublu față de normal"))
|
||||
p += panou("ulta", PAN_BX, AZI_ULTA, RED,
|
||||
"azi = 0,61 × media → RVOL 0.61",
|
||||
"sub jumătate față de o zi normală",
|
||||
"61 % dintr-o zi normală",
|
||||
("sub 100 % = minus, NU veto",
|
||||
"îl notezi, dar analiza continuă"))
|
||||
|
||||
@@ -234,6 +234,17 @@ assert [b[3] for b in BARS["hig"][:-1]] == [b[3] for b in BARS["ulta"][:-1]]
|
||||
# 3. bara „azi" din HIG e chiar cea mai înaltă, iar cea din ULTA e sub medie
|
||||
assert BARS["hig"][-1][2] == max(b[2] for b in BARS["hig"]), "bara HIG nu e cea mai înaltă"
|
||||
assert BARS["ulta"][-1][2] < h_media_px, "bara ULTA nu e sub linia mediei"
|
||||
|
||||
# 3c. eticheta de sub bara ULTA afirmă ce se vede în desen: 0,61 din medie =
|
||||
# 61 % dintr-o zi normală, adică PESTE jumătate. Vechiul text „sub jumătate
|
||||
# față de o zi normală" contrazicea bara desenată (61 % > 50 %) și pica.
|
||||
_rvol_ulta = BARS["ulta"][-1][2] / h_media_px
|
||||
assert round(_rvol_ulta * 100) == 61, \
|
||||
f"bara ULTA măsoară {_rvol_ulta * 100:.0f} % din medie, eticheta nu poate spune 61 %"
|
||||
assert _rvol_ulta > 0.5, \
|
||||
f"bara ULTA e {_rvol_ulta:.2f} din medie, deci PESTE jumătate, nu sub ea"
|
||||
assert "61 % dintr-o zi normală" in svg, "lipsește din desen procentul ULTA"
|
||||
assert "jumătate" not in svg, 'a reapărut formularea greșită "sub jumătate"'
|
||||
# și barele nu ies din cadrul panoului
|
||||
for tag in ("hig", "ulta"):
|
||||
for cx, top, h, v in BARS[tag]:
|
||||
@@ -252,7 +263,7 @@ for tag in ("hig", "ulta"):
|
||||
f"{tag}: eticheta mediei cade peste o bară (valoare {v})"
|
||||
|
||||
# 4. nicio cifră care nu e desenată sau care nu vine din material
|
||||
PERMISE = {"2", "200", "100", "10", "50", "0.61", "0,61", "0.86", "1.03", "1.2", "16"}
|
||||
PERMISE = {"2", "61", "200", "100", "10", "50", "0.61", "0,61", "0.86", "1.03", "1.2", "16"}
|
||||
for _x, _y, s, *_ in TEXTS:
|
||||
for n in re.findall(r"\d+(?:[.,]\d+)?", s):
|
||||
assert n in PERMISE, f"cifră fără acoperire în material: {n!r} în {s!r}"
|
||||
|
||||
@@ -12,7 +12,7 @@ COMPOZITIE:
|
||||
|
||||
CIFRE (toate din capitol / material, niciuna inventata):
|
||||
- HIG: RVOL 200 %, cel mai mare din cele 16 rezultate ale scanerului din ziua aceea.
|
||||
- ULTA: RVOL 0.61, sub jumatate fata de normal.
|
||||
- ULTA: RVOL 0.61, adica 61 % din normal (putin peste jumatate).
|
||||
- scanerul real de Buy Doji: cele trei rezultate aveau 0.86, 1.03 si 0.61.
|
||||
- media e pe 10 bare; indicatorul standard din platforme o calculeaza pe 50.
|
||||
- pragul din sursa e doar „peste 100 %". NU se pune alt prag (nu exista
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
<text x="182.0" y="498.0" font-size="13" font-weight="normal" fill="#000000" text-anchor="middle">se tranzacționează dublu față de normal</text>
|
||||
<text x="382.0" y="340.0" font-size="13" font-weight="bold" fill="#b06000" text-anchor="start">media = 100 %</text>
|
||||
<text x="518.0" y="152.0" font-size="15" font-weight="bold" fill="#c00" text-anchor="middle">azi = 0,61 × media → RVOL 0.61</text>
|
||||
<text x="518.0" y="172.0" font-size="13" font-weight="normal" fill="#000000" text-anchor="middle">sub jumătate față de o zi normală</text>
|
||||
<text x="518.0" y="172.0" font-size="13" font-weight="normal" fill="#000000" text-anchor="middle">61 % dintr-o zi normală</text>
|
||||
<text x="497.3" y="450.0" font-size="13" font-weight="normal" fill="#777777" text-anchor="middle">ultimele 10 bare de volum</text>
|
||||
<text x="647.1" y="450.0" font-size="13" font-weight="bold" fill="#c00" text-anchor="middle">azi</text>
|
||||
<text x="518.0" y="478.0" font-size="13" font-weight="bold" fill="#c00" text-anchor="middle">sub 100 % = minus, NU veto</text>
|
||||
|
||||
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.9 KiB |