--- description: Adaugă manual un rând în jurnal.csv (source=manual sau manual_calibration). Pentru calibrare P4 sau forward paper. argument-hint: "[--calibration] " --- # /m2d-log — manual M2D trade entry Marius extrage manual TOATE câmpurile trade-ului. Folosit pentru calibration P4 (împreună cu `/backtest --calibration` pe același screenshot) sau ca log direct fără vision. ## Workflow 1. **Parse `$ARGUMENTS`** — detectează flag `--calibration` și ``. Dacă `` lipsește, întreabă user-ul. Calculează `basename = basename()` și `basename_no_ext = basename` minus ultima extensie. 2. **Promptează user-ul în română**, pe rând, pentru fiecare câmp din schema `M2DExtraction` (vezi `scripts/vision_schema.py`). Ordinea + opțiuni valide: - `data` — `YYYY-MM-DD` - `ora_utc` — `HH:MM` (conversie din RO local: EEST=UTC+3 vară, EET=UTC+2 iarnă; întreabă user-ul direct dacă nu e clar) - `instrument` — `DIA` / `US30` / `other` - `directie` — `Buy` / `Sell` - `tf_mare` — `5min` / `15min` - `tf_mic` — `1min` / `3min` - `calitate` — `Clară` / `Mai mare ca impuls` / `Slabă` / `n/a` - `entry`, `sl`, `tp0`, `tp1`, `tp2` — float-uri - `risc_pct` — float (ex: `0.12` pentru 0.12%) - `outcome_path` — `SL` / `TP0→SL` / `TP0→TP1` / `TP0→TP2` / `TP0→pending` / `pending` (UNICODE `→`) - `max_reached` — `SL_first` / `TP0` / `TP1` / `TP2` - `be_moved` — `true` / `false` - `confidence` — default `high` (manual e by definition high) - `note` — string opțional, default `""` `screenshot_file` se setează automat la `basename`; `ambiguities` se setează automat la `[]`. Dacă user-ul dă valoare invalidă, repetă întrebarea. 3. **Construiește JSON-ul** complet, valid contra `M2DExtraction`. 4. **Scrie JSON-ul** la `data/extractions/.manual.json` — pretty-print indent 2, UTF-8, newline final. Sufixul `.manual` previne coliziunea cu output-ul vision (`.json`). 5. **Determină source**: `manual_calibration` dacă `--calibration` e prezent, altfel `manual`. 6. **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/.manual.json'), source=''); print(json.dumps(r, default=str))" ``` Parsezi răspunsul JSON. 7. **Dacă `status == "ok"`**: ```bash python -m scripts.regenerate_md ``` Apoi afișezi: ``` ✅ Trade adăugat la jurnal. ID: . Set: . P/L Marius: . outcome_path: . ``` 8. **Dacă `status == "rejected"`**: ``` ❌ Trade respins: ``` NU regenera MD. Dacă `reason` conține "duplicate": - pentru `--calibration`: spui user-ului că există deja rând `manual_calibration` pentru acest screenshot; nu poți avea două leg-uri manual de calibrare pe același screenshot. - pentru `source=manual` simplu: user-ul decide dacă suprascrie (atunci șterge manual rândul din `data/jurnal.csv` și re-rulează). ## Reguli - NU edita CSV direct — folosește `append_extraction`. - NU regenera MD dacă append-ul a fost respins. ## Output skeleton 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": "" } ```