Install
openclaw skills install polymarket-weather-high-temp-sniperAutomated trader for Polymarket weather highest temperature markets. Uses Simmer SDK's importable endpoint for market discovery and trades only during local...
openclaw skills install polymarket-weather-high-temp-sniperAutomated trading bot for Polymarket weather markets focusing on "highest temperature" predictions. Uses Simmer SDK's modern market discovery workflow to find and import new weather markets, then executes trades during a specific time window.
/markets/importable endpoint to find new Polymarket weather markets/markets/check before importing to avoid duplicatesget_markets(import_source='polymarket', tags=['weather'])The bot runs a discovery phase every 6 hours to find new weather markets:
list_importable_markets(venue="polymarket", q="highest temperature")is_weather_market_question() heuristicscheck_market_exists()import_market() until quota is exhaustedAfter discovery, the bot fetches active weather markets:
markets = client.get_markets(
import_source="polymarket",
status="active",
max_hours_to_resolution=48
)
It then locally filters to only weather-related markets using the same heuristics.
For each weather market:
CITY_TZ_MAP)ENTRY_PRICE_THRESHOLDMAX_POSITION_USDplace_order(market_id, "buy", shares, price, slippage)sniper.state.jsonAll parameters are configurable via environment variables or via the OpenClaw automaton (--set flag):
| Parameter | Environment Variable | Default | Description |
|---|---|---|---|
entry_price_threshold | SIMMER_SNIPER2_ENTRY_PRICE_THRESHOLD | 0.35 (35%) | Minimum YES price to trigger a buy |
max_position_usd | SIMMER_SNIPER2_MAX_POSITION_USD | 2.50 | Maximum USD risk per trade |
shares_per_order | SIMMER_SNIPER2_SHARES | 5 | Number of YES shares per order (min 5 on Polymarket) |
slippage_tolerance | SIMMER_SNIPER2_SLIPPAGE | 0.15 (15%) | Maximum acceptable slippage |
scan_interval_seconds | SIMMER_SNIPER2_SCAN_INTERVAL | 300 (5 min) | How often to scan for opportunities |
fallback_at_local_10 | SIMMER_SNIPER2_FALLBACK_10AM | true | Enable 10:00-10:05 fallback window |
telegram_enabled | SIMMER_SNIPER2_TELEGRAM_ENABLED | false | Enable Telegram notifications |
telegram_chat_id | SIMMER_SNIPER2_TELEGRAM_CHAT_ID | "" | Your Telegram chat ID |
report_interval_seconds | SIMMER_SNIPER2_REPORT_INTERVAL | 240 (4 min) | How often to send periodic reports |
Via environment variable:
export SIMMER_SNIPER2_ENTRY_PRICE_THRESHOLD=0.40
export SIMMER_SNIPER2_MAX_POSITION_USD=5.00
Via command line (overrides config.json):
python sniper.py --set entry_price_threshold=0.40
python sniper.py --set max_position_usd=5.00
Via OpenClaw automaton (persistent tuning): The skill integrates with the Simmer Automaton — configuration changes via automaton are automatically persisted and synced.
cd polymarket-weather-high-temp-sniper-1
pip install -r requirements.txt
Create .env file in the skill folder:
# Required
SIMMER_API_KEY=your_simmer_api_key_here
# Optional (Telegram)
TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
TELEGRAM_CHAT_ID=123456789 # Your Telegram user ID
TELEGRAM_ENABLED=true
Or set environment variables directly in your shell/automaton config.
python sniper.py --test-telegram
This verifies bot token and sends a test message.
See what would be traded without executing:
python scripts/sniper.py
Execute real trades:
python scripts/sniper.py --live
The daemon will:
scan_interval_seconds)python scripts/sniper.py --positions
python scripts/sniper.py --config
python scripts/sniper.py --set entry_price_threshold=0.40
python scripts/sniper.py --set max_position_usd=5.00
python scripts/sniper.py --set scan_interval_seconds=180
Press Ctrl+C in the terminal where it's running. A shutdown notification will be sent via Telegram if enabled.
The skill stores its runtime state in sniper.state.json:
{
"date": "2025-01-15",
"traded_today": ["market_id_1", "market_id_2"],
"last_report_ts": 1705312345,
"last_discovery_ts": 1705312000
}
traded_today: List of markets already traded today (reset at midnight UTC)last_report_ts: Timestamp of last periodic reportlast_discovery_ts: Timestamp of last market discovery phaseThe bot auto-detects timezone from city names in the market question. It recognizes major cities worldwide (see CITY_TZ_MAP in the code). If a city is not recognized, the market is skipped.
The bot reads current_probability or external_price_yes from the Simmer market object. Prices are expressed as probabilities (0.0 - 1.0).
Only markets meeting these criteria are considered:
Simmer imposes daily import limits (typically ~10/day). The bot respects remaining quota and will skip discovery when exhausted.
Each trade costs: shares_per_order × price. The bot checks this ≤ max_position_usd before buying. Example: With max_position_usd=2.50, shares=5, and price 0.35, cost = 5 × 0.35 = $1.75 ✅.
Polymarket requires a minimum of 5 shares per order. The default shares_per_order=5 satisfies this constraint.
Set your API key in .env or environment. Get it from simmer.markets/dashboard → SDK tab.
Test with --test-telegram. Verify:
TELEGRAM_BOT_TOKEN is correct (format: 123456:ABC-DEF...)/start to your bot in Telegram)TELEGRAM_CHAT_ID is your numeric user ID (not username)entry_price_threshold (default 35%)shares × price) ≤ max_position_usdThe bot will log when daily import quota (10/day) is exhausted. Wait for the next UTC day or request quota increase from Simmer.
Use --positions to fetch current positions. Ensure wallet is linked (bot attempts auto-link on first run).
For issues or feature requests, refer to the OpenClaw documentation or contact the skill author.