AI AGENT SKILLS

Polymarket Mert Sniper

一个面向 Security 场景的 Agent 技能。原始说明:Near-expiry conviction trading on Polymarket. The skill scans markets in their final minutes, filters for strongly-skewed splits (60/40+), and places bounded...

SKILL.md

SKILL.md


name: polymarket-mert-sniper
description: Near-expiry conviction trading on Polymarket. The skill scans markets in their final minutes, filters for strongly-skewed splits (60/40+), and places bounded trades against the under-priced side. Defaults — $10 max per trade, 5 trades/run, dry-run unless --live.
metadata:
author: Simmer (@simmer_markets)
version: "1.3.2"
displayName: Mert Sniper
difficulty: advanced
attribution: Strategy inspired by @mert — https://x.com/mert/status/2020216613279060433


Mert Sniper

Near-expiry conviction trading on Polymarket. The skill scans markets in their final minutes of pricing, filters for strongly-skewed splits, and places bounded trades against the under-priced side.

🚨 Framework, not a production trading system. Read DISCLAIMER.md before connecting to a wallet with real funds. Dry-run is the default; --live is required for any real-USDC trade. Defaults: $10 max per trade, 60/40 split minimum, 2-minute expiry window, 5 trades per scan cycle — adjust deliberately before scaling.

This is a template. The default logic (expiry + split filter) is a starting point — remix it with your own filters, timing rules, or market selection criteria. The skill handles all the plumbing (market discovery, trade execution, safeguards). Your agent provides the alpha.

Strategy attribution: @mert — see source thread for the original methodology (topic filter, near-expiry timing, strong-split entry).

When to Use This Skill

Use this skill when the user wants to:

  • Trade markets that are about to resolve (last-minute conviction bets)
  • Filter by topic (e.g. only SOL/crypto markets)
  • Cap bet size (e.g. never more than $10)
  • Only trade when odds are strongly skewed (e.g. 60/40 or better)
  • Run an automated expiry-sniping strategy

Setup Flow

  1. Install the Simmer SDK
   pip install simmer-sdk
  1. Ask for Simmer API key
  • Get it from simmer.markets/dashboard -> SDK tab
  • Store in environment as SIMMER_API_KEY
  1. Ask for wallet private key (required for live trading)
  • This is the private key for their Polymarket wallet (the wallet that holds USDC)
  • Store in environment as WALLET_PRIVATE_KEY
  • The SDK uses this to sign orders client-side automatically — no manual signing needed
  1. Ask about settings (or confirm defaults)
  • Market filter: Which markets to scan (default: all)
  • Max bet: Maximum per trade (default $10)
  • Expiry window: How close to resolution (default 2 minutes)
  • Min split: Minimum odds skew (default 60/40)
  1. Save settings to config.json or environment variables

Configuration

| Setting | Environment Variable | Default | Description |
|---------|---------------------|---------|-------------|
| Market filter | SIMMER_MERT_FILTER | (all) | Tag or keyword filter (e.g. solana, crypto) |
| Max bet | SIMMER_MERT_MAX_BET_USD | 10.00 | Maximum USD per trade |
| Expiry window | SIMMER_MERT_EXPIRY_MINUTES | 2 | Only trade markets resolving within N minutes |
| Min split | SIMMER_MERT_MIN_SPLIT | 0.60 | Only trade when YES or NO >= this (e.g. 0.60 = 60/40) |
| Max trades/run | SIMMER_MERT_MAX_TRADES_PER_RUN | 5 | Maximum trades per scan cycle |
| Smart sizing % | SIMMER_MERT_SIZING_PCT | 0.05 | % of balance per trade |
| Fee buffer | SIMMER_MERT_FEE_BUFFER | 0.02 | Extra alpha required above entry fee; only applies when SIMMER_MERT_MIN_EDGE is set |
| Declared edge | SIMMER_MERT_MIN_EDGE | 0.00 | Your signal's claimed edge above market price (probability units). At 0 (default): fee is logged but gate is advisory only. Set to X to block trades where entry fee > X — e.g. 0.05 requires your signal to clear at least 5¢ above market after fees |

Quick Commands

# Check account balance and positions
python scripts/status.py

# Detailed position list
python scripts/status.py --positions

API Reference:

  • Base URL: https://api.simmer.markets
  • Auth: Authorization: Bearer $SIMMER_API_KEY
  • Portfolio: GET /api/sdk/portfolio
  • Positions: GET /api/sdk/positions

Running the Skill

# Dry run (default -- shows opportunities, no trades)
python mert_sniper.py

# Execute real trades
python mert_sniper.py --live

# Filter to specific markets
python mert_sniper.py --filter solana

# Custom expiry window (5 minutes)
python mert_sniper.py --expiry 5

# With smart position sizing (uses portfolio balance)
python mert_sniper.py --live --smart-sizing

# Check positions only
python mert_sniper.py --positions

# View config
python mert_sniper.py --config

# Disable safeguards (not recommended)
python mert_sniper.py --no-safeguards

How It Works

Each cycle the script:

  1. Fetches active markets from Simmer API (optionally filtered by tag/keyword)
  2. Filters to markets resolving within the expiry window (default 2 minutes)
  3. Checks the price split -- only trades when one side >= min_split (default 60%)
  4. Determines direction: backs the favored side (higher probability)
  5. Fee logging: prints entry-fee cost per market (POLY_FEE_RATE_CRYPTO × p × (1-p), entry only — redemption is free). If SIMMER_MERT_MIN_EDGE > 0, gates out markets where declared edge < entry fee + buffer
  6. Safeguards: Checks context for flip-flop warnings, slippage, market status
  7. Execution: Places trade on the favored side, capped at max bet
  8. Reports summary of scanned, filtered, and traded markets

Example Output

🎯 Mert Sniper - Near-Expiry Conviction Trading
==================================================

  [DRY RUN] No trades will be executed. Use --live to enable trading.

  Configuration:
  Filter:        solana
  Max bet:       $10.00
  Expiry window: 2 minutes
  Min split:     60/40
  Max trades:    5
  Smart sizing:  Disabled
  Safeguards:    Enabled

  Fetching markets (filter: solana)...
  Found 12 active markets

  Markets expiring within 2 minutes: 2

  SOL highest price on Feb 10?
     Resolves in: 1m 34s
     Split: YES 72% / NO 28%
     Side: YES (72% >= 60%)
     [DRY RUN] Would buy $10.00 on YES

  Summary:
  Markets scanned: 12
  Near expiry:     2
  Strong split:    1
  Trades executed: 0

  [DRY RUN MODE - no real trades executed]

Troubleshooting

"No markets found"

  • Check your filter -- try without a filter first
  • Markets may not be available (check simmer.markets)

"No markets expiring within window"

  • Increase expiry window: --expiry 10 (10 minutes)
  • Or run more frequently (cron every minute)

"Split too narrow"

  • Lower the min split: --set min_split=0.55
  • This trades more often but with less conviction

"Resolves in: 17h" on 15-min markets

  • Polymarket's endDate is the event-level end-of-day, not the individual market close time
  • For 15-min crypto markets (e.g. "BTC Up or Down - Feb 8, 11PM ET"), the actual close time is in the question text but not in the API
  • This is a Polymarket data limitation — widen the expiry window (--expiry 1080) as a workaround, or use the split filter to find conviction opportunities regardless of timing

"External wallet requires a pre-signed order"

  • WALLET_PRIVATE_KEY is not set in the environment
  • The SDK signs orders automatically when this env var is present — no manual signing code needed
  • Fix: export WALLET_PRIVATE_KEY=0x<your-polymarket-wallet-private-key>
  • Do NOT attempt to sign orders manually or modify the skill code — the SDK handles it

"Balance shows $0 but I have funds on Polygon"

  • Polymarket V2 (live 2026-04-28) uses pUSD (PolyUSD, 1:1 backed by USDC.e). If your wallet holds USDC.e, migrate at simmer.markets/dashboard with one click (~30s)
  • If you bridged native USDC (Circle), swap to USDC.e first, then migrate to pUSD
  • Full migration guide: docs.simmer.markets/v2-migration

"API key invalid"

  • Get new key from simmer.markets/dashboard -> SDK tab