做市商通过 CLOB API 与 Polymarket 交互——发布双向报价、跨市场管理库存、重新平衡仓位。SDK 客户端处理订单签名和提交,因此你可以专注于策略。
本页涵盖做市商特定的工作流程和最佳实践。有关完整订单机制,请参阅创建订单和取消订单。
双向报价
核心做市工作流程是在你的公允价值附近发布买价和卖价。使用 createAndPostOrder 来下单每一侧:
import { ClobClient, Side, OrderType } from "@polymarket/clob-client";
const client = new ClobClient(
"https://clob.polymarket.com",
137,
wallet,
credentials,
signatureType,
funder,
);
// Bid at 0.48
const bid = await client.createAndPostOrder({
tokenID: "3409705850427531082723332342151729...",
side: Side.BUY,
price: 0.48,
size: 1000,
orderType: OrderType.GTC,
});
// Ask at 0.52
const ask = await client.createAndPostOrder({
tokenID: "3409705850427531082723332342151729...",
side: Side.SELL,
price: 0.52,
size: 1000,
orderType: OrderType.GTC,
});
批量订单
对于跨多个价格档位的更紧密价差,使用 postOrders 在单个请求中提交最多 15 个订单:
const orders = await Promise.all([
client.createOrder({ tokenID, side: Side.BUY, price: 0.48, size: 500 }),
client.createOrder({ tokenID, side: Side.BUY, price: 0.47, size: 500 }),
client.createOrder({ tokenID, side: Side.SELL, price: 0.52, size: 500 }),
client.createOrder({ tokenID, side: Side.SELL, price: 0.53, size: 500 }),
]);
const response = await client.postOrders(
orders.map((order) => ({ order, orderType: OrderType.GTC })),
);
批量提交通过在单个请求中提交多个报价来减少延迟。始终优先使用 postOrders() 而不是多次单独调用 createAndPostOrder()。
选择订单类型
| 类型 | 行为 | 何时使用 |
|---|
| GTC | 挂在订单簿上直到成交或取消 | 被动报价的默认选择 |
| GTD | 在指定时间自动过期 | 在已知事件前让报价过期 |
| FOK | 必须立即全部成交,否则取消 | 激进的重新平衡——全有或全无 |
| FAK | 立即成交可用部分,取消剩余 | 部分成交可接受的重新平衡 |
GTC 和 GTD 是被动做市的主要工具——它们以你指定的价格挂在订单簿上。FOK 和 FAK 用于针对现有流动性重新平衡库存。
使用 GTD 的限时报价
在已知事件(如市场关闭或判定)前自动让报价过期:
// Expire in 1 hour
const expiringOrder = await client.createOrder({
tokenID,
side: Side.BUY,
price: 0.5,
size: 1000,
orderType: OrderType.GTD,
expiration: Math.floor(Date.now() / 1000) + 3600,
});
管理订单
取消单个订单、按市场取消或一次性取消所有订单:
await client.cancelOrder(orderId); // Single order
await client.cancelOrders(orderIds); // Multiple orders
await client.cancelMarketOrders(conditionId); // All orders in a market
await client.cancelAll(); // Everything
有关包括链上取消在内的完整详情,请参阅取消订单。
监控未成交订单
const order = await client.getOrder(orderId);
const orders = await client.getOpenOrders({
market: "0xbd31dc8a...",
asset_id: "52114319501245...",
});
Tick 大小
你的订单价格必须符合市场的 tick 大小,否则会被拒绝。在报价前使用 SDK 查询:
const tickSize = await client.getTickSize(tokenID);
// Returns: "0.1" | "0.01" | "0.001" | "0.0001"
大多数市场对 Maker 和 Taker 都是零费用。但是,以下市场类型有 Taker 费用:
- 5 分钟加密货币市场
- 15 分钟加密货币市场
- 特定体育市场(例如 NCAAB、Serie A)
有关完整费用表和计算详情,请参阅费用。
最佳实践
报价管理
- 双向报价——发布买价和卖价以获得最多流动性奖励
- 根据库存倾斜——根据当前仓位调整报价价格以管理风险敞口
- 取消过时报价——市场条件变化时立即撤单
- 对事件使用 GTD——在已知催化剂前自动让报价过期以避免过时敞口
- 批量订单——使用
postOrders() 在单个请求中提交多个报价
- WebSocket 获取数据——订阅实时推送而不是轮询 REST 端点
风险控制
- 规模限制——报价前检查代币余额,不要超过可用库存
- 价格保护——根据订单簿中间价验证价格并拒绝异常值
- 紧急开关——出现错误或仓位突破时立即调用
cancelAll()
- 监控成交——订阅 WebSocket 用户频道以获取实时成交通知
下一步