SDK 与跟单机器人
官方开源(MIT)客户端,Node.js 与 Python 各一套;以及基于它们、开箱即用的 Polymarket 跟单机器人。
SDK 封装了 API 文档里的全部接口,并替你处理 WebSocket:断线重连与保活、按 session/seq 发现漏帧并从最后一笔已送达的成交补回、按 eventId 去重,游标落盘, 重启后从停下的地方续上。投递语义是至少一次:游标在你的回调返回之后才保存,两者之间崩溃的话, 重启会再交付一次那笔成交 —— 你的处理逻辑要按 eventId 做幂等。需要一把 API key,在 API key 页创建。
Node.js SDK
GitHub pmwallets-node,npm pmwallets。 Node.js ≥ 20,自带 TypeScript 类型。
npm install pmwallets
import { PmwClient, FillStream, FileStateStore, verifyWebhook } from 'pmwallets'; const pmw = new PmwClient({ apiKey: process.env.PMW_API_KEY! }); // who is making money on Polymarket, and how const board = await pmw.leaderboard({ minWinLo: 0.55, minEligible: 30, style: 'taker', status: 'active', limit: 50 }); // follow one (billed per entity per hour; 402 = balance too low, 409 = dormant) await pmw.subscribe({ entityId: board.rows[0].entityId, channels: ['ws'] }); // every fill of every entity you follow const stream = new FillStream({ client: pmw, store: new FileStateStore('./stream.json'), // a restart resumes from the last saved cursor onFill: async (fill, { source }) => console.log(source, fill.side, fill.price, fill.tokenId), onEvent: (e) => e.type === 'replaced' && console.warn('another connection took the stream'), }); await stream.start();
| 作用 | |
|---|---|
PmwClient | 榜单、实体、解锁地址、订阅、成交补发(fills、fillsSince)、交易历史导出 |
FillStream | WebSocket,带重连与保活;发现断档并补回;去重;游标落盘 |
verifyWebhook(rawBody, signature, secret) | 校验 x-pmw-signature(原始 body 的 HMAC-SHA256) |
Python SDK
GitHub pmwallets-python,PyPI pmwallets。 Python ≥ 3.10,同步与 asyncio 两种客户端。
pip install pmwallets
import asyncio from pmwallets import AsyncClient, Client, FillStream, FileStateStore # synchronous REST with Client(api_key="pmw_...") as pmw: board = pmw.leaderboard(minWinLo=0.55, minEligible=30, style="taker", status="active", limit=50) pmw.subscribe(board["rows"][0]["entityId"], channels=["ws"]) # billed per entity per hour # every fill of every entity you follow async def main(): async with AsyncClient(api_key="pmw_...") as pmw: stream = FillStream( client=pmw, store=FileStateStore("stream.json"), # a restart resumes from the last saved cursor on_fill=lambda fill, meta: print(meta.source, fill["side"], fill["price"], fill["tokenId"]), ) await stream.run() asyncio.run(main())
| 作用 | |
|---|---|
Client / AsyncClient | 榜单、实体、解锁地址、订阅、成交补发(fills、fills_since)、交易历史导出 |
FillStream | asyncio WebSocket,带重连与保活;发现断档并补回;去重;游标落盘 |
verify_webhook(raw_body, signature, secret) | 校验 x-pmw-signature(原始 body 的 HMAC-SHA256) |
Polymarket 跟单机器人
基于 SDK。你在榜单上挑交易者并订阅,机器人通过 WebSocket 收到他们的每一笔成交,用你自己的账户在 Polymarket CLOB 上按你设的限额跟单。私钥只在你自己的机器上 —— PMWallets 看不到,也从不替你下单。 默认 dry-run:每个决定都记日志,不真的交易。
Node.js
polymarket-copy-trading-bot · npm pmwallets-copytrade
# Node.js ≥ 20 npm install -g pmwallets-copytrade pmwallets-copytrade init # writes config.yaml export PMW_API_KEY=pmw_... # https://pmwallets.com/keys pmwallets-copytrade run # dry-run: logs every decision, trades nothing
Python
polymarket-copy-trading-bot-python · PyPI pmwallets-copytrade
# Python ≥ 3.10 pip install pmwallets-copytrade pmwallets-copytrade init # writes config.yaml export PMW_API_KEY=pmw_... # https://pmwallets.com/keys pmwallets-copytrade run # dry-run: logs every decision, trades nothing
切到实盘
dry-run 的日志看着没问题后,把 config.yaml 里的 mode 改成 live;Polymarket 账户怎么配见仓库 README。
mode: live polymarket: privateKey: ${POLY_PRIVATE_KEY} # signs your orders signatureType: 3 funderAddress: ${POLY_FUNDER_ADDRESS} # your Polymarket profile address (holds the USDC)
跟谁、机器人拿到成交后怎么决定:见跟单指南。
在哪儿跑
每个账户一条推送流:API key 的连接优先于网站推送页;两个 API 连接之间,后连上的顶掉先连的 —— 所以一个账户只跑一个消费者。PMWallets 的服务器在英国;对本身有资格使用 Polymarket API 的用户,同时要下单的程序 建议跑在爱尔兰(AWS eu-west-1),因为 Polymarket 的 API 不接受来自英国、美国和部分欧盟国家的下单。 服务器放在哪里,不改变你本人能否交易。