Install
openclaw skills install @simmer/polymarket-signal-sniperMonitor RSS feeds for news that may move Polymarket markets, configure custom signal sources and keywords, and get article + market pairs with safeguard warnings. Never trades; your agent decides whether and how to trade.
openclaw skills install @simmer/polymarket-signal-sniperYour signals, Simmer's market safeguards, your agent's judgment.
🚨 The skill never trades. It hands your agent article + market pairs. Your agent decides whether the article bears on the market, which side, and how much. Read DISCLAIMER.md before your agent trades with real funds.
This is a template. The default signal source is RSS feeds. Remix it with any data source (APIs, webhooks, social media, custom scrapers). The skill handles the plumbing (feed polling, market matching, safeguards, dedup). Your agent provides the judgment.
Changed in 2.0.0: earlier versions guessed the trade side from keyword sentiment and could place orders with --live. Keyword sentiment cannot tell whether a headline is about a market, so that path is gone. --live, --dry-run and --scan-only are still accepted so old cron lines keep working, but they have no effect.
When user asks to install or configure this skill:
Install the Simmer SDK
pip install simmer-sdk
Ask for Simmer API key
SIMMER_API_KEYThe skill needs no wallet key, because it never trades. If your agent will act on signals, set up trading separately with the simmer-wallet-setup skill.
User provides RSS feed and market directly:
User: "Watch this RSS feed for greenland news: https://news.google.com/rss/search?q=greenland"
User: "Tell me about any trump news from this feed that could move my markets"
→ Run with --feed, --market and --json:
python signal_sniper.py --feed "https://news.google.com/rss/search?q=greenland" --market "greenland-acquisition" --json
For recurring scans, configure via environment:
| Setting | Environment Variable | Default | Description |
|---|---|---|---|
| RSS Feeds | SIMMER_SNIPER_FEEDS | (none) | Comma-separated RSS URLs |
| Markets | SIMMER_SNIPER_MARKETS | (auto) | Comma-separated market IDs (auto-discovers from keywords if empty) |
| Keywords | SIMMER_SNIPER_KEYWORDS | (none) | Comma-separated keywords to match |
Each cycle the script:
--jsonIt places no trades and changes nothing on your wallet or account. (If OWS_WALLET is set, the SDK still looks the wallet up at startup, so a stale wallet name stops the scan.)
Run a scan:
python signal_sniper.py
Get signals as JSON for your agent (logs go to stderr, JSON to stdout):
python signal_sniper.py --json
View current config:
python signal_sniper.py --config
Override for one run:
python signal_sniper.py --feed "https://..." --keywords "trump,greenland" --market "abc123"
Show processed articles:
python signal_sniper.py --history
{
"signals": [
{
"article": {"title": "...", "url": "...", "summary": "...", "published": "..."},
"market": {"id": "...", "question": "...", "resolution_criteria": "...",
"current_price": 0.42, "time_to_resolution": "5d 3h"},
"warnings": ["Moderate slippage (11.0%)"]
}
],
"error": null
}
A pair means the article matched a keyword (every article matches when no keywords are set) and the market passed the safeguards. It does not mean the article is about the market.
The warnings list on each signal comes from the market's context:
| Warning | Action |
|---|---|
Market resolves in Xh - elevated risk | Consider if signal is timely enough |
Mild flip-flop warning | Proceed carefully, need strong signal |
High slippage / Moderate slippage | Reduce position size or skip |
Edge ... below threshold | The market may already reflect this |
Markets that are resolved, resolve within 2 hours, have a severe flip-flop warning or a spread above 10% are dropped before pairing.
For each signal, your agent should:
Read the headline and summary. What is the actual news?
Check resolution_criteria. What ACTUALLY resolves this market?
Ask whether it is priced in. Compare published with recent price movement. News on a public RSS feed has often moved the price already.
Only trade if the article bears on the resolution criteria, it is not priced in, and no warning argues against it. If it trades, pass source="sdk:signalsniper" so the trade is attributed to this skill:
client.trade(market_id=..., side="yes", amount=10.0, source="sdk:signalsniper",
skill_slug="polymarket-signal-sniper")
User: "Set up news sniping for the Greenland market" → Ask for RSS feeds they want to monitor → Configure with market ID and keywords → Enable cron for recurring scans, and read the JSON each run
User: "Check this feed for trading signals"
→ Run: python signal_sniper.py --feed "URL" --json
→ Assess each pair and report the ones that bear on resolution
User: "Snipe any bitcoin news from CoinDesk" → Run with CoinDesk RSS and bitcoin-related markets → Show relevant pairs and ask if they want to trade
User: "What signals have we processed?"
→ Run: python signal_sniper.py --history
→ Show recent articles and the markets they were paired with
1. RSS poll finds: "Trump and Denmark reach preliminary Greenland agreement"
2. Keywords match: "greenland", "trump"
3. Market "greenland-acquisition-2027" passes safeguards → signal emitted
4. Agent reads resolution criteria: "Resolves YES if US formally acquires Greenland by 2027"
5. Agent's view: "preliminary agreement" ≠ "formally acquires"; price already up 4% today
6. Agent decides: no trade, report to user
"No feeds configured"
SIMMER_SNIPER_FEEDS environment variable"No matching articles found"
"Skipping: safeguards failed"
"Already processed"
"--live has no effect"
Tips for choosing signal sources:
https://news.google.com/rss/search?q=YOUR_TOPICThe skill works best when: