Market
exchange.GetMarkets()
获取交易所支持的交易对列表,以及每个交易对的价格精度、数量精度、最小下单量等交易规则。
语法
python
markets = exchange.GetMarkets()返回值
Dict[str, Dict],key 为交易对符号,value 字段如下(字段名为小写下划线风格):
| 字段 | 类型 | 说明 |
|---|---|---|
| symbol | str | 交易对,与 key 相同 |
| base | str | 基础资产(如 BTC) |
| quote | str | 计价资产(如 USDT) |
| active | bool | 是否可交易 |
| tick_size | float | 价格最小变动单位(0 表示未知) |
| amount_size | float | 数量最小变动单位(0 表示未知) |
| price_precision | int | 价格精度(小数位数) |
| amount_precision | int | 数量精度(小数位数) |
| min_qty | float | 最小下单量(0 表示未知) |
| max_qty | float | 最大下单量(0 表示无上限) |
| min_notional | float | 最小名义价值(0 表示未知) |
| max_notional | float | 最大名义价值(0 表示无上限) |
| ct_val | float | 合约面值(现货为 0) |
| ct_val_ccy | str | 合约面值币种 |
| info | dict | 交易所原始数据 |
key 的格式
| 市场 | 格式 | 示例 |
|---|---|---|
| 现货 | {BASE}_{QUOTE} | BTC_USDT |
| 合约 | {BASE}_{QUOTE}.swap | BTC_USDT.swap |
| 预测市场(Polymarket) | {slug}_USDC.{outcome} | btc-updown-5m-1778612700_USDC.Up |
示例
查询某个交易对的规则
python
markets = exchange.GetMarkets()
m = markets.get("BTC_USDT")
if m:
Log(f"价格精度 {m['price_precision']},数量精度 {m['amount_precision']},最小下单 {m['min_qty']}")按规则修正下单参数
python
def normalize(symbol, price, amount):
m = exchange.GetMarkets()[symbol]
price = _N(price, m["price_precision"])
amount = _N(amount, m["amount_precision"])
if m["min_qty"] and amount < m["min_qty"]:
return None, None
if m["min_notional"] and price * amount < m["min_notional"]:
return None, None
return price, amount列出所有可交易的 USDT 交易对
python
markets = exchange.GetMarkets()
usdt = [k for k, v in markets.items() if v["active"] and v["quote"] == "USDT"]
Log(f"共 {len(usdt)} 个 USDT 交易对")注意事项
- Python SDK 中
GetMarkets()固定作用于exchanges[0],在exchanges[1]上调用也会返回第一个交易所的数据。 - 返回数据量较大,建议启动时获取一次并缓存。
- Polymarket 的行为(分类、去重、Token ID 提取)见下方「Polymarket 说明」。
Polymarket 说明
- 无参数,分类由 exchange.IO("SetCategory") 决定,未设置时为
crypto。 - 数据来自
https://polymarket.com/api/{category}/markets?_s=volume_24hr&_sts=active,每页 1000 条自动翻页,只含活跃市场;每个市场按outcomes展开为每个结果一条,key 为{slug}_USDC.{outcome}。 - crypto 分类去重:
{coin}-updown-{period}-{timestamp}周期市场(5m/15m/1h/4h/1d/1w/1M/1y)按"币种+周期"分组,只保留时间戳 ≤ 当前时间且最大的一期(正在进行的一期);全为未来期时保留最早一期。其他分类不去重。结果按volume24hr降序。
| 字段 | Polymarket 下的含义 |
|---|---|
| base | 市场 slug |
| quote | 固定 "USDC" |
| tick_size / amount_size | Gamma orderPriceMinTickSize,缺省 0.01 |
| price_precision / amount_precision | tick_size 的小数位数 |
| min_qty | Gamma orderMinSize(最小下单份数),缺省 5 |
| max_qty / max_notional | 无上限(极大值) |
| min_notional | min_qty × tick_size |
| ct_val / ct_val_ccy | 固定 1 / "USDC" |
| info | Gamma 原始市场数据:question、conditionId、outcomes、outcomePrices、clobTokenIds、volume24hr、endDate、negRisk 等 |
Token ID 不在顶层字段中,需从 info 中按 outcomes 下标取 clobTokenIds(两者可能是 JSON 字符串,也可能已是列表):
python
markets = exchange.GetMarkets()
symbol = next(k for k in markets if k.startswith("btc-updown-5m-") and k.endswith("_USDC.Up"))
info = markets[symbol]["info"]
outcomes = info["outcomes"] if isinstance(info["outcomes"], list) else json.loads(info["outcomes"])
token_ids = info["clobTokenIds"] if isinstance(info["clobTokenIds"], list) else json.loads(info["clobTokenIds"])
token_id = token_ids[[o.lower() for o in outcomes].index("up")]
exchange.SetCurrency(symbol)
exchange.IO("SetTokenID", token_id)一次拉取整个分类,耗时较长,不建议在主循环中高频调用。
相关方法
- GetCurrenciesPrecision - 获取精度信息
- SetCurrency - 设置交易对