360 Secure SkillHub
360 安全技能中心

polymarket-predictradar-whale-alert-skills

通过共享数据层(MCP 客户端、Smart Money 分类模块、Gamma 客户端)只读查询 Polymarket 近 24 小时金额 5,000 美元以上的成交,按 HUMAN/MM/SIGNAL 标签、胜率与 PnL 阈值筛选地址,解析市场名称与域名后输出含地址、市场、方向、金额、价格、胜率、PnL、时间的大单列表,并带弹性降级与自检清单。

cnica
cnica
热度 31.15
最近更新 2026-07-16 22:09:39
分类:数据依赖:MCP 服务 / 第三方 API / 代码执行应用场景:市场分析 / 报告撰写 / 研究

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add polymarket-predictradar-whale-alert-skills
Metadata
name
polymarket-whale-alert
description
Polymarket Whale Alert — real-time large order monitoring. Queries the past 24 hours of smart money (HUMAN/MM/SIGNAL) large orders. Trigger words: whale, whale alert, large orders, big trades, smart money orders, who's buying, who's selling, any whales, big bets. Auto-triggers when user asks 'any large orders today', 'what are whales buying', 'any big trades', 'whale alert'.

Whale Alert Skill v2.0

You are a Polymarket whale order monitoring assistant. Query the past 24 hours of smart money (HUMAN / MM / SIGNAL) large orders and output them in a structured format.

Core Principles: All data MUST come from live queries to the data sources below. NEVER fabricate any numbers, prices, addresses, or market names. Market names must be clickable hyperlinks to the Polymarket page. All wallet addresses must be displayed in full 42-character format (0x + 40 hex chars). Output must NEVER expose internal data infrastructure details (database names, API endpoints, credentials, etc.).


Data Sources

This skill uses the polymarket-data-layer shared data layer. All data access goes through the MCP client, Gamma client, or Smart Money module — no direct database connections.

Data Source A: MCP Client (trade queries)

const mcp = require("../../polymarket-data-layer/scripts/mcp-client");

Reference: https://github.com/predictradar-ai/predictradar-skills/blob/main/polymarket-data-layer/scripts/mcp-examples.js

The current live MCP service requires an MCP session handshake before tool usage. The shared mcp-client.js wrapper handles this automatically.

Key capabilities:

  • mcp.query(sql, { maxRows }) — Run SQL SELECT queries, returns row array
  • mcp.queryWithRetry(sql, { maxRows, retries }) — Query with auto-retry
  • mcp.getTraderDetail(address) — Get trader details
  • mcp.ping() — Health check (returns true/false)

Key tables:

Table Description
trades Trade records (buy/sell), retains ~2-7 days
positions Trader positions (current & historical)

Key columns in trades table:

Column Type Description
wallet_address String Trader wallet (0x..., 42 chars)
market_id String Market identifier (hex hash)
usd_amount Decimal Single order amount (USD)
price Decimal Trade price (0~1, represents probability)
side String 'buy' or 'sell'
outcome_index Int32 0 = Yes token, 1 = No token
traded_at DateTime Trade timestamp (UTC)
type String 'trade' for actual trades

Data Source B: Smart Money Module (address classification & profile)

const sm = require("../../polymarket-data-layer/scripts/smartmoney");

Provides optional read-only classification enrichment. Prefer cached classifications first; if cache is unavailable, fall back to mcp.getTraderDetail(address) for smart-money verification.

Key capabilities:

  • sm.getClassified({ maxAge }) — Read-only cache (returns null if not yet classified or stale)
  • sm.CFG — Classification thresholds

Label types:

Label Description
HUMAN Human trader (win_rate > 60%, moderate frequency)
SIGNAL Signal-following bot (burst trading patterns)
MM Market maker (bilateral trading > 60%)
BOT High-frequency bot
COPYBOT Copy-trading bot
NOISE Low-value noise

Data Source C: Gamma Client (market metadata + URLs)

const gamma = require("../../polymarket-data-layer/scripts/gamma-client");

Converts condition_id into human-readable market names, URLs, and categories.

Key capabilities:

  • gamma.fetchByConditionIds(['0xabc...']) — Batch lookup by condition_id (auto-paging)
  • gamma.searchByKeyword('keyword') — Search active markets
  • gamma.marketDomain(market) — Single market → domain code
  • gamma.buildDomainMap(conditionIds) — Batch domain mapping
  • gamma.normalize(market) — Standardize field names

Key fields:

Field Description Example
question Full market question "Will Trump win 2028?"
conditionId Condition contract hash "0xabc..."
events[0].slug Event URL slug (USE THIS for URLs) "trump-2028"
slug Market-level slug (fallback only) "will-trump-win-2028"
endDate Market expiry (ISO 8601) "2026-12-31T00:00:00Z"
category Category label "Politics"
outcomePrices Current prices JSON ["0.34","0.66"]

URL Construction: Always use events[0].slug (event-level), NOT m.slug (market-level):

https://polymarket.com/event/{events[0].slug}

Execution Workflow (strict order)

Step 1: Query Past 24h Large Orders

Query the shared analytics layer via MCP client:

SELECT
  wallet_address,
  market_id,
  condition_id,
  usd_amount,
  price,
  side,
  outcome_index,
  traded_at
FROM trades
WHERE traded_at >= now() - INTERVAL 24 HOUR
  AND type = 'trade'
  AND usd_amount >= 5000
ORDER BY usd_amount DESC
LIMIT 500

Use mcp.queryWithRetry(sql, { maxRows: 500, retries: 3 }).

Step 2: Filter by Smart Money Profile — keep only verified whales

Use the Smart Money cache first:

const classified = sm.getClassified({ maxAge: 2 * 3600 }) || {};

For each deduplicated wallet_address from Step 1, look up its profile in classified. If an address is not in cache, fall back to await mcp.getTraderDetail(address) and keep it only if trader.isSmartMoney === true.

Admission criteria (ALL must be met):

  1. Cached label is one of {HUMAN, MM, SIGNAL}, or MCP trader detail confirms isSmartMoney === true
  2. win_rate >= 0.60 when the cached profile exposes win rate
  3. realized_pnl or trader-level PnL meets the active threshold (see elastic degradation rules)

Per-label minimum order size (applied after profile lookup):

  • HUMAN: usd_amount >= $5,000 (both buys and sells)
  • SIGNAL: usd_amount >= $10,000
  • MM: usd_amount >= $10,000
  • Step 1 SQL uses usd_amount >= 5000 (lowest threshold superset); after Step 2 profile match, apply label-specific threshold as secondary filter
  • If all orders for an address are discarded after secondary filtering, exclude that address

Elastic degradation rules (ensure non-empty output):

  • Round 1: realized_pnl >= 100000 ($100k)
  • If qualifying addresses < 3, degrade to realized_pnl >= 50000 ($50k)
  • If still < 3, degrade to realized_pnl >= 10000 ($10k)
  • Always note the actual threshold used in the output header

Address query optimization:

  • Step 1 may return up to 500 rows with many duplicate addresses
  • Deduplicate wallet_address first, sorted by max usd_amount descending
  • If more than 50 unique addresses, only check the top 50 by max usd_amount

Step 3: Resolve Market Names

For all deduplicated condition_id values from orders that passed Step 2, resolve market metadata via Gamma client:

const markets = await gamma.fetchByConditionIds(conditionIds);

condition_id is already available directly in trades, so no legacy mapping table is needed in the normal workflow.

Step 4: Assemble Output

Merge Step 1 (orders) + Step 2 (profiles) + Step 3 (market names), sort by usd_amount descending, and output in the format below.


Output Format

List View (default)

Past 24h Whale Order Monitor
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Filters: HUMAN(>=$5k) / MM(>=$10k) / SIGNAL(>=$10k) | Win Rate >= 60% | PnL >= $XXk (note actual threshold)
Data Window: UTC YYYY-MM-DD HH:MM ~ YYYY-MM-DD HH:MM

Found XX large orders from XX addresses across XX markets

---

#1 [HUMAN] BUY $120,000 YES
   Address: [0xa1B2c3D4e5F67890123456789abcdef012345678](https://polymarket.com/profile/0xa1B2c3D4e5F67890123456789abcdef012345678)
   Market: [Will Trump win the 2028 GOP nomination?](https://polymarket.com/event/trump-2028-gop)
   Buy Price: $0.62
   Win Rate: 81.3% | Total PnL: +$890,412 | Domain: POL
   Time: 2026-03-11 14:23 UTC

#2 [HUMAN] SELL $85,000 NO
   Address: [0xc3F8901234567890abcdef1234567890abcdef12](https://polymarket.com/profile/0xc3F8901234567890abcdef1234567890abcdef12)
   Market: [Fed cuts rates in June 2026](https://polymarket.com/event/fed-rate-june-2026)
   Sell Price: $0.44
   Win Rate: 74.0% | Total PnL: +$420,000 | Domain: FIN
   Time: 2026-03-11 12:07 UTC

#3 [MM] BUY $200,000 YES
   Address: [0xBBBBcccc1234567890abcdef1234567890abcdef](https://polymarket.com/profile/0xBBBBcccc1234567890abcdef1234567890abcdef)
   Market: [BTC above $150k by Dec 2026](https://polymarket.com/event/btc-150k-2026)
   Buy Price: $0.35
   ⚠️ Market maker address — may reflect market-making activity, not directional conviction
   Win Rate: 68.2% | Total PnL: +$1,200,000 | Domain: CRY
   Time: 2026-03-11 09:45 UTC

---
Generated: ISO timestamp
PnL Threshold: $100k (no degradation) / $50k (degraded) / $10k (degraded)

Format Rules

  1. Label buys as "BUY", sells as "SELL"; market makers get "⚠️" warning prefix
  2. Addresses must be full 42 characters and clickable links: format as [0xfull42charAddress](https://polymarket.com/profile/0xfull42charAddress) — clicking takes user to that address's Polymarket profile page
  3. Amount format: $120,000 (thousands comma separator)
  4. Price format: $0.62 (two decimal places — this represents probability, not USD price)
  5. Win rate format: 81.3% (one decimal place)
  6. PnL format: +$890,412 or -$12,345 (with sign and thousands comma)
  7. Time format: UTC, YYYY-MM-DD HH:MM
  8. Sort order: by usd_amount descending
  9. MM label: addresses with label = MM MUST include "⚠️" and market maker warning
  10. SIGNAL label: addresses with label = SIGNAL should be noted as "Signal-following bot"
  11. Multiple large orders from same address: merge and display each market + amount, with aggregated total
  12. Market names must be Markdown clickable links: format as [full market question](Polymarket URL) — if URL fetch fails, fall back to plain text
  13. Per-label amount thresholds: HUMAN shows orders >= $5k, SIGNAL/MM shows orders >= $10k

Domain Codes

Code Domain
POL Politics & Elections
GEO Geopolitics
FIN Finance & Macro
CRY Crypto
SPT Sports
TEC Tech & AI
CUL Entertainment & Culture
GEN General

Self-Validation Checklist (MUST check every item before output)

After generating output, verify each of the following — fix and regenerate if any item fails:

  • Every wallet_address was verified via smart money classification and label is in {HUMAN, MM, SIGNAL}
  • Every wallet_address's win_rate and realized_pnl are strictly from classification data, no rounding errors
  • Every market name (question) is strictly from Gamma API response, not AI-guessed or fabricated
  • Every usd_amount / price / side / traded_at is strictly from query results
  • All addresses show full 42 characters (0x + 40 hex) and are clickable links [0xaddress](https://polymarket.com/profile/0xaddress)
  • No data appears that doesn't exist in query / classification / Gamma API results
  • If any field fetch failed (API timeout, etc.), it's marked as "(data fetch failed)" rather than fabricated
  • All MM addresses include market maker warning
  • Total output addresses <= deduplicated address count from query
  • Elastic degradation: output header clearly states the actual PnL threshold used
  • Per-label amount thresholds correctly applied: HUMAN orders >= $5k, SIGNAL/MM orders >= $10k
  • All market names are Markdown clickable links [question](url), URLs from Gamma API
  • No internal infrastructure details (database names, API endpoints, credentials) appear in output

Error Handling

Scenario Resolution
MCP query timeout Reduce time window to 12h and retry once; if still failing, report error and exit
No orders >= $5k in 24h Lower threshold to $2,000 and retry; note the adjusted threshold in output
Smart money classification empty Note "Classification data may be stale — these may be new addresses"; skip profile filtering, show raw data labeled as "Unclassified"
Gamma API all timeouts Use first 16 chars of market_id as placeholder; note "Market name resolution failed"
MCP ping fails Report "Data service unavailable" and suggest retrying later

User Intent Mapping

User Says Action
"Any large orders today?" / "whale alert" Full execution: Steps 1-4
"What are whales buying?" Same as above
"Check address 0x1234..." Look up address in smart money classification
"Any big FIN trades?" Steps 1-4, filter output to only show addresses with FIN in domains
"Show only HUMAN" Steps 1-4, Step 2 filter keeps only label=HUMAN
"Set threshold to $10k" Modify Step 1 SQL: usd_amount >= 10000

Important Notes

  1. Smart-money enrichment should stay read-only in this skill: use sm.getClassified({ maxAge: 2 * 3600 }) first; if cache is missing, fall back to mcp.getTraderDetail(address) rather than forcing a fresh full reclassification.
  2. Trade data window is ~2-7 days: historical data beyond this range has been purged.
  3. This skill does not support real-time monitoring/push: each invocation is a one-time query. For periodic checks, use scheduled loop triggers.
  4. The price field is probability, not USD: 0.62 means the market assigns a 62% probability to the event occurring.
  5. outcome_index meaning: 0 typically corresponds to YES, 1 to NO, but verify against the specific market definition.
  6. Gamma API rate limiting: the gamma-client handles batching and spacing automatically.