Files
atm/docs/swirling-drifting-starfish.md
Claude Agent 9207197a56 initial: scaffold atm trading monitor (Faza 1)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:03:36 +00:00

6.8 KiB

Plan: ATM — Automated Trading Monitor (M2D, Faza 1)

Context

User tranzacționează manual strategia M2D pe DIA (TradeStation) cu execuție pe TradeLocker US30 CFD (cont prop firm). Aceeași strategie merge și pe GLD → XAUUSD. 4 ore/seară trebuie să urmărească 2 ecrane. Obiectiv Faza 1: bot detectează automat trigger-ul și trimite notificare Telegram/Discord cu screenshot + nivele SL/TP1/TP2, user execută manual în TradeLocker. Faza 2 (auto-execution) deferată până prop firm TOS verificat + Faza 1 dovedită.

Design doc complet salvat la ~/.gstack/projects/romfast-workspace/claude-master-design-20260415-atm-trading.md (include strategia M2D cu toate detaliile).

Approach: B — Structured Python service + dry-run + audit log

Rulează pe aceeași mașină Windows cu TradeStation. ROI color sampling pe strip-ul M2D MAPS, state machine pentru secvența 3-dot, notifier abstraction (Discord/Telegram), calibration Tkinter, dry-run pe screenshot-uri salvate.

Files to Create

  • /workspace/atm/pyproject.toml — packaging, deps: mss, opencv-python, numpy, requests, pygetwindow, tomli
  • /workspace/atm/config.toml — populat de calibration tool (ROI coords, culori referință + toleranțe, y-axis scale)
  • /workspace/atm/src/atm/detector.py — screenshot loop + color classification + state machine 3-dot
  • /workspace/atm/src/atm/levels.py — extragere SL/TP1/TP2 din liniile orizontale (pixel y → preț)
  • /workspace/atm/src/atm/notifier/__init__.py — interface Notifier.send(signal, screenshot, levels)
  • /workspace/atm/src/atm/notifier/discord.py — webhook POST
  • /workspace/atm/src/atm/notifier/telegram.py — bot API
  • /workspace/atm/src/atm/audit.py — JSONL logger, fiecare ciclu
  • /workspace/atm/src/atm/calibrate.py — Tkinter UI: click pe dot → capture RGB + tolerance; click pe colț ROI → salvează; click pe 2 puncte pe axa Y cu prețurile → calibrare scale
  • /workspace/atm/src/atm/dryrun.py — replay detector pe folder de screenshot-uri
  • /workspace/atm/src/atm/main.py — orchestration, CLI (atm run, atm calibrate, atm dryrun <dir>)
  • /workspace/atm/samples/ — director screenshot-uri pentru dry-run corpus
  • /workspace/atm/logs/ — director JSONL audit
  • /workspace/atm/README.md — setup + calibration workflow

Build Order

  1. pyproject.toml + scaffold packagepip install -e ., atm --help funcționează.
  2. Script standalone de capture samples (înainte de orice logică) — rulezi în timpul următoarelor sesiuni trading, dump screenshot la 5s interval în samples/. Ai corpus pentru dry-run.
  3. calibrate.py — fără config calibrat, nimic nu merge. Tkinter cu: pas 1 (select TradeStation window by title), pas 2 (click pe colțuri ROI M2D MAPS), pas 3 (click pe fiecare culoare: turquoise, verde închis, verde deschis, galben, roșu închis, roșu deschis + gri neutru; capturează RGB + rază de toleranță implicită 20), pas 4 (2 click-uri pe axa Y + valori preț introduse → scale factor pixel→preț). Salvează config.toml.
  4. detector.py — loop 1s: locate window, screenshot ROI, sample rightmost 5 dots pe pozițiile calibrate, clasifică fiecare la cea mai apropiată culoare (Euclidean in RGB cu toleranță). Rolling window ultimele 10 clasificări + timestamp. State machine: ultimele 3 non-gri consecutive = secvență BUY sau SELL? Fire o dată pe trigger (dedup set cu TTL 10min).
  5. levels.py — după trigger, scan chart region pentru liniile orizontale roșii (SL) și verzi (TP1/TP2). Extrage y-pixel al fiecărei linii, convertește la preț folosind scale-ul calibrat.
  6. notifier/discord.py — POST multipart cu screenshot adnotat + mesaj formatat: 🟢 BUY DIA→US30 | SL: 484.35 | TP1: 485.20 | TP2: 485.90 | 22:47:03.
  7. dryrun.py — iterează samples/, rulează detector, printează ce AR fi trimis. Validare logică detecție înainte de live.
  8. audit.py — wrap detector loop, scrie JSONL: {ts, window_found, roi_ok, dots:[...], classification:[...], trigger:null|"BUY"|"SELL", notified:true|false, reason}.
  9. main.py — CLI unificat. atm calibrate, atm dryrun ./samples, atm run (loop live cu audit).
  10. Windows Task Scheduler — 2 task-uri: start 16:30 (stop 18:30), start 21:00 (stop 23:00). atm run --duration 2h.
  11. notifier/telegram.py — opțional după ce Discord e stabil.

Existing Utilities to Reuse

N/A — greenfield project. No internal utilities to reuse.

Verification

End-to-end, în ordinea din build:

  1. Calibration workflow: atm calibrate → urmezi pașii → rezultă config.toml complet. Verifică manual că RGB-urile sunt plauzibile pentru culorile descrise.
  2. Dry-run corpus: ai ≥20 screenshot-uri din sesiuni reale în samples/. Rulezi atm dryrun ./samples → output per screenshot: clasificare + decizie trigger. Manual verifici că cazurile unde ai văzut tu semnal reali → trigger; cazurile neutre → no-trigger. False-positives = 0 țintă, false-negatives ≤ 5%.
  3. Live test notification-only (2 sesiuni): atm run în fereastra trading. Verifici:
    • Notificările Discord apar în 3s de când vezi trigger-ul pe chart.
    • Screenshot atașat e clar, lizibil.
    • SL/TP1/TP2 extrase sunt la ≤$0.05 de nivelele reale pe chart.
    • Audit log (logs/YYYY-MM-DD.jsonl) conține fiecare ciclu; poți reproduce un missed signal.
  4. Sanity alerts: mută/redimensionează fereastra TradeStation → bot detectează "window lost" în 60s → notificare. Restabilește fereastra → bot reia.
  5. Scheduler validation: Windows Task Scheduler pornește atm run la 16:30, se oprește curat la 18:30, audit log salvează fără corupere.

Risk Register

  • Prop firm TOS (Faza 2 blocker, NU Faza 1): înainte de orice extensie spre auto-execution în TradeLocker, citești TOS-ul prop-ului, cauți "EA / automation / bot / copy trading / external signals". Dacă e interzis, Faza 2 e moartă și rămâi permanent pe Faza 1.
  • Indicator layout change: dacă TradeStation update schimbă render-ul M2D MAPS → re-calibration. Audit log va arăta degradare graduală a confidence-ului → alert activ via "bot lost sight".
  • Price divergence DIA↔US30: trigger-ul se dă pe DIA; poate fi o secundă unde US30 deja a mișcat diferit. Risc acceptabil (judgment user), dar monitorizat în Faza 2 prin slippage analysis.
  • Screenshot pe ecran sharing / AnyDesk / RDP: dacă cineva se conectează remote la Windows-ul tău în timpul trading, screenshot-urile pot cuprinde overlay-uri nepotrivite. Mic, dar notabil.

Out of Scope (Faza 1)

  • Orice click automat în TradeLocker
  • Multi-symbol concurrent monitoring (single chart la un moment dat)
  • Backtesting pe date istorice (strategia e deja validată manual)
  • UI / dashboard web — totul rulează headless cu notificări externe