# Market Watch - Multiplayer GARP Paper Trading Simulator

Multiplayer paper trading simulator implementing a **Growth at a Reasonable Price (GARP)** strategy. Compete against Case (AI) and other players.

## How It Works

- **Create or join a game** with configurable starting cash
- **Trade manually** via the web portal or Telegram
- **Case (AI)** trades autonomously using the GARP strategy
- **Leaderboard** tracks who's winning by % return

## GARP Filter Criteria

| Metric | Threshold |
|--------|-----------|
| Revenue Growth | ≥ 10% |
| Trailing P/E | < 25 |
| Forward P/E | < 15 |
| PEG Ratio | < 1.2 (if available) |
| EPS Growth | > 15% |
| ROE | > 5% |
| Quick Ratio | > 1.5 (if available) |
| Debt/Equity | < 35% (if available) |
| Market Cap | > $5B |

### Case's Trading Rules
- **Buy:** GARP filter pass + RSI < 70 + not within 2% of 52wk high + max 10% per position + max 15 positions
- **Sell:** Fails GARP rescan OR 10% trailing stop-loss OR RSI > 80
- **Universe:** S&P 500 + S&P 400 MidCap (~900 stocks)

## Architecture

| File | Description |
|------|-------------|
| `game_engine.py` | Multiplayer game/player/portfolio engine |
| `scanner.py` | GARP scanner across S&P 500 + 400 |
| `trader.py` | Case's autonomous trading logic |
| `run_daily.py` | Daily orchestrator (scan → trade → snapshot → alert) |
| `portfolio.py` | Backward-compatible wrapper for single-player |
| `portal/server.py` | Web dashboard with multiplayer UI |

### Data Structure
```
data/games/{game_id}/
├── game.json                    # Game config, players, rules
└── players/{username}/
    ├── portfolio.json           # Current positions & cash
    ├── trades.json              # Trade history
    └── snapshots.json           # Daily value snapshots
```

## Web Portal

**URL:** http://marketwatch.local (or http://localhost:8889)

- **Home:** List of games, create new game
- **Game page:** Leaderboard, join game
- **Player page:** Portfolio, trade form, performance chart, trade history

### API Endpoints

| Method | Endpoint | Description |
|--------|----------|-------------|
| POST | `/api/games` | Create game (form: name, starting_cash, end_date) |
| POST | `/api/games/{id}/join` | Join game (form: username) |
| POST | `/api/games/{id}/players/{user}/trade` | Trade (form: action, ticker, shares) |
| GET | `/api/games/{id}/leaderboard` | Get leaderboard JSON |
| GET | `/api/games/{id}/players/{user}/portfolio` | Get portfolio JSON |

## Systemd Services

| Service | Schedule |
|---------|----------|
| `market-watch.timer` | Mon-Fri 9:00 AM + 3:30 PM CST |
| `market-watch-portal.service` | Always running (port 8889) |

```bash
systemctl --user status market-watch.timer
systemctl --user status market-watch-portal
journalctl --user -u market-watch -f
```

## Telegram

Players can trade via: `buy AAPL 10` or `sell BAC 50`
Daily summaries with leaderboard sent automatically.
