# Storyclaw Polymarket Trading

> Self-evolving Polymarket trading bot. Design strategy with user, run paper trading, auto-improve until edge target met, then ask to switch to live.

- Skill: `storyclaw-official/storyclaw-polymarket-trading` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add storyclaw-official/storyclaw-polymarket-trading`
- Raw SKILL.md: https://api.skillmd.com/api/skills/storyclaw-official/storyclaw-polymarket-trading/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: storyclaw-official (https://skillmd.com/u/storyclaw-official)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/storyclaw-official/storyclaw-polymarket-trading

---


# Polymarket Trading - Self-Evolving Trading Bot

Design a trading strategy with the user, run automated paper trading (dry-run), auto-improve parameters when underperforming, and ask permission to switch to live trading when edge target met.

Supports **any market type**: politics, sports, crypto prices, science, entertainment, etc.

## Critical Rules

1. NEVER default to any specific market — always ask user what they want to trade
2. NEVER show made-up prices or signals — only real script output
3. DRY RUN always on by default — only switch to live after explicit user confirmation
4. Auto-improve silently — adjust params and notify user
5. NEVER create a strategy or set up crons without explicit user confirmation

## Multi-User Support

Each user has their own `credentials/{USER_ID}.json`:

```json
{
  "private_key": "0x...",
  "funder_address": "0x...",
  "dry_run": true
}
```

Set `USER_ID` or `TELEGRAM_USER_ID` env var when calling scripts.

Or set `POLYMARKET_PRIVATE_KEY` env var.

## First-Time User Flow

### 1. Check credentials

```bash
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/polymarket.py check
```

If not configured, run interactive setup:

```bash
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/polymarket.py setup
```

### 2. Ask what they want to trade

Do NOT assume. Ask:

- What market type? (politics, sports, crypto, tech, etc.)
- Any specific keywords to focus on?

### 3. Propose strategy — WAIT FOR CONFIRMATION

Based on the conversation, derive and propose concrete values. Stop and wait for user to confirm before executing anything.

### 4. Create strategy (only after confirmation)

```bash
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/strategy_manager.py create --json '{
  "name": "<strategy name>",
  "market_filter": {
    "keywords": ["<keywords>"],
    "min_liquidity_usdc": 1000,
    "max_days_to_expiry": 30,
    "min_days_to_expiry": 1
  },
  "signal": {
    "method": "orderbook_imbalance",
    "params": { "threshold": 0.15, "max_entry_price": 0.60 }
  },
  "sizing": { "max_size_usdc": 5 },
  "targets": { "min_sample_size": 30, "min_edge": 0.05 }
}'
```

### 5. Set up crons

```bash
SKILL_PATH={baseDir}
STRATEGY_ID=<id from step 4>

# Signal scan: every 15 minutes
(crontab -l 2>/dev/null; echo "*/15 * * * * USER_ID=$TELEGRAM_USER_ID python3 $SKILL_PATH/scripts/signal_cron.py $STRATEGY_ID >> $SKILL_PATH/state/$TELEGRAM_USER_ID.$STRATEGY_ID.log 2>&1") | crontab -

# Performance review: daily at 09:00 UTC
(crontab -l 2>/dev/null; echo "0 9 * * * USER_ID=$TELEGRAM_USER_ID python3 $SKILL_PATH/scripts/review_cron.py $STRATEGY_ID >> $SKILL_PATH/state/$TELEGRAM_USER_ID.review.log 2>&1") | crontab -
```

## Strategy Lifecycle

```
dry_run → improving → pending_live → live
```

Go-live condition: `edge = win_rate - avg_entry_price >= min_edge` AND `total_pnl > 0`

## Strategy Management

```bash
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/strategy_manager.py status
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/strategy_manager.py review <strategy_id>
USER_ID=$TELEGRAM_USER_ID python3 {baseDir}/scripts/strategy_manager.py activate-live <strategy_id>
```

## Auto-Improvement Rules

| Condition                    | Action                                       |
| ---------------------------- | -------------------------------------------- |
| edge < min_edge - 10%        | Raise threshold (fewer but stronger signals) |
| edge < min_edge - 3%         | Lower max_entry_price (cheaper entries)      |
| 3+ adjustments still failing | Notify user to reconsider                    |
| edge >= min_edge AND pnl > 0 | Mark pending_live, notify user               |

## Signal Methods

| Method              | Best for                                |
| ------------------- | --------------------------------------- |
| orderbook_imbalance | Any liquid market with active orderbook |

New methods can be added to `scripts/signals.py`.

## Troubleshooting

| Error                        | Solution                                            |
| ---------------------------- | --------------------------------------------------- |
| py-clob-client not installed | `pip3 install py-clob-client`                       |
| USER_ID not set              | Add `USER_ID=xxx` prefix                            |
| No config found              | Run `python3 {baseDir}/scripts/polymarket.py setup` |
| API Error 401                | Re-run setup to re-derive keys                      |
| No markets found             | Broaden keywords or lower min_liquidity_usdc        |

## File Structure

```
polymarket-trading/
├── SKILL.md
├── scripts/
│   ├── strategy_manager.py   # Lifecycle: create/review/status/activate-live
│   ├── signal_cron.py        # Cron: scan markets, run signals, record trades
│   ├── review_cron.py        # Cron: daily review + auto-improve
│   ├── signals.py            # Pluggable signal methods
│   ├── market_scanner.py     # Gamma API market discovery
│   └── polymarket.py         # CLOB API primitives
├── credentials/
│   └── {USER_ID}.json
├── strategies/
│   └── {USER_ID}/{strategy_id}.json
└── state/
    └── {USER_ID}.{strategy_id}.perf.json
```

