100 lines
3.7 KiB
Markdown
100 lines
3.7 KiB
Markdown
---
|
|
description: Adaugă manual un rând în jurnal.csv (source=manual sau manual_calibration). Pentru calibrare P4 sau forward paper.
|
|
argument-hint: "[--calibration] <screenshot_path>"
|
|
---
|
|
|
|
# /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 `<screenshot_path>`. Dacă `<screenshot_path>` lipsește, întreabă user-ul. Calculează `basename = basename(<screenshot_path>)` ș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/<basename_no_ext>.manual.json` — pretty-print indent 2, UTF-8, newline final. Sufixul `.manual` previne coliziunea cu output-ul vision (`<basename_no_ext>.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/<basename_no_ext>.manual.json'), source='<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: <id>. Set: <set>. P/L Marius: <pl_marius>. outcome_path: <outcome_path>.
|
|
```
|
|
|
|
8. **Dacă `status == "rejected"`**:
|
|
|
|
```
|
|
❌ Trade respins: <reason>
|
|
```
|
|
|
|
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": ""
|
|
}
|
|
```
|