Files
atm-backtesting/.claude/commands/m2d-log.md

3.7 KiB

description, argument-hint
description argument-hint
Adaugă manual un rând în jurnal.csv (source=manual sau manual_calibration). Pentru calibrare P4 sau forward paper. [--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:

    • dataYYYY-MM-DD
    • ora_utcHH:MM (conversie din RO local: EEST=UTC+3 vară, EET=UTC+2 iarnă; întreabă user-ul direct dacă nu e clar)
    • instrumentDIA / US30 / other
    • directieBuy / Sell
    • tf_mare5min / 15min
    • tf_mic1min / 3min
    • calitateClară / Mai mare ca impuls / Slabă / n/a
    • entry, sl, tp0, tp1, tp2 — float-uri
    • risc_pct — float (ex: 0.12 pentru 0.12%)
    • outcome_pathSL / TP0→SL / TP0→TP1 / TP0→TP2 / TP0→pending / pending (UNICODE )
    • max_reachedSL_first / TP0 / TP1 / TP2
    • be_movedtrue / 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:

    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":

    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

{
  "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": ""
}