Mirror positions from top Polymarket traders using Simmer API. Size-weighted aggregation across multiple wallets.
Mirror positions from successful Polymarket traders using the Simmer SDK.
This is a template. The default logic mirrors whale wallets by size-weighted allocation — remix it with your own wallet selection criteria, position filters, or rebalancing rules. The skill handles all the plumbing (wallet fetching, conflict detection, trade execution). Your agent provides the alpha.
Use this skill when the user wants to:
# Check account balance and positions
python scripts/status.py
# Detailed position list
python scripts/status.py --positions
API Reference:
https://api.simmer.marketsAuthorization: Bearer $SIMMER_API_KEYGET /api/sdk/portfolioGET /api/sdk/positionsUser provides wallet(s) directly in chat:
User: "Copytrade this wallet: 0x1234...abcd"
User: "What positions does 0x5678...efgh have?"
User: "Follow these whales: 0xaaa..., 0xbbb..."
→ Run with --wallets flag:
python copytrading_trader.py --wallets 0x1234...abcd
python copytrading_trader.py --wallets 0xaaa...,0xbbb... --dry-run
This is the simplest way - no setup needed, just pass wallets directly.
For automated recurring scans, wallets can be saved in environment:
| Setting | Environment Variable | Default |
|---|---|---|
| Target wallets | SIMMER_COPYTRADING_WALLETS | (none) |
| Top N positions | SIMMER_COPYTRADING_TOP_N | auto |
| Max per position | SIMMER_COPYTRADING_MAX_USD | 50 |
| Max trades/run | SIMMER_COPYTRADING_MAX_TRADES | 10 |
Top N auto-calculation (when not specified):
Polymarket Constraints:
⚠️ Start Conservative: Begin with small amounts (
--max-usd 5-10) and--dry-runto understand how the skill behaves before scaling up.
By default, only buys execute. Pass
--rebalanceto also sell positions the whales have exited, or--whale-exitsto sell only on whale exits.
Each cycle the script:
Copytrading supports $SIM mode — mirror whale positions using simulated money on Simmer's LMSR markets. No wallet or USDC required.
# Paper trade with $SIM (explicit)
python copytrading_trader.py --venue sim --wallets 0x123... --live
# Auto-detect: if your account has no linked wallet, $SIM is used automatically
python copytrading_trader.py --wallets 0x123... --live
In $SIM mode:
sdk:copytrading)Run a scan (dry run by default — no trades):
python copytrading_trader.py
Execute real trades:
python copytrading_trader.py --live
Check positions only:
python copytrading_trader.py --positions
View current config:
python copytrading_trader.py --config
Override wallets for one run:
python copytrading_trader.py --wallets 0x123...,0x456...
Full rebalance mode (includes sells):
python copytrading_trader.py --rebalance
Sell when whales exit positions:
python copytrading_trader.py --whale-exits
After each run, message the user with:
Example output to share:
🐋 Copytrading Scan Complete
Configuration:
• Following 2 wallets
• Top 10 positions, max $50 each
• Balance: $250.00 USDC
Fetched positions:
• 0x1234...abcd: 15 positions
• 0x5678...efgh: 22 positions
• Combined: 28 unique markets
• Conflicts skipped: 2
Top 10 by allocation:
1. "Will BTC hit $100k?" - 18.5% → BUY YES
2. "Trump pardons X?" - 12.3% → BUY NO
3. "Fed rate cut Jan?" - 9.8% → Already held
...
Trades executed: 4 buys ($180 total)
• Bought 45 YES shares on "Will BTC hit $100k?" @ $0.82
• Bought 120 NO shares on "Trump pardons X?" @ $0.15
...
Next scan in 4 hours.
User: "Copytrade 0x1234...abcd"
→ Run: python copytrading_trader.py --wallets 0x1234...abcd
→ Report what positions that wallet has and what trades would execute
User: "What is 0x5678...efgh holding?"
→ Run: python copytrading_trader.py --wallets 0x5678...efgh --dry-run
→ Show their positions without trading
User: "Follow these wallets: 0xaaa..., 0xbbb..., 0xccc..."
→ Run: python copytrading_trader.py --wallets 0xaaa...,0xbbb...,0xccc...
→ Aggregate positions across all wallets, report results
User: "Copytrade this whale but only top 5 positions"
→ Run: python copytrading_trader.py --wallets 0x... --top-n 5
User: "How are my positions doing?"
→ Run: python copytrading_trader.py --positions
→ Show current Polymarket positions with P&L
User: "Show copytrading config"
→ Run: python copytrading_trader.py --config
→ Display current settings
User: "Sell positions that whales have exited"
→ Run: python copytrading_trader.py --whale-exits
→ Compares your positions to whales, sells any they've closed
User: "Do a full rebalance to match the whales"
→ Run: python copytrading_trader.py --rebalance
→ Includes both buys AND sells to match whale allocations
Common approaches:
The skill works best when:
When following multiple wallets, positions are scored by conviction:
max_usd)High-conviction positions are prioritized in Top N selection. Single-wallet positions still trade, but with reduced size. Using just 1 wallet disables conviction scoring (all positions get full sizing).
"Order too small" / "below minimum (5)"
--max-usd or reduce --top-n to concentrate into fewer positions"No wallets specified"
"Agent has no USDC balance"
--venue sim for $SIM paper trading"Conflict skipped"
"All N positions filtered (X conflicts, Y drifted, Z stale)"
"Insufficient balance"
"Market could not be imported"
"External wallet requires a pre-signed order"
WALLET_PRIVATE_KEY is not set in the environmentexport WALLET_PRIVATE_KEY=0x<your-polymarket-wallet-private-key>"Balance shows $0 but I have USDC on Polygon"
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) — not native USDC