怎样实时拿到一个 Polymarket 钱包的成交
在 Polymarket 交易者出手的同时看到他做了什么,有三种办法 —— 轮询 Polymarket 的 Data API、自己从 Polygon 链上读成交、或订阅推送 —— 以及每种办法的代价。
这里说的「实时」是什么意思
Polymarket 的成交在 Polygon 上结算,Polygon 大约每 1.5 秒出一个块。一笔成交进了块才算存在。对机器人来说,实时就是在一两个块之内看到它 —— 而且一笔都不能悄悄漏掉。
办法一:轮询 Polymarket 的 Data API
Polymarket 公开的 Data API 通过 REST 返回一个钱包的成交和活动。这是最简单的起点:查一个地址,过一会儿再查。代价随需求增长:你的延迟是轮询间隔加上 API 自己的索引延迟;每多跟一个钱包,循环里就多一个请求,很快碰到限流;而且每个请求只覆盖一个地址,一个人用好几个钱包,你就得把它们全找出来。
为什么 CLOB WebSocket 解决不了
Polymarket 的 CLOB WebSocket 有一个 market 频道,推送你指定市场的盘口变化和最新成交价 —— 但不说是谁成交的;还有一个 user 频道,需要你的 API 凭证,只覆盖你自己的订单。两个都不推送别人钱包的成交。
办法二:自己读链
Polymarket 的每一笔成交都会由它在 Polygon 上的某个交易所合约发出一个 OrderFilled 事件,写明挂单方和吃单方。从 Polygon 节点订阅这些日志,就能以出块的速度拿到每一笔成交。接下来要你自己负责的:分属两种事件格式的四个交易所合约、把每个吃单方和它的挂单方配对、把代理钱包解析到背后的交易者、链重组(新的链头必须对照主链核对)、把 token ID 映射到市场,以及保持节点连接不断。
办法三:订阅推送
PMWallets 替你做了办法二,把你关注的交易者的成交通过 WebSocket(尽力投递)或带签名的 Webhook(至少一次)推给你。每个 WebSocket 帧都带 session 和连续的序号,缺口一眼可见,缺的部分用 GET /v1/account/fills 补回来,event ID 不变。开源的 Node.js 与 Python SDK 处理重连、缺口检测、补发和去重:
import { PmwClient, FillStream, FileStateStore } from "pmwallets"; const pmw = new PmwClient({ apiKey: process.env.PMW_API_KEY! }); await pmw.subscribe({ entityId: "<handle or address>", channels: ["ws"] }); const stream = new FillStream({ client: pmw, store: new FileStateStore("./stream.json"), // a restart resumes where it stopped onFill: async (fill) => console.log(fill.side, fill.price, fill.shares, fill.tokenId), }); await stream.start();
该选哪个
只跟几个钱包、延迟几分钟无所谓:轮询 Data API。有基础设施团队、想要链上的一切:自己读日志。机器人必须在约一秒内看到所跟交易者的每一笔成交,并在掉线后把错过的补回来:用推送。从出块到推送的实测延迟实时公布在延迟页上。
常见问题
Polymarket 有能推送别人钱包成交的 WebSocket 吗?
截至 2026 年 10 月没有。CLOB WebSocket 的 market 频道按市场推送盘口和最新成交价,不写交易者;user 频道只覆盖你自己经过认证的订单。
Polymarket 的成交最快多久能看到?
成交进了 Polygon 区块才存在,大约每 1.5 秒一个块。PMWallets 推送所关注交易者的成交,通常在出块后一秒内;实测中位数和 p95 公布在延迟页上。
有获取 Polymarket 成交流的 Python 或 Node.js 库吗?
有:开源的 pmwallets SDK(npm install pmwallets、pip install pmwallets)通过 PMWallets WebSocket 推送你关注的交易者的成交,自带补发与去重。