Install
openclaw skills install @diagnostikon/polymarket-bundle-overwatch-bo3-traderTrades structural arbitrage between Overwatch BO3 series winner markets and individual game winner markets on Polymarket. P(BO3 winner) must be mathematically consistent with P(Game 1 winner) and P(Game 2 winner) -- when it is not, individual game probabilities imply a different BO3 win probability than the market is pricing, creating a free edge that resolves mechanically.
openclaw skills install @diagnostikon/polymarket-bundle-overwatch-bo3-traderThis is a template. The default signal detects inconsistencies between Overwatch BO3 series winner markets and individual game winner markets. The skill handles all the plumbing (market parsing, match grouping, implied probability calculation, trade execution, safeguards). Your agent provides the alpha.
Polymarket lists Overwatch match markets in bundles: a BO3 series winner market ("Overwatch: Team A vs Team B (BO3)") alongside individual game winner markets ("Game 1 Winner", "Game 2 Winner", and sometimes "Game 3 Winner"). The BO3 winner probability is not independent of the individual game probabilities -- it is a mathematical function of them. When the market prices these inconsistently, the gap is a structural arbitrage that resolves mechanically as the series plays out.
The mathematical relationship is exact:
P(Team wins BO3) = p1*p2 + p1*(1-p2)*p3 + (1-p1)*p2*p3
Where p1, p2, p3 are the probabilities of the team winning Games 1, 2, and 3 respectively. If Game 3 data is unavailable, assume p3 = 0.5 (neutral).
This constraint must hold. When it does not:
Overwatch, OCS, OWL, Game 1 Winner, Game 2 Winner, BO3, Virtus.pro, Team Peps) with a get_markets(limit=200) fallbackMIN_VIOLATION (default 5%):
The skill defaults to paper trading (venue="sim"). Real trades only with --live flag.
| Scenario | Mode | Financial risk |
|---|---|---|
python trader.py | Paper (sim) | None |
| Cron / automaton | Paper (sim) | None |
python trader.py --live | Live (polymarket) | Real USDC |
autostart: false and cron: null mean nothing runs automatically until configured in Simmer UI.
| Variable | Required | Notes |
|---|---|---|
SIMMER_API_KEY | Yes | Trading authority. Treat as a high-value credential. |
All declared as tunables in clawhub.json and adjustable from the Simmer UI.
| Variable | Default | Purpose |
|---|---|---|
SIMMER_MAX_POSITION | 40 | Max USDC per trade at full conviction |
SIMMER_MIN_TRADE | 5 | Floor for any trade (min USDC regardless of conviction) |
SIMMER_MIN_VOLUME | 3000 | Min market volume filter (USD) |
SIMMER_MAX_SPREAD | 0.08 | Max bid-ask spread |
SIMMER_MIN_DAYS | 1 | Min days until resolution |
SIMMER_MAX_POSITIONS | 10 | Max concurrent open positions |
SIMMER_YES_THRESHOLD | 0.38 | Buy YES only if market probability <= this |
SIMMER_NO_THRESHOLD | 0.62 | Sell NO only if market probability >= this |
SIMMER_MIN_VIOLATION | 0.05 | Min implied-vs-actual BO3 probability gap to trigger a trade |
Overwatch BO3 series winner markets and individual game winner markets form a closed mathematical system. The probability of winning a best-of-3 series is a deterministic function of the probabilities of winning each individual game. When Polymarket prices these markets independently and the implied BO3 probability diverges from the actual BO3 market price, the gap is structural arbitrage. Resolution is mechanical: as each game is played, the BO3 price must converge to the value implied by game outcomes. This skill systematically detects and trades these cross-market inconsistencies.
simmer-sdk by Simmer Markets (SpartanLabsXyz)