diff --git a/PROGRESS.md b/PROGRESS.md index 6c1717e..61235e4 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -54,6 +54,17 @@ Zilnică (147). Decizii luate cu el: `tmux qa_local2`, care așteaptă terminarea primei și reia `transcribe.py` ca să prindă fișierele mutate. `transcribe.py` sare peste ce are deja transcriere, deci pasele sunt sigure de repetat. +- **Workerul de pe moltbot moare fără urmă în loguri.** S-a întâmplat o dată + pe 2026-09-12 la 19:55, în mijlocul unui fișier de 2h11m: procesul python + ȘI serverul tmux au dispărut, fără traceback, fără linie de OOM (containerul + nu vede `dmesg`), fără reboot (uptime intact). Cel mai probabil OOM + nelogat — 8GB, `medium` int8 cu 5 threaduri. Coada s-a oprit 90 de minute + până am observat. + Fix: `cpu_threads` scăzut la 4, și `/root/atm/run.sh` — un supervizor care + relansează workerul de până la 40 de ori, cu 20s pauză, până apare + `ALL DONE` în log. Workerul e resumabil, deci o cădere pierde doar fișierul + în lucru. Pornește cu `tmux new-session -d -s qa_molt "/root/atm/run.sh"`, + NU cu workerul direct. - **Workerul de pe moltbot își face `sorted(glob)` o singură dată la start** — dacă muți/ștergi fișiere din `/root/atm/audio` cât rulează, repornește-l (`tmux kill-session -t qa_molt` + relansare), nu te baza că observă diff --git a/audit_diagrams.py b/audit_diagrams.py new file mode 100644 index 0000000..268361a --- /dev/null +++ b/audit_diagrams.py @@ -0,0 +1,85 @@ +""" +Verificări mecanice pe diagramele SVG dintr-un fișier de sumarizare. + +Prinde exact clasele de bug găsite manual în 01_MODUL_1/05_patternuri_candele.md: +scară inconsistentă între niveluri, text tăiat de viewBox, text suprapus, +linii goale care rup blocul HTML. NU înlocuiește verificarea vizuală — nu +vede dacă un text stă peste o linie de preț. + +Rulează: .venv/bin/python audit_diagrams.py summaries//.md +""" + +import re +import sys +from pathlib import Path + +CHAR_W = 5.7 # latime medie per caracter la 12px sans-serif (calibrat pe randare) +LINE_H = 13 # înălțimea unei linii de text + + +def texts(svg: str): + for m in re.finditer(r']*)>(.*?)', svg, re.S): + attrs, inner = m.group(1), re.sub(r'<[^>]+>', '', m.group(2)) + x = float(re.search(r'\bx="([-\d.]+)"', attrs).group(1)) if re.search(r'\bx="', attrs) else 0.0 + y = float(re.search(r'\by="([-\d.]+)"', attrs).group(1)) if re.search(r'\by="', attrs) else 0.0 + anchor = (re.search(r'text-anchor="(\w+)"', attrs) or [None, "start"])[1] + w = len(inner) * CHAR_W + x0 = x - w if anchor == "end" else (x - w / 2 if anchor == "middle" else x) + yield x0, x0 + w, y, inner.strip() + + +def check(path: Path) -> list[str]: + md = path.read_text(encoding="utf-8") + problems = [] + for i, svg in enumerate(re.findall(r'', md, re.S)): + vb = re.search(r'viewBox="0 0 ([\d.]+) ([\d.]+)"', svg) + if not vb: + problems.append(f"svg {i}: fără viewBox") + continue + vw, vh = float(vb.group(1)), float(vb.group(2)) + + if re.search(r"\n[ \t]*\n", svg): + problems.append(f"svg {i}: linie goală înăuntru — markdown rupe blocul") + + tx = list(texts(svg)) + for x0, x1, y, s in tx: + if x1 > vw + 2: + problems.append(f'svg {i}: text depășește marginea dreaptă ({x1:.0f} > {vw:.0f}): "{s[:45]}"') + if y > vh + 2 or y < 0: + problems.append(f'svg {i}: text în afara înălțimii (y={y:.0f}, viewBox {vh:.0f}): "{s[:45]}"') + for a in range(len(tx)): + for b in range(a + 1, len(tx)): + xa0, xa1, ya, sa = tx[a] + xb0, xb1, yb, sb = tx[b] + if abs(ya - yb) < LINE_H and xa0 < xb1 - 4 and xb0 < xa1 - 4: + problems.append(f'svg {i}: texte suprapuse — "{sa[:28]}" / "{sb[:28]}"') + + # dacă diagrama are exact 3 niveluri de preț orizontale (SL/intrare/TP), + # raportul distanțelor în preț trebuie să fie cel din pixeli + lv = re.findall(r']*?/>\s*]*>([^<]*?(\d+\.\d\d)[^<]*)', svg) + if len(lv) == 3: + pts = sorted((float(p), float(y)) for y, _, p in lv) + (plo, ylo), (pmid, ymid), (phi, yhi) = pts + if pmid - plo > 0 and ylo - ymid > 0: + rp = (phi - pmid) / (pmid - plo) + rx = (ymid - yhi) / (ylo - ymid) + if abs(rp - rx) > 0.05: + problems.append(f"svg {i}: SCARĂ GREȘITĂ — raport în prețuri {rp:.2f}R, desenat {rx:.2f}R") + return problems + + +def main(): + files = [Path(a) for a in sys.argv[1:]] or sorted(Path("summaries").glob("*/*.md")) + total = 0 + for f in files: + probs = check(f) + total += len(probs) + print(f"\n=== {f} — {len(probs)} probleme" if probs else f"\n=== {f} — curat") + for p in probs: + print(" ", p) + print(f"\nTOTAL: {total} probleme în {len(files)} fișiere") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/summaries/09_QA/01_2026-08-25.html b/summaries/09_QA/01_2026-08-25.html index ae9a58f..31f2cba 100644 --- a/summaries/09_QA/01_2026-08-25.html +++ b/summaries/09_QA/01_2026-08-25.html @@ -375,7 +375,7 @@ indicatorul Market Picture / Commitment of Traders.

  • Speculatorii = toți ceilalți, inclusiv JP Morgan când speculează, inclusiv Warren Buffett, inclusiv retail-ul. "Dar noi suntem mici."
  • -

    +

    Preț (weekly) ↑ @@ -387,14 +387,13 @@ indicatorul Market Picture / Commitment of Traders.

    Commitment of Traders zero - sub linie = net short / peste = net long mari comercianți (commercials) trec deasupra liniei de zero AICI - 3-5 săptămâni până la bottom-ul de preț + 3-5 săptămâni până la bottom-ul de prețLinia albastră sub linia de zero = commercials net short; peste ea = net long. după bottom ies iar net short (fac hedging)

    @@ -550,20 +549,20 @@ Fed-ul bagă lichiditate masiv ca să țină piața în uptrend, iar asta poate sfârși într-un eveniment de lichiditate.

    Definiția lui, care e mai utilă decât cea din manuale: un Black Swan nu e "o știre proastă". E absența ordinelor între două prețuri.

    -

    +

    preț ↑ 27.00 — ultimul preț tranzacționat aseară - - 24.00 — unde ți-ai pus stop-loss-ul + + 24.00 — unde ți-ai pus stop-loss-ul niciun ordin aici nimeni nu cumpără între 27.00 și 10.00 10.00 — prima deschidere de azi SL-ul de la 24.00 se execută la 10.00, nu la 24.00. - Nu există niciun preț între cele două la care cineva să fi cumpărat. + Nu există niciun preț între cele două la care cineva să fi cumpărat.Desenat la scară: 1.00 = 9.4 px, deci golul de sub stop e la fel de mare pe cât e în realitate.

    De ce e mai mult decât o curiozitate: stop-loss-ul nu e o garanție de preț, e un ordin care se activează la un nivel și se execută la primul preț diff --git a/summaries/09_QA/01_2026-08-25.md b/summaries/09_QA/01_2026-08-25.md index 3f1dc12..f6442e6 100644 --- a/summaries/09_QA/01_2026-08-25.md +++ b/summaries/09_QA/01_2026-08-25.md @@ -425,7 +425,7 @@ indicatorul Market Picture / Commitment of Traders. - **Speculatorii** = toți ceilalți, inclusiv JP Morgan când speculează, inclusiv Warren Buffett, inclusiv retail-ul. "Dar noi suntem mici." - + Preț (weekly) ↑ @@ -437,14 +437,13 @@ indicatorul Market Picture / Commitment of Traders. Commitment of Traders zero - sub linie = net short / peste = net long mari comercianți (commercials) trec deasupra liniei de zero AICI - 3-5 săptămâni până la bottom-ul de preț + 3-5 săptămâni până la bottom-ul de prețLinia albastră sub linia de zero = commercials net short; peste ea = net long. după bottom ies iar net short (fac hedging) @@ -579,20 +578,20 @@ sfârși într-un **eveniment de lichiditate**. **Definiția lui, care e mai utilă decât cea din manuale:** un Black Swan nu e "o știre proastă". E **absența ordinelor între două prețuri**. - + preț ↑ 27.00 — ultimul preț tranzacționat aseară - - 24.00 — unde ți-ai pus stop-loss-ul + + 24.00 — unde ți-ai pus stop-loss-ul niciun ordin aici nimeni nu cumpără între 27.00 și 10.00 10.00 — prima deschidere de azi SL-ul de la 24.00 se execută la 10.00, nu la 24.00. - Nu există niciun preț între cele două la care cineva să fi cumpărat. + Nu există niciun preț între cele două la care cineva să fi cumpărat.Desenat la scară: 1.00 = 9.4 px, deci golul de sub stop e la fel de mare pe cât e în realitate. **De ce e mai mult decât o curiozitate:** stop-loss-ul nu e o garanție de diff --git a/summaries/09_QA/03_2026-08-11.html b/summaries/09_QA/03_2026-08-11.html index 86df6d5..fd4756c 100644 --- a/summaries/09_QA/03_2026-08-11.html +++ b/summaries/09_QA/03_2026-08-11.html @@ -158,7 +158,7 @@ Opțiunea amplifică; nu ea dă direcția.

    MBT-10, intri fără altă confirmare.

    Dar cu o nuanță care contează: prima MBT-10 de după gap down poate să nu meargă. În general merge a doua sau a treia.

    -

    +

    preț ↑ @@ -173,7 +173,7 @@ meargă. În general merge a doua sau a treia.

    #3 — ține de aici pornește mișcarea - Consecință practică: dimensionează poziția știind că s-ar putea să dai 2-3 încercări înainte să prindă una. + Consecință practică: dimensionează poziția știind că s-ar puteasă dai 2-3 încercări înainte să prindă una.

    De ce contează nuanța asta (completarea mea): dacă intri cu toată mărimea pe prima MBT-10 și te scoate, ai pierdut și banii, și încrederea să @@ -203,7 +203,7 @@ candlestick. Problema lor: sunt extrem de rare.

    cozi în ambele părți Se întâmplă des, pe orice asset. >65% probabilitate, testat istoric. - Un pattern cu rată bună de reușită dar care apare o dată la doi ani nu-ți produce nimic. Frecvența contează la fel de mult ca rata. + Un pattern cu rată bună de reușită dar care apare o dată la doi aninu-ți produce nimic. Frecvența contează la fel de mult ca rata.

    Argumentul lui, verbatim: "când am o chestie care mi se întâmplă foarte rar, cât de des pot să fac eu bani cu ea? Ce sens are să stau să mă diff --git a/summaries/09_QA/03_2026-08-11.md b/summaries/09_QA/03_2026-08-11.md index 05c0a38..d68bac9 100644 --- a/summaries/09_QA/03_2026-08-11.md +++ b/summaries/09_QA/03_2026-08-11.md @@ -151,7 +151,7 @@ MBT-10, intri fără altă confirmare.** Dar cu o nuanță care contează: **prima MBT-10 de după gap down poate să nu meargă. În general merge a doua sau a treia.** - + preț ↑ @@ -166,7 +166,7 @@ meargă. În general merge a doua sau a treia.** #3 — ține de aici pornește mișcarea - Consecință practică: dimensionează poziția știind că s-ar putea să dai 2-3 încercări înainte să prindă una. + Consecință practică: dimensionează poziția știind că s-ar puteasă dai 2-3 încercări înainte să prindă una. **De ce contează nuanța asta (completarea mea):** dacă intri cu toată @@ -203,7 +203,7 @@ candlestick. Problema lor: sunt extrem de rare. cozi în ambele părți Se întâmplă des, pe orice asset. >65% probabilitate, testat istoric. - Un pattern cu rată bună de reușită dar care apare o dată la doi ani nu-ți produce nimic. Frecvența contează la fel de mult ca rata. + Un pattern cu rată bună de reușită dar care apare o dată la doi aninu-ți produce nimic. Frecvența contează la fel de mult ca rata. **Argumentul lui, verbatim:** "când am o chestie care mi se întâmplă foarte diff --git a/summaries/09_QA/05_2026-07-28.html b/summaries/09_QA/05_2026-07-28.html index 48dc6ad..9b7dd90 100644 --- a/summaries/09_QA/05_2026-07-28.html +++ b/summaries/09_QA/05_2026-07-28.html @@ -57,7 +57,7 @@ higher highs / higher lows să se stabilească vizibil, nu doar să presupui.

    Cifra de context: piața de bonduri e de 5-10 ori mai mare decât piața de equities. Ce se decide acolo nu urmează piața de acțiuni — o precede.

    Relația preț ↔ randament

    -

    +

    Prețul bondului și randamentul (yield) sunt invers proporționale TLT — prețul bondurilor @@ -74,7 +74,7 @@ de equities. Ce se decide acolo nu urmează piața de acțiuni — o precede.

    TLT care urcă înseamnă că cineva cumpără bonduri — adică piața de bonduri anticipează dobânzi mai mici. - Dacă prețul urcă, dobânzile scad. Dacă dobânzile urcă, prețurile scad. Nu sunt două fenomene, e același. + Dacă prețul urcă, dobânzile scad. Dacă dobânzile urcă, scad prețurile.Nu sunt două fenomene, e același.

    Cum a citit-o live: pe futures-ul de bonduri la 30 de ani, fiecare respingere fusese cumpărată — semn că instituționalii cumpără bonduri. diff --git a/summaries/09_QA/05_2026-07-28.md b/summaries/09_QA/05_2026-07-28.md index 7e0512e..d5a6548 100644 --- a/summaries/09_QA/05_2026-07-28.md +++ b/summaries/09_QA/05_2026-07-28.md @@ -51,7 +51,7 @@ de equities. Ce se decide acolo nu urmează piața de acțiuni — o precede. ### Relația preț ↔ randament - + Prețul bondului și randamentul (yield) sunt invers proporționale TLT — prețul bondurilor @@ -68,7 +68,7 @@ de equities. Ce se decide acolo nu urmează piața de acțiuni — o precede. TLT care urcă înseamnă că cineva cumpără bonduri — adică piața de bonduri anticipează dobânzi mai mici. - Dacă prețul urcă, dobânzile scad. Dacă dobânzile urcă, prețurile scad. Nu sunt două fenomene, e același. + Dacă prețul urcă, dobânzile scad. Dacă dobânzile urcă, scad prețurile.Nu sunt două fenomene, e același. **Cum a citit-o live:** pe futures-ul de bonduri la 30 de ani, fiecare diff --git a/summaries/09_QA/10_2025-12-02.html b/summaries/09_QA/10_2025-12-02.html index a5715a5..968ca39 100644 --- a/summaries/09_QA/10_2025-12-02.html +++ b/summaries/09_QA/10_2025-12-02.html @@ -113,7 +113,7 @@ consolidare.

    sprinturi nu se oprește — aleargă ușor între ele. Consolidarea e alergarea ușoară. După ea vine un nou sprint, care poate fi în direcția trendului sau invers.

    -

    +

    preț ↑ sprint (trend) @@ -124,7 +124,7 @@ invers.

    sau sprint invers (reversal) sprint nou, în direcția trendului - Din trend se trece prin consolidare, apoi ori continuă trendul, ori se schimbă. Direcția nu se știe dinainte. + Din trend se trece prin consolidare, apoi ori continuă trendul,ori se schimbă. Direcția nu se știe dinainte.

    Definiția de uptrend pe care a repetat-o ("scărița"): high-ul de azi mai sus decât high-ul de ieri și low-ul de azi mai sus decât low-ul de ieri. diff --git a/summaries/09_QA/10_2025-12-02.md b/summaries/09_QA/10_2025-12-02.md index 802fe79..513c08f 100644 --- a/summaries/09_QA/10_2025-12-02.md +++ b/summaries/09_QA/10_2025-12-02.md @@ -119,7 +119,7 @@ sprinturi nu se oprește — **aleargă ușor** între ele. Consolidarea e alerg ușoară. După ea vine un nou sprint, care poate fi în direcția trendului sau invers. - + preț ↑ sprint (trend) @@ -130,7 +130,7 @@ invers. sau sprint invers (reversal) sprint nou, în direcția trendului - Din trend se trece prin consolidare, apoi ori continuă trendul, ori se schimbă. Direcția nu se știe dinainte. + Din trend se trece prin consolidare, apoi ori continuă trendul,ori se schimbă. Direcția nu se știe dinainte. **Definiția de uptrend pe care a repetat-o** ("scărița"): high-ul de azi mai diff --git a/summaries/09_QA/12_2025-11-18.html b/summaries/09_QA/12_2025-11-18.html index 49f6ad6..5bea1f7 100644 --- a/summaries/09_QA/12_2025-11-18.html +++ b/summaries/09_QA/12_2025-11-18.html @@ -261,7 +261,7 @@ de 2% se încalcă cel mai ușor.

    Citirea de bottom din ziua aceea

    Confluența pe care a folosit-o ca să spună că suntem într-o zonă de suport importantă:

    -

    +

    Cinci semnale în același punct Pivotul quarterly @@ -283,7 +283,7 @@ importantă:

    pe structura de preț Contextul: S&P urcase 33-40% de la bottom, cu 7 luni consecutive de creștere — rar istoric. Căzuse doar 4-5%. Părerea lui: o corecție de 10-12% ar fi fost sănătoasă. - Scenariul de risc: dacă e Head & Shoulders, mișcarea măsurată duce fix în pivotul quarterly, încă ~2% mai jos. + Scenariul de risc: dacă e Head & Shoulders, mișcarea măsuratăduce fix în pivotul quarterly, încă ~2% mai jos.

    Regula de acțiune pe care a dat-o: dacă prețul ajunge în pivotul quarterly, acolo se cumpără pe ATMI (strategia de investiții pe termen diff --git a/summaries/09_QA/12_2025-11-18.md b/summaries/09_QA/12_2025-11-18.md index dda53ec..ef02344 100644 --- a/summaries/09_QA/12_2025-11-18.md +++ b/summaries/09_QA/12_2025-11-18.md @@ -266,7 +266,7 @@ de 2% se încalcă cel mai ușor. Confluența pe care a folosit-o ca să spună că suntem într-o zonă de suport importantă: - + Cinci semnale în același punct Pivotul quarterly @@ -288,7 +288,7 @@ importantă: pe structura de preț Contextul: S&P urcase 33-40% de la bottom, cu 7 luni consecutive de creștere — rar istoric. Căzuse doar 4-5%. Părerea lui: o corecție de 10-12% ar fi fost sănătoasă. - Scenariul de risc: dacă e Head & Shoulders, mișcarea măsurată duce fix în pivotul quarterly, încă ~2% mai jos. + Scenariul de risc: dacă e Head & Shoulders, mișcarea măsuratăduce fix în pivotul quarterly, încă ~2% mai jos. **Regula de acțiune pe care a dat-o:** dacă prețul ajunge în **pivotul