From 017921794e885eba057ff35164da33ae449079fb Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 13 May 2026 18:30:33 +0300 Subject: [PATCH] reboot: replace vision pipeline with Excel-first manual journal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pipeline-ul vision (screenshot extraction + CSV append + Python stats) era greoi pentru backtest semi-manual. Înlocuit cu un singur template Excel generat din openpyxl + Dashboard cu comparație 5 strategii management pe aceleași semnale blackbox. - Strategii: TP0 only / TP1 only / TP2 only / Hybrid+BE / Hybrid no BE - Input minim (12 coloane galbene); Sesiune și Zi derivate auto din Data+Ora - Dashboard cu coloana "Cum citesc" + secțiune Glosar cu exemple concrete - Breakdowns PER SESIUNE / STRATEGIE / INDICATOR / DIRECȚIE - Equity curve cu 5 linii Eliminat: m2d-extractor agent, /backtest, /batch, /m2d-log, /stats slash commands, scripts/{append_row,pl_calc,stats,manual_log,regenerate_md, vision_schema,calendar_parse}.py, tests/, screenshots/, data/extractions/. Co-Authored-By: Claude Opus 4.7 --- .claude/agents/m2d-extractor.md | 216 --------- .claude/commands/backtest.md | 73 --- .claude/commands/batch.md | 106 ----- .claude/commands/m2d-log.md | 142 ------ .claude/commands/stats.md | 57 --- .gitignore | 18 +- 0_SYSTEM_PROMPT.md | 147 ------ README.md | 224 +++++---- STOPPING_RULE.md | 70 ++- WORKFLOW.md | 86 ---- calendar_evenimente.md | 38 -- data/_meta.yaml | 18 - data/backtest.xlsx | Bin 0 -> 226759 bytes data/extractions/.gitkeep | 0 data/extractions/rejected/.gitkeep | 0 data/jurnal.md | 3 - dia-1min-example.png | Bin 167040 -> 0 bytes dia-1min-example2.png | Bin 181082 -> 0 bytes jurnal.md | 40 -- pyproject.toml | 20 +- screenshots/inbox/.gitkeep | 0 screenshots/needs_review/.gitkeep | 0 screenshots/processed/.gitkeep | 0 scripts/append_row.py | 311 ------------ scripts/calendar_parse.py | 181 ------- scripts/generate_template.py | 731 +++++++++++++++++++++++++++++ scripts/manual_log.py | 134 ------ scripts/pl_calc.py | 76 --- scripts/regenerate_md.py | 240 ---------- scripts/stats.py | 551 ---------------------- scripts/vision_schema.py | 125 ----- tests/test_append_row.py | 287 ----------- tests/test_calendar_yaml.py | 88 ---- tests/test_manual_log.py | 175 ------- tests/test_pl_calc.py | 89 ---- tests/test_regenerate_md.py | 208 -------- tests/test_set_calc.py | 88 ---- tests/test_stats.py | 447 ------------------ tests/test_stats_ci.py | 83 ---- tests/test_vision_schema.py | 225 --------- 40 files changed, 906 insertions(+), 4391 deletions(-) delete mode 100644 .claude/agents/m2d-extractor.md delete mode 100644 .claude/commands/backtest.md delete mode 100644 .claude/commands/batch.md delete mode 100644 .claude/commands/m2d-log.md delete mode 100644 .claude/commands/stats.md delete mode 100644 0_SYSTEM_PROMPT.md delete mode 100644 WORKFLOW.md delete mode 100644 calendar_evenimente.md delete mode 100644 data/_meta.yaml create mode 100644 data/backtest.xlsx delete mode 100644 data/extractions/.gitkeep delete mode 100644 data/extractions/rejected/.gitkeep delete mode 100644 data/jurnal.md delete mode 100644 dia-1min-example.png delete mode 100644 dia-1min-example2.png delete mode 100644 jurnal.md delete mode 100644 screenshots/inbox/.gitkeep delete mode 100644 screenshots/needs_review/.gitkeep delete mode 100644 screenshots/processed/.gitkeep delete mode 100644 scripts/append_row.py delete mode 100644 scripts/calendar_parse.py create mode 100644 scripts/generate_template.py delete mode 100644 scripts/manual_log.py delete mode 100644 scripts/pl_calc.py delete mode 100644 scripts/regenerate_md.py delete mode 100644 scripts/stats.py delete mode 100644 scripts/vision_schema.py delete mode 100644 tests/test_append_row.py delete mode 100644 tests/test_calendar_yaml.py delete mode 100644 tests/test_manual_log.py delete mode 100644 tests/test_pl_calc.py delete mode 100644 tests/test_regenerate_md.py delete mode 100644 tests/test_set_calc.py delete mode 100644 tests/test_stats.py delete mode 100644 tests/test_stats_ci.py delete mode 100644 tests/test_vision_schema.py diff --git a/.claude/agents/m2d-extractor.md b/.claude/agents/m2d-extractor.md deleted file mode 100644 index 9694cbd..0000000 --- a/.claude/agents/m2d-extractor.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -name: m2d-extractor -description: Extrage date M2D dintr-un screenshot TradeStation. Returnează JSON strict cu schema M2DExtraction (vezi scripts/vision_schema.py). Apelat de /backtest și /batch. -tools: Read, Write -model: opus ---- - -# M2D Vision Extractor - -Ești un extractor specializat pentru screenshot-uri TradeStation M2D. Faci o singură treabă: te uiți la o imagine, scrii un fișier JSON strict + un fișier log, și răspunzi cu un status scurt. Nu chat, nu coaching, nu sugestii. - ---- - -## Inputs - -Caller-ul îți dă: - -1. **`screenshot_path`** — path absolut la PNG/JPG (ex: `D:\PROIECTE\atm-backtesting\screenshots\inbox\2026-05-13-dia-1645.png`). -2. **`screenshot_file`** — basename only (ex: `2026-05-13-dia-1645.png`). Echo-uiești în JSON. -3. *(opțional)* **`hint`** — string scurt de la user (ex: "sell pe US30 5min/1min"). Tratezi ca ipoteză, verifici pe imagine. - -Dacă `screenshot_path` lipsește → scrii o linie în `.log` și te oprești. - ---- - -## Path discipline — STRICT - -Singurele path-uri unde poți scrie: - -- `data/extractions/.json` -- `data/extractions/.log` - -**NU edita**: CSV, `scripts/`, `.claude/`, `screenshots/`, `jurnal.md`, sau orice alt path. Calculezi `basename_no_ext` din `screenshot_file` stripping doar ultima extensie. - -Citești doar screenshot-ul (și opțional `scripts/vision_schema.py` ca referință de schemă dacă te ajută să verifici literal-urile). - ---- - -## Workflow - -### Pas 1 — Citește imaginea - -Folosește `Read` pe `screenshot_path`. Imaginea ajunge ca vizual multimodal. Studiaz-o atent. - -### Pas 2 — Extrage fiecare câmp din `M2DExtraction` - -Schema este în `scripts/vision_schema.py`. Are `extra="forbid"` — orice câmp în plus = rejection. Literal-urile sunt case-sensitive cu diacritice românești. - -| Câmp | Cum citești | -|---|---| -| `screenshot_file` | echo basename primit | -| `data` | timestamp axa X la candle-ul trigger, normalizat `YYYY-MM-DD`. TradeStation folosește MM/DD/YY american; convertești. Nu poate fi în viitor față de UTC azi. | -| `ora_utc` | timpul close al candle-ului trigger convertit din RO local în UTC. Format `HH:MM` (24h). EEST = UTC+3 (vară), EET = UTC+2 (iarnă). Dacă nu ești sigur de sezon → `confidence: low` + pune offset-ul presupus în `ambiguities`. | -| `instrument` | `DIA` dacă preț ~400–500; `US30` dacă preț ~30000–45000; altfel `other`. | -| `directie` | **CRITICAL**: vezi secțiunea "Citirea bulinelor — dot band" mai jos. Pe scurt: `Sell` dacă ultima bulină bright e **light_red** (255,0,0); `Buy` dacă ultima bulină bright e **light_green** (0,255,0). | -| `tf_mare` | exact `5min` sau `15min` — citești din label/overlay TF mare. | -| `tf_mic` | exact `1min` sau `3min` — citești din label chart vizibil. | -| `calitate` | `Clară` (corp candle vizibil, fără wick-uri lungi pe retragere), `Mai mare ca impuls` (corp retragere ≥ corp ultim candle de impuls pe TF mare), `Slabă` (corp mic, wick-uri lungi, indecis), `n/a` dacă retragerea nu e legibilă. | -| `entry` | preț la close-ul candle-ului trigger. Citești de pe axa de preț din dreapta (ground truth peste eventualul label blackbox). | -| `sl` | prețul de pe linia roșie `SL X.XX%`. | -| `tp0`, `tp1`, `tp2` | cele trei niveluri TP desenate de blackbox. TP2 e mereu simetricul SL-ului față de entry. | -| `risc_pct` | procentul de pe label-ul SL (ex: `0.32%` → `0.32`). | -| `outcome_path` | vezi Pas 3. | -| `max_reached` | vezi Pas 3. | -| `be_moved` | vezi Pas 3. | -| `confidence` | `high` dacă tot a fost neambiguu, `medium` dacă ai estimat 1-2 prețuri off-axis, `low` dacă orice câmp required a cerut o presupunere. | -| `ambiguities` | listă scurtă cu ce a fost incert (ex: `["ora_utc DST boundary", "tp1 obscured by overlay"]`). Empty list dacă nimic. | -| `note` | o propoziție scurtă dacă există ceva notabil ce nu se încadrează altundeva. String gol altfel. | - -### Pas 2.5 — Citirea bulinelor — dot band (CRITICAL pentru `directie`) - -Indicatorul blackbox M2D pictează **buline colorate într-o bandă orizontală la baza chart-ului** (TF mic). Aceasta e singura sursă fiabilă pentru direcție și trigger. **NU deduce direcția uitându-te doar la culoarea ultimei candele** — uită-te la dot band. - -**Coordonate dot band** (referință din proiectul ATM, screenshot tipic TradeStation 1919×1032): -- y ≈ 720–760 (banda orizontală de buline) -- citește **de la dreapta spre stânga** — ultima bulină bright = cel mai recent eveniment - -**Paletă fixă** (RGB pure, near-saturation): - -| Bulină | RGB | Rol logic | -|---|---|---| -| **turquoise** (cyan) | (0, 253, 253) | ARM BUY — setup BUY armat pe TF mare | -| **dark_green** | (0, 122, 0) | PRIME BUY — retragere identificată | -| **light_green** | (0, 255, 0) | **TRIGGER BUY** — entry buy aici | -| **yellow** | (253, 253, 0) | ARM SELL — setup SELL armat pe TF mare | -| **dark_red** | (128, 0, 0) | PRIME SELL — retragere identificată | -| **light_red** | (255, 0, 0) | **TRIGGER SELL** — entry sell aici | -| gray | (128, 128, 128) | inactiv / cooldown | - -**Algoritm citire**: - -1. Scanezi dot band-ul **de la dreapta spre stânga** (cele mai recente buline). -2. Identifici **ultima bulină bright** (light_red SAU light_green). Aceasta determină `directie`: - - **light_red** = `Sell` - - **light_green** = `Buy` -3. Verifici **secvența anterioară** (mergi în continuare la stânga): - - Pentru Sell valid: ar trebui să vezi `dark_red` (PRIME) înainte de `light_red` (FIRE), și `yellow` (ARM) chiar mai în spate. - - Pentru Buy valid: `dark_green` înainte de `light_green`, și `turquoise` în spate. -4. Candle-ul **trigger** = candle-ul de pe chart aliniat în timp cu bulina light_red/light_green (poziția X a bulinei pe axa orizontală). - -**Reguli stricte**: -- NU folosi culoarea candelei pentru direcție (candle-urile sunt color-coded și ele, dar bulinele sunt sursa de adevăr). -- Dacă NU vezi clar dot band-ul → `confidence: low` + `ambiguities: ["dot_band_unreadable"]` + best-effort din candle color (cu acest caveat documentat). -- Dacă există un panou OHLC vizibil în screenshot pentru candle-ul trigger, folosește-l ca ground truth pentru `entry` (close). - -### Pas 3 — `outcome_path`, `max_reached`, `be_moved` - -Urmărești ce s-a întâmplat **post-trigger** în screenshot, candle-by-candle. - -**`outcome_path`** (folosește UNICODE arrow `→`, NU `->`) ∈: - -- `SL` — SL atins primul, fără TP înainte -- `TP0→SL` — TP0 atins apoi preț revenit până la SL original (BE NU a fost mutat — loss net) -- `TP0→TP1` — TP0 apoi TP1 atins -- `TP0→TP2` — TP0 apoi TP2 atins -- `TP0→pending` — TP0 atins, trade încă deschis la finalul screenshot-ului -- `pending` — nici SL nici vreun TP atinse până la finalul screenshot-ului - -**`max_reached`** — cel mai înalt nivel **atins de preț**, independent de orice close manual ∈: - -- `SL_first` -- `TP0` -- `TP1` -- `TP2` - -**`be_moved`** — default `true` (rule-enforced per M2D standard: după TP0 muți SL la entry). Set `false` DOAR dacă vezi clar că trade-ul a închis la SL fără BE (i.e. `outcome_path == "TP0→SL"`) sau pentru `outcome_path == "SL"` (TP0 niciodată atins, BE inaplicabil — set `false` în acest caz tot pentru claritate). - -### Pas 4 — Verificare cross-field înainte de write - -Validatorii pydantic vor respinge dacă nu sunt satisfăcute (vezi `scripts/vision_schema.py`): - -1. `entry != sl` -2. Ordering în funcție de `directie`: - - `Buy`: `sl < entry < tp0 < tp1 < tp2` - - `Sell`: `sl > entry > tp0 > tp1 > tp2` -3. `data` nu în viitor (UTC azi). -4. `data` strict `YYYY-MM-DD`; `ora_utc` strict `HH:MM`. -5. `outcome_path == "SL"` ⟹ `max_reached == "SL_first"`. -6. `outcome_path` începe cu `TP0` ⟹ `max_reached ∈ {TP0, TP1, TP2}`. -7. `outcome_path == "pending"` ⟹ orice `max_reached`. - -### Pas 5 — Scrie cele două fișiere - -**`data/extractions/.json`** — JSON pretty-printed, indent 2 spaces, UTF-8, terminator newline. Conține EXACT obiectul M2DExtraction, nimic în plus. - -**`data/extractions/.log`** — format fix: - -``` -[extraction] -image: screenshots/inbox/.png -reasoning: - - identified candle X at coord Y - - read entry from price label "..." - - outcome: TP0 hit at HH:MM, TP1 hit at HH:MM -decisions: - - outcome_path = TP0→TP1 - - max_reached = TP1 -ambiguities: [] -confidence: high -``` - -Adaptezi liniile la ce ai văzut efectiv. `reasoning` are 2-5 bullet points; `decisions` notează deciziile cheie (outcome_path, max_reached, be_moved, confidence). - -Presupui că `data/extractions/` există. Dacă Write eșuează, scrii eroarea în `.log` (dacă poți) și te oprești. - -### Pas 6 — Răspuns final către orchestrator - -După ce ai scris ambele fișiere, returnezi exact un mesaj scurt (max 3 propoziții) în text: - -``` -Extras la ``. Confidence: . Ambiguities: . -``` - -Fără preambul, fără markdown fence cu JSON, fără explicații extra. Caller-ul e un script. - -Dacă screenshot-ul e ILIZIBIL COMPLET, NU abortezi — scrii JSON cu `confidence: low`, `ambiguities: ["image_unreadable"]`, restul câmpurilor best-effort (chiar dacă sunt presupuneri), urmat de `.log` corespunzător, urmat de status-line normal. - ---- - -## Reguli stricte - -1. **NICIODATĂ nu inventezi date**. Dacă un câmp nu e legibil → `confidence: low` + adaugă în `ambiguities`. Estimezi DOAR dacă geometria o permite (TP2 simetric cu SL, TP0 ≈ 0.4·|entry−sl| de la entry, TP1 ≈ 0.6·|entry−sl|). -2. **Axa de preț e ground truth** peste orice label blackbox sau tooltip când diferă. -3. **Nu speculezi despre TF-uri pe care nu le vezi**. Dacă screenshot-ul nu include daily, nu scrii nimic despre trend daily în `note`. -4. **Formatul trebuie să satisfacă `scripts/vision_schema.py` EXACT** — fără câmpuri extra, literal-uri case-sensitive cu diacritice (`Clară`, `Slabă`, `Mai mare ca impuls`). -5. **Un screenshot = un JSON**. Niciodată batch. -6. **Output strict** — fără preambul în răspuns, doar status-line-ul după write. - ---- - -## Exemplu output JSON - -```json -{ - "screenshot_file": "2026-05-13-dia-1645.png", - "data": "2026-05-13", - "ora_utc": "14:45", - "instrument": "DIA", - "directie": "Buy", - "tf_mare": "5min", - "tf_mic": "1min", - "calitate": "Clară", - "entry": 497.42, - "sl": 496.80, - "tp0": 497.67, - "tp1": 497.79, - "tp2": 498.04, - "risc_pct": 0.12, - "outcome_path": "TP0→TP1", - "max_reached": "TP1", - "be_moved": true, - "confidence": "high", - "ambiguities": [], - "note": "" -} -``` diff --git a/.claude/commands/backtest.md b/.claude/commands/backtest.md deleted file mode 100644 index b79fc13..0000000 --- a/.claude/commands/backtest.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -description: Run vision extraction on a single TradeStation screenshot, then append to jurnal CSV + regenerate MD. -argument-hint: " [--calibration]" ---- - -# /backtest — single screenshot vision extraction - -Lansează subagentul `m2d-extractor` pe un screenshot, primește JSON-ul, append la `data/jurnal.csv`, regenerează `data/jurnal.md`. - -## Arguments - -- `$1` (obligatoriu) — path la screenshot. Acceptă: - - basename (`2026-05-13-dia-1645.png`) — caută în `screenshots/inbox/`, fallback `screenshots/processed/` - - path relativ sau absolut explicit -- `--calibration` (flag) — `source=vision_calibration` în loc de `source=vision`. Folosit împreună cu `/m2d-log --calibration` pe același screenshot pentru P4 mismatch report. - -## Workflow - -1. **Rezolvă path-ul** screenshot-ului. Dacă `$1` e doar basename, încearcă `screenshots/inbox/` apoi `screenshots/processed/`. Dacă nu există nicăieri, raportezi eroare și te oprești. - -2. **Invocă subagentul `m2d-extractor`** (definit în `.claude/agents/m2d-extractor.md`) prin Task tool cu `subagent_type: "m2d-extractor"`. Prompt-ul către agent: - - ``` - screenshot_path: - screenshot_file: - ``` - - Agentul scrie `data/extractions/.json` + `.log` și returnează status-line scurt. - -3. **Verifică output-ul**: - - Dacă fișierul `data/extractions/.json` nu există după ce agentul revine → eroare; raportezi și muți screenshot-ul la `screenshots/needs_review/`. - - Citește JSON-ul. Dacă `confidence == "low"` SAU `ambiguities` non-empty cu `image_unreadable` → muți screenshot-ul la `screenshots/needs_review/`, raportezi, nu apelezi append. - -4. **Append la CSV**: - - ```bash - python -c "from pathlib import Path; from scripts.append_row import append_extraction; import json; r = append_extraction(Path('data/extractions/.json'), source=''); print(json.dumps(r, default=str))" - ``` - - `` = `vision_calibration` dacă `--calibration`, altfel `vision`. - - Parsezi răspunsul. Dacă `status == "rejected"`: - - `reason` conține "duplicate" → screenshot deja procesat cu acest source; raportezi și NU îl muți. - - `reason` conține "validation error" → JSON-ul agentului a fost respins; muți screenshot la `screenshots/needs_review/` și raportezi. - - Alte erori → raportezi și lași screenshot-ul unde e. - -5. **Mută screenshot-ul** la `screenshots/processed/` dacă append-ul a reușit și fișierul originar a fost în `inbox/`. Dacă era deja în `processed/`, nu-l muta. - -6. **Regenerează MD**: - - ```bash - python scripts/regenerate_md.py - ``` - -7. **Raport final** (în română): - - ``` - /backtest → trade # adăugat (source=, set=, pl_marius=, confidence=). - Regenerat data/jurnal.md ( rânduri). - ``` - - Dacă screenshot-ul a fost mutat la `needs_review`: - - ``` - /backtest → NEEDS REVIEW: . Mutat la screenshots/needs_review/. - ``` - -## Reguli - -- O singură invocare per screenshot. Nu reapelezi agentul dacă output-ul e dubios — îl muți la `needs_review` și raportezi. -- NU edita CSV direct. -- NU regenera MD dacă append-ul a fost respins. -- Path discipline: subagentul scrie doar la `data/extractions/`; tu (slash command) muți screenshot-uri și apelezi scripts/. diff --git a/.claude/commands/batch.md b/.claude/commands/batch.md deleted file mode 100644 index 4cbf540..0000000 --- a/.claude/commands/batch.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -description: Procesează toate screenshot-urile din screenshots/inbox/ paralel (5 agenți). Append serial cu partial-failure semantics. -argument-hint: "[N max_parallel=5]" ---- - -# /batch — parallel vision extraction over screenshots/inbox/ - -Procesează screenshot-uri multiple din `screenshots/inbox/`. Lansează până la **5 subagenți `m2d-extractor` în paralel** (cap rigid — context window + rate limits). După ce toți revin, append-ezi rezultatele **serial** (`append_row` citește/scrie CSV — paralelism la write = ID collision garantat). - -## Workflow - -### Fază 1 — Colectează lista - -1. Listează `screenshots/inbox/*.png` (sortat alfabetic). -2. Dacă lista e goală → afișează `Inbox gol. Adaugă PNG-uri în screenshots/inbox/.` și oprește. -3. Dacă `$ARGUMENTS` conține un număr `N`, folosește-l ca `max_parallel` în loc de 5 (dar nu depăși niciodată 5 — hard cap). - -### Fază 2 — Extracție paralelă (max 5 concurent) - -Procesezi în **batch-uri de `max_parallel`**. Pentru fiecare batch: - -- Lansezi câte un Task tool call cu `subagent_type: "m2d-extractor"` pentru fiecare screenshot, ÎN ACELAȘI MESAJ (tool calls paralele). Prompt per agent: - - ``` - Extrage trade din ``. Scrie JSON la `data/extractions/.json` și log la `data/extractions/.log`. - - screenshot_path: - screenshot_file: - ``` - -- Aștepți să se întoarcă toți. Treci la următorul batch. - -**De ce max 5**: peste 5 sub-agenți paraleli începi să saturezi context window-ul orchestratorului cu output-urile lor și rate limits-urile API-ului. Cap rigid. - -### Fază 3 — Append serial cu partial-failure - -Ține trei liste: `ok`, `rejected`, `failed`. Pentru fiecare PNG din lista originală, **în ordine alfabetică**: - -1. **Verifică existența JSON-ului** `data/extractions/.json`: - - Lipsește sau e corupt → mută PNG la `screenshots/needs_review/`, adaugă la `failed` cu motiv `missing/invalid JSON`, continuă. - -2. **Apelează append** (source = `vision` — `/batch` nu suportă calibration, pentru asta folosește `/backtest --calibration` individual): - - ```bash - python -c "from pathlib import Path; from scripts.append_row import append_extraction; import json; r = append_extraction(Path('data/extractions/.json'), source='vision'); print(json.dumps(r, default=str))" - ``` - -3. **Reacționezi**: - - `status == "ok"` → mută PNG la `screenshots/processed/`, adaugă la `ok` cu `id`, `set`, `outcome_path`. - - `status == "rejected"` → mută PNG la `screenshots/needs_review/`, mută JSON la `data/extractions/rejected/.json` (creează folderul dacă lipsește), adaugă la `rejected` cu `reason`. - -4. **NU oprești batch-ul la primul fail**. Continuă până la capăt. - -### Fază 4 — Regenerează MD o singură dată - -```bash -python -m scripts.regenerate_md -``` - -(MD regen după fiecare append e wasteful; CSV-ul e sursa de adevăr.) - -### Fază 5 — Scrie summary la `data/extractions/_batch_.md` - -`` format ISO compact (ex: `2026-05-13T15-45-21Z`). Conținut: - -```markdown -# Batch run - -Total: | OK: | REJECTED: | FAILED: - -## OK -- .png → id=, set=, outcome_path= -- ... - -## REJECTED -- .png — reason: -- ... - -## FAILED -- .png — -- ... -``` - -Secțiuni goale se omit (dacă REJECTED e gol, nu scrii secțiunea). - -### Fază 6 — Afișează summary user-ului - -Format scurt în terminal: - -``` -/batch terminat. Total screenshot-uri. - OK: (trade-uri #, #, ...) - REJECTED: (mutate la screenshots/needs_review/) - FAILED: (mutate la screenshots/needs_review/, JSON lipsă) -Regenerat data/jurnal.md. -Summary scris la data/extractions/_batch_.md. -``` - -## Reguli - -- **Hard cap concurrency la 5**. Chiar dacă `max_parallel` argumentat e mai mare, clamp la 5. -- **Append serial obligatoriu**. `append_extraction` citește CSV, computează `next_id`, scrie atomic; rulat paralel = ID-uri duplicate sau pierderi. -- **Partial failure = continuă**. Un screenshot prost nu blochează restul batch-ului. -- **MD regen o singură dată** la final. -- **Path discipline pentru subagent neschimbată**: agentul scrie doar la `data/extractions/`. Tu (orchestrator) muți screenshot-uri și rejected JSON-uri. -- `/batch` folosește mereu `source=vision`. Pentru calibration, rulează `/backtest --calibration` individual pe fiecare screenshot. diff --git a/.claude/commands/m2d-log.md b/.claude/commands/m2d-log.md deleted file mode 100644 index a1aec7c..0000000 --- a/.claude/commands/m2d-log.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -description: Adaugă rapid un trade în jurnal.csv. 6 câmpuri minim, restul derivate auto. Manual entry rapidă pentru backtest/forward paper. -argument-hint: "[--calibration]" ---- - -# /m2d-log — quick manual M2D entry - -User-ul (Marius) loghează rapid un trade. 6 câmpuri esențiale obligatorii, restul derivate automat de `scripts/manual_log.py`. - -## Workflow - -1. **Parse `$ARGUMENTS`** — flag `--calibration` produce `source=manual_calibration`; altfel `source=manual`. - -2. **Cere user-ului următoarele 6 câmpuri obligatorii** (afișează template-ul de mai jos și roagă să răspundă într-un singur mesaj, format `cheie: valoare`): - - ``` - data: 2026-05-13 (format YYYY-MM-DD) - ora: 17:33 (ora RO local, HH:MM — DST gestionat automat) - dir: Sell (Buy sau Sell) - entry: 492.47 (prețul de intrare = close trigger candle) - sl: 492.77 (SL absolute price) - out: TP0→pending (SL | TP0→SL | TP0→TP1 | TP0→TP2 | TP0→pending | pending) - ``` - - Opționale (utilizatorul le poate omite — defaults aplicate): - ``` - inst: DIA (default DIA — alternative: US30, other) - calitate: Clară (default n/a — Clară | Mai mare ca impuls | Slabă) - tf_mic: 1min (default 1min — alternativ: 3min) - tf_mare: 5min (default 5min — alternativ: 15min) - note: ... (default empty) - ``` - -3. **Parsează răspunsul user-ului**. Tolerant la spații în jurul valorilor. Dacă lipsește un câmp obligatoriu → afișează ce lipsește și ceri din nou. - -4. **Construiește dict-ul** apelând helper-ul Python (printr-un singur `python -c`): - - ```bash - python -c " - import json - from scripts.manual_log import build_extraction - d = build_extraction( - data='', - ora_ro='', - directie='', - entry=, - sl=, - outcome_path='', - instrument='', - tf_mare='', - tf_mic='', - calitate='', - note='', - ) - import pathlib - basename_no_ext = d['screenshot_file'].rsplit('.', 1)[0] - p = pathlib.Path(f'data/extractions/{basename_no_ext}.manual.json') - p.parent.mkdir(parents=True, exist_ok=True) - p.write_text(json.dumps(d, ensure_ascii=False, indent=2), encoding='utf-8') - print(json.dumps({'json_path': str(p), 'screenshot_file': d['screenshot_file']}, default=str)) - " - ``` - - Helper-ul calculează automat: - - `ora_utc` din `ora_ro` (DST-aware Europe/Bucharest) - - `tp0` = entry ± 0.4·|entry−sl| (sign în funcție de directie) - - `tp1` = entry ± 0.6·|entry−sl| - - `tp2` = entry ± |entry−sl| (simetric SL) - - `risc_pct` = 100·|entry−sl|/entry - - `max_reached` din `outcome_path` (SL→SL_first, TP0→SL→TP0, TP0→TP1→TP1, ...) - - `be_moved` din `outcome_path` (False pentru SL/pending, True pentru orice TP0→...) - - `screenshot_file` generat dacă nu e prezent: `--.png` - - Cross-field ordering validat (Buy: sl'), source='') - print(json.dumps(r, default=str)) - " - ``` - -6. **Dacă `status == "ok"`**: - - ```bash - python -m scripts.regenerate_md - ``` - - Apoi afișează concis: - - ``` - ✅ Trade # adăugat — set=, outcome=, pl_marius=, pl_theoretical= - ``` - -7. **Dacă `status == "rejected"`**: - - ``` - ❌ Respins: - ``` - - Dacă `reason` conține "duplicate" → trade-ul cu acel `(screenshot_file, source)` există deja. Dacă vrei să-l suprascrii, șterge linia din `data/jurnal.csv` și re-rulează (sau cere user-ului să specifice `note: ` ca să forțeze basename diferit). - - Dacă `reason` conține "validation" → câmpurile au violat constraint-urile pydantic; reîntrebezi user-ul ce să corecteze. - -8. **Errori în parsing user**: dacă user-ul răspunde ambiguu (ex: lipsește `dir`, sau `entry` nu e număr), afișează ce trebuie corectat și revii la step 2 cu valorile parțiale păstrate. - -## Reguli - -- NU edita CSV direct. -- NU regenera MD pe rejection. -- Helper-ul `build_extraction` ridică `ValueError` dacă: `entry == sl`, `Buy` cu `sl >= entry`, `Sell` cu `sl <= entry`. Propaga eroarea către user cu mesaj clar. - -## Exemple - -**Cel mai scurt input valid**: -``` -data: 2026-05-13 -ora: 17:33 -dir: Sell -entry: 492.47 -sl: 492.77 -out: TP0→pending -``` -→ generează screenshot_file=`2026-05-13-dia-1733.png`, calculează ora_utc=14:33, tp0=492.35, tp1=492.29, tp2=492.17, risc_pct=0.0609, max_reached=TP0, be_moved=True, set=A2 (Mie 17:33). - -**Cu calitate și note**: -``` -data: 2026-05-13 -ora: 17:33 -dir: Sell -entry: 492.47 -sl: 492.77 -out: TP0→TP1 -calitate: Clară -note: bună retragere dimineața, news risc zero -``` - -**Calibrare**: `/m2d-log --calibration` → source=manual_calibration. Folosit cu `/backtest --calibration ` pe același screenshot pentru P4 mismatch report. diff --git a/.claude/commands/stats.md b/.claude/commands/stats.md deleted file mode 100644 index 3572aaa..0000000 --- a/.claude/commands/stats.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: Afișează statistici WR / expectancy / per Set (din data/jurnal.csv). Cu --calibration arată raport P4. -argument-hint: "[--calibration] [--overlay pl_marius|pl_theoretical] [--seed N]" ---- - -# /stats — backtest statistics - -Wrapper read-only peste `scripts/stats.py`. Afișează raportul stat ca atare; eventual adăugă highlight la final dacă observi un Set care îndeplinește pragul STOPPING_RULE. - -## Arguments - -- `--calibration` (flag) — afișează raportul P4 (mismatch field-by-field pe perechi `manual_calibration` ↔ `vision_calibration` join-uite pe `screenshot_file`). -- `--overlay pl_marius|pl_theoretical` (opțional, default `pl_marius`) — care P/L overlay folosește. -- `--seed N` (opțional) — seed pentru bootstrap RNG. Folosește pentru reproducibilitate. - -Default (fără flag-uri): backtest stats — overall + per-Set + per-calitate + per-instrument WR, expectancy, Wilson 95% CI pe WR, bootstrap 95% CI pe expectancy, pe overlay `pl_marius`. - -## Workflow - -1. **Parse `$ARGUMENTS`** și pasează-le direct prin: - - ```bash - python -m scripts.stats $ARGUMENTS - ``` - - `--csv data/jurnal.csv` e default-ul scriptului; nu îl pasezi. - -2. Rulează prin Bash. Output-ul vine pe stdout în UTF-8. - -3. **Afișează output-ul as-is** către user. NU reformata, NU re-rezuma, NU inventa numere. Scriptul are deja format ales (tabele + secțiuni text). - -4. **Highlight STOPPING_RULE** la final, DOAR dacă observi în output un Set care îndeplinește toate cele 3 thresholds din `STOPPING_RULE.md`: - - `N ≥ 40` trade-uri non-pending pe acel Set - - `WR ≥ 55%` cu Wilson 95% CI lower bound ≥ 45% - - `Expectancy ≥ +0.20R` pe overlay `pl_marius` - - Dacă DA pe vreun Set: - - ``` - 🚀 STOPPING RULE: Set îndeplinește pragurile (N=, WR=, Wilson_LB=, E=R). Discută cu user dacă pornește forward paper trading la 0.25R per trade pe acest Set. - ``` - - Dacă **niciun Set** nu îndeplinește toate: nu adăuga highlight. Lasă raportul scriptului să vorbească. - -5. **Highlight calibration P4** (în modul `--calibration`): - - Dacă perechi `(manual_calibration, vision_calibration)` < 10 → adăugă: `Insuficient pentru P4 — continuă să acumulezi calibrare (minim 10 perechi).` - - Dacă ≥ 10 perechi și mismatch rate > 10% pe câmpuri core (`entry/sl/tp0/tp1/tp2/outcome_path/max_reached/directie`) → adăugă: `⚠️ P4 FAIL: mismatch > 10% pe câmpuri core. Fix promptul vision agent (.claude/agents/m2d-extractor.md) și re-rulează calibrarea.` - - Dacă ≥ 10 perechi și mismatch ≤ 10% → adăugă: `✅ P4 PASS: mismatch ≤ 10% pe câmpuri core.` - -6. NU edita CSV. NU regenera MD. Citire pură. - -## Reguli - -- Read-only. Această comandă nu scrie nimic. -- Output-ul scriptului e ground truth — nu inventezi numere; doar le citești și aplici regulile STOPPING_RULE. -- `calitate` e descriptor biased post-outcome (vezi `STOPPING_RULE.md` §3) — raportul îl afișează informational only. NU sugera user-ului să folosească `calitate` ca filtru pentru GO LIVE. -- Highlight-ul `🚀 STOPPING RULE` e doar trigger pentru discuție; decizia GO LIVE rămâne a user-ului, cu caveats-urile semnate în `STOPPING_RULE.md`. diff --git a/.gitignore b/.gitignore index fec7b47..3a5d9ef 100644 --- a/.gitignore +++ b/.gitignore @@ -8,21 +8,9 @@ __pycache__/ venv/ .python-version -# Data — vision extractions and batch logs (regenerable) -data/extractions/*.json -data/extractions/*.log -data/extractions/rejected/* -data/extractions/_batch_*.md -!data/extractions/.gitkeep -!data/extractions/rejected/.gitkeep - -# Screenshots — keep originals out of git (large binary, regenerable jurnal from CSV) -screenshots/inbox/* -screenshots/processed/* -screenshots/needs_review/* -!screenshots/inbox/.gitkeep -!screenshots/processed/.gitkeep -!screenshots/needs_review/.gitkeep +# Excel temp/lock files +~$*.xlsx +*.xlsx.bak # OS / editor .DS_Store diff --git a/0_SYSTEM_PROMPT.md b/0_SYSTEM_PROMPT.md deleted file mode 100644 index deb1a10..0000000 --- a/0_SYSTEM_PROMPT.md +++ /dev/null @@ -1,147 +0,0 @@ -# M2D Backtesting Assistant — System Instructions - -> Acest text se lipește în câmpul **"Custom Instructions"** al proiectului Claude (NU ca fișier knowledge). - ---- - -## Rolul tău -Ești un assistant specializat în backtesting-ul strategiei M2D pură pe US30/DIA. -Utilizatorul (Marius) îți va trimite screenshot-uri din TradeStation cu semnalele unui -indicator "blackbox" custom. Tu reconstruiești trade-uri ipotetice din aceste screenshot-uri -și actualizezi jurnalul de backtest. - -**Nu este vorba de tranzacțiile lui reale** — este backtesting curat al strategiei. -Tu acționezi ca și cum trade-ul s-ar fi executat automat la fiecare semnal valid. - ---- - -## Strategia M2D pe scurt - -### Setup BUY -1. **TF mare** (5min sau 15min): bulină TURQUOISE = semnal direcțional buy -2. **TF mic** (1min sau 3min): bulină VERDE ÎNCHIS = retragere identificată -3. **TF mic**: bulină VERDE DESCHIS = reluare / TRIGGER entry - -### Setup SELL -1. **TF mare**: bulină GALBENĂ = semnal direcțional sell -2. **TF mic**: bulină ROȘU ÎNCHIS = retragere -3. **TF mic**: bulină ROȘU DESCHIS = reluare / TRIGGER entry - -### Reguli SL/TP (calculate automat de blackbox, citite de pe chart) -- **SL** = linia roșie "SL X.XX%" -- **TP0** ≈ 40% din distanța SL (R:R 1:0.4) -- **TP1** ≈ 60% din distanța SL (R:R 1:0.6) -- **TP2** = 100% din distanța SL = SIMETRIC cu SL (R:R 1:1) -- Position size: 1/3 la fiecare zonă -- BE move recomandat: după TP0 atins, muți SL la entry - ---- - -## Ce să faci la fiecare screenshot primit - -### Pas 1: Extrage date din imagine -Identifică și notează exact: -- **Data** (din timestamp axa X, format MM/DD/YY american) -- **Ora trigger entry** (RO, EEST sau EET în funcție de sezon) -- **Instrument** (DIA dacă preț ~497, US30 dacă ~42000, altul dacă diferit) -- **Direcție** (Buy/Sell) -- **TF mare** (deduce din spacing semnal turquoise/galben) -- **TF mic** (chart-ul vizibil — de obicei 1min sau 3min) -- **Preț entry** (preț la trigger candle close) -- **SL preț** + **SL %** (de pe linia roșie) -- **TP0, TP1, TP2 prețuri** + procente -- **Calitate retragere**: - - **Clară** = corp candle vizibil, fără wick-uri lungi - - **Mai mare ca impuls** = corp retragere ≥ corp ultim candle de impuls pe TF mare - - **Slabă** = corp mic, wick-uri lungi, indecis - -### Pas 2: Identifică outcome -Urmărește acțiunea POST-trigger în screenshot: -- Care zone TP au fost atinse? (TP0, TP1, TP2 sau niciuna) -- A fost SL prins înainte? -- Dacă a fost atins TP0 dar apoi reversal — presupun **BE move = Da** (default standard) -- Notează rezultatul: SL / TP0 / TP1 / TP2 - -### Pas 3: Calculează Set (fereastra orară) -- **A1**: 16:35-17:00 RO, Mar/Mie/Joi -- **A2**: 17:00-18:00 RO, Mar/Mie/Joi (sweet spot) -- **A3**: 18:00-19:00 RO, Mar/Mie/Joi -- **B**: 22:00-22:45 RO, Mar/Mie/Joi -- **C - News window**: 15:30-16:30 (orice zi) sau zile FOMC/NFP/CPI -- **D**: Luni sau Vineri -- **Other**: orice altceva - -### Pas 4: Calculează P/L în puncte -Cu logica partial close 1/3 + BE move: -- Hit SL → P/L = -Risc (toată poziția) -- Hit TP0 + BE Da → P/L = +0.133 × Risc -- Hit TP0 + BE Nu → P/L = -0.533 × Risc (LOSS!) -- Hit TP1 + BE Da → P/L = +0.333 × Risc -- Hit TP1 + BE Nu → P/L = 0 (BE) -- Hit TP2 → P/L = +0.667 × Risc (max) - ---- - -## Format output (foarte important) - -Pentru fiecare screenshot, dă răspuns ÎN ACEASTĂ ORDINE și ATÂT (nu adăuga preamble): - -### 1. Rândul de jurnal (markdown table) - -```markdown -| # | Data | Zi | Ora RO | Instrument | Direcție | TF mare | TF mic | Calitate | Entry | SL | TP0 | TP1 | TP2 | Risc % | Hit | BE | P/L Risc | Set | Note | -|---|------|----|----|-----------|----------|---------|--------|----------|-------|-----|------|------|------|--------|-----|----|----|-----|------| -| N | YYYY-MM-DD | [zi] | HH:MM | DIA/US30 | Buy/Sell | 5/15min | 1/3min | Clară/Slabă/Mai mare | XX.XX | XX.XX | XX.XX | XX.XX | XX.XX | 0.XX% | TPx/SL | Da/Nu | +/-X.XX | A1/A2/A3/B/C/D | scurt | -``` - -### 2. Analiză scurtă (2-3 propoziții MAX) - -Format obligatoriu — bifează DA/NU pentru fiecare: -- ✅/❌ **Calitate retragere**: [Clară / Slabă / Mai mare ca impuls] -- ✅/❌ **Fereastră optimă**: [Set X, Tier Y] -- ✅/❌ **News risk**: [există news major ±15 min? Da/Nu] -- **Învățare**: [1 propoziție — ce confirmă/contrazice acest trade?] - -### 3. Cere instrucțiunea de salvat - -La final ÎNTOTDEAUNA întrebi: -> "Adaug rândul la jurnal.md? (răspunde 'da' sau dă-mi instrucțiuni de modificare)" - -DACĂ user-ul răspunde "da", reproduci RÂNDUL FORMATAT MARKDOWN pe care el să-l copy-paste în fișierul `jurnal.md` din proiect. - ---- - -## Reguli stricte - -1. **NICIODATĂ nu inventezi date** — dacă nu vezi clar TP0 în screenshot, scrii "N/A" și ceri user-ului să confirme manual. -2. **NICIODATĂ nu interpretezi semnalele dincolo de ce e vizibil** — nu spui "trend-ul de pe daily era bullish" dacă nu vezi daily-ul. -3. **Format de output identic la fiecare răspuns** — așa user-ul poate copia consistent. -4. **Dacă screenshot-ul e neclar** (calitate slabă, niveluri tăiate), spune ce nu poți citi și cere confirmare. -5. **Nu da sfaturi psihologice / coaching** decât dacă ești întrebat explicit. Tu ești logger + filter checker. -6. **Conversie timezone**: dacă vezi 21:38 în screenshot și nu e explicit RO, presupui că e RO (TradeStation setat pe ora locală). -7. **Numerotare rânduri**: începi de la următorul N după ultimul din jurnal.md (dacă există). Dacă jurnal e gol, începi de la 1. - ---- - -## Workflow tipic - -``` -User: [trimite screenshot] -Tu: [rândul jurnal] + [analiză 3 puncte] + "Adaug la jurnal.md?" -User: "da" -Tu: [reproduci rândul formatat clar pentru copy-paste] -User: [copy-paste în jurnal.md, eventual upload-ează jurnalul actualizat] -``` - -Periodic (la fiecare 10-20 trade-uri), user-ul îți va cere statistici agregate. -Atunci citești tot jurnalul și răspunzi cu: -- WR pe Set -- Hit distribution (SL vs TP0/TP1/TP2) -- WR per calitate retragere -- Net P/L total - ---- - -## Limba - -Răspunde mereu în română. Tu și user-ul vorbiți direct și concis. diff --git a/README.md b/README.md index 8fef9d6..ddb9f26 100644 --- a/README.md +++ b/README.md @@ -1,122 +1,144 @@ -# M2D Backtesting — Setup Proiect Claude +# atm-backtesting -## 📂 Conținut +Jurnal Excel manual pentru backtesting pe semnale blackbox (entry / SL / TP precalculate de alt trader sau de un indicator), cu comparație **5 strategii de management** side-by-side. -Acest ZIP conține tot ce ai nevoie pentru a configura proiectul Claude de backtesting M2D: +## Ce face -| Fișier | Rol | +Introduci datele de bază ale fiecărui trade — dată, oră, strategie, indicator, TF, direcție, SL/TP0/TP1/TP2 în %, outcome — și Excel calculează automat: + +- **R-multiples** și **$ P&L** pentru 5 strategii paralele +- **Dashboard**: Win Ratio, Average Win/Loss, Profit Factor, Risk:Reward, Expectancy, HWM Balance, Max Drawdown — câte un set per strategie +- **Breakdown** per Sesiune, Strategie, Indicator, Direcție +- **Equity curve** (5 linii — câte una per strategie) + +Cele 5 strategii de management comparate: + +| # | Strategie | Comportament | +|---|---|---| +| 1 | **TP0 only** | 100% poziție, close la TP0. Foarte conservator (bird in hand). | +| 2 | **TP1 only** | 100% poziție, OCO la SL sau TP1, fără intervenție. | +| 3 | **TP2 only** | 100% poziție, OCO la SL sau TP2 (let it ride). | +| 4 | **Hybrid + BE** | 50% close la TP0, mut SL la BE, 50% close la TP1. Recomandat de trader. | +| 5 | **Hybrid no BE** | 50% close la TP0, **fără** BE, 50% close la TP1. Compară direct cu #4 ca să vezi dacă BE-ul aduce valoare. | + +Rezultatul: pe aceleași semnale, vezi care metodă de management produce cel mai mare expectancy, profit factor și cea mai mică drawdown. + +### De ce 2 variante Hybrid (cu/fără BE) + +BE move este o **regulă teoretică** de management, nu o decizie istorică pe fiecare trade. Așa că nu o marchezi manual pe rând — în schimb, ambele variante (cu și fără BE) se calculează automat pentru fiecare trade. Compari direct dacă regula BE-ului adaugă R-uri sau le scoate. + +## Setup (o singură dată) + +```powershell +pip install openpyxl +python scripts/generate_template.py +``` + +Se generează `data/backtest.xlsx`. Deschide-l în Excel sau LibreOffice Calc. + +## Workflow zilnic + +1. Deschide `data/backtest.xlsx` și du-te în sheet-ul **Trades**. +2. Adaugă un rând nou (continuă imediat sub ultimul completat — **nu lăsa goluri** între rânduri). +3. Completează coloanele galbene (input) — restul (albastre) se calculează automat: + - **Data**, **Ora RO** (sesiunea + ziua se derivă automat de aici) + - **Strategie** (M2D / EMA cross / ... — dropdown, editabil în Config) + - **Indicator** (DIA / SPY / US30 / ... — dropdown) + - **TF** (1min / 3min / 15min — dropdown; e TF-ul de entry, vezi mai jos) + - **Direcție** (Buy / Sell — dropdown) + - **SL %**, **TP0 %**, **TP1 %**, **TP2 %** — distanțe față de entry, în procente (ex. 0.30 pentru 0.30%) + - **Outcome** (SL / TP0 only / TP1 / TP2 — dropdown) + - **Notes** (opțional) +4. Coloanele albastre derivate (Zi, Sesiune, R_*, $_*, Bal_* pentru cele 5 strategii) se umplu automat. +5. Mergi la sheet-ul **Dashboard** — metricile, breakdown-urile și equity curve se actualizează live. + +### Coloana TF + +Pentru M2D, TF-ul mic este TF-ul de entry, iar TF-ul mare e implicit: + +| TF (input) | Perechea M2D | |---|---| -| `0_SYSTEM_PROMPT.md` | Custom Instructions pentru proiect (lipești textul, NU urci ca knowledge file) | -| `jurnal.md` | Knowledge file principal — jurnalul de backtest (gol, pregătit cu headers) | -| `strategie_M2D.md` | Knowledge file de referință — regulile strategiei | -| `calendar_evenimente.md` | Knowledge file de referință — events economice recurente | -| `README.md` | Acest fișier — instrucțiuni setup | +| 1min | 1 / 5 min | +| 3min | 3 / 15 min | +| 15min | 15 / 60 min | ---- +Dacă folosești o altă strategie cu pereche diferită, descrie în Notes. -## 🚀 Pași de configurare +### Cum se calculează Sesiunea automat -### 1. Creează un proiect nou în Claude.ai -- Mergi la **claude.ai** → click pe **Projects** în sidebar → **+ New Project** -- Nume sugerat: **"M2D Backtest"** -- Descriere (opțional): "Backtesting strategie scalping M2D pe US30/DIA prin analiză screenshot-uri TradeStation blackbox" +Pe baza Data + Ora RO, regulile M2D (vezi `strategie_M2D.md`): -### 2. Setează Custom Instructions -- În proiectul creat, click pe **"Set custom instructions"** -- Deschide `0_SYSTEM_PROMPT.md` din acest ZIP -- Copiază TOT textul (fără secțiunea cu titlul "# M2D Backtesting Assistant — System Instructions" dacă vrei) -- Lipește în câmpul de Custom Instructions -- Save +| Sesiune | Condiție | +|---|---| +| **A1** | 16:35–17:00 RO, Mar/Mie/Joi | +| **A2** | 17:00–18:00 RO, Mar/Mie/Joi (sweet spot) | +| **A3** | 18:00–19:00 RO, Mar/Mie/Joi | +| **B** | 22:00–22:45 RO, Mar/Mie/Joi (Power Hour) | +| **C** | 15:30–16:30 RO (pre-NY chop / news risk), orice zi | +| **D** | Luni sau Vineri | +| **Other** | În afara ferestrelor de mai sus | -### 3. Adaugă fișierele knowledge -- În proiect, click pe **"Add content"** sau **"Project knowledge"** -- Urcă următoarele 3 fișiere: - - `jurnal.md` - - `strategie_M2D.md` - - `calendar_evenimente.md` -- NU urca `0_SYSTEM_PROMPT.md` (acela e doar pentru Custom Instructions) -- NU urca acest `README.md` +> Notă: zilele FOMC/NFP/CPI ar trebui marcate ca C, dar formula nu detectează evenimente — marchează manual în Notes dacă e zi news majoră. -### 4. Test inițial -- Începe o conversație nouă în proiect -- Întreabă: "Ești pregătit să primești screenshot-uri pentru backtest M2D?" -- Răspunsul ar trebui să confirme că înțelege strategia și formatul jurnal +## Configurare ---- +Sheet-ul **Config** permite editarea: -## 📋 Workflow zilnic +- **Account Size Start ($)** — balanța inițială (default $10,000) +- **Risk per Trade (%)** — % din account riscat per trade (default 1.0%) +- Listele pentru dropdown-uri: Strategii, Indicatori, TF, Direcție, Outcome -``` -1. Deschizi un screenshot cu setup M2D din TradeStation blackbox -2. Începi o conversație nouă (sau continui una) în proiectul Claude -3. Atașezi screenshot-ul + scrii "Backtest" -4. Claude îți răspunde cu: - - Rândul de jurnal formatat în markdown - - Analiza scurtă (3 puncte cu ✅/❌) - - Întrebarea "Adaug la jurnal.md?" -5. Răspunzi "da" → Claude îți dă rândul curat de copy-paste -6. Deschizi jurnal.md local (sau de oriunde îl ții) și adaugi rândul -7. La 20+ trade-uri: re-uploadezi jurnal.md actualizat în Project Knowledge +La schimbarea Account Size sau Risk %, toate sumele $ din Trades și Dashboard se recalculează. + +## Formule R-multiples (referință) + +`SL_%`, `TP0_%`, `TP1_%`, `TP2_%` sunt distanțe pozitive față de entry, exprimate în procente. + +Tabelul de mai jos arată R-multiple-ul rezultat pentru fiecare combinație (Outcome × Strategie): + +| Outcome | TP0 only | TP1 only | TP2 only | Hybrid + BE | Hybrid no BE | +|---------|----------|----------|----------|-------------|--------------| +| **SL** | −1 | −1 | −1 | −1 | −1 | +| **TP0 only** | +TP0/SL | −1 | −1 | +0.5·TP0/SL | +0.5·TP0/SL − 0.5 | +| **TP1** | +TP0/SL | +TP1/SL | −1 | +0.5·(TP0+TP1)/SL | +0.5·(TP0+TP1)/SL | +| **TP2** | +TP0/SL | +TP1/SL | +TP2/SL | +0.5·(TP0+TP1)/SL | +0.5·(TP0+TP1)/SL | + +**Citirea Outcome-ului**: +- `SL` — prețul a atins SL fără să atingă vreodată TP0 (loss complet). +- `TP0 only` — prețul a atins TP0, dar nu și TP1 (ulterior fie a venit înapoi la SL, fie a fost închis la BE pentru variantele cu BE move). +- `TP1` — prețul a atins TP1 (a trecut prin TP0). +- `TP2` — prețul a atins TP2 (a trecut prin TP0 și TP1). + +**Asumpții de simulare**: +- `TP1 only` și `TP2 only` simulează OCO pur, fără intervenție manuală. Outcome=`TP0 only` se închide la SL (presupunere worst-case). +- `TP2 only` cu Outcome=`TP1` se închide la SL (TP1 a fost atins, dar SL ar fi venit înainte de TP2). +- Diferența dintre Hybrid + BE și Hybrid no BE apare doar când Outcome=`TP0 only`; la TP1/TP2 ambele dau identic. + +## Regenerare template + +Dacă strici structura Excel-ului accidental sau modifici `scripts/generate_template.py`: + +```powershell +python scripts/generate_template.py ``` ---- +Atenție: **suprascrie** `data/backtest.xlsx`. Fă backup la rândurile tale înainte (copy-paste într-un alt fișier sau export CSV). -## 🔄 Sincronizare jurnal +## Decizii GO LIVE / ABANDON -Claude vede doar versiunea de `jurnal.md` care e în Project Knowledge. Deci: +Vezi `STOPPING_RULE.md` — threshold-urile semnate (N≥40, WR≥55%, Expectancy≥+0.20R) și caveat-urile metodologice. -- **După fiecare câteva trade-uri** (ex: 5-10): re-uploadează `jurnal.md` actualizat -- **Înainte să ceri statistici**: ÎNTOTDEAUNA re-uploadează jurnalul, altfel Claude lucrează cu date vechi - -**Sfat practic**: ține `jurnal.md` într-un loc ușor accesibil (Google Drive, Dropbox, Gitea-ul tău, sau local cu sync). Mai ușor de updatat. - ---- - -## 📊 Cereri tipice pe care le poți face - -După ce ai 20+ trade-uri în jurnal: +## Fișiere ``` -"Dă-mi statisticile complete: WR pe Set, hit distribution, WR per calitate retragere" +atm-backtesting/ +├── data/ +│ └── backtest.xlsx # source of truth — jurnalul tău +├── scripts/ +│ └── generate_template.py # regenerator template +├── strategie_M2D.md # referință reguli M2D (Buy/Sell setup, SL/TP, sesiuni) +├── calendar_evenimente.yaml # calendar news (FOMC/NFP/CPI etc.) pentru identificare manuală sesiune +├── STOPPING_RULE.md # threshold-uri decizie + caveats semnate +├── pyproject.toml # dependență: openpyxl +└── README.md # acest fișier ``` - -``` -"Care e Set-ul cu cel mai mare expectancy? Și cel mai prost?" -``` - -``` -"Pe ultimele 30 trade-uri, ce procent au fost cu calitate retragere Slabă? -Au influențat negativ WR-ul?" -``` - -``` -"Compară performanța pe DIA vs US30" -``` - -``` -"Sunt câteva trade-uri Set C (news days). Dacă le exclud, cum se schimbă WR-ul global?" -``` - ---- - -## ⚠️ Limitări de știut - -1. **Claude nu poate edita direct fișiere din Project Knowledge** — tu actualizezi local și re-uploadezi -2. **Calitatea outputului depinde de calitatea screenshot-ului** — dacă liniile TP/SL sunt tăiate, Claude va cere clarificări -3. **Recunoașterea bulinelor colorate** poate avea greșeli ocazionale — verifică primele 5-10 trade-uri să fii sigur că Claude interpretează corect -4. **Pentru trade-uri ambigue** (semnal neclar, multiple posibilități), Claude îți cere confirmare în loc să presupună - ---- - -## 🎯 Obiectiv backtest - -- **Pragul minim de date**: 50 trade-uri pentru concluzii inițiale -- **Pragul de încredere**: 200+ trade-uri pentru statistici robuste -- **Întrebări la care vrei să răspunzi**: - - Care Set are cel mai mare expectancy? - - WR > 55% pe Set A2 (sweet spot)? - - Filtrul de calitate retragere are impact real? - - News days chiar trebuie excluse? - - DIA sau US30 e mai bun pentru M2D? - -Mult succes la backtest! 🚀 diff --git a/STOPPING_RULE.md b/STOPPING_RULE.md index ab72bfa..a7e6088 100644 --- a/STOPPING_RULE.md +++ b/STOPPING_RULE.md @@ -1,6 +1,6 @@ -# STOPPING_RULE — M2D Backtesting +# STOPPING_RULE — Backtesting jurnal Excel -**Versiune**: 1 +**Versiune**: 2 **Data**: 2026-05-13 **Status**: SIGNED — Marius @@ -8,34 +8,35 @@ ## Întrebarea de decis -Pentru fiecare Set candidat (A1, A2, A3, B), decidem una din trei: +Pentru fiecare combinație (Indicator × Sesiune) candidată, decidem una din trei: - **GO LIVE** — pornesc forward paper trading cu 0.25R per trade (validare reală) -- **EXTEND COLLECTION** — mai colectez screenshot-uri, încă nu sunt date suficiente -- **ABANDON** — strategia nu are edge măsurabil pe acest Set; renunț la Set sau la întreaga strategie +- **EXTEND COLLECTION** — mai colectez trade-uri, încă nu sunt date suficiente +- **ABANDON** — strategia nu are edge măsurabil pe această combinație + +Decizia se ia separat pentru fiecare strategie de management (Hybrid 50/50+BE / TP1-only OCO / TP2-only OCO) — Dashboard-ul din `data/backtest.xlsx` afișează metrici side-by-side. --- -## Threshold-uri obligatorii pentru GO LIVE pe un Set +## Threshold-uri obligatorii pentru GO LIVE pe o combinație Indicator × Sesiune -Toate condițiile trebuie satisfăcute simultan: +Toate condițiile trebuie satisfăcute simultan, pentru cel puțin o strategie de management: -1. **N ≥ 40** trade-uri non-pending pe acel Set -2. **WR ≥ 55%** (Wilson 95% CI lower bound ≥ 45%) -3. **Expectancy ≥ +0.20R** pe overlay-ul `pl_marius` (50% TP0 + BE + close ~TP1) -4. **Calibration P4 PASS** — pe primele 10 trade-uri double-extracted (manual + vision), mismatch rate ≤10% pe câmpuri core (`entry`, `sl`, `tp0/1/2`, `outcome_path`, `max_reached`, `directie`) +1. **N ≥ 40** trade-uri pe acea combinație (vezi Dashboard → PER SESIUNE / PER INDICATOR) +2. **WR ≥ 55%** (rule-of-thumb: 95% CI lower bound trebuie să fie ≥ 45% — calculează manual sau folosește calculator Wilson extern) +3. **Expectancy ≥ +0.20R** pe strategia aleasă (Hybrid 50/50+BE implicit; alternativ TP1-only OCO sau TP2-only OCO) -Dacă oricare condiție pică → **EXTEND COLLECTION** sau **ABANDON** (vezi mai jos). +Dacă oricare condiție pică → **EXTEND COLLECTION** sau **ABANDON**. --- -## Threshold-uri pentru ABANDON pe un Set +## Threshold-uri pentru ABANDON Oricare e suficient: -- N ≥ 40 și WR < 45% → edge negativ; ABANDON acest Set -- N ≥ 40 și Expectancy ≤ −0.10R → ABANDON -- Wilson 95% CI lower bound stabil sub 50% după N ≥ 60 → ABANDON +- N ≥ 40 și WR < 45% pe toate cele 3 strategii → edge negativ; ABANDON combinația +- N ≥ 40 și Expectancy ≤ −0.10R pe toate cele 3 strategii → ABANDON +- WR observat stabil sub 50% după N ≥ 60 → ABANDON --- @@ -45,23 +46,44 @@ Oricare e suficient: 1. **N=40 = directional evidence, NU scientific proof**. Intervalul de încredere 95% pentru WR la N=40, WR observat 55%, este aproximativ [40%, 70%]. "Validated" la N=40 înseamnă "merită să tradez cu 0.25R", NU "edge confirmat statistic". Confirmarea reală vine din forward paper trading. -2. **Selection bias rezidual**. Chiar și cu scroll protocol (vezi `WORKFLOW.md`), eu am ales perioada pe care scroll-uiesc. Acest bias e parțial mitigat, NU eliminat. +2. **Selection bias rezidual**. Chiar dacă păstrez disciplina să loghez toate trigger-urile (inclusiv loss-urile clare), eu aleg ce perioadă scroll-uiesc. Acest bias e parțial mitigat prin trade-by-trade logging, NU eliminat. -3. **Lookahead bias pe `calitate`**. Câmpul `calitate ∈ {Clară, Mai mare ca impuls, Slabă}` este clasificat post-outcome (am văzut chart-ul întreg). DECI: NU folosesc `calitate` ca filtru în stopping rule. Rămâne descriptor în jurnal, NU criteriu de tradare. +3. **Lookahead bias pe calitate subiectivă**. Nu mai există coloană `calitate` în jurnalul Excel — clasificarea subiectivă post-outcome a fost eliminată ca sursă de bias. Note-urile rămân pentru context, dar NU sunt folosite ca filtru de decizie. -4. **Backtest = upper bound al expectancy real**. Execuția live va avea slippage, latențe, emoții. Expectancy real probabil 0.05-0.15R sub backtest. De aceea pragul `+0.20R` în backtest = aproximativ break-even-cu-edge-mic în live. +4. **Backtest = upper bound al expectancy real**. Execuția live va avea slippage, latențe, emoții, mouse-trip-uri. Expectancy real probabil 0.05–0.15R sub backtest. De aceea pragul `+0.20R` în backtest ≈ break-even-cu-edge-mic în live. -5. **Indicator drift**. Dacă indicatorul blackbox se update-ează, trade-urile vechi devin istoric irelevant. Trackuit prin coloana `indicator_version` în CSV; reset stat-uri la schimbare. +5. **Indicator drift**. Dacă indicatorul blackbox se update-ează, trade-urile vechi devin istoric irelevant. Trackează manual versiunea indicatorului în coloana Notes; reset stats la schimbare semnificativă. + +--- + +## Comparația de strategii — context + +Cele 5 overlay-uri calculate automat per trade în `Trades` sheet: + +| Strategie | Descriere | +|---|---| +| **TP0 only** | 100% poziție, close la TP0. Maxim conservator. | +| **TP1 only** | 100% poziție, OCO la SL sau TP1, fără intervenție manuală. | +| **TP2 only** | 100% poziție, OCO la SL sau TP2 (let it ride). | +| **Hybrid + BE** | 50% close la TP0, mut SL la BE, 50% close la TP1. Recomandat de trader. | +| **Hybrid no BE** | 50% close la TP0, fără BE, 50% close la TP1. Control pentru izolarea valorii BE-ului. | + +**Decizie de management se ia DUPĂ ce ai N≥40 trade-uri**: alegi strategia cu cel mai bun Expectancy + Profit Factor pe combinația de Indicator × Sesiune care a trecut gate-urile. + +**Asumpții de simulare**: +- `TP1 only` și `TP2 only` simulează OCO pur, fără intervenție; Outcome=`TP0 only` se închide la SL. +- `TP2 only` cu Outcome=`TP1`: TP2 nu a fost atins → presupunem că, în lipsa time-stop-ului, SL ar fi venit ulterior; tratat ca −1R. Asumpția subestimează ușor TP2-only dacă în realitate trade-ul s-ar fi închis profitabil prin alt mecanism, dar e prudent. +- BE este parametru teoretic — nu un input per trade. Hybrid + BE vs Hybrid no BE diferă strict când Outcome=`TP0 only` (diferența = +0.5R în favoarea BE). --- ## Post-GO LIVE protocol -După un Set primește GO LIVE: +După o combinație Indicator × Sesiune × Strategie primește GO LIVE: -1. Forward paper trading cu 0.25R per trade pe acel Set. +1. Forward paper trading cu 0.25R per trade. 2. Minimum 20 trade-uri live înainte de a urca sizing-ul la 0.5R sau full. -3. Dacă WR live diverge >10pp de backtest în prima 20 trade-uri → review (probabil execuție defectă sau bias subestimat). +3. Dacă WR live diverge >10pp de backtest în primele 20 trade-uri → review (probabil execuție defectă sau bias subestimat). --- @@ -71,4 +93,4 @@ După un Set primește GO LIVE: Marius — semnat prin commit git — data: 2026-05-13 ``` -Toate cele 5 caveats înțelese și acceptate. Procedez cu calibrarea P4 pe `dia-1min-example.png`. +Toate cele 5 caveats înțelese și acceptate. diff --git a/WORKFLOW.md b/WORKFLOW.md deleted file mode 100644 index 6798567..0000000 --- a/WORKFLOW.md +++ /dev/null @@ -1,86 +0,0 @@ -# WORKFLOW — colectare screenshot-uri M2D - -**Scop**: minimizează **selection bias** când colectezi screenshot-uri istorice din TradeStation. - -> **Premisa ascunsă pe care o atacăm**: dacă faci screenshot doar la trade-urile care "arată interesant", WR-ul măsurat va fi structural mai mare decât WR-ul real. Setup-urile care arată "dubios" la trigger sunt mai des losers — dacă le filtrezi inconștient, statisticile mint. - ---- - -## Regula de aur - -> **Dacă vezi o bulină verde-deschis (BUY trigger) sau roșu-deschis (SELL trigger) pe TF mic care urmează unei bulin verde-închis/roșu-închis după turquoise/galben pe TF mare → screenshot, indiferent cum arată setupul.** - -NU evaluezi calitatea ÎNAINTE de screenshot. Calitatea o pune extractorul (manual sau vision) pe baza imaginii, nu tu pe baza memoriei. - ---- - -## Scroll protocol - -### 1. Alege perioada în avans - -- Definește o fereastră calendaristică concretă: "Mar/Mie/Joi între 16:35-18:00 RO, din 2025-09-01 până în 2025-12-31". -- **Scrie perioada aleasă într-un comentariu sau fișier înainte de a începe scroll-ul**. Așa nu poți extinde sau restrânge perioada în funcție de ce vezi. - -### 2. Configurare TradeStation - -- TF mic vizibil (1min sau 3min). -- TF mare overlay sau pe ecran separat — important să vezi semnalul direcțional. -- Indicator blackbox activ pe ambele TF-uri. -- Zoom suficient ca să distingi culorile bulinelor clar. - -### 3. Scroll candle-by-candle - -- Începi cu prima zi a perioadei, ora 16:35 (sau începutul fereastrei alese). -- Avansezi candle-by-candle (sau cu pas mic). **NU sări** peste perioade lungi "pentru că arată plat" — chiar și acolo pot fi trigger-e ratate. -- La fiecare bulină verde-deschis / roșu-deschis pe TF mic în fereastra orară a perioadei → **STOP. Screenshot.** -- Verifică post-screenshot că setup-ul respectă pre-condițiile (turquoise/galben pe TF mare anterior, retragere intermediară). Dacă NU respectă → este un trigger fără setup valid; documentează cu nume `-invalid.png` (sau șterge), dar **logează decizia în WORKFLOW_LOG.md de mai jos**. - -### 4. Workflow log (audit trail anti-bias) - -Creează un fișier `data/workflow_log.md` la pornirea fiecărei sesiuni de scroll: - -```markdown -## 2026-05-13 — sesiune scroll perioada 2025-09-01 → 2025-09-15 - -- Start: 14:32 RO -- Perioada scroll-uită: 2025-09-01 → 2025-09-15, Mar/Mie/Joi, 16:35-18:00 -- Trigger-e găsite: 12 -- Screenshot-uri făcute: 12 -- Screenshot-uri NEFĂCUTE (cu motiv): - - 2025-09-04 17:14 — bulina verde-deschis dar fără verde-închis înainte → NU e M2D valid (trigger fals) -- End: 15:48 RO -``` - -**Regula**: dacă rata screenshot/trigger < 95% pe o sesiune, ai un motiv documentat pentru cele lipsă. Dacă nu — ai un bias. - -### 5. Cazuri ambigue (cum eviți cherry-picking) - -- "Nu sunt sigur că e M2D" → screenshot oricum, log la `data/workflow_log.md` ca "ambiguous: motiv". Extractorul (manual/vision) decide final. -- "Imaginea e neclară" → screenshot oricum; vision poate să returneze `confidence:low` și merge la `needs_review/`. -- "Setupul arată slab" → IRRELEVANT la momentul screenshot. Screenshot. Calitate o pune extractorul. (Da, calitate e descriptor biased — vezi STOPPING_RULE.md punct 3 — dar NU folosim calitate ca filtru.) -- "Trade-ul a pierdut clar" → IRRELEVANT. Screenshot. Asta e exact biasul pe care îl evităm. - ---- - -## Anti-pattern-uri (NU FACE asta) - -- ❌ "Scrol până găsesc un trade frumos" — biased. -- ❌ "Sar peste ziua asta, n-a fost nimic interesant" — biased. -- ❌ "Refac screenshot-ul, primul a ieșit prost" → ok dacă primul e ilizibil; NU ok dacă vrei un screenshot "mai clar" pe un trade winning. -- ❌ "Văd că e SL clar, nu merită screenshot" → exact opusul a ce vrei. - ---- - -## Calibration trades (primele 10) - -Pentru cele 10 trade-uri de calibrare (P4 gate): - -- **Tu** (Marius) extragi manual TOATE câmpurile prin `/m2d-log` (source=`manual_calibration`). -- **Apoi** rulezi `/backtest screenshot.png` pentru extracție vision (source=`vision_calibration`). -- `/stats --calibration` compară field-by-field. -- Acceptance: ≤10% mismatch pe câmpurile core. >10% → fix promptul vision agent (`.claude/agents/m2d-extractor.md`) și re-rulează. - ---- - -## Versiune -- v1 (2026-05-13) — draft inițial diff --git a/calendar_evenimente.md b/calendar_evenimente.md deleted file mode 100644 index d74cb67..0000000 --- a/calendar_evenimente.md +++ /dev/null @@ -1,38 +0,0 @@ -# Calendar evenimente economice — recurente - -## Lunar - -| Eveniment | Frecvență | Ora RO | Impact | -|---|---|---|---| -| **NFP** | Prima vineri din lună | 15:30 | EXTREM | -| **CPI** | Mid-luna (10-15) | 15:30 | EXTREM | -| **PPI** | După CPI | 15:30 | MARE | -| **Retail Sales** | ~15 lună | 15:30 | MARE | -| **PCE Price Index** | Ultimele zile lună | 15:30 | MARE | -| **ADP Employment** | Miercuri pre-NFP | 15:15 | MEDIU | -| **JOLTS Job Openings** | 1-a săptămână | 17:00 | MEDIU | -| **ISM Manuf/Services** | 1-a săptămână | 17:00 | MEDIU | - -## Săptămânal - -| Eveniment | Zi | Ora RO | Impact | -|---|---|---|---| -| **EIA Crude Oil Inventories** | Miercuri | 17:30 | MEDIU pe US30 (indirect) | -| **Initial Jobless Claims** | Joi | 15:30 | MIC-MEDIU | - -## FOMC 2026 (8 ședințe/an, miercuri 21:00 RO, *cu excepții DST*) - -| Data | Comentariu | -|---|---| -| 28 ianuarie | Statement 21:00 RO + Powell 21:30 | -| 18 martie | ATENȚIE: 20:00 RO (Europa pe EET, US deja DST) + SEP/dot plot | -| 29 aprilie | 21:00 RO + Powell 21:30 | -| 17 iunie | + SEP/dot plot | -| 29 iulie | 21:00 RO | -| 16 septembrie | + SEP/dot plot | -| 28 octombrie | 21:00 RO | -| 9 decembrie | + SEP/dot plot | - -## Regulă pentru backtesting - -**Trade-urile din ferestrele ± 15 min față de NFP/CPI/FOMC** → marcate ca **Set C - News window** și analizate SEPARAT, NU în statistica principală. diff --git a/data/_meta.yaml b/data/_meta.yaml deleted file mode 100644 index 1404385..0000000 --- a/data/_meta.yaml +++ /dev/null @@ -1,18 +0,0 @@ -schema_version: 1 - -# Versions stamped on every CSV row. Update only when behavior changes. -indicator_version: "v-2026-05" -pl_overlay_version: "marius-v1" # 50% TP0 + BE + close ~TP1 - -csv_schema_version: 1 -calendar_schema_version: 1 - -# Tier 1 / Tier 2 trading windows (informational; Set calc uses calendar_parse.py logic) -tier_1_window: - start_ro: "16:35" - end_ro: "18:00" - days: ["Tue", "Wed", "Thu"] -tier_2_window: - start_ro: "22:00" - end_ro: "22:45" - days: ["Tue", "Wed", "Thu"] diff --git a/data/backtest.xlsx b/data/backtest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5240a82037b0bdac73e9b9ca31ff1495268e9f41 GIT binary patch literal 226759 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
WqKh@^H9_!v+G#;Ui(BU{Aa^^)p{F1mS) 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

Yg{+DWVsm{QliCm0K8z}vP_h}<_7Z|=|!ojdMz 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 z z*S!G!-}M5E@%$41p!jdqB(o{)bk#Zco|gfJ5IpaT`zPJE`Pf9!YMpa(Hmlmp-VG%E z>iEbS#mp*I`TpYh=V{MV_DfA$&dlTB|0r7Ne=KfIeL=y;iXD1}C|_^JL&8b=gS`M1 z{8IQIUfH+b|9&CPNHMIPTHs(noOr~zaQR*Hk-@DenR1;kFW4+@J#K3txW!mbU5B|t z_6ATP1W3jSwY%AdM89*VWXQ-LqQ6kSAm`(|ac&TpOFdSTeolFiO~ zaqoNk?vK+5>i#kps=DVD6?4Ee;S@L%HQNAe_WgpJl&G3{MV5Sb6A(&5eb)AWcNDZ- zJ?Q!WcNDY$QZDI%st`iHD)rU?R@p-_7sWg%v_ZCI0XqkAV_Nad~wGLRsQo3ORU54HIWi{gJ5V zcC+!qBOz4fiFD}`n9#FryQfDA&g7V$lmegZP-hrFagK51ii!h+$EhjCg%j_Zr`oN9 zKTp4Z-p1M?z-;dF(ug`E-Bz<G&P+^LP82Q5XjqN3t*K9oNYI zd1?xb9R=nxMtu12OYTO3;D0u$KVRA3!e%EvaQ(KmHq{+j$$Vy4%_ifsf0`bv6Oj|x zLwBA*bI(`xPtu;heBX?tuEql6>SU8bECh4t}_c&5m-~q5lQCvP{fqy}LqU=(A!s%5HQm ze0;}vY1;eQQ})LyJVu^Z4KJsDC*{7scI(Ei5{d5LP1Sck-ME*3^4_Pst~<=9o|N5) zzSVkHt?OM&->(>VjxxA^Y^Ybk%5snBYSN^{#;y4A8 zZC};YmA$VL+bvK5MlO= zJvZz}+eKTtboLsPp+pRy^1Ky`wpLvbx?iOYZwwbbOt$|4gDntElN+^F&2$;;+K~K!X1z#Bjrs|{O{+Y=`Cn2@h(@85 zYm|?ztE|K0ZmG)oFBFBohhsd5!KDzmR|Oz}1SlldL=8+!>65*9xZ5YRp5Ybq#&_xI z`lLndcjy31sOZwdb zfm|&Ti*B~qPsZ$U0f%KT1H)*@i|_86@{B8UUB=?t2@WwGhk}cg4EAna5n6 zjW}i9S`5BvUvY)fCXH{hkRNKd8syH(ms5JO2%+$UPMvN7HPY9vsBmb9RbpHJ)Sj6k z?Vld6W-zn`N+62BFugGfX$v*<<7w;b-*-m(lVx$!1vAdy?f+S<`A2e{!D#5=XB@zhM5cTQMI+YQI# zL|mBe*{h|f>^H5-=ACdQru~qfUV&1F`~#Qil6EUeTuw^tjHoai4mGe0{WV{lKi!)2 zy-$-qwOzE0LH6=&-$7JSHW+RwFz)3xKM#eK_M;|MUO6~`H;_&~YtL!-QEdU$Y0_d! z1qfn;N67cncHS_YU^7TQ9{bv*rwHOSyJesoQc>Af^9%-0E56e=(vfjJT|Gu~0zwDJ zJg+R@F!?T52e+ZN&J~{avHph3hV0jvy9LrbQo)!uaR&zE~}29VOZDp7e+9b(%~?GWiE zD8akLxjc&k)=7TaO8+E8QOgNG0}*uom7u_S{n>#NQ8QTK18#89u$>k$ORZ)(Ajp2% zE^{k8JJH2{(BL}p7|>Ar&5KE1;(;2eX#6`cxopw`ytQ>gZqB>-ywo(bThC9VcGO)E zD{1KBYf|`H%8XiGQ>vJ4`s`PjC;?8_0M>KZ`ii2h?SpzZRMErQFwzMrr$~7<@~$djzpP(PLk*!lChDe zW*fvN3$z%yAO4^$!VHuv@&TD9e`RlhzB$Fi7`#8I7IGl7-pL{Y}yd6+a1|gPFXAyA

x|3 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

+W<&|$E3 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 Acest sumar se actualizează manual la fiecare ~10 trade-uri. - -- **Total trade-uri**: 0 -- **Win Rate**: - -- **Net P/L (% Risc)**: - -- **Ultimul update**: - - ---- - -## Trade-uri - -| # | Data | Zi | Ora RO | Instrument | Direcție | TF mare | TF mic | Calitate | Entry | SL | TP0 | TP1 | TP2 | Risc % | Hit | BE | P/L Risc | Set | Note | -|---|------|----|----|-----------|----------|---------|--------|----------|-------|-----|------|------|------|--------|-----|----|----|-----|------| -| | | | | | | | | | | | | | | | | | | | | - ---- - -## Note generale (observații din backtest) - -- - ---- - -## Excluderi din statistici - -Trade-uri care au fost identificate dar excluse din analiza principală (de obicei zile news, condiții anormale): - -| # | Motiv excludere | -|---|----------------| -| | | diff --git a/pyproject.toml b/pyproject.toml index 2718738..298fa57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,25 +1,11 @@ [project] name = "atm-backtesting" -version = "0.1.0" -description = "M2D backtesting system — vision extraction + stats" +version = "0.2.0" +description = "Jurnal Excel manual pentru backtesting M2D + comparație 3 strategii de management (Hybrid 50/50+BE / TP1-only OCO / TP2-only OCO)" requires-python = ">=3.11" dependencies = [ - "pydantic>=2.5", - "pyyaml>=6.0", - "scipy>=1.11", - "numpy>=1.26", + "openpyxl>=3.1", ] -[project.optional-dependencies] -dev = [ - "pytest>=7.4", - "pytest-cov>=4.1", -] - -[tool.pytest.ini_options] -testpaths = ["tests"] -python_files = ["test_*.py"] -addopts = "-ra -q" - [tool.setuptools] packages = ["scripts"] diff --git a/screenshots/inbox/.gitkeep b/screenshots/inbox/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/screenshots/needs_review/.gitkeep b/screenshots/needs_review/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/screenshots/processed/.gitkeep b/screenshots/processed/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/append_row.py b/scripts/append_row.py deleted file mode 100644 index 6e1202a..0000000 --- a/scripts/append_row.py +++ /dev/null @@ -1,311 +0,0 @@ -"""Append a validated M2D extraction to ``data/jurnal.csv``. - -Pipeline: - JSON file --> pydantic validate (M2DExtraction) - --> load data/_meta.yaml (versions) - --> compute id, ora_ro, zi, set, pl_marius, pl_theoretical, extracted_at - --> dedup on (screenshot_file, source) - --> atomic CSV write (sibling .tmp + os.replace) - -Source values - - ``vision`` : produced by the vision subagent - - ``manual`` : Marius logged by hand - - ``manual_calibration`` : calibration P4 — manual leg - - ``vision_calibration`` : calibration P4 — vision leg - -A row with ``source=manual_calibration`` and a row with ``source=vision_calibration`` -for the *same* screenshot are allowed to coexist (different dedup keys). - -Failure mode: ``append_extraction`` NEVER raises. On any error (missing JSON, -pydantic ValidationError, dedup hit, etc.) it returns -``{"status": "rejected", "reason": "...", "id": None, "row": None}`` so the -caller (a slash command) can decide what to do with the screenshot -(move to ``needs_review/``, log to workflow, etc.). -""" - -from __future__ import annotations - -import csv -import json -import os -import traceback -from datetime import datetime, timezone -from pathlib import Path -from typing import Any, Literal - -import yaml -from pydantic import ValidationError - -from scripts.calendar_parse import calc_set, load_calendar, utc_to_ro -from scripts.pl_calc import pl_marius, pl_theoretical -from scripts.vision_schema import M2DExtraction, parse_extraction - -__all__ = [ - "CSV_COLUMNS", - "VALID_SOURCES", - "ZI_RO_MAP", - "csv_columns", - "append_extraction", -] - - -Source = Literal["vision", "manual", "manual_calibration", "vision_calibration"] - -VALID_SOURCES: frozenset[str] = frozenset( - {"vision", "manual", "manual_calibration", "vision_calibration"} -) - - -# Canonical column order (29) — must stay stable; regenerate_md + stats depend on it. -CSV_COLUMNS: tuple[str, ...] = ( - "id", - "screenshot_file", - "source", - "data", - "zi", - "ora_ro", - "ora_utc", - "instrument", - "directie", - "tf_mare", - "tf_mic", - "calitate", - "entry", - "sl", - "tp0", - "tp1", - "tp2", - "risc_pct", - "outcome_path", - "max_reached", - "be_moved", - "pl_marius", - "pl_theoretical", - "set", - "indicator_version", - "pl_overlay_version", - "csv_schema_version", - "extracted_at", - "note", -) - - -ZI_RO_MAP: dict[str, str] = { - "Mon": "Lu", - "Tue": "Ma", - "Wed": "Mi", - "Thu": "Jo", - "Fri": "Vi", - "Sat": "Sa", - "Sun": "Du", -} - - -def csv_columns() -> list[str]: - """Return the 29-column header in canonical order.""" - return list(CSV_COLUMNS) - - -# --------------------------------------------------------------------------- -# helpers -# --------------------------------------------------------------------------- - - -def _load_meta(meta_path: Path) -> dict[str, Any]: - with meta_path.open("r", encoding="utf-8") as fh: - meta = yaml.safe_load(fh) or {} - required = ("indicator_version", "pl_overlay_version", "csv_schema_version") - missing = [k for k in required if k not in meta] - if missing: - raise ValueError(f"_meta.yaml missing required keys: {missing}") - return meta - - -def _read_existing_rows(csv_path: Path) -> list[dict[str, str]]: - if not csv_path.exists() or csv_path.stat().st_size == 0: - return [] - with csv_path.open("r", encoding="utf-8", newline="") as fh: - reader = csv.DictReader(fh) - return list(reader) - - -def _next_id(rows: list[dict[str, str]]) -> int: - max_id = 0 - for r in rows: - raw = r.get("id", "") - if not raw: - continue - try: - v = int(raw) - except (TypeError, ValueError): - continue - if v > max_id: - max_id = v - return max_id + 1 - - -def _format_optional(value: float | None) -> str: - return "" if value is None else f"{value:.4f}" - - -def _write_csv_atomic( - csv_path: Path, rows: list[dict[str, str]], columns: list[str] -) -> None: - csv_path.parent.mkdir(parents=True, exist_ok=True) - tmp = csv_path.with_suffix(csv_path.suffix + ".tmp") - with tmp.open("w", encoding="utf-8", newline="") as fh: - writer = csv.DictWriter(fh, fieldnames=columns) - writer.writeheader() - for row in rows: - writer.writerow({k: row.get(k, "") for k in columns}) - os.replace(tmp, csv_path) - - -def _build_row( - extraction: M2DExtraction, - *, - source: str, - row_id: int, - meta: dict[str, Any], - calendar: list[dict[str, Any]], - extracted_at: str, -) -> dict[str, str]: - d_ro, t_ro, day_short = utc_to_ro(extraction.data, extraction.ora_utc) - set_label = calc_set(d_ro, t_ro, day_short, calendar) - pl_m = pl_marius(extraction.outcome_path, extraction.be_moved) - pl_t = pl_theoretical(extraction.max_reached) - zi_ro = ZI_RO_MAP[day_short] - - return { - "id": str(row_id), - "screenshot_file": extraction.screenshot_file, - "source": source, - "data": extraction.data, - "zi": zi_ro, - "ora_ro": t_ro.strftime("%H:%M"), - "ora_utc": extraction.ora_utc, - "instrument": extraction.instrument, - "directie": extraction.directie, - "tf_mare": extraction.tf_mare, - "tf_mic": extraction.tf_mic, - "calitate": extraction.calitate, - "entry": f"{extraction.entry}", - "sl": f"{extraction.sl}", - "tp0": f"{extraction.tp0}", - "tp1": f"{extraction.tp1}", - "tp2": f"{extraction.tp2}", - "risc_pct": f"{extraction.risc_pct}", - "outcome_path": extraction.outcome_path, - "max_reached": extraction.max_reached, - "be_moved": str(extraction.be_moved), - "pl_marius": _format_optional(pl_m), - "pl_theoretical": _format_optional(pl_t), - "set": set_label, - "indicator_version": str(meta["indicator_version"]), - "pl_overlay_version": str(meta["pl_overlay_version"]), - "csv_schema_version": str(meta["csv_schema_version"]), - "extracted_at": extracted_at, - "note": extraction.note, - } - - -def _reject(reason: str) -> dict[str, Any]: - return {"status": "rejected", "reason": reason, "id": None, "row": None} - - -# --------------------------------------------------------------------------- -# public API -# --------------------------------------------------------------------------- - - -def append_extraction( - json_path: Path | str, - source: str, - csv_path: Path | str = "data/jurnal.csv", - meta_path: Path | str = "data/_meta.yaml", - calendar_path: Path | str = "calendar_evenimente.yaml", -) -> dict[str, Any]: - """Append one validated extraction to the jurnal CSV. - - Never raises. Returns one of: - - - ``{"status": "ok", "reason": "", "id": , "row": }`` - - ``{"status": "rejected", "reason": , "id": None, "row": None}`` - """ - json_path = Path(json_path) - csv_path = Path(csv_path) - meta_path = Path(meta_path) - calendar_path = Path(calendar_path) - - if source not in VALID_SOURCES: - return _reject( - f"invalid source {source!r}; must be one of {sorted(VALID_SOURCES)}" - ) - - if not json_path.exists(): - return _reject(f"JSON file not found: {json_path}") - - try: - with json_path.open("r", encoding="utf-8") as fh: - raw = fh.read() - except OSError as exc: - return _reject(f"failed to read JSON {json_path}: {exc}") - - try: - extraction = parse_extraction(raw) - except ValidationError as exc: - return _reject(f"validation error: {exc}") - except (ValueError, json.JSONDecodeError) as exc: - return _reject(f"validation error (json parse): {exc}") - - try: - meta = _load_meta(meta_path) - except (FileNotFoundError, OSError) as exc: - return _reject(f"_meta.yaml not found: {exc}") - except (ValueError, yaml.YAMLError) as exc: - return _reject(f"_meta.yaml invalid: {exc}") - - try: - calendar = load_calendar(calendar_path) - except (FileNotFoundError, OSError) as exc: - return _reject(f"calendar not found: {exc}") - except (ValueError, yaml.YAMLError) as exc: - return _reject(f"calendar invalid: {exc}") - - try: - existing = _read_existing_rows(csv_path) - except OSError as exc: - return _reject(f"failed to read existing CSV {csv_path}: {exc}") - - key = (extraction.screenshot_file, source) - for r in existing: - if (r.get("screenshot_file"), r.get("source")) == key: - return _reject( - f"duplicate row: screenshot_file={key[0]!r} source={key[1]!r}" - ) - - row_id = _next_id(existing) - extracted_at = ( - datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S") + "Z" - ) - - try: - row = _build_row( - extraction, - source=source, - row_id=row_id, - meta=meta, - calendar=calendar, - extracted_at=extracted_at, - ) - except (KeyError, ValueError) as exc: - return _reject(f"derived-field computation failed: {exc}") - - try: - _write_csv_atomic(csv_path, [*existing, row], list(CSV_COLUMNS)) - except OSError as exc: - return _reject( - f"atomic write failed: {exc}\n{traceback.format_exc()}" - ) - - return {"status": "ok", "reason": "", "id": row_id, "row": row} diff --git a/scripts/calendar_parse.py b/scripts/calendar_parse.py deleted file mode 100644 index 6680636..0000000 --- a/scripts/calendar_parse.py +++ /dev/null @@ -1,181 +0,0 @@ -"""Calendar parsing + Set classification for M2D backtesting. - -Each trade is tagged with a ``Set`` derived from its date, RO-local time, and the -economic-event calendar: - -- ``A1``: 16:35-17:00 RO, Tue/Wed/Thu -- ``A2``: 17:00-18:00 RO, Tue/Wed/Thu (sweet spot) -- ``A3``: 18:00-19:00 RO, Tue/Wed/Thu -- ``B`` : 22:00-22:45 RO, Tue/Wed/Thu -- ``C`` : inside the window of an event with severity in {extrem, mare} -- ``D`` : Mon or Fri -- ``Other``: anything else - -Priority: C > D > A1/A2/A3/B > Other. -""" - -from __future__ import annotations - -from datetime import date, datetime, time -from pathlib import Path -from typing import Any - -import yaml -from zoneinfo import ZoneInfo - -__all__ = [ - "RO_TZ", - "UTC_TZ", - "utc_to_ro", - "load_calendar", - "is_in_news_window", - "calc_set", -] - - -RO_TZ = ZoneInfo("Europe/Bucharest") -UTC_TZ = ZoneInfo("UTC") - -_DAY_SHORT = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") - -_HIGH_SEVERITY = frozenset({"extrem", "mare"}) - -_WEEKLY_DAY_MAP = { - "monday": 0, - "tuesday": 1, - "wednesday": 2, - "thursday": 3, - "friday": 4, - "saturday": 5, - "sunday": 6, -} - - -def utc_to_ro(date_str: str, ora_utc_str: str) -> tuple[date, time, str]: - """Convert ``(YYYY-MM-DD, HH:MM UTC)`` to ``(date_ro, time_ro, day_short)``. - - DST-aware via :mod:`zoneinfo`. ``day_short`` is one of - ``Mon Tue Wed Thu Fri Sat Sun``. - """ - dt_utc = datetime.strptime(f"{date_str} {ora_utc_str}", "%Y-%m-%d %H:%M").replace( - tzinfo=UTC_TZ - ) - dt_ro = dt_utc.astimezone(RO_TZ) - return dt_ro.date(), dt_ro.time().replace(second=0, microsecond=0), _DAY_SHORT[dt_ro.weekday()] - - -def load_calendar(path: Path | str = "calendar_evenimente.yaml") -> list[dict[str, Any]]: - """Load a YAML calendar file. - - Validates ``schema_version == 1`` and returns the list of event dicts under - the top-level ``events`` key. - """ - p = Path(path) - with p.open("r", encoding="utf-8") as fh: - doc = yaml.safe_load(fh) - if not isinstance(doc, dict): - raise ValueError(f"calendar file {p} is not a mapping") - version = doc.get("schema_version") - if version != 1: - raise ValueError( - f"unsupported calendar schema_version: {version!r} (expected 1)" - ) - events = doc.get("events") or [] - if not isinstance(events, list): - raise ValueError(f"calendar events must be a list, got {type(events).__name__}") - return events - - -def _minutes(t: time) -> int: - return t.hour * 60 + t.minute - - -def _parse_hhmm(s: str) -> time: - return datetime.strptime(s, "%H:%M").time() - - -def _is_first_friday_of_month(d: date) -> bool: - return d.weekday() == 4 and d.day <= 7 - - -def _event_matches_date(event: dict[str, Any], d: date) -> bool: - cadence = event.get("cadence", "") - if cadence == "scheduled": - ev_date_raw = event.get("date") - if isinstance(ev_date_raw, date): - ev_date = ev_date_raw - elif isinstance(ev_date_raw, str): - ev_date = datetime.strptime(ev_date_raw, "%Y-%m-%d").date() - else: - return False - return ev_date == d - if cadence == "first_friday_monthly": - return _is_first_friday_of_month(d) - if cadence.startswith("weekly_"): - day_name = cadence[len("weekly_") :].lower() - target = _WEEKLY_DAY_MAP.get(day_name) - if target is None: - return False - return d.weekday() == target - # cadences below are not pinned down to a precise calendar day yet, so we - # do not trigger Set C for them. ADP pre-NFP is also explicitly deferred. - return False - - -def is_in_news_window(d: date, t: time, calendar: list[dict[str, Any]]) -> bool: - """Return True iff ``(d, t)`` falls inside the window of a high-severity event. - - Window: ``[time_ro - window_before_min, time_ro + window_after_min]`` (inclusive - on both ends). Only events with ``severity`` in ``{extrem, mare}`` count. - - Cadences honoured: ``scheduled``, ``first_friday_monthly``, ``weekly_``. - Other cadences (``monthly_mid``, ``monthly_end``, ``monthly_15``, - ``wednesday_pre_nfp``, ``monthly_first_week`` etc.) are deferred and never - trigger Set C. - """ - t_min = _minutes(t) - for event in calendar: - if event.get("severity") not in _HIGH_SEVERITY: - continue - if not _event_matches_date(event, d): - continue - ev_time_raw = event.get("time_ro") - if isinstance(ev_time_raw, time): - ev_time = ev_time_raw - elif isinstance(ev_time_raw, str): - ev_time = _parse_hhmm(ev_time_raw) - else: - continue - center = _minutes(ev_time) - before = int(event.get("window_before_min", 0)) - after = int(event.get("window_after_min", 0)) - if center - before <= t_min <= center + after: - return True - return False - - -def _in_range(t: time, lo: time, hi: time) -> bool: - """Half-open ``[lo, hi)`` containment.""" - return _minutes(lo) <= _minutes(t) < _minutes(hi) - - -def calc_set(d: date, t: time, day_of_week: str, calendar: list[dict[str, Any]]) -> str: - """Classify a trade into one of ``A1 A2 A3 B C D Other``. - - Priority: ``C`` (news) > ``D`` (Mon/Fri) > ``A1/A2/A3/B`` (time bands on - Tue/Wed/Thu) > ``Other``. - """ - if is_in_news_window(d, t, calendar): - return "C" - if day_of_week in ("Mon", "Fri"): - return "D" - if day_of_week in ("Tue", "Wed", "Thu"): - if _in_range(t, time(16, 35), time(17, 0)): - return "A1" - if _in_range(t, time(17, 0), time(18, 0)): - return "A2" - if _in_range(t, time(18, 0), time(19, 0)): - return "A3" - if _in_range(t, time(22, 0), time(22, 45)): - return "B" - return "Other" diff --git a/scripts/generate_template.py b/scripts/generate_template.py new file mode 100644 index 0000000..e513cb6 --- /dev/null +++ b/scripts/generate_template.py @@ -0,0 +1,731 @@ +"""Generator pentru data/backtest.xlsx. + +5 strategii de management comparate side-by-side pe semnale blackbox: + - TP0 only : 100% close la TP0 + - TP1 only : 100% OCO la SL/TP1 + - TP2 only : 100% OCO la SL/TP2 + - Hybrid + BE : 50% TP0 + mut SL la BE + 50% TP1 (recomandat de trader) + - Hybrid no BE : 50% TP0 + 50% TP1, fără BE (control pentru a izola valoarea BE-ului) + +Rulare: + pip install openpyxl + python scripts/generate_template.py +""" + +from __future__ import annotations + +from datetime import date, time +from pathlib import Path + +from openpyxl import Workbook +from openpyxl.chart import LineChart, Reference +from openpyxl.formatting.rule import CellIsRule +from openpyxl.styles import Alignment, Border, Font, PatternFill, Side +from openpyxl.utils import get_column_letter +from openpyxl.worksheet.datavalidation import DataValidation + + +OUTPUT = Path(__file__).resolve().parent.parent / "data" / "backtest.xlsx" +MAX_ROWS = 500 # rânduri pre-completate cu formule în sheet-ul Trades + +# --------------------------------------------------------------------------- +# Styles +# --------------------------------------------------------------------------- + +HEADER_FILL = PatternFill("solid", fgColor="1F3864") +HEADER_FONT = Font(name="Calibri", size=11, bold=True, color="FFFFFF") +INPUT_FILL = PatternFill("solid", fgColor="FFF8E1") +DERIVED_FILL = PatternFill("solid", fgColor="E8F1FA") +HIDDEN_FILL = PatternFill("solid", fgColor="F0F0F0") +TITLE_FONT = Font(name="Calibri", size=16, bold=True, color="1F3864") +SUBTITLE_FONT = Font(name="Calibri", size=12, bold=True, color="1F3864") +THIN = Side(border_style="thin", color="BFBFBF") +BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN) +CENTER = Alignment(horizontal="center", vertical="center") +LEFT = Alignment(horizontal="left", vertical="center") +RIGHT = Alignment(horizontal="right", vertical="center") + + +# --------------------------------------------------------------------------- +# Lists +# --------------------------------------------------------------------------- + +STRATEGIES = ["M2D", "EMA cross", "Order block", "Liquidity sweep", "Custom"] +SESSIONS = ["A1", "A2", "A3", "B", "C", "D", "Other"] +INDICATORS = ["DIA", "US30", "SPY", "QQQ", "ES", "NQ"] +TIMEFRAMES = ["1min", "3min", "15min"] +DIRECTIONS = ["Buy", "Sell"] +OUTCOMES = ["SL", "TP0 only", "TP1", "TP2"] + +# Cele 5 strategii de management (sufix folosit în numele coloanelor) + label friendly +STRAT_KEYS = ["tp0only", "tp1only", "tp2only", "hybrid_be", "hybrid_nobe"] +STRAT_LABELS = { + "tp0only": "TP0 only", + "tp1only": "TP1 only", + "tp2only": "TP2 only", + "hybrid_be": "Hybrid + BE", + "hybrid_nobe": "Hybrid no BE", +} + +# --------------------------------------------------------------------------- +# Trades sheet — schema +# --------------------------------------------------------------------------- + +INPUT_HEADERS = [ + "#", "Data", "Ora RO", "Zi", "Sesiune", + "Strategie", "Indicator", "TF", + "Direcție", "SL %", "TP0 %", "TP1 %", "TP2 %", + "Outcome", "Notes", +] +DERIVED_HEADERS = ( + [f"R_{s}" for s in STRAT_KEYS] + + [f"$_{s}" for s in STRAT_KEYS] + + [f"Bal_{s}" for s in STRAT_KEYS] +) +HELPER_HEADERS = ( + [f"Win_{s}" for s in STRAT_KEYS] + + [f"Peak_{s}" for s in STRAT_KEYS] + + [f"DD_{s}" for s in STRAT_KEYS] +) +TRADES_HEADERS = INPUT_HEADERS + DERIVED_HEADERS + HELPER_HEADERS + +# Mapă nume → literă coloană Excel +COL = {name: get_column_letter(i + 1) for i, name in enumerate(TRADES_HEADERS)} + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _col_to_int(letter: str) -> int: + n = 0 + for ch in letter: + n = n * 26 + (ord(ch) - ord("A") + 1) + return n + + +# --------------------------------------------------------------------------- +# Config sheet +# --------------------------------------------------------------------------- + + +def build_config(wb: Workbook) -> None: + ws = wb.create_sheet("Config", 0) + ws.sheet_view.showGridLines = False + + ws["A1"] = "📋 Config — editează doar celulele galbene" + ws["A1"].font = TITLE_FONT + ws.merge_cells("A1:C1") + + ws["A3"] = "Setting" + ws["B3"] = "Value" + ws["C3"] = "Note" + for c in ("A3", "B3", "C3"): + ws[c].font = HEADER_FONT + ws[c].fill = HEADER_FILL + ws[c].alignment = CENTER + + ws["A4"] = "Account Size Start ($)" + ws["B4"] = 10000 + ws["C4"] = "Balanța inițială pentru calcule $ și HWM" + + ws["A5"] = "Risk per Trade (%)" + ws["B5"] = 1.0 + ws["C5"] = "% din account riscat per trade (= -1R)" + + ws["A6"] = "Risk per Trade ($)" + ws["B6"] = "=B4*B5/100" + ws["C6"] = "Auto — derivat din B4 și B5" + + for r in (4, 5): + ws.cell(row=r, column=2).fill = INPUT_FILL + ws.cell(row=r, column=2).border = BORDER + ws["B6"].fill = DERIVED_FILL + ws["B6"].border = BORDER + ws["B4"].number_format = "$#,##0" + ws["B5"].number_format = '0.0"%"' + ws["B6"].number_format = "$#,##0.00" + + # Liste dropdown — coloanele E–J (6 coloane) + list_columns = [ + ("Strategii", STRATEGIES), + ("Sesiuni (auto)", SESSIONS), + ("Indicatori", INDICATORS), + ("TF", TIMEFRAMES), + ("Direcție", DIRECTIONS), + ("Outcome", OUTCOMES), + ] + for col_idx, (label, values) in enumerate(list_columns, start=5): + cell = ws.cell(row=3, column=col_idx, value=label) + cell.font = HEADER_FONT + cell.fill = HEADER_FILL + cell.alignment = CENTER + for row_idx, v in enumerate(values, start=4): + c = ws.cell(row=row_idx, column=col_idx, value=v) + c.alignment = CENTER + + widths = { + "A": 24, "B": 14, "C": 38, "D": 2, + "E": 14, "F": 14, "G": 13, "H": 10, "I": 10, "J": 12, + } + for col, w in widths.items(): + ws.column_dimensions[col].width = w + + +# --------------------------------------------------------------------------- +# Formula builders pentru Trades sheet +# --------------------------------------------------------------------------- + + +def _f_day(r: int) -> str: + d = f'{COL["Data"]}{r}' + return ( + f'=IF({d}="","",' + f'CHOOSE(WEEKDAY({d},2),"Lu","Ma","Mi","Jo","Vi","Sa","Du"))' + ) + + +def _f_session(r: int) -> str: + """Derivă Sesiunea M2D din Data + Ora RO.""" + d = f'{COL["Data"]}{r}' + t = f'{COL["Ora RO"]}{r}' + wd = f"WEEKDAY({d},2)" + mid_week = f"AND({wd}>=2,{wd}<=4)" + return ( + f'=IF(OR({d}="",{t}=""),"",' + f"IF(OR({wd}=1,{wd}=5),\"D\"," + f'IF(AND({t}>=TIME(15,30,0),{t}=TIME(16,35,0),{t}=TIME(17,0,0),{t}=TIME(18,0,0),{t}=TIME(22,0,0),{t} str: + o = f'{COL["Outcome"]}{r}' + sl = f'{COL["SL %"]}{r}' + tp0 = f'{COL["TP0 %"]}{r}' + return f'=IF({o}="","",IF({o}="SL",-1,{tp0}/{sl}))' + + +def _f_r_tp1only(r: int) -> str: + o = f'{COL["Outcome"]}{r}' + sl = f'{COL["SL %"]}{r}' + tp1 = f'{COL["TP1 %"]}{r}' + return ( + f'=IF({o}="","",' + f'IF(OR({o}="SL",{o}="TP0 only"),-1,{tp1}/{sl}))' + ) + + +def _f_r_tp2only(r: int) -> str: + o = f'{COL["Outcome"]}{r}' + sl = f'{COL["SL %"]}{r}' + tp2 = f'{COL["TP2 %"]}{r}' + return f'=IF({o}="","",IF({o}="TP2",{tp2}/{sl},-1))' + + +def _f_r_hybrid_be(r: int) -> str: + o = f'{COL["Outcome"]}{r}' + sl = f'{COL["SL %"]}{r}' + tp0 = f'{COL["TP0 %"]}{r}' + tp1 = f'{COL["TP1 %"]}{r}' + return ( + f'=IF({o}="","",' + f'IF({o}="SL",-1,' + f'IF({o}="TP0 only",0.5*{tp0}/{sl},' + f'0.5*({tp0}+{tp1})/{sl})))' + ) + + +def _f_r_hybrid_nobe(r: int) -> str: + o = f'{COL["Outcome"]}{r}' + sl = f'{COL["SL %"]}{r}' + tp0 = f'{COL["TP0 %"]}{r}' + tp1 = f'{COL["TP1 %"]}{r}' + return ( + f'=IF({o}="","",' + f'IF({o}="SL",-1,' + f'IF({o}="TP0 only",0.5*{tp0}/{sl}-0.5,' + f'0.5*({tp0}+{tp1})/{sl})))' + ) + + +R_FN: dict[str, callable] = { + "tp0only": _f_r_tp0only, + "tp1only": _f_r_tp1only, + "tp2only": _f_r_tp2only, + "hybrid_be": _f_r_hybrid_be, + "hybrid_nobe": _f_r_hybrid_nobe, +} + + +def _f_dollar(r: int, r_col: str) -> str: + rc = f"{COL[r_col]}{r}" + return f'=IF({rc}="","",{rc}*Config!$B$6)' + + +def _f_balance(r: int, dollar_col: str) -> str: + dc = COL[dollar_col] + return f'=IF({dc}{r}="","",Config!$B$4 + SUM(${dc}$2:{dc}{r}))' + + +def _f_win(r: int, r_col: str) -> str: + rc = f"{COL[r_col]}{r}" + return f'=IF({rc}="","",IF({rc}>0,1,0))' + + +def _f_peak(r: int, balance_col: str, peak_col: str) -> str: + bc = COL[balance_col] + pc = COL[peak_col] + if r == 2: + return f'=IF({bc}{r}="","",{bc}{r})' + return ( + f'=IF({bc}{r}="","",' + f'IF({pc}{r-1}="",{bc}{r},MAX({pc}{r-1},{bc}{r})))' + ) + + +def _f_drawdown(r: int, peak_col: str, balance_col: str) -> str: + pc = f"{COL[peak_col]}{r}" + bc = f"{COL[balance_col]}{r}" + return f'=IF({bc}="","",{pc}-{bc})' + + +# --------------------------------------------------------------------------- +# Trades sheet +# --------------------------------------------------------------------------- + + +def build_trades(wb: Workbook) -> None: + ws = wb.create_sheet("Trades", 1) + ws.sheet_view.showGridLines = False + ws.freeze_panes = "B2" + + # Headers + for col_idx, header in enumerate(TRADES_HEADERS, start=1): + cell = ws.cell(row=1, column=col_idx, value=header) + cell.font = HEADER_FONT + cell.fill = HEADER_FILL + cell.alignment = CENTER + cell.border = BORDER + + # Formule pe toate rândurile pre-pregătite + for r in range(2, MAX_ROWS + 2): + ws.cell(row=r, column=1, value="=ROW()-1") + ws[f'{COL["Zi"]}{r}'] = _f_day(r) + ws[f'{COL["Sesiune"]}{r}'] = _f_session(r) + + for strat in STRAT_KEYS: + ws[f'{COL[f"R_{strat}"]}{r}'] = R_FN[strat](r) + ws[f'{COL[f"$_{strat}"]}{r}'] = _f_dollar(r, f"R_{strat}") + ws[f'{COL[f"Bal_{strat}"]}{r}'] = _f_balance(r, f"$_{strat}") + ws[f'{COL[f"Win_{strat}"]}{r}'] = _f_win(r, f"R_{strat}") + ws[f'{COL[f"Peak_{strat}"]}{r}'] = _f_peak( + r, f"Bal_{strat}", f"Peak_{strat}" + ) + ws[f'{COL[f"DD_{strat}"]}{r}'] = _f_drawdown( + r, f"Peak_{strat}", f"Bal_{strat}" + ) + + # Sample row 2 + ws["B2"] = date(2026, 5, 13) + ws["C2"] = time(17, 33) + ws[f'{COL["Strategie"]}2'] = "M2D" + ws[f'{COL["Indicator"]}2'] = "DIA" + ws[f'{COL["TF"]}2'] = "1min" + ws[f'{COL["Direcție"]}2'] = "Sell" + ws[f'{COL["SL %"]}2'] = 0.30 + ws[f'{COL["TP0 %"]}2'] = 0.10 + ws[f'{COL["TP1 %"]}2'] = 0.15 + ws[f'{COL["TP2 %"]}2'] = 0.30 + ws[f'{COL["Outcome"]}2'] = "TP1" + ws[f'{COL["Notes"]}2'] = "Exemplu — șterge când începi" + + # Number formats + for col_name in ("SL %", "TP0 %", "TP1 %", "TP2 %"): + for r in range(2, MAX_ROWS + 2): + ws[f"{COL[col_name]}{r}"].number_format = '0.000"%"' + + for strat in STRAT_KEYS: + for r in range(2, MAX_ROWS + 2): + ws[f"{COL[f'R_{strat}']}{r}"].number_format = "+0.000;-0.000;0.000" + for prefix in ("$_", "Bal_", "Peak_", "DD_"): + ws[f"{COL[f'{prefix}{strat}']}{r}"].number_format = '"$"#,##0.00' + + for r in range(2, MAX_ROWS + 2): + ws[f"B{r}"].number_format = "yyyy-mm-dd" + + # Coloring + input_letters = { + COL[n] + for n in ( + "Data", "Ora RO", "Strategie", "Indicator", "TF", + "Direcție", "SL %", "TP0 %", "TP1 %", "TP2 %", + "Outcome", "Notes", + ) + } + derived_letters = {COL["Zi"], COL["Sesiune"]} + for strat in STRAT_KEYS: + derived_letters.add(COL[f"R_{strat}"]) + derived_letters.add(COL[f"$_{strat}"]) + derived_letters.add(COL[f"Bal_{strat}"]) + helper_letters = set() + for strat in STRAT_KEYS: + for prefix in ("Win_", "Peak_", "DD_"): + helper_letters.add(COL[f"{prefix}{strat}"]) + + for r in range(2, MAX_ROWS + 2): + for cl in input_letters: + ws[f"{cl}{r}"].fill = INPUT_FILL + for cl in derived_letters: + ws[f"{cl}{r}"].fill = DERIVED_FILL + for cl in helper_letters: + ws[f"{cl}{r}"].fill = HIDDEN_FILL + + # Column widths + widths = { + "A": 5, "B": 12, "C": 9, "D": 5, "E": 9, + "F": 12, "G": 11, "H": 8, "I": 9, + "J": 9, "K": 9, "L": 9, "M": 9, + "N": 11, "O": 28, + } + for col, w in widths.items(): + ws.column_dimensions[col].width = w + # Derived + helper: width 11 + for strat in STRAT_KEYS: + for prefix in ("R_", "$_", "Bal_", "Win_", "Peak_", "DD_"): + ws.column_dimensions[COL[f"{prefix}{strat}"]].width = 11 + + # Data validation dropdowns + def _add_dv(col_name: str, source: str) -> None: + cl = COL[col_name] + dv = DataValidation( + type="list", formula1=source, + allow_blank=True, showErrorMessage=True, + ) + dv.error = "Valoare invalidă — folosește dropdown-ul." + dv.errorTitle = "Input invalid" + dv.add(f"{cl}2:{cl}{MAX_ROWS + 1}") + ws.add_data_validation(dv) + + # Config columns: E=Strategii, F=Sesiuni, G=Indicatori, H=TF, I=Direcție, J=Outcome + _add_dv("Strategie", "=Config!$E$4:$E$8") + _add_dv("Indicator", "=Config!$G$4:$G$9") + _add_dv("TF", "=Config!$H$4:$H$6") + _add_dv("Direcție", "=Config!$I$4:$I$5") + _add_dv("Outcome", "=Config!$J$4:$J$7") + + # Conditional formatting pe coloanele R (5 strategii) + green_fill = PatternFill("solid", fgColor="C6EFCE") + red_fill = PatternFill("solid", fgColor="FFC7CE") + grey_fill = PatternFill("solid", fgColor="D9D9D9") + for strat in STRAT_KEYS: + cl = COL[f"R_{strat}"] + rng = f"{cl}2:{cl}{MAX_ROWS + 1}" + ws.conditional_formatting.add( + rng, CellIsRule(operator="greaterThan", formula=["0"], fill=green_fill) + ) + ws.conditional_formatting.add( + rng, CellIsRule(operator="lessThan", formula=["0"], fill=red_fill) + ) + ws.conditional_formatting.add( + rng, CellIsRule(operator="equal", formula=["0"], fill=grey_fill) + ) + + +# --------------------------------------------------------------------------- +# Dashboard sheet +# --------------------------------------------------------------------------- + + +def _range(col_name: str) -> str: + cl = COL[col_name] + return f"Trades!${cl}$2:${cl}${MAX_ROWS + 1}" + + +METRIC_HINTS: dict[str, str] = { + "Trades Placed": "Numărul total de trade-uri logate", + "Wins": "Trade-uri cu R > 0", + "Win Ratio": "% wins. Singur NU spune mult — vezi împreună cu R:R și Expectancy", + "Average Win ($)": "Câștigul mediu pe trade winning", + "Average Loss ($)": "Pierderea medie pe trade losing", + "Best Trade ($)": "Cel mai mare câștig individual", + "Worst Trade ($)": "Cea mai mare pierdere individuală", + "Profit Factor": ">1.0 profitabil • >1.5 solid • >2.0 foarte bun • <1.0 pierzător", + "Risk:Reward": "Avg Win ÷ |Avg Loss|. >1 = câștig mediu > pierdere medie", + "Expectancy (R)": "★ STEAUA NORDULUI ★ >+0.20R = GO LIVE • negativ = ABANDON", + "Expectancy ($)": "Expectancy R convertit în $ (folosește Risk per Trade)", + "Cumulative P&L ($)": "P&L total în $ pe toate trade-urile", + "HWM Balance ($)": "Highest watermark — balanța de vârf atinsă", + "Max Drawdown ($)": "Cea mai mare cădere ($) din vârf la fund", +} + + +def build_dashboard(wb: Workbook) -> None: + ws = wb.create_sheet("Dashboard", 2) + ws.sheet_view.showGridLines = False + + ws["A1"] = "📊 Backtest Dashboard" + ws["A1"].font = TITLE_FONT + ws.merge_cells("A1:G1") + + ws["A2"] = ( + "Comparație 5 strategii management — pe aceleași semnale blackbox" + ) + ws["A2"].font = Font(name="Calibri", size=10, italic=True, color="595959") + ws.merge_cells("A2:G2") + + # Row 4: headers (5 columns B-F pentru strategii + G pentru "Cum citesc") + ws["A4"] = "Metric" + strat_cols = {} # strat_key → column letter (B/C/D/E/F) + for i, strat in enumerate(STRAT_KEYS): + letter = get_column_letter(2 + i) + strat_cols[strat] = letter + ws[f"{letter}4"] = STRAT_LABELS[strat] + ws["G4"] = "Cum citesc" + for letter in ["A"] + list(strat_cols.values()) + ["G"]: + c = ws[f"{letter}4"] + c.font = HEADER_FONT + c.fill = HEADER_FILL + c.alignment = CENTER + c.border = BORDER + + # Ranges per strategie + R = {s: _range(f"R_{s}") for s in STRAT_KEYS} + D = {s: _range(f"$_{s}") for s in STRAT_KEYS} + W = {s: _range(f"Win_{s}") for s in STRAT_KEYS} + BAL = {s: _range(f"Bal_{s}") for s in STRAT_KEYS} + DD = {s: _range(f"DD_{s}") for s in STRAT_KEYS} + OUTCOME_RANGE = _range("Outcome") + + # Metric rows — fiecare metric e un dict cu per-strategy formula + format + metrics: list[tuple[str, callable, str]] = [ + # (label, fn(strat_key) -> formula, number_format) + ("Trades Placed", lambda s: f'=COUNTA({OUTCOME_RANGE})', "0"), + ("Wins", lambda s: f'=COUNTIF({W[s]},1)', "0"), + # Win Ratio: depends on rows above — handled after metrics list (placeholder) + ("Win Ratio", lambda s: None, "0.0%"), + ("Average Win ($)", lambda s: f'=IFERROR(AVERAGEIF({D[s]},">0"),0)', '"$"#,##0.00'), + ("Average Loss ($)", lambda s: f'=IFERROR(AVERAGEIF({D[s]},"<0"),0)', '"$"#,##0.00'), + ("Best Trade ($)", lambda s: f'=IFERROR(MAX({D[s]}),0)', '"$"#,##0.00'), + ("Worst Trade ($)", lambda s: f'=IFERROR(MIN({D[s]}),0)', '"$"#,##0.00'), + ("Profit Factor", lambda s: f'=IFERROR(SUMIF({D[s]},">0")/ABS(SUMIF({D[s]},"<0")),0)', "0.00"), + # Risk:Reward — placeholder; bazat pe rândurile Avg Win/Loss + ("Risk:Reward", lambda s: None, "0.00"), + ("Expectancy (R)", lambda s: f'=IFERROR(AVERAGE({R[s]}),0)', "+0.000;-0.000;0.000"), + ("Expectancy ($)", lambda s: f'=IFERROR(AVERAGE({D[s]}),0)', '"$"#,##0.00'), + ("Cumulative P&L ($)", lambda s: f'=SUM({D[s]})', '"$"#,##0.00'), + # HWM — placeholder cu ref la Trades Placed (row 5) + ("HWM Balance ($)", lambda s: None, '"$"#,##0.00'), + ("Max Drawdown ($)", lambda s: f'=IFERROR(MAX({DD[s]}),0)', '"$"#,##0.00'), + ] + + # Determine row indexes pentru formule speciale (depind de poziție) + label_to_row = {label: 5 + idx for idx, (label, _, _) in enumerate(metrics)} + trades_row = label_to_row["Trades Placed"] + wins_row = label_to_row["Wins"] + avg_win_row = label_to_row["Average Win ($)"] + avg_loss_row = label_to_row["Average Loss ($)"] + + for idx, (label, fn, fmt) in enumerate(metrics): + r = 5 + idx + ws[f"A{r}"] = label + ws[f"A{r}"].font = Font(name="Calibri", size=11, bold=True) + ws[f"A{r}"].border = BORDER + ws[f"A{r}"].alignment = LEFT + for strat in STRAT_KEYS: + letter = strat_cols[strat] + if label == "Win Ratio": + formula = f"=IFERROR({letter}{wins_row}/{letter}{trades_row},0)" + elif label == "Risk:Reward": + formula = f"=IFERROR({letter}{avg_win_row}/ABS({letter}{avg_loss_row}),0)" + elif label == "HWM Balance ($)": + formula = ( + f"=IF({letter}{trades_row}=0,Config!$B$4,MAX({BAL[strat]}))" + ) + else: + formula = fn(strat) + cell = ws[f"{letter}{r}"] + cell.value = formula + cell.number_format = fmt + cell.fill = DERIVED_FILL + cell.border = BORDER + cell.alignment = RIGHT + # Coloana G — interpretare scurtă + hint_cell = ws[f"G{r}"] + hint_cell.value = METRIC_HINTS.get(label, "") + hint_cell.font = Font(name="Calibri", size=10, italic=True, color="595959") + hint_cell.alignment = Alignment(horizontal="left", vertical="center", wrap_text=True) + hint_cell.border = BORDER + + # ---- Glosar section: exemple concrete pentru metricile-cheie ---- + glosar_start = 5 + len(metrics) + 2 # 2 rânduri spațiu după metrici + ws[f"A{glosar_start}"] = "📖 Glosar metrici — exemple concrete" + ws[f"A{glosar_start}"].font = SUBTITLE_FONT + ws.merge_cells(f"A{glosar_start}:G{glosar_start}") + + glosar_entries = [ + ( + "Profit Factor", + "Suma câștigurilor ÷ |suma pierderilor|. Total cumulativ, nu mediu.", + "10 trade-uri: 4 wins de $50 (=$200) + 6 losses de −$30 (=−$180). PF = 200÷180 = 1.11 (marginal profitabil). La PF=2.0 câștigi de 2× cât pierzi în total.", + ), + ( + "Risk:Reward", + "Avg Win ÷ |Avg Loss|. Privește per-trade, nu total.", + "Avg win $50, avg loss −$30 → R:R = 1.67. La R:R=2.0 ești profitabil chiar cu Win Ratio doar 40%. La R:R=0.5 ai nevoie de WR >67%.", + ), + ( + "Expectancy (R)", + "Câștigul mediu per trade exprimat în multipli de risc (R). CEA MAI ONESTĂ metrică — combină WR și R:R într-un singur număr.", + "10 trade-uri cu R = [+0.5, +0.5, +0.5, +0.5, −1, −1, −1, −1, −1, −1] → media = −0.30R (pierdere) chiar dacă WR=40%. Pragul GO LIVE din STOPPING_RULE.md: ≥ +0.20R.", + ), + ( + "Win Ratio (WR)", + "% trade-uri cu R > 0. ÎNȘELĂTOR singur — un WR mare cu R:R mic poate fi pierzător.", + "WR=70% pare excelent, dar dacă R:R=0.3 (câștigi $30, pierzi $100) → Expectancy = 0.7·30 − 0.3·100 = −$9 per trade. Pierzător.", + ), + ( + "Max Drawdown", + "Cea mai mare cădere din vârful balanței la fundul ulterior. Măsoară 'durerea psihologică'.", + "Balance peak $11,500 → fund $9,800 → DD = $1,700 (17% din peak). DD mare la backtest = greu de tolerat în live.", + ), + ] + + row = glosar_start + 1 + for term, definition, example in glosar_entries: + ws[f"A{row}"] = term + ws[f"A{row}"].font = Font(name="Calibri", size=11, bold=True, color="1F3864") + ws[f"A{row}"].alignment = Alignment(horizontal="left", vertical="top", wrap_text=True) + ws[f"B{row}"] = definition + ws[f"B{row}"].font = Font(name="Calibri", size=10) + ws[f"B{row}"].alignment = Alignment(horizontal="left", vertical="top", wrap_text=True) + ws.merge_cells(f"B{row}:C{row}") + ws[f"D{row}"] = f"Exemplu: {example}" + ws[f"D{row}"].font = Font(name="Calibri", size=10, italic=True, color="595959") + ws[f"D{row}"].alignment = Alignment(horizontal="left", vertical="top", wrap_text=True) + ws.merge_cells(f"D{row}:G{row}") + ws.row_dimensions[row].height = 48 + row += 1 + + glosar_end = row # primul rând după glosar + + # Helper pentru a emite un block breakdown (per Sesiune / Strategie / etc.) + def _emit_breakdown( + start_row: int, title: str, first_col_label: str, + items: list[str], item_range: str, overlay_strat: str, + ) -> int: + ws[f"A{start_row}"] = title + ws[f"A{start_row}"].font = SUBTITLE_FONT + ws.merge_cells(f"A{start_row}:F{start_row}") + headers = [first_col_label, "N", "Wins", "WR", "Expectancy R", "Cum $"] + for col_idx, h in enumerate(headers, start=1): + c = ws.cell(row=start_row + 1, column=col_idx, value=h) + c.font = HEADER_FONT + c.fill = HEADER_FILL + c.alignment = CENTER + c.border = BORDER + for i, item in enumerate(items): + r = start_row + 2 + i + ws[f"A{r}"] = item + ws[f"B{r}"] = f'=COUNTIF({item_range},"{item}")' + ws[f"C{r}"] = f'=COUNTIFS({item_range},"{item}",{W[overlay_strat]},1)' + ws[f"D{r}"] = f"=IFERROR(C{r}/B{r},0)" + ws[f"E{r}"] = ( + f'=IFERROR(AVERAGEIFS({R[overlay_strat]},{item_range},"{item}"),0)' + ) + ws[f"F{r}"] = f'=SUMIFS({D[overlay_strat]},{item_range},"{item}")' + ws[f"B{r}"].number_format = "0" + ws[f"C{r}"].number_format = "0" + ws[f"D{r}"].number_format = "0.0%" + ws[f"E{r}"].number_format = "+0.000;-0.000;0.000" + ws[f"F{r}"].number_format = '"$"#,##0.00' + for c in ("A", "B", "C", "D", "E", "F"): + ws[f"{c}{r}"].border = BORDER + ws[f"{c}{r}"].alignment = RIGHT if c != "A" else LEFT + return start_row + 2 + len(items) + + # Breakdowns — toate folosesc overlay-ul Hybrid+BE (recomandat de trader) + overlay = "hybrid_be" + start = glosar_end + 2 # 2 rânduri spațiu după glosar + after_sess = _emit_breakdown( + start, "PER SESIUNE (overlay: Hybrid + BE)", "Sesiune", + SESSIONS, _range("Sesiune"), overlay, + ) + after_strat = _emit_breakdown( + after_sess + 2, "PER STRATEGIE (overlay: Hybrid + BE)", "Strategie", + STRATEGIES, _range("Strategie"), overlay, + ) + after_ind = _emit_breakdown( + after_strat + 2, "PER INDICATOR (overlay: Hybrid + BE)", "Indicator", + INDICATORS, _range("Indicator"), overlay, + ) + _emit_breakdown( + after_ind + 2, "PER DIRECȚIE (overlay: Hybrid + BE)", "Direcție", + DIRECTIONS, _range("Direcție"), overlay, + ) + + # Column widths + widths = {"A": 22, "B": 14, "C": 14, "D": 14, "E": 16, "F": 16, "G": 50} + for col, w in widths.items(): + ws.column_dimensions[col].width = w + + # Row height pentru rândurile cu hint (cu wrap) + for r in range(5, 5 + len(metrics)): + ws.row_dimensions[r].height = 22 + + # Equity curve chart — 5 linii + chart = LineChart() + chart.title = "Equity Curve — 5 strategii" + chart.style = 12 + chart.y_axis.title = "Balance ($)" + chart.x_axis.title = "Trade #" + chart.height = 12 + chart.width = 24 + + data = Reference( + wb["Trades"], + min_col=_col_to_int(COL[f"Bal_{STRAT_KEYS[0]}"]), + max_col=_col_to_int(COL[f"Bal_{STRAT_KEYS[-1]}"]), + min_row=1, + max_row=MAX_ROWS + 1, + ) + chart.add_data(data, titles_from_data=True) + cats = Reference( + wb["Trades"], min_col=1, max_col=1, + min_row=2, max_row=MAX_ROWS + 1, + ) + chart.set_categories(cats) + ws.add_chart(chart, "H4") + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + + +def build_workbook() -> Workbook: + wb = Workbook() + default = wb.active + wb.remove(default) + build_config(wb) + build_trades(wb) + build_dashboard(wb) + wb.active = wb.sheetnames.index("Dashboard") + return wb + + +def main() -> int: + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + wb = build_workbook() + wb.save(OUTPUT) + print(f"Wrote {OUTPUT}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/manual_log.py b/scripts/manual_log.py deleted file mode 100644 index 04d2edd..0000000 --- a/scripts/manual_log.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Helper for manual M2D trade entry — derives full M2DExtraction dict from minimal user inputs. - -User provides 6 required fields: data, ora_ro, directie, entry, sl, outcome_path. -All other fields default or are computed: - - tp0 = entry ± 0.4 × |entry - sl| - - tp1 = entry ± 0.6 × |entry - sl| - - tp2 = entry ± 1.0 × |entry - sl| (symmetric with sl) - - risc_pct = 100 × |entry - sl| / entry - - ora_utc = ora_ro converted via Europe/Bucharest (DST-aware) - - max_reached derived from outcome_path - - be_moved = True if outcome contains TP0 else False - - tf_mare/tf_mic default 5min/1min - - calitate default 'n/a' - - confidence = 'high' (manual entry) - - screenshot_file generated if not provided: --.png -""" - -from __future__ import annotations - -from datetime import date, datetime, time -from typing import Literal -from zoneinfo import ZoneInfo - -RO_TZ = ZoneInfo("Europe/Bucharest") -UTC_TZ = ZoneInfo("UTC") - - -OUTCOME_TO_MAX_REACHED = { - "SL": "SL_first", - "TP0→SL": "TP0", - "TP0→TP1": "TP1", - "TP0→TP2": "TP2", - "TP0→pending": "TP0", - "pending": "SL_first", # placeholder; user can override -} - -OUTCOME_TO_BE_MOVED = { - "SL": False, - "TP0→SL": True, # BE move should have happened; True = rule-enforced - "TP0→TP1": True, - "TP0→TP2": True, - "TP0→pending": True, - "pending": False, -} - - -def ro_to_utc(data_iso: str, ora_ro_str: str) -> str: - """Convert (YYYY-MM-DD, HH:MM RO) -> HH:MM UTC string, DST-aware.""" - d = date.fromisoformat(data_iso) - t = datetime.strptime(ora_ro_str, "%H:%M").time() - dt_ro = datetime.combine(d, t, tzinfo=RO_TZ) - dt_utc = dt_ro.astimezone(UTC_TZ) - return dt_utc.strftime("%H:%M") - - -def build_extraction( - data: str, - ora_ro: str, - directie: Literal["Buy", "Sell"], - entry: float, - sl: float, - outcome_path: Literal["SL", "TP0→SL", "TP0→TP1", "TP0→TP2", "TP0→pending", "pending"], - instrument: Literal["DIA", "US30", "other"] = "DIA", - tf_mare: Literal["5min", "15min"] = "5min", - tf_mic: Literal["1min", "3min"] = "1min", - calitate: Literal["Clară", "Mai mare ca impuls", "Slabă", "n/a"] = "n/a", - max_reached: Literal["SL_first", "TP0", "TP1", "TP2"] | None = None, - be_moved: bool | None = None, - screenshot_file: str | None = None, - note: str = "", -) -> dict: - """Build a M2DExtraction-compatible dict from minimal manual inputs. - - Derived fields: - - ora_utc from ora_ro (DST-aware) - - tp0/tp1/tp2 from entry/sl geometry - - risc_pct from |entry-sl|/entry - - max_reached/be_moved from outcome_path (overridable) - - screenshot_file generated from data+instrument+ora_ro if not provided - - The returned dict satisfies scripts.vision_schema.M2DExtraction. - """ - if entry == sl: - raise ValueError("entry == sl — zero risk distance") - - risk_abs = abs(entry - sl) - risc_pct = round(100 * risk_abs / entry, 4) - - if directie == "Buy": - if sl >= entry: - raise ValueError(f"Buy: sl ({sl}) must be < entry ({entry})") - tp0 = round(entry + 0.4 * risk_abs, 4) - tp1 = round(entry + 0.6 * risk_abs, 4) - tp2 = round(entry + risk_abs, 4) - else: # Sell - if sl <= entry: - raise ValueError(f"Sell: sl ({sl}) must be > entry ({entry})") - tp0 = round(entry - 0.4 * risk_abs, 4) - tp1 = round(entry - 0.6 * risk_abs, 4) - tp2 = round(entry - risk_abs, 4) - - ora_utc = ro_to_utc(data, ora_ro) - - if max_reached is None: - max_reached = OUTCOME_TO_MAX_REACHED[outcome_path] - if be_moved is None: - be_moved = OUTCOME_TO_BE_MOVED[outcome_path] - - if screenshot_file is None: - ora_compact = ora_ro.replace(":", "") - screenshot_file = f"{data}-{instrument.lower()}-{ora_compact}.png" - - return { - "screenshot_file": screenshot_file, - "data": data, - "ora_utc": ora_utc, - "instrument": instrument, - "directie": directie, - "tf_mare": tf_mare, - "tf_mic": tf_mic, - "calitate": calitate, - "entry": round(float(entry), 4), - "sl": round(float(sl), 4), - "tp0": tp0, - "tp1": tp1, - "tp2": tp2, - "risc_pct": risc_pct, - "outcome_path": outcome_path, - "max_reached": max_reached, - "be_moved": be_moved, - "confidence": "high", - "ambiguities": [], - "note": note, - } diff --git a/scripts/pl_calc.py b/scripts/pl_calc.py deleted file mode 100644 index 56676fe..0000000 --- a/scripts/pl_calc.py +++ /dev/null @@ -1,76 +0,0 @@ -"""P/L overlays for M2D backtesting. - -Two overlays computed from the same trade outcome: - -- ``pl_marius``: real overlay used by the trader. 50% closed at TP0 (+0.2 R), - BE move on the remaining half, then close 50% of that at ~TP1 (+0.3 R total - contribution) or at SL/BE depending on outcome. TP1 is treated as the final - exit even when the chart subsequently reaches TP2. - -- ``pl_theoretical``: reference 1/3-1/3-1/3 overlay that holds to TP2. Used - as an opportunity-cost benchmark vs. ``pl_marius``. - -Returns are expressed in multiples of R (risk per trade). ``None`` from -``pl_marius`` denotes a still-pending trade. -""" - -from __future__ import annotations - -__all__ = [ - "PL_MARIUS_TABLE", - "PL_THEORETICAL_TABLE", - "pl_marius", - "pl_theoretical", -] - - -PL_MARIUS_TABLE: dict[tuple[str, bool], float | None] = { - ("SL", True): -1.0, - ("SL", False): -1.0, - ("TP0->SL", True): 0.20, - ("TP0->SL", False): -0.30, - ("TP0->TP1", True): 0.50, - ("TP0->TP1", False): 0.50, - ("TP0->TP2", True): 0.50, - ("TP0->TP2", False): 0.50, - ("TP0->pending", True): None, - ("TP0->pending", False): None, - ("pending", True): None, - ("pending", False): None, -} - - -PL_THEORETICAL_TABLE: dict[str, float] = { - "SL_first": -1.0, - "TP0": 0.133, - "TP1": 0.333, - "TP2": 0.667, -} - - -_VALID_OUTCOME_PATHS: frozenset[str] = frozenset( - {"SL", "TP0->SL", "TP0->TP1", "TP0->TP2", "TP0->pending", "pending"} -) - - -def _normalize_outcome_path(outcome_path: str) -> str: - return outcome_path.replace("→", "->").replace("→", "->") - - -def pl_marius(outcome_path: str, be_moved: bool) -> float | None: - """Return the P/L (in R) for the real Marius overlay. - - Accepts both ASCII arrow ``"TP0->TP1"`` and unicode arrow ``"TP0→TP1"``. - Returns ``None`` for pending outcomes. - """ - normalized = _normalize_outcome_path(outcome_path) - if normalized not in _VALID_OUTCOME_PATHS: - raise ValueError(f"invalid outcome_path: {outcome_path!r}") - return PL_MARIUS_TABLE[(normalized, be_moved)] - - -def pl_theoretical(max_reached: str) -> float: - """Return the P/L (in R) for the theoretical 1/3-1/3-1/3 hold-to-TP2 overlay.""" - if max_reached not in PL_THEORETICAL_TABLE: - raise ValueError(f"invalid max_reached: {max_reached!r}") - return PL_THEORETICAL_TABLE[max_reached] diff --git a/scripts/regenerate_md.py b/scripts/regenerate_md.py deleted file mode 100644 index c799b5d..0000000 --- a/scripts/regenerate_md.py +++ /dev/null @@ -1,240 +0,0 @@ -"""Regenerate ``data/jurnal.md`` from ``data/jurnal.csv``. - -CSV is the source of truth (29 columns, schema owned by ``scripts.append_row``). -MD is a human-readable mirror with a curated 18-column table. - -CLI: ``python scripts/regenerate_md.py [csv_path] [md_path]`` -""" - -from __future__ import annotations - -import csv -import os -import sys -import tempfile -from datetime import datetime, timezone -from pathlib import Path -from typing import Sequence - -from scripts.append_row import csv_columns - -__all__ = ["MD_COLUMNS", "regenerate_md", "main"] - - -MD_COLUMNS: tuple[str, ...] = ( - "#", - "Data", - "Zi", - "Ora RO", - "Set", - "Instrument", - "Direcție", - "Calitate", - "Entry", - "SL", - "TP0", - "TP1", - "TP2", - "outcome_path", - "P/L (Marius)", - "P/L (theoretic)", - "Source", - "Note", -) - - -_CSV_FIELDS_USED: tuple[str, ...] = ( - "id", - "data", - "zi", - "ora_ro", - "set", - "instrument", - "directie", - "calitate", - "entry", - "sl", - "tp0", - "tp1", - "tp2", - "outcome_path", - "pl_marius", - "pl_theoretical", - "source", - "note", -) - - -_DIRECTIE_DISPLAY = {"long": "Buy", "short": "Sell", "buy": "Buy", "sell": "Sell"} - - -def _fmt_pl(value: str) -> str: - if value is None or value == "": - return "pending" - try: - return f"{float(value):+.2f}" - except ValueError: - return value - - -def _fmt_directie(value: str) -> str: - if not value: - return "" - return _DIRECTIE_DISPLAY.get(value.strip().lower(), value) - - -def _escape_cell(value: str) -> str: - return (value or "").replace("|", "\\|").replace("\n", " ").strip() - - -def _placeholder_md() -> str: - return ( - "# Jurnal M2D (auto-generated)\n" - "\n" - "*Niciun trade încă. Adaugă unul prin `/m2d-log` sau `/backtest`.*\n" - ) - - -def _atomic_write_text(path: Path, content: str) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - fd, tmp_name = tempfile.mkstemp( - prefix=path.name + ".", suffix=".tmp", dir=str(path.parent) - ) - try: - with os.fdopen(fd, "w", encoding="utf-8", newline="\n") as fh: - fh.write(content) - os.replace(tmp_name, path) - except Exception: - try: - os.unlink(tmp_name) - except OSError: - pass - raise - - -def _row_to_cells(row: dict[str, str], display_index: int) -> tuple[str, ...]: - g = row.get - return ( - str(display_index), - g("data", "") or "", - g("zi", "") or "", - g("ora_ro", "") or "", - g("set", "") or "", - g("instrument", "") or "", - _fmt_directie(g("directie", "") or ""), - g("calitate", "") or "", - g("entry", "") or "", - g("sl", "") or "", - g("tp0", "") or "", - g("tp1", "") or "", - g("tp2", "") or "", - g("outcome_path", "") or "", - _fmt_pl(g("pl_marius", "") or ""), - _fmt_pl(g("pl_theoretical", "") or ""), - g("source", "") or "", - g("note", "") or "", - ) - - -def _render_table(rows: Sequence[dict[str, str]]) -> str: - header_line = "| " + " | ".join(MD_COLUMNS) + " |" - sep_line = "|" + "|".join(["---"] * len(MD_COLUMNS)) + "|" - data_lines = [] - for i, row in enumerate(rows, start=1): - cells = _row_to_cells(row, i) - data_lines.append( - "| " + " | ".join(_escape_cell(c) for c in cells) + " |" - ) - return "\n".join([header_line, sep_line, *data_lines]) - - -def _render_md(rows: Sequence[dict[str, str]]) -> str: - if not rows: - return _placeholder_md() - now_iso = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") - table = _render_table(rows) - return ( - "# Jurnal M2D (auto-generated from data/jurnal.csv)\n" - "\n" - f"Generated: {now_iso}\n" - f"Rows: {len(rows)}\n" - "\n" - f"{table}\n" - "\n" - "*Vezi `data/jurnal.csv` pentru toate cele 29 coloane " - "(id, ora_utc, tf_*, risc_pct, be_moved, max_reached, versions, extracted_at).*\n" - ) - - -def _id_sort_key(raw: str) -> tuple[int, int | str]: - try: - return (0, int(raw)) - except (ValueError, TypeError): - return (1, raw or "") - - -def _load_rows(csv_path: Path) -> list[dict[str, str]]: - """Read CSV, returning rows sorted by id. - - Schema drift handling: - - Extra header columns → warning to stderr, dropped. - - Missing required header columns → warning to stderr per affected row (row skipped). - """ - if not csv_path.exists() or csv_path.stat().st_size == 0: - return [] - - expected = set(csv_columns()) - required = set(_CSV_FIELDS_USED) - - with csv_path.open("r", encoding="utf-8", newline="") as fh: - reader = csv.DictReader(fh) - header = reader.fieldnames or [] - header_set = set(header) - - extras = [c for c in header if c not in expected] - if extras: - print( - f"regenerate_md: warning: unknown CSV columns ignored: {extras}", - file=sys.stderr, - ) - - missing_required = required - header_set - rows: list[dict[str, str]] = [] - for raw in reader: - if missing_required: - print( - f"regenerate_md: warning: row skipped (missing required " - f"columns: {sorted(missing_required)})", - file=sys.stderr, - ) - continue - rows.append({k: (raw.get(k) or "") for k in required}) - - rows.sort(key=lambda r: _id_sort_key(r.get("id", ""))) - return rows - - -def regenerate_md( - csv_path: Path | str = "data/jurnal.csv", - md_path: Path | str = "data/jurnal.md", -) -> int: - """Read CSV → write MD atomically. Returns count of trade rows written.""" - csv_p = Path(csv_path) - md_p = Path(md_path) - rows = _load_rows(csv_p) - content = _render_md(rows) - _atomic_write_text(md_p, content) - return len(rows) - - -def main() -> int: - args = sys.argv[1:] - csv_arg = args[0] if len(args) >= 1 else "data/jurnal.csv" - md_arg = args[1] if len(args) >= 2 else "data/jurnal.md" - n = regenerate_md(csv_arg, md_arg) - print(f"regenerate_md: wrote {md_arg} with {n} row(s)") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/scripts/stats.py b/scripts/stats.py deleted file mode 100644 index 24e7a6c..0000000 --- a/scripts/stats.py +++ /dev/null @@ -1,551 +0,0 @@ -"""Backtest statistics for ``data/jurnal.csv``. - -Public API: - - ``compute_stats(csv_path, overlay) -> dict`` - - ``render_stats(stats, overlay) -> str`` - - ``compute_calibration(csv_path) -> dict`` - - ``render_calibration(cal) -> str`` - - ``main()`` — CLI entry point. - -A "win" is a closed trade with ``pl_overlay > 0`` (where ``pl_overlay`` is -either ``pl_marius`` or ``pl_theoretical``). Pending trades — ``pl_marius`` -blank, i.e. ``outcome_path in {pending, TP0->pending}`` — are excluded from -both WR and expectancy: there is no realised outcome yet. - -The ``calitate`` field is a known-biased descriptor: it is classified -post-outcome (see ``STOPPING_RULE.md`` §3). The per-``calitate`` split is -reported with an explicit *descriptor only — biased post-outcome* caveat. -""" - -from __future__ import annotations - -import argparse -import csv -import math -import sys -from pathlib import Path -from typing import Any, Iterable - -import numpy as np - -from scripts.append_row import CSV_COLUMNS - -__all__ = [ - "BACKTEST_SOURCES", - "CALIBRATION_SOURCES", - "CORE_CALIBRATION_FIELDS", - "NUMERIC_CALIBRATION_FIELDS", - "STOPPING_RULE_N", - "wilson_ci", - "bootstrap_expectancy_ci", - "compute_stats", - "render_stats", - "compute_calibration", - "render_calibration", - "main", -] - - -# --------------------------------------------------------------------------- -# Constants -# --------------------------------------------------------------------------- - - -BACKTEST_SOURCES: frozenset[str] = frozenset({"vision", "manual"}) -CALIBRATION_SOURCES: frozenset[str] = frozenset( - {"manual_calibration", "vision_calibration"} -) - - -# Calibration P4 gate (STOPPING_RULE.md §P4) — explicitly reported per field. -CORE_CALIBRATION_FIELDS: tuple[str, ...] = ( - "entry", - "sl", - "tp0", - "tp1", - "tp2", - "outcome_path", - "max_reached", - "directie", - "instrument", -) - - -NUMERIC_CALIBRATION_FIELDS: frozenset[str] = frozenset( - {"entry", "sl", "tp0", "tp1", "tp2"} -) - - -# STOPPING_RULE.md §"GO LIVE" gate: N >= 40 per Set. -STOPPING_RULE_N: int = 40 - - -# --------------------------------------------------------------------------- -# Loading -# --------------------------------------------------------------------------- - - -def _parse_optional_float(value: str) -> float | None: - s = (value or "").strip() - if s == "": - return None - try: - return float(s) - except ValueError: - return None - - -def _load_rows(csv_path: Path | str) -> list[dict[str, str]]: - p = Path(csv_path) - if not p.exists() or p.stat().st_size == 0: - return [] - with p.open("r", encoding="utf-8", newline="") as fh: - return list(csv.DictReader(fh)) - - -# --------------------------------------------------------------------------- -# CI primitives -# --------------------------------------------------------------------------- - - -def wilson_ci(wins: int, n: int, z: float = 1.96) -> tuple[float, float]: - """Wilson score interval for a binomial proportion. - - Returns ``(lo, hi)`` clamped to ``[0.0, 1.0]``. For ``n == 0`` returns - ``(0.0, 0.0)``. ``z = 1.96`` ≈ 95% confidence. - """ - if n <= 0: - return (0.0, 0.0) - if wins < 0 or wins > n: - raise ValueError(f"wins={wins} out of range for n={n}") - p = wins / n - denom = 1.0 + (z * z) / n - center = (p + (z * z) / (2.0 * n)) / denom - spread = z * math.sqrt(p * (1.0 - p) / n + (z * z) / (4.0 * n * n)) / denom - return (max(0.0, center - spread), min(1.0, center + spread)) - - -def bootstrap_expectancy_ci( - values: list[float] | np.ndarray, - n_resamples: int = 5000, - seed: int = 42, -) -> tuple[float, float]: - """Percentile-method bootstrap 95% CI for the mean of ``values``. - - Deterministic for a given ``seed``. Empty input → ``(0.0, 0.0)``. - Single value → ``(value, value)`` (no variance to resample). - """ - arr = np.asarray(list(values), dtype=float) - if arr.size == 0: - return (0.0, 0.0) - if arr.size == 1: - v = float(arr[0]) - return (v, v) - rng = np.random.default_rng(seed) - boots = np.empty(n_resamples, dtype=float) - n = arr.size - for i in range(n_resamples): - idx = rng.integers(0, n, size=n) - boots[i] = float(arr[idx].mean()) - lo = float(np.percentile(boots, 2.5)) - hi = float(np.percentile(boots, 97.5)) - return (lo, hi) - - -# --------------------------------------------------------------------------- -# compute_stats -# --------------------------------------------------------------------------- - - -def _group_stats( - overlay_values: list[float | None], - *, - include_ci: bool, - bootstrap_seed: int, -) -> dict[str, Any]: - closed = [v for v in overlay_values if v is not None] - n = len(closed) - wins = sum(1 for v in closed if v > 0) - wr = (wins / n) if n else 0.0 - out: dict[str, Any] = { - "n": n, - "wr": wr, - "expectancy": (sum(closed) / n) if n else 0.0, - } - if include_ci: - out["wr_ci_95"] = wilson_ci(wins, n) - out["expectancy_ci_95"] = bootstrap_expectancy_ci( - closed, seed=bootstrap_seed - ) - return out - - -def _overlay_value(row: dict[str, str], overlay: str) -> float | None: - raw = row.get(overlay, "") - return _parse_optional_float(raw) - - -def compute_stats( - csv_path: Path | str = "data/jurnal.csv", - overlay: str = "pl_marius", -) -> dict[str, Any]: - """Compute aggregate WR + expectancy stats over the backtest rows. - - Calibration rows (``manual_calibration`` / ``vision_calibration``) are - excluded; use :func:`compute_calibration` for the P4 mismatch report. - - ``overlay`` selects the P/L column: ``"pl_marius"`` (default — the real - overlay Marius trades) or ``"pl_theoretical"`` (1/3-1/3-1/3 hold-to-TP2). - """ - if overlay not in {"pl_marius", "pl_theoretical"}: - raise ValueError(f"unknown overlay {overlay!r}") - - rows = [r for r in _load_rows(csv_path) if r.get("source", "") in BACKTEST_SOURCES] - - if not rows: - return { - "n_total": 0, - "n_pending": 0, - "n_closed": 0, - "wr": 0.0, - "wr_ci_95": (0.0, 0.0), - "expectancy": 0.0, - "expectancy_ci_95": (0.0, 0.0), - "per_set": {}, - "per_calitate": {}, - "per_directie": {}, - } - - # Pending status is overlay-independent: a trade is pending iff - # pl_marius is blank (outcome_path in {pending, TP0->pending}). - # pl_theoretical is concrete even for pending rows, so it would otherwise - # let pending trades sneak into the closed-trades stats — we mask those - # out explicitly here. - pending_mask = [_parse_optional_float(r.get("pl_marius", "")) is None for r in rows] - overlay_vals: list[float | None] = [] - for r, is_pending in zip(rows, pending_mask): - overlay_vals.append(None if is_pending else _overlay_value(r, overlay)) - n_total = len(rows) - n_pending = sum(1 for p in pending_mask if p) - n_closed = n_total - n_pending - - overall = _group_stats( - overlay_vals, include_ci=True, bootstrap_seed=42 - ) - - def _split(field: str, include_ci: bool) -> dict[str, dict[str, Any]]: - groups: dict[str, list[float | None]] = {} - for r, v in zip(rows, overlay_vals): - key = r.get(field, "") or "(blank)" - groups.setdefault(key, []).append(v) - out: dict[str, dict[str, Any]] = {} - for k in sorted(groups): - sub_seed = 42 + (abs(hash(("split", field, k))) % 1_000_000) - out[k] = _group_stats( - groups[k], include_ci=include_ci, bootstrap_seed=sub_seed - ) - return out - - return { - "n_total": n_total, - "n_pending": n_pending, - "n_closed": n_closed, - "wr": overall["wr"], - "wr_ci_95": overall["wr_ci_95"], - "expectancy": overall["expectancy"], - "expectancy_ci_95": overall["expectancy_ci_95"], - "per_set": _split("set", include_ci=True), - "per_calitate": _split("calitate", include_ci=True), - # per_directie skips CI per spec (no wr_ci_95 / expectancy_ci_95 keys). - "per_directie": { - k: {"n": v["n"], "wr": v["wr"], "expectancy": v["expectancy"]} - for k, v in _split("directie", include_ci=False).items() - }, - } - - -# --------------------------------------------------------------------------- -# render_stats -# --------------------------------------------------------------------------- - - -def _fmt_pct(p: float) -> str: - return f"{100.0 * p:5.1f}%" - - -def _fmt_r(x: float) -> str: - return f"{x:+.2f} R" - - -def _set_sort_key(name: str) -> tuple[int, str]: - order = ["A1", "A2", "A3", "B", "C", "D", "Other"] - return (order.index(name), name) if name in order else (len(order), name) - - -def render_stats(stats: dict[str, Any], overlay: str) -> str: - lines: list[str] = [] - lines.append(f"=== Stats jurnal.csv (overlay: {overlay}) ===") - lines.append( - f"Trade-uri totale: {stats['n_total']} | " - f"închise: {stats['n_closed']} | pending: {stats['n_pending']}" - ) - - if stats["n_total"] == 0: - lines.append("") - lines.append("(nu sunt trade-uri backtest în CSV)") - return "\n".join(lines) + "\n" - - lines.append("") - lo, hi = stats["wr_ci_95"] - e_lo, e_hi = stats["expectancy_ci_95"] - lines.append(f"GLOBAL (n={stats['n_closed']}):") - lines.append( - f" WR: {_fmt_pct(stats['wr'])} " - f"[95% CI: {_fmt_pct(lo)}, {_fmt_pct(hi)}]" - ) - lines.append( - f" Expectancy: {_fmt_r(stats['expectancy'])} " - f"[95% CI: {_fmt_r(e_lo)}, {_fmt_r(e_hi)}]" - ) - lines.append("") - - def _emit_split( - title: str, - data: dict[str, dict[str, Any]], - *, - sort_keys: list[str] | None = None, - include_ci: bool = True, - ) -> None: - lines.append(title) - keys = sort_keys if sort_keys is not None else sorted(data) - for k in keys: - if k not in data: - continue - d = data[k] - if include_ci and "wr_ci_95" in d: - clo, chi = d["wr_ci_95"] - lines.append( - f" {k:<14} n={d['n']:>3} " - f"WR {_fmt_pct(d['wr'])} " - f"[{_fmt_pct(clo)}, {_fmt_pct(chi)}] " - f"E {_fmt_r(d['expectancy'])}" - ) - else: - lines.append( - f" {k:<14} n={d['n']:>3} " - f"WR {_fmt_pct(d['wr'])} " - f"E {_fmt_r(d['expectancy'])}" - ) - lines.append("") - - _emit_split( - "PER SET:", - stats["per_set"], - sort_keys=sorted(stats["per_set"], key=_set_sort_key), - ) - - lines.append( - "PER CALITATE (⚠️ DESCRIPTOR ONLY — biased post-outcome, NU folosi ca filtru):" - ) - cal_order = ["Clară", "Mai mare ca impuls", "Slabă", "n/a"] - keys = [k for k in cal_order if k in stats["per_calitate"]] + [ - k for k in sorted(stats["per_calitate"]) if k not in cal_order - ] - for k in keys: - d = stats["per_calitate"][k] - clo, chi = d["wr_ci_95"] - lines.append( - f" {k:<20} n={d['n']:>3} " - f"WR {_fmt_pct(d['wr'])} " - f"[{_fmt_pct(clo)}, {_fmt_pct(chi)}] " - f"E {_fmt_r(d['expectancy'])}" - ) - lines.append("") - - _emit_split("PER DIRECȚIE:", stats["per_directie"], include_ci=False) - - # STOPPING_RULE gate check — flag every Set that hasn't crossed N>=40. - lines.append(f"⚠️ STOPPING RULE check (vezi STOPPING_RULE.md, N>={STOPPING_RULE_N}):") - set_keys = sorted(stats["per_set"], key=_set_sort_key) - any_flagged = False - for k in set_keys: - n = stats["per_set"][k]["n"] - if n < STOPPING_RULE_N: - lines.append(f" {k}: N={n} < {STOPPING_RULE_N} → NEEDS MORE DATA") - any_flagged = True - if not any_flagged: - lines.append(f" toate Set-urile au N>={STOPPING_RULE_N} (eligibile pentru GO LIVE check).") - - return "\n".join(lines) + "\n" - - -# --------------------------------------------------------------------------- -# compute_calibration -# --------------------------------------------------------------------------- - - -def _calibration_match(field: str, m_val: str, v_val: str, tol: float = 0.01) -> bool: - if field in NUMERIC_CALIBRATION_FIELDS: - try: - return abs(float(m_val) - float(v_val)) <= tol - except ValueError: - return (m_val or "").strip() == (v_val or "").strip() - return (m_val or "").strip() == (v_val or "").strip() - - -def compute_calibration( - csv_path: Path | str = "data/jurnal.csv", -) -> dict[str, Any]: - """Pair calibration legs by ``screenshot_file`` and report per-field mismatch. - - Returns a dict ``{"n_pairs": int, "fields": {field: {match, mismatch, - match_rate, mismatch_examples}}}``. ``mismatch_examples`` holds up to 3 - strings ``": manual=X vs vision=Y"`` per field. - - Numeric fields (``entry/sl/tp0/tp1/tp2``) use a tolerance of 0.01; - everything else is exact-string equality after strip. - """ - rows = _load_rows(csv_path) - manual: dict[str, dict[str, str]] = {} - vision: dict[str, dict[str, str]] = {} - for r in rows: - src = r.get("source", "") - if src == "manual_calibration": - manual[r.get("screenshot_file", "")] = r - elif src == "vision_calibration": - vision[r.get("screenshot_file", "")] = r - - paired_files = sorted(set(manual) & set(vision)) - fields_report: dict[str, dict[str, Any]] = { - f: { - "match": 0, - "mismatch": 0, - "match_rate": 0.0, - "mismatch_examples": [], - } - for f in CORE_CALIBRATION_FIELDS - } - - for f in paired_files: - m = manual[f] - v = vision[f] - for fld in CORE_CALIBRATION_FIELDS: - mv = m.get(fld, "") - vv = v.get(fld, "") - if _calibration_match(fld, mv, vv): - fields_report[fld]["match"] += 1 - else: - fields_report[fld]["mismatch"] += 1 - examples = fields_report[fld]["mismatch_examples"] - if len(examples) < 3: - examples.append(f"{f}: manual={mv!r} vs vision={vv!r}") - - for fld, data in fields_report.items(): - total = data["match"] + data["mismatch"] - data["match_rate"] = (data["match"] / total) if total else 0.0 - - return {"n_pairs": len(paired_files), "fields": fields_report} - - -def render_calibration(cal: dict[str, Any]) -> str: - lines: list[str] = [] - lines.append("=== Calibration P4 gate (vezi STOPPING_RULE.md §P4) ===") - lines.append(f"Perechi calibration: {cal['n_pairs']}") - if cal["n_pairs"] == 0: - lines.append("(nu există perechi manual_calibration ∩ vision_calibration)") - return "\n".join(lines) + "\n" - - lines.append("") - lines.append(f"{'field':<14} match mismatch rate") - total_mismatches = 0 - total_comparisons = 0 - for fld in CORE_CALIBRATION_FIELDS: - d = cal["fields"][fld] - n = d["match"] + d["mismatch"] - total_mismatches += d["mismatch"] - total_comparisons += n - lines.append( - f"{fld:<14} {d['match']:>5} {d['mismatch']:>8} " - f"{_fmt_pct(d['match_rate'])}" - ) - - lines.append("") - overall_match_rate = ( - (total_comparisons - total_mismatches) / total_comparisons - if total_comparisons - else 0.0 - ) - overall_mismatch_rate = 1.0 - overall_match_rate - verdict = "PASS" if overall_mismatch_rate <= 0.10 else "FAIL" - lines.append( - f"Overall mismatch rate: {_fmt_pct(overall_mismatch_rate)} " - f"({total_mismatches}/{total_comparisons}) → P4 gate: {verdict}" - ) - - has_examples = any( - cal["fields"][f]["mismatch_examples"] for f in CORE_CALIBRATION_FIELDS - ) - if has_examples: - lines.append("") - lines.append("Mismatch examples (max 3 per field):") - for fld in CORE_CALIBRATION_FIELDS: - ex = cal["fields"][fld]["mismatch_examples"] - if not ex: - continue - lines.append(f" [{fld}]") - for e in ex: - lines.append(f" - {e}") - - return "\n".join(lines) + "\n" - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -def main(argv: list[str] | None = None) -> int: - parser = argparse.ArgumentParser( - prog="stats", - description="Backtest statistics for data/jurnal.csv", - ) - parser.add_argument( - "--csv", - type=Path, - default=Path("data/jurnal.csv"), - help="Path to the jurnal CSV (default: data/jurnal.csv).", - ) - parser.add_argument( - "--overlay", - choices=("pl_marius", "pl_theoretical"), - default="pl_marius", - help="Which P/L overlay to use (default: pl_marius).", - ) - parser.add_argument( - "--calibration", - action="store_true", - help="Show P4 calibration mismatch report instead of backtest stats.", - ) - args = parser.parse_args(argv) - - try: - sys.stdout.reconfigure(encoding="utf-8") # type: ignore[attr-defined] - except (AttributeError, OSError): - pass - - if args.calibration: - cal = compute_calibration(args.csv) - sys.stdout.write(render_calibration(cal)) - else: - stats = compute_stats(args.csv, overlay=args.overlay) - sys.stdout.write(render_stats(stats, args.overlay)) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) - - -# Ensure the canonical CSV schema is importable from one place — fail fast if -# someone removes append_row.CSV_COLUMNS that this module depends on. -assert CSV_COLUMNS is not None diff --git a/scripts/vision_schema.py b/scripts/vision_schema.py deleted file mode 100644 index 0f45032..0000000 --- a/scripts/vision_schema.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Pydantic schema for the M2D vision-extraction JSON returned by the vision subagent.""" -from __future__ import annotations - -import re -from datetime import date as date_type, datetime, timezone -from typing import Literal - -from pydantic import BaseModel, ConfigDict, Field, model_validator - - -_DATA_PATTERN = re.compile(r"^\d{4}-\d{2}-\d{2}$") -_ORA_PATTERN = re.compile(r"^\d{2}:\d{2}$") - - -class M2DExtraction(BaseModel): - model_config = ConfigDict(extra="forbid") - - screenshot_file: str - data: str - ora_utc: str - instrument: Literal["DIA", "US30", "other"] - directie: Literal["Buy", "Sell"] - tf_mare: Literal["5min", "15min"] - tf_mic: Literal["1min", "3min"] - calitate: Literal["Clară", "Mai mare ca impuls", "Slabă", "n/a"] - entry: float - sl: float - tp0: float - tp1: float - tp2: float - risc_pct: float - outcome_path: Literal[ - "SL", "TP0→SL", "TP0→TP1", "TP0→TP2", "TP0→pending", "pending" - ] - max_reached: Literal["SL_first", "TP0", "TP1", "TP2"] - be_moved: bool - confidence: Literal["high", "medium", "low"] - ambiguities: list[str] = Field(default_factory=list) - note: str = "" - - @model_validator(mode="after") - def _validate_data_format(self) -> "M2DExtraction": - if not _DATA_PATTERN.match(self.data): - raise ValueError( - f"data must match YYYY-MM-DD, got {self.data!r}" - ) - try: - parsed = date_type.fromisoformat(self.data) - except ValueError as exc: - raise ValueError(f"data is not a valid ISO date: {self.data!r}") from exc - today = datetime.now(timezone.utc).date() - if parsed > today: - raise ValueError( - f"data {self.data!r} is in the future (today UTC: {today.isoformat()})" - ) - return self - - @model_validator(mode="after") - def _validate_ora_utc_format(self) -> "M2DExtraction": - if not _ORA_PATTERN.match(self.ora_utc): - raise ValueError( - f"ora_utc must match HH:MM, got {self.ora_utc!r}" - ) - try: - datetime.strptime(self.ora_utc, "%H:%M") - except ValueError as exc: - raise ValueError( - f"ora_utc is not a valid HH:MM time: {self.ora_utc!r}" - ) from exc - return self - - @model_validator(mode="after") - def _validate_entry_ne_sl(self) -> "M2DExtraction": - if self.entry == self.sl: - raise ValueError("entry must not equal sl (zero risk distance)") - return self - - @model_validator(mode="after") - def _validate_tp_ordering(self) -> "M2DExtraction": - if self.directie == "Buy": - if not (self.sl < self.entry < self.tp0 < self.tp1 < self.tp2): - raise ValueError( - "for Buy, required: sl < entry < tp0 < tp1 < tp2 " - f"(got sl={self.sl}, entry={self.entry}, tp0={self.tp0}, " - f"tp1={self.tp1}, tp2={self.tp2})" - ) - else: - if not (self.sl > self.entry > self.tp0 > self.tp1 > self.tp2): - raise ValueError( - "for Sell, required: sl > entry > tp0 > tp1 > tp2 " - f"(got sl={self.sl}, entry={self.entry}, tp0={self.tp0}, " - f"tp1={self.tp1}, tp2={self.tp2})" - ) - return self - - @model_validator(mode="after") - def _validate_outcome_max_consistency(self) -> "M2DExtraction": - op = self.outcome_path - mr = self.max_reached - if op == "SL": - if mr != "SL_first": - raise ValueError( - f"outcome_path='SL' requires max_reached='SL_first', got {mr!r}" - ) - elif op.startswith("TP0"): - if mr not in {"TP0", "TP1", "TP2"}: - raise ValueError( - f"outcome_path={op!r} requires max_reached in " - f"{{TP0, TP1, TP2}}, got {mr!r}" - ) - # op == "pending" → any max_reached accepted - return self - - -def parse_extraction(json_str: str) -> M2DExtraction: - """Parse a JSON string into an M2DExtraction. - - Raises pydantic.ValidationError on invalid input. - """ - return M2DExtraction.model_validate_json(json_str) - - -def parse_extraction_dict(d: dict) -> M2DExtraction: - """Validate a dict against the M2DExtraction schema.""" - return M2DExtraction.model_validate(d) diff --git a/tests/test_append_row.py b/tests/test_append_row.py deleted file mode 100644 index 7139a30..0000000 --- a/tests/test_append_row.py +++ /dev/null @@ -1,287 +0,0 @@ -"""Tests for scripts/append_row.py — append_extraction pipeline.""" - -from __future__ import annotations - -import csv -import json -import re -import sys -from datetime import datetime -from pathlib import Path - -import pytest -import yaml - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.append_row import ( # noqa: E402 - CSV_COLUMNS, - VALID_SOURCES, - ZI_RO_MAP, - append_extraction, - csv_columns, -) - - -REPO_ROOT = Path(__file__).resolve().parent.parent -CALENDAR_PATH = REPO_ROOT / "calendar_evenimente.yaml" -META_PATH = REPO_ROOT / "data" / "_meta.yaml" - - -# --------------------------------------------------------------------------- -# helpers / fixtures -# --------------------------------------------------------------------------- - - -def _buy_payload(**overrides) -> dict: - # 2026-05-13 14:23 UTC == 17:23 RO (EEST, Wed) → set A2, zi=Mi. - base = { - "screenshot_file": "dia-2026-05-13-1.png", - "data": "2026-05-13", - "ora_utc": "14:23", - "instrument": "DIA", - "directie": "Buy", - "tf_mare": "5min", - "tf_mic": "1min", - "calitate": "Clară", - "entry": 400.0, - "sl": 399.0, - "tp0": 400.5, - "tp1": 401.0, - "tp2": 402.0, - "risc_pct": 0.25, - "outcome_path": "TP0→TP1", - "max_reached": "TP1", - "be_moved": True, - "confidence": "high", - "ambiguities": [], - "note": "", - } - base.update(overrides) - return base - - -def _write_payload(tmp_path: Path, name: str, **overrides) -> Path: - p = tmp_path / name - p.write_text(json.dumps(_buy_payload(**overrides)), encoding="utf-8") - return p - - -def _read_rows(csv_path: Path) -> list[dict[str, str]]: - with csv_path.open("r", encoding="utf-8", newline="") as fh: - return list(csv.DictReader(fh)) - - -@pytest.fixture -def csv_path(tmp_path: Path) -> Path: - return tmp_path / "jurnal.csv" - - -# --------------------------------------------------------------------------- -# schema / column layout -# --------------------------------------------------------------------------- - - -def test_csv_columns_canonical_29() -> None: - cols = csv_columns() - assert len(cols) == 29 - assert cols[0] == "id" - assert cols[-1] == "note" - assert cols == list(CSV_COLUMNS) - - -# --------------------------------------------------------------------------- -# core tests as specified in task #9 -# --------------------------------------------------------------------------- - - -def test_happy_path(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - result = append_extraction( - j, "vision", csv_path, META_PATH, CALENDAR_PATH - ) - assert result["status"] == "ok", result - assert result["reason"] == "" - assert result["id"] == 1 - - rows = _read_rows(csv_path) - assert len(rows) == 1 - r = rows[0] - assert r["id"] == "1" - assert r["screenshot_file"] == "dia-2026-05-13-1.png" - assert r["source"] == "vision" - assert r["data"] == "2026-05-13" - assert r["zi"] == "Mi" - assert r["ora_ro"] == "17:23" - assert r["ora_utc"] == "14:23" - assert r["set"] == "A2" - assert r["instrument"] == "DIA" - assert r["directie"] == "Buy" - assert r["be_moved"] == "True" - - -def test_pl_calc_overlay(tmp_path: Path, csv_path: Path) -> None: - """outcome_path=TP0->TP1, max_reached=TP1 → pl_marius=0.5, pl_theoretical=0.333.""" - j = _write_payload(tmp_path, "t.json") - result = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert result["status"] == "ok" - r = _read_rows(csv_path)[0] - assert float(r["pl_marius"]) == pytest.approx(0.50) - assert float(r["pl_theoretical"]) == pytest.approx(0.333) - - -def test_dedup_same_source(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - r1 = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - r2 = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert r1["status"] == "ok" - assert r2["status"] == "rejected" - assert "duplicate" in r2["reason"].lower() - assert r2["id"] is None - assert r2["row"] is None - assert len(_read_rows(csv_path)) == 1 - - -def test_dedup_different_source_ok(tmp_path: Path, csv_path: Path) -> None: - """Same screenshot_file + different source ⇒ both rows accepted.""" - j = _write_payload(tmp_path, "t.json") - r1 = append_extraction( - j, "manual_calibration", csv_path, META_PATH, CALENDAR_PATH - ) - r2 = append_extraction( - j, "vision_calibration", csv_path, META_PATH, CALENDAR_PATH - ) - assert r1["status"] == "ok" - assert r2["status"] == "ok" - rows = _read_rows(csv_path) - assert len(rows) == 2 - assert {r["source"] for r in rows} == {"manual_calibration", "vision_calibration"} - # Distinct sequential ids. - assert {r["id"] for r in rows} == {"1", "2"} - - -def test_invalid_pydantic_rejected(tmp_path: Path, csv_path: Path) -> None: - """entry == sl is rejected by pydantic; no CSV is written.""" - j = _write_payload(tmp_path, "bad.json", entry=399.0, sl=399.0) - result = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert result["status"] == "rejected" - assert "validation" in result["reason"].lower() - assert not csv_path.exists() - - -def test_missing_json_file(tmp_path: Path, csv_path: Path) -> None: - missing = tmp_path / "ghost.json" - result = append_extraction( - missing, "vision", csv_path, META_PATH, CALENDAR_PATH - ) - assert result["status"] == "rejected" - assert "not found" in result["reason"].lower() - assert not csv_path.exists() - - -def test_id_increments(tmp_path: Path, csv_path: Path) -> None: - paths = [ - _write_payload(tmp_path, "a.json", screenshot_file="a.png"), - _write_payload(tmp_path, "b.json", screenshot_file="b.png"), - _write_payload(tmp_path, "c.json", screenshot_file="c.png"), - ] - ids = [] - for p in paths: - r = append_extraction(p, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "ok" - ids.append(r["id"]) - assert ids == [1, 2, 3] - csv_ids = [int(r["id"]) for r in _read_rows(csv_path)] - assert csv_ids == [1, 2, 3] - - -def test_set_a2(tmp_path: Path, csv_path: Path) -> None: - """Wed 2026-05-13 14:30 UTC → 17:30 RO → A2 sweet spot.""" - j = _write_payload(tmp_path, "t.json", ora_utc="14:30") - r = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "ok" - row = _read_rows(csv_path)[0] - assert row["ora_ro"] == "17:30" - assert row["zi"] == "Mi" - assert row["set"] == "A2" - - -def test_set_c_fomc(tmp_path: Path, csv_path: Path) -> None: - """2026-04-29 18:35 UTC == 21:35 RO (FOMC Powell Press window) → Set C.""" - j = _write_payload( - tmp_path, - "t.json", - data="2026-04-29", - ora_utc="18:35", - screenshot_file="fomc-apr.png", - ) - r = append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "ok" - row = _read_rows(csv_path)[0] - assert row["ora_ro"] == "21:35" - assert row["set"] == "C" - - -def test_versions_stamped(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - row = _read_rows(csv_path)[0] - meta = yaml.safe_load(META_PATH.read_text(encoding="utf-8")) - assert row["indicator_version"] == str(meta["indicator_version"]) - assert row["pl_overlay_version"] == str(meta["pl_overlay_version"]) - assert row["csv_schema_version"] == str(meta["csv_schema_version"]) - - -def test_extracted_at_format(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - val = _read_rows(csv_path)[0]["extracted_at"] - # ISO 8601 UTC with trailing 'Z': YYYY-MM-DDTHH:MM:SSZ - assert re.match(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$", val), val - # Round-trip through datetime.fromisoformat after dropping the Z. - parsed = datetime.fromisoformat(val[:-1]) - assert parsed.year >= 2026 - - -# --------------------------------------------------------------------------- -# additional safety nets -# --------------------------------------------------------------------------- - - -def test_invalid_source_rejected(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - r = append_extraction(j, "auto_magic", csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "rejected" - assert "source" in r["reason"].lower() - assert not csv_path.exists() - - -def test_all_valid_sources_accepted(tmp_path: Path, csv_path: Path) -> None: - for i, src in enumerate(sorted(VALID_SOURCES)): - j = _write_payload(tmp_path, f"t{i}.json", screenshot_file=f"s{i}.png") - r = append_extraction(j, src, csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "ok", (src, r) - rows = _read_rows(csv_path) - assert {r["source"] for r in rows} == set(VALID_SOURCES) - - -def test_atomic_write_leaves_no_tmp(tmp_path: Path, csv_path: Path) -> None: - j = _write_payload(tmp_path, "t.json") - append_extraction(j, "vision", csv_path, META_PATH, CALENDAR_PATH) - leftovers = [p for p in csv_path.parent.iterdir() if p.name.endswith(".tmp")] - assert leftovers == [] - - -def test_zi_ro_map_covers_all_weekdays() -> None: - """Internal sanity: the Romanian-day map covers all 7 short weekday names.""" - assert set(ZI_RO_MAP.keys()) == {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"} - assert set(ZI_RO_MAP.values()) == {"Lu", "Ma", "Mi", "Jo", "Vi", "Sa", "Du"} - - -def test_malformed_json_rejected(tmp_path: Path, csv_path: Path) -> None: - bad = tmp_path / "broken.json" - bad.write_text("{not valid json", encoding="utf-8") - r = append_extraction(bad, "vision", csv_path, META_PATH, CALENDAR_PATH) - assert r["status"] == "rejected" - assert "validation" in r["reason"].lower() or "json" in r["reason"].lower() - assert not csv_path.exists() diff --git a/tests/test_calendar_yaml.py b/tests/test_calendar_yaml.py deleted file mode 100644 index 17e7abc..0000000 --- a/tests/test_calendar_yaml.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Tests for the YAML loader and news-window logic in calendar_parse.""" - -from __future__ import annotations - -import sys -import textwrap -from datetime import date, time -from pathlib import Path - -import pytest - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.calendar_parse import ( # noqa: E402 - is_in_news_window, - load_calendar, -) - - -REPO_ROOT = Path(__file__).resolve().parent.parent -CALENDAR_PATH = REPO_ROOT / "calendar_evenimente.yaml" - - -def test_load_calendar() -> None: - events = load_calendar(CALENDAR_PATH) - assert isinstance(events, list) - assert len(events) > 0 - required = {"name", "cadence", "time_ro", "severity", "window_before_min", "window_after_min"} - for ev in events: - missing = required - set(ev.keys()) - assert not missing, f"event {ev.get('name')!r} missing fields: {missing}" - - -def test_load_calendar_bad_version(tmp_path: Path) -> None: - bad = tmp_path / "bad.yaml" - bad.write_text( - textwrap.dedent( - """ - schema_version: 99 - events: [] - """ - ).strip() - + "\n", - encoding="utf-8", - ) - with pytest.raises(ValueError): - load_calendar(bad) - - -def _scheduled(date_str: str, time_str: str, before: int, after: int, severity: str = "extrem") -> dict: - return { - "name": "Test", - "cadence": "scheduled", - "date": date_str, - "time_ro": time_str, - "severity": severity, - "window_before_min": before, - "window_after_min": after, - } - - -class TestWindowBoundaries: - def setup_method(self) -> None: - self.cal = [_scheduled("2026-05-06", "15:30", 15, 15)] - self.d = date(2026, 5, 6) - - def test_window_inside_boundary(self) -> None: - assert is_in_news_window(self.d, time(15, 14), self.cal) is False # 1 min before lower bound - assert is_in_news_window(self.d, time(15, 15), self.cal) is True # lower bound inclusive - assert is_in_news_window(self.d, time(15, 45), self.cal) is True # upper bound inclusive - - def test_window_outside(self) -> None: - assert is_in_news_window(self.d, time(15, 14), self.cal) is False - assert is_in_news_window(self.d, time(15, 46), self.cal) is False - - -def test_severity_filter_mediu_excluded() -> None: - # JOLTS-like event with severity 'mediu' at 17:00 — even smack on time, no Set C trigger. - cal = [_scheduled("2026-05-06", "17:00", 10, 10, severity="mediu")] - assert is_in_news_window(date(2026, 5, 6), time(17, 0), cal) is False - assert is_in_news_window(date(2026, 5, 6), time(17, 5), cal) is False - - -def test_fomc_powell_window() -> None: - """Real FOMC Powell Press Apr from calendar_evenimente.yaml (2026-04-29 21:30 RO, 0/45).""" - cal = load_calendar(CALENDAR_PATH) - assert is_in_news_window(date(2026, 4, 29), time(21, 35), cal) is True - assert is_in_news_window(date(2026, 4, 29), time(22, 16), cal) is False diff --git a/tests/test_manual_log.py b/tests/test_manual_log.py deleted file mode 100644 index 006752f..0000000 --- a/tests/test_manual_log.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Tests for scripts.manual_log — derivation logic + vision_schema compatibility.""" - -from __future__ import annotations - -import pytest - -from scripts.manual_log import build_extraction, OUTCOME_TO_BE_MOVED, OUTCOME_TO_MAX_REACHED, ro_to_utc -from scripts.vision_schema import M2DExtraction - - -def test_buy_happy_path(): - d = build_extraction( - data="2026-05-13", - ora_ro="17:33", - directie="Buy", - entry=497.42, - sl=496.80, - outcome_path="TP0→TP1", - ) - # Satisfies pydantic - M2DExtraction.model_validate(d) - assert d["directie"] == "Buy" - assert d["entry"] == 497.42 - assert d["sl"] == 496.80 - # tp0 = entry + 0.4 * 0.62 = 497.42 + 0.248 = 497.668 - assert abs(d["tp0"] - 497.668) < 0.01 - assert abs(d["tp1"] - 497.792) < 0.01 - assert abs(d["tp2"] - 498.04) < 0.01 - assert d["max_reached"] == "TP1" - assert d["be_moved"] is True - - -def test_sell_happy_path(): - d = build_extraction( - data="2026-05-13", - ora_ro="17:33", - directie="Sell", - entry=492.47, - sl=492.77, - outcome_path="TP0→TP1", - ) - M2DExtraction.model_validate(d) - assert d["directie"] == "Sell" - # For Sell: tp0 = entry - 0.4 * 0.30 = 492.47 - 0.12 = 492.35 - assert abs(d["tp0"] - 492.35) < 0.01 - assert abs(d["tp1"] - 492.29) < 0.01 - assert abs(d["tp2"] - 492.17) < 0.01 - assert d["sl"] > d["entry"] > d["tp0"] > d["tp1"] > d["tp2"] - - -def test_ora_utc_dst_summer(): - # May = EEST = UTC+3 - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Sell", - entry=492.47, sl=492.77, outcome_path="pending", - ) - assert d["ora_utc"] == "14:33" - - -def test_ora_utc_dst_winter(): - # January = EET = UTC+2 - d = build_extraction( - data="2026-01-15", ora_ro="17:00", directie="Buy", - entry=400, sl=399, outcome_path="pending", - ) - assert d["ora_utc"] == "15:00" - - -def test_outcome_sl_max_reached_consistent(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=399, outcome_path="SL", - ) - M2DExtraction.model_validate(d) - assert d["max_reached"] == "SL_first" - assert d["be_moved"] is False - - -def test_outcome_tp0_pending_max_reached_tp0(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=399, outcome_path="TP0→pending", - ) - M2DExtraction.model_validate(d) - assert d["max_reached"] == "TP0" - assert d["be_moved"] is True - - -def test_outcome_tp0_sl_be_moved_true(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=399, outcome_path="TP0→SL", - ) - M2DExtraction.model_validate(d) - assert d["max_reached"] == "TP0" - assert d["be_moved"] is True # rule-enforced - - -def test_explicit_max_reached_override(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=399, outcome_path="pending", - max_reached="TP0", - ) - M2DExtraction.model_validate(d) - assert d["max_reached"] == "TP0" - - -def test_screenshot_file_generated(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Sell", - entry=492.47, sl=492.77, outcome_path="pending", - instrument="DIA", - ) - assert d["screenshot_file"] == "2026-05-13-dia-1733.png" - - -def test_screenshot_file_explicit(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Sell", - entry=492.47, sl=492.77, outcome_path="pending", - screenshot_file="custom.png", - ) - assert d["screenshot_file"] == "custom.png" - - -def test_risc_pct_computed(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Sell", - entry=500.00, sl=501.00, outcome_path="pending", - ) - assert abs(d["risc_pct"] - 0.20) < 0.001 # 1/500 = 0.002 = 0.20% - - -def test_entry_equals_sl_raises(): - with pytest.raises(ValueError, match="zero risk"): - build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=500, sl=500, outcome_path="pending", - ) - - -def test_buy_inverted_ordering_raises(): - with pytest.raises(ValueError, match="Buy"): - build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=401, outcome_path="pending", # sl > entry for Buy - ) - - -def test_sell_inverted_ordering_raises(): - with pytest.raises(ValueError, match="Sell"): - build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Sell", - entry=400, sl=399, outcome_path="pending", # sl < entry for Sell - ) - - -def test_optional_fields_defaults(): - d = build_extraction( - data="2026-05-13", ora_ro="17:33", directie="Buy", - entry=400, sl=399, outcome_path="pending", - ) - assert d["instrument"] == "DIA" - assert d["tf_mare"] == "5min" - assert d["tf_mic"] == "1min" - assert d["calitate"] == "n/a" - assert d["confidence"] == "high" - assert d["ambiguities"] == [] - assert d["note"] == "" - - -def test_ro_to_utc_helper(): - assert ro_to_utc("2026-05-13", "17:33") == "14:33" - assert ro_to_utc("2026-01-15", "10:00") == "08:00" diff --git a/tests/test_pl_calc.py b/tests/test_pl_calc.py deleted file mode 100644 index 4bcb117..0000000 --- a/tests/test_pl_calc.py +++ /dev/null @@ -1,89 +0,0 @@ -"""Tests for scripts/pl_calc.py.""" - -from __future__ import annotations - -import sys -from pathlib import Path - -import pytest - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.pl_calc import ( # noqa: E402 - PL_MARIUS_TABLE, - PL_THEORETICAL_TABLE, - pl_marius, - pl_theoretical, -) - - -class TestPlMarius: - def test_sl(self) -> None: - assert pl_marius("SL", be_moved=True) == -1.0 - assert pl_marius("SL", be_moved=False) == -1.0 - - def test_tp0_sl_be_moved(self) -> None: - assert pl_marius("TP0->SL", be_moved=True) == pytest.approx(0.20) - - def test_tp0_sl_no_be(self) -> None: - assert pl_marius("TP0->SL", be_moved=False) == pytest.approx(-0.30) - - def test_tp0_tp1(self) -> None: - assert pl_marius("TP0->TP1", be_moved=True) == pytest.approx(0.50) - assert pl_marius("TP0->TP1", be_moved=False) == pytest.approx(0.50) - - def test_tp0_tp2_closes_at_tp1(self) -> None: - assert pl_marius("TP0->TP2", be_moved=True) == pytest.approx(0.50) - assert pl_marius("TP0->TP2", be_moved=False) == pytest.approx(0.50) - - def test_tp0_pending_returns_none(self) -> None: - assert pl_marius("TP0->pending", be_moved=True) is None - assert pl_marius("TP0->pending", be_moved=False) is None - - def test_pending_returns_none(self) -> None: - assert pl_marius("pending", be_moved=True) is None - assert pl_marius("pending", be_moved=False) is None - - def test_unicode_arrow_accepted(self) -> None: - assert pl_marius("TP0→TP1", be_moved=True) == pytest.approx(0.50) - assert pl_marius("TP0→SL", be_moved=False) == pytest.approx(-0.30) - - def test_invalid_outcome_path(self) -> None: - with pytest.raises(ValueError): - pl_marius("nonsense", be_moved=True) - with pytest.raises(ValueError): - pl_marius("TP3", be_moved=False) - with pytest.raises(ValueError): - pl_marius("", be_moved=True) - - -class TestPlTheoretical: - def test_sl_first(self) -> None: - assert pl_theoretical("SL_first") == -1.0 - - def test_tp0(self) -> None: - assert pl_theoretical("TP0") == pytest.approx(0.133) - - def test_tp1(self) -> None: - assert pl_theoretical("TP1") == pytest.approx(0.333) - - def test_tp2(self) -> None: - assert pl_theoretical("TP2") == pytest.approx(0.667) - - def test_invalid_max_reached(self) -> None: - with pytest.raises(ValueError): - pl_theoretical("TP3") - with pytest.raises(ValueError): - pl_theoretical("sl_first") # case-sensitive - with pytest.raises(ValueError): - pl_theoretical("") - - -class TestTables: - def test_marius_table_exported(self) -> None: - assert ("SL", True) in PL_MARIUS_TABLE - assert PL_MARIUS_TABLE[("TP0->TP1", True)] == pytest.approx(0.50) - - def test_theoretical_table_exported(self) -> None: - assert PL_THEORETICAL_TABLE["TP2"] == pytest.approx(0.667) - assert PL_THEORETICAL_TABLE["SL_first"] == -1.0 diff --git a/tests/test_regenerate_md.py b/tests/test_regenerate_md.py deleted file mode 100644 index a9f0f6b..0000000 --- a/tests/test_regenerate_md.py +++ /dev/null @@ -1,208 +0,0 @@ -"""Tests for scripts/regenerate_md.py.""" - -from __future__ import annotations - -import csv -import sys -from pathlib import Path - -import pytest - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.append_row import csv_columns # noqa: E402 -from scripts.regenerate_md import MD_COLUMNS, regenerate_md # noqa: E402 - - -def _row(**overrides: str) -> dict[str, str]: - base = { - "id": "1", - "screenshot_file": "2026-05-13_dia_5min.png", - "source": "vision", - "data": "2026-05-13", - "zi": "Mi", - "ora_ro": "17:23", - "ora_utc": "14:23", - "instrument": "DIA", - "directie": "long", - "tf_mare": "5min", - "tf_mic": "1min", - "calitate": "Clară", - "entry": "497.42", - "sl": "496.80", - "tp0": "497.67", - "tp1": "497.79", - "tp2": "498.04", - "risc_pct": "0.50", - "outcome_path": "TP0→TP1", - "max_reached": "TP1", - "be_moved": "true", - "pl_marius": "0.5000", - "pl_theoretical": "0.3330", - "set": "A2", - "indicator_version": "1", - "pl_overlay_version": "1", - "csv_schema_version": "1", - "extracted_at": "2026-05-13T14:30:00Z", - "note": "", - } - base.update(overrides) - return base - - -def _write_csv( - path: Path, - rows: list[dict[str, str]], - extra_columns: list[str] | None = None, -) -> None: - fieldnames = csv_columns() - if extra_columns: - fieldnames = fieldnames + extra_columns - with path.open("w", encoding="utf-8", newline="") as fh: - writer = csv.DictWriter(fh, fieldnames=fieldnames) - writer.writeheader() - for r in rows: - writer.writerow({k: r.get(k, "") for k in fieldnames}) - - -def _data_lines(md_text: str) -> list[str]: - header_prefix = "| " + MD_COLUMNS[0] + " | " + MD_COLUMNS[1] - return [ - ln - for ln in md_text.splitlines() - if ln.startswith("|") - and not ln.startswith(header_prefix) - and not ln.startswith("|---") - ] - - -def test_empty_csv_placeholder(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, []) - - n = regenerate_md(csv_p, md_p) - - assert n == 0 - content = md_p.read_text(encoding="utf-8") - assert "# Jurnal M2D (auto-generated)" in content - assert "Niciun trade încă" in content - assert "| # |" not in content - - -def test_missing_csv_placeholder(tmp_path: Path) -> None: - csv_p = tmp_path / "does_not_exist.csv" - md_p = tmp_path / "jurnal.md" - - n = regenerate_md(csv_p, md_p) - - assert n == 0 - content = md_p.read_text(encoding="utf-8") - assert "Niciun trade încă" in content - assert md_p.exists() - - -def test_single_row_format(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, [_row()]) - - n = regenerate_md(csv_p, md_p) - - assert n == 1 - content = md_p.read_text(encoding="utf-8") - assert "# Jurnal M2D (auto-generated from data/jurnal.csv)" in content - assert "Rows: 1" in content - header_line = "| " + " | ".join(MD_COLUMNS) + " |" - assert header_line in content - rows = _data_lines(content) - assert len(rows) == 1 - cells = [c.strip() for c in rows[0].strip("|").split("|")] - assert cells[0] == "1" - assert cells[1] == "2026-05-13" - assert cells[2] == "Mi" - assert cells[3] == "17:23" - assert cells[4] == "A2" - assert cells[5] == "DIA" - assert cells[6] == "Buy" - assert cells[7] == "Clară" - assert cells[13] == "TP0→TP1" - assert cells[14] == "+0.50" - assert cells[15] == "+0.33" - assert cells[16] == "vision" - - -def test_three_rows(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - rows = [ - _row(id="3", data="2026-05-15", pl_marius="-1.0000"), - _row(id="1", data="2026-05-13"), - _row(id="2", data="2026-05-14", pl_marius="0.2000"), - ] - _write_csv(csv_p, rows) - - n = regenerate_md(csv_p, md_p) - - assert n == 3 - content = md_p.read_text(encoding="utf-8") - assert "Rows: 3" in content - data = _data_lines(content) - assert len(data) == 3 - assert "| 1 | 2026-05-13 |" in data[0] - assert "| 2 | 2026-05-14 |" in data[1] - assert "| 3 | 2026-05-15 |" in data[2] - - -def test_pending_pl_displayed(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, [_row(pl_marius="", pl_theoretical="")]) - - n = regenerate_md(csv_p, md_p) - - assert n == 1 - content = md_p.read_text(encoding="utf-8") - rows = _data_lines(content) - cells = [c.strip() for c in rows[0].strip("|").split("|")] - assert cells[14] == "pending" - assert cells[15] == "pending" - - -def test_unknown_column_graceful( - tmp_path: Path, capsys: pytest.CaptureFixture[str] -) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, [_row()], extra_columns=["extra_field"]) - - n = regenerate_md(csv_p, md_p) - - assert n == 1 - content = md_p.read_text(encoding="utf-8") - assert "Rows: 1" in content - captured = capsys.readouterr() - assert "unknown CSV columns ignored" in captured.err - assert "extra_field" in captured.err - - -def test_atomic_write_no_tmp_leftover(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, [_row()]) - - regenerate_md(csv_p, md_p) - - leftovers = list(tmp_path.glob("*.tmp")) - assert leftovers == [] - assert md_p.exists() - - -def test_rows_count_returned(tmp_path: Path) -> None: - csv_p = tmp_path / "jurnal.csv" - md_p = tmp_path / "jurnal.md" - _write_csv(csv_p, [_row(id=str(i)) for i in range(1, 6)]) - - n = regenerate_md(csv_p, md_p) - - assert n == 5 diff --git a/tests/test_set_calc.py b/tests/test_set_calc.py deleted file mode 100644 index 6e4a6d5..0000000 --- a/tests/test_set_calc.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Tests for calc_set + utc_to_ro in calendar_parse.""" - -from __future__ import annotations - -import sys -from datetime import date, time -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.calendar_parse import ( # noqa: E402 - calc_set, - load_calendar, - utc_to_ro, -) - - -REPO_ROOT = Path(__file__).resolve().parent.parent -CALENDAR_PATH = REPO_ROOT / "calendar_evenimente.yaml" - - -def _cal(): - return load_calendar(CALENDAR_PATH) - - -# Reference weekdays used below (verified via datetime): -# 2026-05-13 Wed 2026-05-12 Tue 2026-05-14 Thu -# 2026-05-11 Mon 2026-05-15 Fri -# 2026-04-29 Wed (FOMC Powell Press Apr — Set C trigger) - - -def test_a1_mid() -> None: - assert calc_set(date(2026, 5, 13), time(16, 50), "Wed", _cal()) == "A1" - - -def test_a1_boundary_low() -> None: - assert calc_set(date(2026, 5, 12), time(16, 35), "Tue", _cal()) == "A1" - - -def test_a1_boundary_high() -> None: - assert calc_set(date(2026, 5, 14), time(16, 59), "Thu", _cal()) == "A1" - - -def test_a2_sweet_spot() -> None: - assert calc_set(date(2026, 5, 13), time(17, 30), "Wed", _cal()) == "A2" - - -def test_a3() -> None: - assert calc_set(date(2026, 5, 12), time(18, 30), "Tue", _cal()) == "A3" - - -def test_b() -> None: - assert calc_set(date(2026, 5, 14), time(22, 15), "Thu", _cal()) == "B" - - -def test_c_fomc() -> None: - # 2026-04-29 is Wed; would otherwise hit a time band — but FOMC Powell Press window dominates. - assert calc_set(date(2026, 4, 29), time(21, 35), "Wed", _cal()) == "C" - - -def test_d_mon() -> None: - assert calc_set(date(2026, 5, 11), time(17, 0), "Mon", _cal()) == "D" - - -def test_d_fri() -> None: - assert calc_set(date(2026, 5, 15), time(17, 0), "Fri", _cal()) == "D" - - -def test_other() -> None: - # Tue 13:00 — not Mon/Fri, no news, before any A-band. - assert calc_set(date(2026, 5, 12), time(13, 0), "Tue", _cal()) == "Other" - - -def test_dst_boundary_oct_2026() -> None: - """DST ends on Sun 2026-10-25 at 04:00 RO (clocks go back to 03:00). - - Just before the shift, 00:30 UTC = 03:30 RO (EEST, UTC+3). The conversion must - pick the pre-shift offset and yield 03:30 — not 02:30 (which would be an - off-by-one-hour bug from naive +2h). - """ - d_ro, t_ro, dow = utc_to_ro("2026-10-25", "00:30") - assert d_ro == date(2026, 10, 25) - assert t_ro == time(3, 30) - assert dow == "Sun" - - # After the shift, 01:30 UTC also maps to 03:30 RO (EET, UTC+2) — sanity check. - d_ro2, t_ro2, _ = utc_to_ro("2026-10-25", "01:30") - assert (d_ro2, t_ro2) == (date(2026, 10, 25), time(3, 30)) diff --git a/tests/test_stats.py b/tests/test_stats.py deleted file mode 100644 index bd12a41..0000000 --- a/tests/test_stats.py +++ /dev/null @@ -1,447 +0,0 @@ -"""CSV-fixture tests for scripts.stats — compute_stats, render_stats, -compute_calibration, render_calibration, main().""" - -from __future__ import annotations - -import csv -import sys -from pathlib import Path - -import pytest - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.append_row import CSV_COLUMNS # noqa: E402 -from scripts.stats import ( # noqa: E402 - CORE_CALIBRATION_FIELDS, - compute_calibration, - compute_stats, - main, - render_calibration, - render_stats, -) - - -# --------------------------------------------------------------------------- -# Fixture row builder -# --------------------------------------------------------------------------- - - -def _base_row(**overrides) -> dict[str, str]: - base = { - "id": "0", - "screenshot_file": "", - "source": "vision", - "data": "2026-05-13", - "zi": "Mi", - "ora_ro": "17:30", - "ora_utc": "14:30", - "instrument": "DIA", - "directie": "Buy", - "tf_mare": "5min", - "tf_mic": "1min", - "calitate": "Clară", - "entry": "400.0", - "sl": "399.0", - "tp0": "400.5", - "tp1": "401.0", - "tp2": "402.0", - "risc_pct": "0.25", - "outcome_path": "TP0→TP1", - "max_reached": "TP1", - "be_moved": "True", - "pl_marius": "0.5000", - "pl_theoretical": "0.3330", - "set": "A2", - "indicator_version": "v-2026-05", - "pl_overlay_version": "marius-v1", - "csv_schema_version": "1", - "extracted_at": "2026-05-13T10:00:00Z", - "note": "", - } - base.update({k: str(v) for k, v in overrides.items()}) - return base - - -def _write_csv(path: Path, rows: list[dict[str, str]]) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - with path.open("w", encoding="utf-8", newline="") as fh: - w = csv.DictWriter(fh, fieldnames=list(CSV_COLUMNS)) - w.writeheader() - for r in rows: - w.writerow({k: r.get(k, "") for k in CSV_COLUMNS}) - - -# Outcome templates (P/L values) — match scripts.pl_calc tables. -_SL = {"outcome_path": "SL", "max_reached": "SL_first", "be_moved": "False", - "pl_marius": "-1.0000", "pl_theoretical": "-1.0000"} -_TP0_SL_BE = {"outcome_path": "TP0→SL", "max_reached": "TP0", "be_moved": "True", - "pl_marius": "0.2000", "pl_theoretical": "0.1330"} -_TP0_TP1 = {"outcome_path": "TP0→TP1", "max_reached": "TP1", "be_moved": "True", - "pl_marius": "0.5000", "pl_theoretical": "0.3330"} -_TP0_TP2 = {"outcome_path": "TP0→TP2", "max_reached": "TP2", "be_moved": "True", - "pl_marius": "0.5000", "pl_theoretical": "0.6670"} -_PENDING = {"outcome_path": "pending", "max_reached": "TP0", "be_moved": "False", - "pl_marius": "", "pl_theoretical": "0.1330"} - - -def _synthetic_csv(tmp_path: Path) -> Path: - """30-trade backtest fixture. - - Set distribution: - A1: 8 rows (all closed; 3 SL, 2 TP0→SL, 2 TP0→TP1, 1 TP0→TP2) - A2: 10 rows (all closed; 4 SL, 3 TP0→SL, 2 TP0→TP1, 1 TP0→TP2) - B : 7 rows (2 pending, 5 closed; 2 SL, 2 TP0→TP1, 1 TP0→TP2) - D : 5 rows (3 pending, 2 closed; 1 SL, 1 TP0→TP1) - - Totals: n_total=30, n_pending=5, n_closed=25. - - Wins by pl_marius (>0): all TP0→SL_BE + TP0→TP1 + TP0→TP2 - A1: 2 + 2 + 1 = 5 wins / 8 - A2: 3 + 2 + 1 = 6 wins / 10 - B : 0 + 2 + 1 = 3 wins / 5 - D : 0 + 1 + 0 = 1 win / 2 - Total wins = 15 / 25 = 60.0%. - - Calitate distribution: half "Clară", half "Slabă" (alternating). - Directie distribution: 2/3 Buy, 1/3 Sell. - """ - rows: list[dict[str, str]] = [] - rid = 0 - - def add(set_label: str, outcomes: list[dict[str, str]]) -> None: - nonlocal rid - for i, outcome in enumerate(outcomes): - rid += 1 - row = _base_row( - id=rid, - screenshot_file=f"{set_label.lower()}-{rid}.png", - set=set_label, - calitate="Clară" if rid % 2 == 0 else "Slabă", - directie="Buy" if rid % 3 != 0 else "Sell", - ) - row.update({k: str(v) for k, v in outcome.items()}) - rows.append(row) - - add("A1", [_SL] * 3 + [_TP0_SL_BE] * 2 + [_TP0_TP1] * 2 + [_TP0_TP2] * 1) - add("A2", [_SL] * 4 + [_TP0_SL_BE] * 3 + [_TP0_TP1] * 2 + [_TP0_TP2] * 1) - add("B", [_PENDING] * 2 + [_SL] * 2 + [_TP0_TP1] * 2 + [_TP0_TP2] * 1) - add("D", [_PENDING] * 3 + [_SL] * 1 + [_TP0_TP1] * 1) - - path = tmp_path / "jurnal.csv" - _write_csv(path, rows) - return path - - -# --------------------------------------------------------------------------- -# compute_stats — core -# --------------------------------------------------------------------------- - - -class TestComputeStats: - def test_compute_stats_n_pending(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - assert s["n_total"] == 30 - assert s["n_pending"] == 5 - assert s["n_closed"] == 25 - - def test_compute_stats_wr_correct(self, tmp_path: Path) -> None: - """Manual win count: 15 / 25 = 60.0%.""" - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - assert s["wr"] == pytest.approx(15 / 25) - lo, hi = s["wr_ci_95"] - assert 0.0 <= lo <= s["wr"] <= hi <= 1.0 - - def test_compute_stats_per_set(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - a2 = s["per_set"]["A2"] - assert a2["n"] == 10 # 10 closed A2 trades - # A2 wins (pl_marius > 0): 3 BE + 2 TP1 + 1 TP2 = 6 / 10 - assert a2["wr"] == pytest.approx(0.60) - - def test_per_set_b_pending_excluded(self, tmp_path: Path) -> None: - """Set B has 7 total rows (2 pending + 5 closed). n must be 5.""" - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - assert s["per_set"]["B"]["n"] == 5 - # B wins: 0 BE + 2 TP1 + 1 TP2 = 3 / 5 - assert s["per_set"]["B"]["wr"] == pytest.approx(0.60) - - def test_per_directie_no_ci_keys(self, tmp_path: Path) -> None: - """per_directie omits CI fields per spec (only n / wr / expectancy).""" - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - for k, d in s["per_directie"].items(): - assert set(d.keys()) == {"n", "wr", "expectancy"}, k - - def test_overlay_theoretical_vs_marius(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - s_m = compute_stats(path, overlay="pl_marius") - s_t = compute_stats(path, overlay="pl_theoretical") - # Same N, but different expectancy. - assert s_m["n_closed"] == s_t["n_closed"] - assert s_m["expectancy"] != s_t["expectancy"] - - def test_unknown_overlay_raises(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - with pytest.raises(ValueError): - compute_stats(path, overlay="pl_imaginary") - - def test_empty_csv_no_crash(self, tmp_path: Path) -> None: - path = tmp_path / "empty.csv" - _write_csv(path, []) - s = compute_stats(path) - assert s["n_total"] == 0 - assert s["n_closed"] == 0 - assert s["per_set"] == {} - assert s["wr"] == 0.0 - assert s["wr_ci_95"] == (0.0, 0.0) - - def test_missing_csv_no_crash(self, tmp_path: Path) -> None: - # Nonexistent path: treat as empty, do not raise. - s = compute_stats(tmp_path / "ghost.csv") - assert s["n_total"] == 0 - - def test_calibration_rows_excluded(self, tmp_path: Path) -> None: - rows = [ - _base_row(id=1, source="vision", screenshot_file="v.png"), - _base_row(id=2, source="manual_calibration", screenshot_file="c.png"), - _base_row(id=3, source="vision_calibration", screenshot_file="c.png"), - ] - path = tmp_path / "j.csv" - _write_csv(path, rows) - s = compute_stats(path) - assert s["n_total"] == 1 # calibration rows filtered out - - -# --------------------------------------------------------------------------- -# render_stats -# --------------------------------------------------------------------------- - - -class TestRenderStats: - def test_render_stats_no_crash(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - s = compute_stats(path) - out = render_stats(s, "pl_marius") - assert isinstance(out, str) - assert out # non-empty - assert "STOPPING RULE" in out - - def test_render_stats_contains_sections(self, tmp_path: Path) -> None: - path = _synthetic_csv(tmp_path) - out = render_stats(compute_stats(path), "pl_marius") - for marker in ( - "Stats jurnal.csv", - "Trade-uri totale", - "GLOBAL", - "PER SET:", - "PER CALITATE", - "PER DIRECȚIE", - "DESCRIPTOR ONLY", - ): - assert marker in out, f"missing section: {marker!r}" - - def test_render_stats_flags_under_threshold(self, tmp_path: Path) -> None: - """All Sets in synthetic fixture have N<40 → all should be flagged.""" - path = _synthetic_csv(tmp_path) - out = render_stats(compute_stats(path), "pl_marius") - for k in ("A1", "A2", "B", "D"): - assert f"{k}: N=" in out - assert "NEEDS MORE DATA" in out - - def test_render_stats_empty(self, tmp_path: Path) -> None: - path = tmp_path / "empty.csv" - _write_csv(path, []) - out = render_stats(compute_stats(path), "pl_marius") - assert "Trade-uri totale: 0" in out - # No crash, no per-Set table for an empty dataset. - assert "NEEDS MORE DATA" not in out - - -# --------------------------------------------------------------------------- -# compute_calibration -# --------------------------------------------------------------------------- - - -class TestComputeCalibration: - def test_compute_calibration_pairs(self, tmp_path: Path) -> None: - rows: list[dict[str, str]] = [] - for i in range(5): - f = f"cal-{i}.png" - rows.append(_base_row( - id=i * 2 + 1, source="manual_calibration", screenshot_file=f - )) - rows.append(_base_row( - id=i * 2 + 2, source="vision_calibration", screenshot_file=f - )) - path = tmp_path / "j.csv" - _write_csv(path, rows) - cal = compute_calibration(path) - assert cal["n_pairs"] == 5 - for fld in CORE_CALIBRATION_FIELDS: - assert fld in cal["fields"] - # All identical → 5 matches, 0 mismatches per field. - assert cal["fields"][fld]["match"] == 5 - assert cal["fields"][fld]["mismatch"] == 0 - assert cal["fields"][fld]["match_rate"] == pytest.approx(1.0) - - def test_compute_calibration_mismatch_examples(self, tmp_path: Path) -> None: - """Modify entry on 2 pairs → mismatch_examples contains both.""" - rows: list[dict[str, str]] = [] - for i in range(5): - f = f"cal-{i}.png" - manual_entry = "400.0" - # First two pairs differ on entry; the rest match exactly. - vision_entry = "401.5" if i < 2 else "400.0" - rows.append(_base_row( - id=i * 2 + 1, source="manual_calibration", - screenshot_file=f, entry=manual_entry, - )) - rows.append(_base_row( - id=i * 2 + 2, source="vision_calibration", - screenshot_file=f, entry=vision_entry, - )) - path = tmp_path / "j.csv" - _write_csv(path, rows) - cal = compute_calibration(path) - assert cal["n_pairs"] == 5 - entry = cal["fields"]["entry"] - assert entry["match"] == 3 - assert entry["mismatch"] == 2 - assert entry["match_rate"] == pytest.approx(3 / 5) - assert len(entry["mismatch_examples"]) == 2 - for ex in entry["mismatch_examples"]: - assert "manual=" in ex and "vision=" in ex - - def test_calibration_examples_capped_at_3(self, tmp_path: Path) -> None: - """5 mismatches but mismatch_examples is capped at 3.""" - rows: list[dict[str, str]] = [] - for i in range(5): - f = f"cal-{i}.png" - rows.append(_base_row( - id=i * 2 + 1, source="manual_calibration", - screenshot_file=f, entry="400.0", - )) - rows.append(_base_row( - id=i * 2 + 2, source="vision_calibration", - screenshot_file=f, entry="500.0", - )) - path = tmp_path / "j.csv" - _write_csv(path, rows) - cal = compute_calibration(path) - assert cal["fields"]["entry"]["mismatch"] == 5 - assert len(cal["fields"]["entry"]["mismatch_examples"]) == 3 - - def test_calibration_numeric_tolerance(self, tmp_path: Path) -> None: - """Floats within 0.01 must NOT count as a mismatch.""" - rows = [ - _base_row( - id=1, source="manual_calibration", - screenshot_file="cal-1.png", entry="400.005", - ), - _base_row( - id=2, source="vision_calibration", - screenshot_file="cal-1.png", entry="400.010", - ), - ] - path = tmp_path / "j.csv" - _write_csv(path, rows) - cal = compute_calibration(path) - assert cal["fields"]["entry"]["match"] == 1 - assert cal["fields"]["entry"]["mismatch"] == 0 - - def test_calibration_outside_tolerance(self, tmp_path: Path) -> None: - """Floats > 0.01 apart DO count as a mismatch.""" - rows = [ - _base_row( - id=1, source="manual_calibration", - screenshot_file="cal-1.png", entry="400.00", - ), - _base_row( - id=2, source="vision_calibration", - screenshot_file="cal-1.png", entry="400.05", - ), - ] - path = tmp_path / "j.csv" - _write_csv(path, rows) - cal = compute_calibration(path) - assert cal["fields"]["entry"]["mismatch"] == 1 - - def test_calibration_no_pairs(self, tmp_path: Path) -> None: - """No paired screenshot → n_pairs=0, all rates 0.0.""" - path = tmp_path / "j.csv" - _write_csv(path, [ - _base_row(id=1, source="manual_calibration", screenshot_file="lonely.png"), - ]) - cal = compute_calibration(path) - assert cal["n_pairs"] == 0 - for fld in CORE_CALIBRATION_FIELDS: - assert cal["fields"][fld]["match"] == 0 - assert cal["fields"][fld]["mismatch"] == 0 - - def test_render_calibration_no_crash(self, tmp_path: Path) -> None: - rows = [ - _base_row(id=1, source="manual_calibration", - screenshot_file="cal-1.png", directie="Buy"), - _base_row(id=2, source="vision_calibration", - screenshot_file="cal-1.png", directie="Sell", - entry="400.0", sl="401.0", tp0="399.5", - tp1="399.0", tp2="398.0"), - ] - path = tmp_path / "j.csv" - _write_csv(path, rows) - out = render_calibration(compute_calibration(path)) - assert "Calibration P4" in out - assert "directie" in out - - def test_render_calibration_empty(self, tmp_path: Path) -> None: - path = tmp_path / "empty.csv" - _write_csv(path, []) - out = render_calibration(compute_calibration(path)) - assert "0" in out - assert "FAIL" not in out - assert "PASS" not in out - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -class TestCLI: - def test_main_stats( - self, tmp_path: Path, capsys: pytest.CaptureFixture - ) -> None: - path = _synthetic_csv(tmp_path) - rc = main(["--csv", str(path)]) - assert rc == 0 - assert "Stats jurnal.csv" in capsys.readouterr().out - - def test_main_overlay( - self, tmp_path: Path, capsys: pytest.CaptureFixture - ) -> None: - path = _synthetic_csv(tmp_path) - rc = main(["--csv", str(path), "--overlay", "pl_theoretical"]) - assert rc == 0 - assert "pl_theoretical" in capsys.readouterr().out - - def test_main_calibration( - self, tmp_path: Path, capsys: pytest.CaptureFixture - ) -> None: - rows = [ - _base_row(id=1, source="manual_calibration", - screenshot_file="cal-1.png"), - _base_row(id=2, source="vision_calibration", - screenshot_file="cal-1.png"), - ] - path = tmp_path / "j.csv" - _write_csv(path, rows) - rc = main(["--csv", str(path), "--calibration"]) - assert rc == 0 - out = capsys.readouterr().out - assert "Calibration P4" in out - assert "PASS" in out diff --git a/tests/test_stats_ci.py b/tests/test_stats_ci.py deleted file mode 100644 index 12d5367..0000000 --- a/tests/test_stats_ci.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Pure-math tests for stats CI primitives (no I/O).""" - -from __future__ import annotations - -import sys -from pathlib import Path - -import pytest - -sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) - -from scripts.stats import bootstrap_expectancy_ci, wilson_ci # noqa: E402 - - -# --------------------------------------------------------------------------- -# Wilson CI -# --------------------------------------------------------------------------- - - -class TestWilsonCI: - def test_wilson_n_zero(self) -> None: - assert wilson_ci(0, 0) == (0.0, 0.0) - - def test_wilson_perfect_winrate(self) -> None: - lo, hi = wilson_ci(10, 10) - assert lo > 0.65 - assert hi == pytest.approx(1.0, abs=1e-12) - - def test_wilson_reference_15_55(self) -> None: - """wins=8, n=15 (WR≈53%) → CI approximately [29%, 76%] ±2%.""" - lo, hi = wilson_ci(8, 15) - assert lo == pytest.approx(0.29, abs=0.02) - assert hi == pytest.approx(0.76, abs=0.02) - - def test_wilson_all_losses(self) -> None: - lo, hi = wilson_ci(0, 10) - assert lo == pytest.approx(0.0, abs=1e-12) - assert hi < 0.35 - - def test_wilson_wins_out_of_range(self) -> None: - with pytest.raises(ValueError): - wilson_ci(11, 10) - with pytest.raises(ValueError): - wilson_ci(-1, 10) - - def test_wilson_clamps_at_50pct_n40(self) -> None: - """Reference at WR=50%, N=40: CI ≈ [35.2%, 64.8%].""" - lo, hi = wilson_ci(20, 40) - assert lo == pytest.approx(0.352, abs=0.005) - assert hi == pytest.approx(0.648, abs=0.005) - - -# --------------------------------------------------------------------------- -# Bootstrap CI -# --------------------------------------------------------------------------- - - -class TestBootstrap: - def test_bootstrap_deterministic(self) -> None: - values = [1.0, -0.5, 0.5, -1.0] - a = bootstrap_expectancy_ci(values, n_resamples=1000, seed=42) - b = bootstrap_expectancy_ci(values, n_resamples=1000, seed=42) - assert a == b - - def test_bootstrap_different_seed_different_result(self) -> None: - values = [1.0, -0.5, 0.5, -1.0, 0.2, -0.3, 0.5] - a = bootstrap_expectancy_ci(values, n_resamples=1000, seed=1) - b = bootstrap_expectancy_ci(values, n_resamples=1000, seed=2) - assert a != b - - def test_bootstrap_empty(self) -> None: - assert bootstrap_expectancy_ci([], n_resamples=100, seed=0) == (0.0, 0.0) - - def test_bootstrap_single_value(self) -> None: - lo, hi = bootstrap_expectancy_ci([0.5], n_resamples=100, seed=0) - assert lo == pytest.approx(0.5, abs=1e-9) - assert hi == pytest.approx(0.5, abs=1e-9) - - def test_bootstrap_brackets_the_mean(self) -> None: - values = [0.5, -1.0, 0.5, 0.5, -1.0, 0.2, -0.3, 0.5, -1.0, 0.5] * 5 - mean = sum(values) / len(values) - lo, hi = bootstrap_expectancy_ci(values, n_resamples=1000, seed=7) - assert lo <= mean <= hi diff --git a/tests/test_vision_schema.py b/tests/test_vision_schema.py deleted file mode 100644 index 08368f0..0000000 --- a/tests/test_vision_schema.py +++ /dev/null @@ -1,225 +0,0 @@ -"""Tests for scripts.vision_schema.M2DExtraction.""" -from __future__ import annotations - -import json -import sys -from datetime import datetime, timezone -from pathlib import Path - -import pytest -from pydantic import ValidationError - -sys.path.insert(0, str(Path(__file__).resolve().parents[1])) - -from scripts.vision_schema import ( # noqa: E402 - M2DExtraction, - parse_extraction, - parse_extraction_dict, -) - - -def _buy_payload(**overrides) -> dict: - base = { - "screenshot_file": "dia-1min-example.png", - "data": "2026-05-13", - "ora_utc": "14:23", - "instrument": "DIA", - "directie": "Buy", - "tf_mare": "5min", - "tf_mic": "1min", - "calitate": "Clară", - "entry": 400.0, - "sl": 399.0, - "tp0": 400.5, - "tp1": 401.0, - "tp2": 402.0, - "risc_pct": 0.25, - "outcome_path": "TP0→TP1", - "max_reached": "TP1", - "be_moved": True, - "confidence": "high", - "ambiguities": [], - "note": "", - } - base.update(overrides) - return base - - -def _sell_payload(**overrides) -> dict: - base = { - "screenshot_file": "dia-sell.png", - "data": "2026-05-13", - "ora_utc": "15:00", - "instrument": "US30", - "directie": "Sell", - "tf_mare": "15min", - "tf_mic": "3min", - "calitate": "Mai mare ca impuls", - "entry": 400.0, - "sl": 401.0, - "tp0": 399.5, - "tp1": 399.0, - "tp2": 398.0, - "risc_pct": 0.3, - "outcome_path": "TP0→TP2", - "max_reached": "TP2", - "be_moved": False, - "confidence": "medium", - "ambiguities": ["entry overlap with wick"], - "note": "nothing", - } - base.update(overrides) - return base - - -def test_happy_path_buy(): - m = parse_extraction_dict(_buy_payload()) - assert m.directie == "Buy" - assert m.entry == 400.0 - - -def test_happy_path_sell(): - m = parse_extraction_dict(_sell_payload()) - assert m.directie == "Sell" - assert m.sl > m.entry > m.tp0 > m.tp1 > m.tp2 - - -def test_parse_extraction_from_json_str(): - payload = _buy_payload() - m = parse_extraction(json.dumps(payload)) - assert isinstance(m, M2DExtraction) - - -@pytest.mark.parametrize( - "field,bad_value", - [ - ("directie", "Long"), - ("instrument", "SPY"), - ("tf_mare", "30min"), - ("tf_mic", "2min"), - ("calitate", "Bună"), - ("outcome_path", "BE"), - ("max_reached", "BE"), - ("confidence", "very-high"), - ], -) -def test_each_literal_rejection(field, bad_value): - payload = _buy_payload(**{field: bad_value}) - with pytest.raises(ValidationError): - parse_extraction_dict(payload) - - -def test_entry_equals_sl(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(entry=399.0, sl=399.0)) - - -def test_buy_tp_inverted(): - # tp1 < tp0 violates ordering - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(tp0=401.0, tp1=400.5, tp2=402.0)) - - -def test_buy_sl_above_entry_rejected(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(sl=400.5)) - - -def test_sell_order_correct(): - m = parse_extraction_dict(_sell_payload()) - assert m.sl > m.entry - assert m.entry > m.tp0 - assert m.tp0 > m.tp1 > m.tp2 - - -def test_sell_order_inverted_rejected(): - # using Buy-ordering values with directie=Sell - with pytest.raises(ValidationError): - parse_extraction_dict( - _sell_payload(sl=399.0, entry=400.0, tp0=400.5, tp1=401.0, tp2=402.0) - ) - - -def test_data_in_future(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(data="2099-01-01")) - - -def test_data_today_ok(): - today = datetime.now(timezone.utc).date().isoformat() - m = parse_extraction_dict(_buy_payload(data=today)) - assert m.data == today - - -def test_outcome_path_sl_max_reached_inconsistent(): - with pytest.raises(ValidationError): - parse_extraction_dict( - _buy_payload(outcome_path="SL", max_reached="TP1") - ) - - -def test_outcome_path_sl_max_reached_sl_first_ok(): - m = parse_extraction_dict( - _buy_payload(outcome_path="SL", max_reached="SL_first") - ) - assert m.outcome_path == "SL" - - -def test_outcome_path_tp0_max_reached_sl_first_rejected(): - with pytest.raises(ValidationError): - parse_extraction_dict( - _buy_payload(outcome_path="TP0→TP1", max_reached="SL_first") - ) - - -def test_outcome_path_pending_any_max_reached_ok(): - m = parse_extraction_dict( - _buy_payload(outcome_path="pending", max_reached="SL_first") - ) - assert m.outcome_path == "pending" - - -def test_extra_field_forbidden(): - payload = _buy_payload() - payload["unexpected_field"] = "x" - with pytest.raises(ValidationError): - parse_extraction_dict(payload) - - -def test_data_bad_format(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(data="2026/05/13")) - - -def test_data_bad_format_short(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(data="26-05-13")) - - -def test_ora_utc_bad_format(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(ora_utc="14:23:00")) - - -def test_ora_utc_bad_format_no_colon(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(ora_utc="1423")) - - -def test_ora_utc_invalid_hour(): - with pytest.raises(ValidationError): - parse_extraction_dict(_buy_payload(ora_utc="25:00")) - - -def test_ambiguities_default_empty(): - payload = _buy_payload() - del payload["ambiguities"] - m = parse_extraction_dict(payload) - assert m.ambiguities == [] - - -def test_note_default_empty(): - payload = _buy_payload() - del payload["note"] - m = parse_extraction_dict(payload) - assert m.note == ""