名称: trading-polymarket 描述: “使用py_clob_client在Polymarket上执行交易 - 完整的API访问用于市场数据、订单、头寸” 表情: “💰” 门限: 环境变量: - POLY_API_KEY - POLY_API_SECRET - POLY_API_PASSPHRASE - PRIVATE_KEY
Polymarket交易 - 完整API参考
通过官方的py_clob_client库完全访问Polymarket的CLOB(中央限价订单簿)。
60多种方法文档。这是完整参考。
必需的环境变量
PRIVATE_KEY=0x... # 用于签名的以太坊私钥
POLY_FUNDER_ADDRESS=0x... # 您在Polygon上的钱包地址
POLY_API_KEY=... # 来自Polymarket API
POLY_API_SECRET=... # Base64编码的密钥
POLY_API_PASSPHRASE=... # API密码短语
安装
pip install py-clob-client requests
认证级别
| 级别 | 要求 | 能力 |
|---|---|---|
| L0 | 无 | 只读:订单簿、价格、市场 |
| L1 | 私钥 | 创建和签名订单(不发布) |
| L2 | 私钥 + API凭证 | 完整交易:发布订单、取消、查询 |
签名类型
| 类型 | 使用场景 |
|---|---|
0 |
标准EOA(MetaMask、硬件钱包) |
1 |
魔法/邮箱钱包(委托签名) |
2 |
代理钱包(Gnosis Safe、浏览器代理) |
ClobClient - 完整API(60+方法)
初始化
from py_clob_client.client import ClobClient
from py_clob_client.clob_types import (
OrderArgs, MarketOrderArgs, ApiCreds, OrderType,
BookParams, TradeParams, OpenOrderParams, BalanceAllowanceParams,
AssetType, OrderScoringParams, OrdersScoringParams, DropNotificationParams
)
from py_clob_client.order_builder.constants import BUY, SELL
from py_clob_client.constants import POLYGON # 137
# 级别2认证(完整交易访问)
client = ClobClient(
host="https://clob.polymarket.com",
key=os.getenv("PRIVATE_KEY"), # 用于签名的私钥
chain_id=POLYGON, # 137主网,80002 Amoy测试网
funder=os.getenv("POLY_FUNDER_ADDRESS"), # 钱包地址(用于代理钱包)
signature_type=2 # 0=EOA, 1=MagicLink, 2=Proxy
)
# 设置认证端点的API凭证
client.set_api_creds(ApiCreds(
api_key=os.getenv("POLY_API_KEY"),
api_secret=os.getenv("POLY_API_SECRET"),
api_passphrase=os.getenv("POLY_API_PASSPHRASE")
))
健康和配置
client.get_ok() # 检查服务器是否运行
client.get_server_time() # 获取服务器时间戳
client.get_address() # 您的签名者公钥地址
client.get_collateral_address() # USDC合约地址
client.get_conditional_address() # CTF合约地址
client.get_exchange_address() # 交易所合约(neg_risk=False默认)
市场数据 - 单个代币
# 获取价格和价差
client.get_midpoint(token_id) # 中间市场价
client.get_price(token_id, side="BUY") # 边的最佳价格
client.get_spread(token_id) # 当前价差
client.get_last_trade_price(token_id) # 最后执行交易价
# 获取完整订单簿
orderbook = client.get_order_book(token_id)
# 返回:OrderBookSummary,包含买盘、卖盘、最小变动单位、负风险、时间戳、哈希
市场数据 - 批量(多个代币)
params = [
BookParams(token_id="TOKEN1", side="BUY"),
BookParams(token_id="TOKEN2", side="SELL")
]
client.get_midpoints(params) # 多个中间价
client.get_prices(params) # 多个价格
client.get_spreads(params) # 多个价差
client.get_order_books(params) # 多个订单簿
client.get_last_trades_prices(params) # 多个最后价格
市场元数据
client.get_tick_size(token_id) # 返回:"0.1"、"0.01"、"0.001"或"0.0001"
client.get_neg_risk(token_id) # 返回:True/False(负风险市场)
client.get_fee_rate_bps(token_id) # 返回:费率以基点计(0或1000)
订单类型
from py_clob_client.clob_types import OrderType
OrderType.GTC # 直到取消 - 保持开放直到成交/取消
OrderType.FOK # 全部成交或取消 - 立即全部成交或取消
OrderType.GTD # 直到日期 - 在时间戳过期(最小60秒)
OrderType.FAK # 成交并取消 - 尽可能成交,取消剩余
何时使用每种订单类型
| 类型 | 使用场景 | 示例 |
|---|---|---|
| GTC | 入场 - 等待成交 | 以0.45买入,等待下跌 |
| FOK | 退出 - 需要立即成交 | 立即市场卖出全部头寸 |
| GTD | 时间限制订单 | 报价在5分钟后过期 |
| FAK | 部分成交可接受 | 尽可能现在获取 |
OrderArgs - 限价订单
OrderArgs(
token_id: str, # 代币ID(交易结果)
price: float, # 价格0.01-0.99
size: float, # 股数
side: str, # "BUY"或"SELL"(或使用BUY/SELL常量)
fee_rate_bps: int = 0, # 可选:费率以基点计(0或检查市场)
nonce: int = 0, # 可选:取消的唯一nonce
expiration: int = 0, # 可选:过期时间戳(0 = GTC,使用时间戳用于GTD)
taker: str = ZERO_ADDRESS # 可选:特定接盘者(ZERO_ADDRESS = 任何人)
)
MarketOrderArgs - 市场订单
MarketOrderArgs(
token_id: str, # 代币ID
amount: float, # 花费的总USDC金额(买入)或股数(卖出)
side: str, # "BUY"或"SELL"
price: float = 0, # 可选:最差可接受价格(滑点保护)
fee_rate_bps: int = 0, # 可选:费率
nonce: int = 0, # 可选:nonce
taker: str = ZERO_ADDRESS, # 可选:接盘者地址
order_type: OrderType = FOK # 可选:FOK(默认)或FAK
)
完整订单示例
from py_clob_client.order_builder.constants import BUY, SELL
# 1. 限价买入(GTC)- 留在订单簿直到成交
order = client.create_and_post_order(
OrderArgs(token_id=TOKEN_ID, price=0.45, size=100.0, side=BUY)
)
# 2. 限价卖出(GTC)
order = client.create_and_post_order(
OrderArgs(token_id=TOKEN_ID, price=0.55, size=50.0, side=SELL)
)
# 3. 市场买入 - 以当前价格花费$100 USDC(FOK)
signed = client.create_market_order(
MarketOrderArgs(token_id=TOKEN_ID, amount=100.0, side=BUY)
)
result = client.post_order(signed, orderType=OrderType.FOK)
# 4. 市场卖出 - 立即卖出所有股数(FOK)
signed = client.create_market_order(
MarketOrderArgs(token_id=TOKEN_ID, amount=my_shares, side=SELL)
)
result = client.post_order(signed, orderType=OrderType.FOK)
# 5. 仅发布做市商订单(避免接盘费,赚取返佣)
signed = client.create_order(
OrderArgs(token_id=TOKEN_ID, price=0.44, size=100.0, side=BUY)
)
result = client.post_order(signed, orderType=OrderType.GTC, post_only=True)
# 如果订单会穿越价差,则被拒绝而不是接盘
# 6. 直到日期(GTD)- 在时间戳后过期
import time
expiry = int(time.time()) + 300 # 从现在起5分钟
signed = client.create_order(
OrderArgs(token_id=TOKEN_ID, price=0.50, size=100.0, side=BUY, expiration=expiry)
)
result = client.post_order(signed, orderType=OrderType.GTD)
# 7. 成交并取消(FAK)- 成交可能的部分,取消剩余
signed = client.create_market_order(
MarketOrderArgs(token_id=TOKEN_ID, amount=1000.0, side=BUY)
)
result = client.post_order(signed, orderType=OrderType.FAK)
订单操作
创建和发布订单
# 简单:在一个调用中创建和发布(推荐)
result = client.create_and_post_order(
OrderArgs(
token_id="123456789012345678901234567890",
price=0.45,
size=10.0,
side="BUY"
)
)
# 返回:{"orderID": "...", "status": "...", ...}
# 高级:分开创建和发布
order = client.create_order(OrderArgs(...)) # 返回SignedOrder
result = client.post_order(order, orderType=OrderType.GTC, post_only=False)
# 市场订单(自动计算价格)
result = client.create_market_order(
MarketOrderArgs(
token_id="...",
amount=100.0, # 花费$100 USDC
side="BUY"
)
)
# 在市场订单前计算预期成交价
price = client.calculate_market_price(
token_id="...",
side="BUY",
amount=100.0,
order_type=OrderType.FOK
)
取消订单
client.cancel(order_id="ORDER_ID") # 取消特定订单
client.cancel_orders(["ID1", "ID2", "ID3"]) # 取消多个
client.cancel_all() # 取消所有开放订单
client.cancel_market_orders( # 按市场/资产取消
market="CONDITION_ID",
asset_id="TOKEN_ID"
)
查询订单
# 获取所有开放订单
orders = client.get_orders(
params=OpenOrderParams(
id="ORDER_ID", # 可选:特定订单
market="COND_ID", # 可选:按市场过滤
asset_id="TOKEN" # 可选:按代币过滤
),
next_cursor="MA==" # 用于分页
)
# 获取特定订单
order = client.get_order(order_id="ORDER_ID")
交易历史
trades = client.get_trades(
params=TradeParams(
id="TRADE_ID", # 可选:特定交易
maker_address="0x...", # 可选:按做市商过滤
market="CONDITION_ID", # 可选:按市场过滤
asset_id="TOKEN_ID", # 可选:按代币过滤
before="2024-01-01", # 可选:日期之前
after="2023-01-01" # 可选:日期之后
),
next_cursor="MA=="
)
余额和许可
# 检查余额和许可
balance = client.get_balance_allowance(
params=BalanceAllowanceParams(
asset_type=AssetType.COLLATERAL, # USDC余额
# 或 AssetType.CONDITIONAL # 代币余额
token_id="TOKEN_ID" # 用于条件代币
)
)
# 更新/刷新许可缓存
client.update_balance_allowance(params=...)
市场发现
从CLOB获取市场
# 所有活跃市场
markets = client.get_markets(next_cursor="MA==")
simplified = client.get_simplified_markets()
# 特定市场
market = client.get_market(condition_id="CONDITION_ID")
# 市场交易事件
events = client.get_market_trades_events(condition_id="CONDITION_ID")
# 抽样/特色市场
client.get_sampling_markets()
client.get_sampling_simplified_markets()
从Gamma API获取市场(更多详情)
import requests
def search_markets(query: str, limit: int = 10):
"""按关键词搜索Polymarket市场"""
url = "https://gamma-api.polymarket.com/markets"
params = {
"_q": query,
"active": "true",
"closed": "false",
"_limit": limit
}
r = requests.get(url, params=params)
return r.json()
# 获取市场详情
markets = search_markets("bitcoin")
for m in markets:
print(f"问题:{m['question']}")
print(f"条件ID:{m['condition_id']}")
print(f"交易量:${m.get('volume', 0):,.2f}")
for token in m.get('tokens', []):
print(f" {token['outcome']}:{token['token_id']}")
print(f" 价格:{float(token['price']):.2f}")
链上操作
检查代币余额(头寸大小)
import requests
CTF_CONTRACT = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045"
RPC_URL = "https://polygon-rpc.com/"
def get_token_balance(wallet: str, token_id: str) -> float:
"""获取特定结果代币的余额,以股数计"""
token_int = int(token_id)
# ERC-1155 balanceOf(address,uint256)
data = f"0x00fdd58e000000000000000000000000{wallet[2:].lower()}{token_int:064x}"
r = requests.post(RPC_URL, json={
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{"to": CTF_CONTRACT, "data": data}, "latest"],
"id": 1
})
result = r.json().get("result", "0x0")
balance = int(result, 16) / 1e6 # 从原始转换为股数
return balance
# 使用
balance = get_token_balance(
wallet="0x7c2211103e7Fbb257Ac6fa59f972cfd8bc9D4795",
token_id="12345678901234567890"
)
print(f"头寸:{balance}股")
检查USDC余额
USDC_CONTRACT = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"
def get_usdc_balance(wallet: str) -> float:
"""获取Polygon上的USDC余额"""
# ERC-20 balanceOf(address)
data = f"0x70a08231000000000000000000000000{wallet[2:].lower()}"
r = requests.post(RPC_URL, json={
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{"to": USDC_CONTRACT, "data": data}, "latest"],
"id": 1
})
result = r.json().get("result", "0x0")
return int(result, 16) / 1e6 # USDC有6位小数
API密钥管理
# 创建新API密钥
creds = client.create_api_key(nonce=0)
# 衍生现有API密钥(如果您丢失凭证但有私钥)
creds = client.derive_api_key(nonce=0)
# 创建或衍生(尝试两者)
creds = client.create_or_derive_api_creds(nonce=0)
# 获取所有API密钥
keys = client.get_api_keys()
# 删除当前API密钥
client.delete_api_key()
# 只读API密钥(仅用于监控)
readonly = client.create_readonly_api_key()
client.get_readonly_api_keys()
client.delete_readonly_api_key(key="...")
client.validate_readonly_api_key(address="0x...", key="...")
高级功能
订单心跳(保持订单活跃)
# 开始心跳 - 如果10秒内未发送,所有订单取消
heartbeat_id = client.post_heartbeat(heartbeat_id=None)
# 继续发送心跳
while trading:
client.post_heartbeat(heartbeat_id=heartbeat_id)
time.sleep(5)
订单评分
# 检查订单是否在评分(赚取奖励)
is_scoring = client.is_order_scoring(
params=OrderScoringParams(order_id="...")
)
# 检查多个订单
scores = client.are_orders_scoring(
params=OrdersScoringParams(order_ids=["ID1", "ID2"])
)
通知
notifications = client.get_notifications()
client.drop_notifications(params=DropNotificationParams(...))
费用结构
重要:大多数Polymarket市场有零费用(0%做市商,0%接盘)。
15分钟加密货币市场(例外)
仅15分钟BTC/ETH/SOL/XRP价格预测市场有费用:
费用 = 股数 × 0.25 × (价格 × (1 - 价格))²
| 入场价格 | 费用%(每边) |
|---|---|
| 0.50 | ~1.56% |
| 0.60或0.40 | ~1.44% |
| 0.70或0.30 | ~1.10% |
| 0.80或0.20 | ~0.64% |
| 0.90或0.10 | ~0.20% |
接盘 = 穿越价差 = 支付费用 做市商 = 增加流动性 = 无费用 + 赚取返佣
成为做市商:发布不会立即成交的订单(在价差内)。
小数精度规则
| 订单边 | 价格小数 | 股数小数 |
|---|---|---|
| 买入 | 2 | 4 |
| 卖出 | 2 | 2 |
最小订单大小: 每边$1
完整交易示例
#!/usr/bin/env python3
"""
生产就绪的Polymarket交易脚本
"""
import os
import time
import requests
from py_clob_client.client import ClobClient
from py_clob_client.clob_types import OrderArgs, ApiCreds, OrderType
# 初始化
client = ClobClient(
"https://clob.polymarket.com",
key=os.getenv("PRIVATE_KEY"),
chain_id=137,
funder=os.getenv("POLY_FUNDER_ADDRESS"),
signature_type=2
)
client.set_api_creds(ApiCreds(
api_key=os.getenv("POLY_API_KEY"),
api_secret=os.getenv("POLY_API_SECRET"),
api_passphrase=os.getenv("POLY_API_PASSPHRASE")
))
TOKEN_ID = "YOUR_TOKEN_ID"
WALLET = os.getenv("POLY_FUNDER_ADDRESS")
CTF = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045"
def get_balance(token_id):
"""获取头寸大小"""
token_int = int(token_id)
data = f"0x00fdd58e000000000000000000000000{WALLET[2:].lower()}{token_int:064x}"
r = requests.post("https://polygon-rpc.com/", json={
"jsonrpc": "2.0", "method": "eth_call",
"params": [{"to": CTF, "data": data}, "latest"], "id": 1
})
return int(r.json().get("result", "0x0"), 16) / 1e6
def get_orderbook(token_id):
"""获取当前买/卖价"""
book = client.get_order_book(token_id)
return {
"best_bid": float(book.bids[0].price) if book.bids else 0,
"best_ask": float(book.asks[0].price) if book.asks else 1
}
# 检查头寸
position = get_balance(TOKEN_ID)
print(f"当前头寸:{position}股")
# 获取市场
book = get_orderbook(TOKEN_ID)
print(f"买价:{book['best_bid']:.2f},卖价:{book['best_ask']:.2f}")
# 发布买单(做市商 - 在价差内)
buy_price = book['best_bid'] + 0.01 # 高于买价1分
if buy_price < book['best_ask']: # 确保我们是做市商
result = client.create_and_post_order(OrderArgs(
token_id=TOKEN_ID,
price=buy_price,
size=10.0,
side="BUY"
))
print(f"买单发布:{result}")
# 发布卖单(通过FOK市场卖出)
if position > 0:
result = client.create_and_post_order(OrderArgs(
token_id=TOKEN_ID,
price=0.01, # 最低价格 = 立即成交
size=position,
side="SELL"
))
print(f"卖出头寸:{result}")
错误处理
from py_clob_client.exceptions import PolyApiException
try:
result = client.create_and_post_order(OrderArgs(...))
except PolyApiException as e:
print(f"API错误:{e}")
except Exception as e:
print(f"错误:{e}")
常见错误:
"余额不足"- 没有足够的USDC/代币"无效价格"- 价格超出0.01-0.99或小数错误"订单太小"- 低于最小订单大小"市场关闭"- 市场不接受订单
CLI包装器
用于快速CLI访问,使用捆绑脚本:
python trading/polymarket.py search "bitcoin"
python trading/polymarket.py orderbook <token_id>
python trading/polymarket.py buy <token_id> <price> <size>
python trading/polymarket.py sell <token_id> <size>
python trading/polymarket.py positions
python trading/polymarket.py balance
python trading/polymarket.py cancel_all
Clodds CLI命令(/poly)
直接从Claude Code访问Polymarket交易:
市场数据
/poly search <query> # 搜索市场
/poly market <condition-id> # 市场详情
/poly book <token-id> # 查看订单簿
交易
/poly buy <token-id> <size> <price> # 买入股数(限价)
/poly sell <token-id> <size> <price> # 卖出股数(限价)
/poly orders # 开放订单
/poly cancel <order-id> # 取消订单
/poly cancel all # 取消所有订单
/poly trades [limit] # 近期交易历史
/poly balance # USDC + 头寸
高级订单
/poly twap <buy|sell> <token> <total> <price> [slices] [interval-sec]
/poly bracket <token> <size> <tp> <sl> # TP + SL括号
/poly trigger buy <token> <size> <price> # 价格下跌时买入
/poly redeem # 赎回已解决的头寸
实时成交(WebSocket)
/poly fills # 连接成交WebSocket
/poly fills status # 显示连接 + 近期成交
/poly fills stop # 断开成交WebSocket
/poly fills clear # 清除跟踪的成交
订单心跳
/poly heartbeat # 开始心跳(保持订单活跃)
/poly heartbeat status # 检查心跳状态
/poly heartbeat stop # 停止心跳(订单在10秒内取消)
账户和结算
/poly settlements # 查看已解决市场的待结算
/poly allowance # 检查USDC批准状态
/poly orderbooks <token1> [token2] ... # 批量获取订单簿
完整ClobClient方法参考
健康和配置(L0 - 无认证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
get_ok() |
- | dict | 健康检查 |
get_server_time() |
- | dict | 服务器时间戳 |
get_address() |
- | str | 您的签名者地址 |
get_collateral_address() |
- | str | USDC合约 |
get_conditional_address() |
- | str | CTF合约 |
get_exchange_address(neg_risk) |
bool | str | 交易所合约 |
市场数据(L0 - 无认证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
get_midpoint(token_id) |
str | dict | 中间价 |
get_midpoints(params) |
list[BookParams] | dict | 多个中间价 |
get_price(token_id, side) |
str, str | dict | 边的最佳价格 |
get_prices(params) |
list[BookParams] | dict | 多个价格 |
get_spread(token_id) |
str | dict | 买-卖价差 |
get_spreads(params) |
list[BookParams] | dict | 多个价差 |
get_order_book(token_id) |
str | OrderBookSummary | 完整订单簿 |
get_order_books(params) |
list[BookParams] | list | 多个订单簿 |
get_last_trade_price(token_id) |
str | dict | 最后交易 |
get_last_trades_prices(params) |
list[BookParams] | dict | 多个最后交易 |
get_tick_size(token_id) |
str | TickSize | “0.1”/“0.01”/“0.001”/“0.0001” |
get_neg_risk(token_id) |
str | bool | 是否负风险市场 |
get_fee_rate_bps(token_id) |
str | int | 费用以基点计 |
市场发现(L0 - 无认证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
get_markets(next_cursor) |
str | dict | 分页市场 |
get_simplified_markets(next_cursor) |
str | dict | 简化市场 |
get_sampling_markets(next_cursor) |
str | dict | 特色市场 |
get_market(condition_id) |
str | dict | 单个市场 |
get_market_trades_events(condition_id) |
str | dict | 交易事件 |
订单创建(L1 - 需要私钥)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
create_order(order_args, options) |
OrderArgs, CreateOrderOptions | dict | 签名限价订单 |
create_market_order(order_args, options) |
MarketOrderArgs, CreateOrderOptions | dict | 签名市场订单 |
calculate_market_price(token_id, side, amount, order_type) |
str, str, float, OrderType | float | 预期成交价 |
订单发布(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
post_order(order, orderType, post_only) |
SignedOrder, OrderType, bool | dict | 发布单个订单 |
post_orders(args) |
list[PostOrdersArgs] | dict | 发布批量订单 |
create_and_post_order(order_args, options) |
OrderArgs, PartialCreateOrderOptions | dict | 创建 + 发布(推荐) |
订单取消(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
cancel(order_id) |
str | dict | 取消一个订单 |
cancel_orders(order_ids) |
list[str] | dict | 取消多个 |
cancel_all() |
- | dict | 取消所有订单 |
cancel_market_orders(market, asset_id) |
str, str | dict | 按市场取消 |
订单查询(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
get_orders(params, next_cursor) |
OpenOrderParams, str | list | 获取开放订单 |
get_order(order_id) |
str | dict | 获取特定订单 |
get_trades(params, next_cursor) |
TradeParams, str | list | 交易历史 |
API密钥管理(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
create_api_key(nonce) |
int | ApiCreds | 创建新密钥 |
derive_api_key(nonce) |
int | ApiCreds | 衍生现有密钥 |
create_or_derive_api_creds(nonce) |
int | ApiCreds | 创建或衍生 |
set_api_creds(creds) |
ApiCreds | - | 设置凭证 |
get_api_keys() |
- | dict | 列出您的密钥 |
delete_api_key() |
- | dict | 删除当前密钥 |
create_readonly_api_key() |
- | ReadonlyApiKeyResponse | 只读密钥 |
get_readonly_api_keys() |
- | list[str] | 列出只读密钥 |
delete_readonly_api_key(key) |
str | bool | 删除只读密钥 |
余额和许可(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
get_balance_allowance(params) |
BalanceAllowanceParams | dict | 检查余额 |
update_balance_allowance(params) |
BalanceAllowanceParams | dict | 刷新许可 |
高级功能(L2 - 需要API凭证)
| 方法 | 参数 | 返回 | 描述 |
|---|---|---|---|
post_heartbeat(heartbeat_id) |
str | dict | 保持订单活跃(10秒超时) |
is_order_scoring(params) |
OrderScoringParams | dict | 检查是否赚取奖励 |
are_orders_scoring(params) |
OrdersScoringParams | dict | 检查多个订单 |
get_notifications() |
- | dict | 获取通知 |
drop_notifications(params) |
DropNotificationParams | dict | 删除通知 |
get_closed_only_mode() |
- | dict | 检查仅关闭状态 |
合约地址(Polygon主网)
USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174" # 抵押代币
CTF = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045" # 条件代币(ERC-1155)
EXCHANGE = "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E" # 常规交易所
NEG_RISK = "0xC5d563A36AE78145C45a50134d48A1215220f80a" # 负风险交易所(加密货币)
快速参考:常见模式
检查头寸 → 卖出所有
balance = get_token_balance(wallet, token_id)
if balance > 0:
client.create_and_post_order(OrderArgs(
token_id=token_id, price=0.01, size=balance, side="SELL"
))
做市商入场(无费用)
book = client.get_order_book(token_id)
best_bid = float(book.bids[0].price) if book.bids else 0
maker_price = best_bid + 0.01 # 高于买价1分
signed = client.create_order(OrderArgs(token_id=token_id, price=maker_price, size=100, side="BUY"))
client.post_order(signed, orderType=OrderType.GTC, post_only=True)
市场买入$50价值
signed = client.create_market_order(MarketOrderArgs(token_id=token_id, amount=50.0, side="BUY"))
client.post_order(signed, orderType=OrderType.FOK)
取消一切
client.cancel_all()
WebSocket频道(实时更新)
Polymarket提供WebSocket频道用于实时更新。不需要RPC - 一切都通过CLOB处理。
WebSocket URL
MARKET_WS = "wss://ws-subscriptions-clob.polymarket.com/ws/market"
USER_WS = "wss://ws-subscriptions-clob.polymarket.com/ws/user"
市场频道(公共 - 无认证)
订阅订单簿更新、价格变化、任何市场的交易。
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
event_type = data.get("event_type")
if event_type == "book":
# 完整订单簿快照(订阅后 + 交易后)
print(f"订单簿更新:{data['bids']}, {data['asks']}")
elif event_type == "price_change":
# 订单发布/取消影响价格水平
print(f"价格变化:{data}")
elif event_type == "last_trade_price":
# 交易执行
print(f"交易:{data['price']} x {data['size']}")
elif event_type == "tick_size_change":
# 最小变动单位变化(价格极端)
print(f"最小变动单位:{data['old_tick_size']} -> {data['new_tick_size']}")
def on_open(ws):
# 订阅特定代币
ws.send(json.dumps({
"type": "subscribe",
"channel": "market",
"assets_ids": [TOKEN_ID] # 代币ID列表
}))
ws = websocket.WebSocketApp(
"wss://ws-subscriptions-clob.polymarket.com/ws/market",
on_message=on_message,
on_open=on_open
)
ws.run_forever()
用户频道(认证 - 用于成交)
订阅您的订单更新、成交、交易。这是获取成交通知的方式。
import websocket
import json
import hmac
import hashlib
import time
import base64
API_KEY = os.getenv("POLY_API_KEY")
API_SECRET = os.getenv("POLY_API_SECRET")
API_PASSPHRASE = os.getenv("POLY_API_PASSPHRASE")
def get_auth_headers():
"""为WebSocket生成HMAC认证"""
timestamp = str(int(time.time()))
message = f"GET
{timestamp}
/ws/user"
signature = hmac.new(
base64.b64decode(API_SECRET),
message.encode(),
hashlib.sha256
).digest()
return {
"POLY-ADDRESS": WALLET_ADDRESS,
"POLY-SIGNATURE": base64.b64encode(signature).decode(),
"POLY-TIMESTAMP": timestamp,
"POLY-API-KEY": API_KEY,
"POLY-PASSPHRASE": API_PASSPHRASE
}
def on_message(ws, message):
data = json.loads(message)
event_type = data.get("event_type")
if event_type == "trade":
# 您的成交 - 订单匹配!
status = data.get("status") # MATCHED, MINED, CONFIRMED, FAILED
print(f"成交:{data['side']} {data['size']} @ {data['price']}")
print(f" 状态:{status}")
print(f" 交易ID:{data['id']}")
print(f" 市场:{data['market']}")
if status == "CONFIRMED":
print(" ✓ 交易链上确认!")
elif status == "FAILED":
print(" ✗ 交易失败 - 检查日志")
elif event_type == "order":
order_type = data.get("type") # PLACEMENT, UPDATE, CANCELLATION
print(f"订单{order_type}:{data['side']} {data['original_size']} @ {data['price']}")
print(f" 已成交:{data.get('size_matched', 0)}")
if order_type == "CANCELLATION":
print(" 订单取消")
def on_open(ws):
# 使用认证订阅
ws.send(json.dumps({
"type": "subscribe",
"channel": "user",
"auth": get_auth_headers(),
# 可选:过滤到特定市场
# "markets": [CONDITION_ID]
}))
ws = websocket.WebSocketApp(
"wss://ws-subscriptions-clob.polymarket.com/ws/user",
on_message=on_message,
on_open=on_open
)
ws.run_forever()
消息类型摘要
市场频道:
| 事件 | 触发 | 关键字段 |
|---|---|---|
book |
订阅、交易影响订单簿 | bids, asks, timestamp |
price_change |
订单发布/取消 | price, size, side |
last_trade_price |
交易执行 | price, size, side |
tick_size_change |
价格极端(>0.96或<0.04) | old_tick_size, new_tick_size |
用户频道:
| 事件 | 触发 | 关键字段 |
|---|---|---|
trade |
您的订单成交 | status, side, size, price, market |
order |
订单发布/更新/取消 | type (PLACEMENT/UPDATE/CANCELLATION), size_matched |
交易状态流程
MATCHED → MINED → CONFIRMED (成功)
→ RETRYING → CONFIRMED/FAILED
保持活跃
每10秒发送PING以保持连接活跃:
import threading
def send_ping():
while True:
ws.send(json.dumps({"type": "ping"}))
time.sleep(10)
threading.Thread(target=send_ping, daemon=True).start()
实时数据客户端(替代方案)
Polymarket也提供@polymarket/real-time-data-client用于TypeScript:
import { RealTimeDataClient } from "@polymarket/real-time-data-client";
const client = new RealTimeDataClient({
onMessage: (msg) => console.log(msg),
onConnect: (c) => {
// 使用认证订阅用户成交
c.subscribe({
subscriptions: [{
topic: "clob_user",
type: "*",
clob_auth: {
key: API_KEY,
secret: API_SECRET,
passphrase: API_PASSPHRASE
}
}]
});
}
});
client.connect();
不需要RPC - CLOB处理一切
| 操作 | 方法 |
|---|---|
| 获取头寸 | GET /data/positions?user={address} 通过Gamma API |
| 获取余额 | client.get_balance_allowance() |
| 发布订单 | client.create_and_post_order() |
| 获取成交 | 用户WebSocket频道 |
| 获取价格 | client.get_order_book() 或 市场WebSocket |
| 取消订单 | client.cancel() |
唯一可能需要使用RPC的时间是独立检查链上代币余额,但即使这也可以通过Gamma API头寸端点获取。