Market

exchange.GetMarkets()

获取交易所支持的交易对列表,以及每个交易对的价格精度、数量精度、最小下单量等交易规则。

语法

python
markets = exchange.GetMarkets()

返回值

Dict[str, Dict],key 为交易对符号,value 字段如下(字段名为小写下划线风格):

字段类型说明
symbolstr交易对,与 key 相同
basestr基础资产(如 BTC)
quotestr计价资产(如 USDT)
activebool是否可交易
tick_sizefloat价格最小变动单位(0 表示未知)
amount_sizefloat数量最小变动单位(0 表示未知)
price_precisionint价格精度(小数位数)
amount_precisionint数量精度(小数位数)
min_qtyfloat最小下单量(0 表示未知)
max_qtyfloat最大下单量(0 表示无上限)
min_notionalfloat最小名义价值(0 表示未知)
max_notionalfloat最大名义价值(0 表示无上限)
ct_valfloat合约面值(现货为 0)
ct_val_ccystr合约面值币种
infodict交易所原始数据

key 的格式

市场格式示例
现货{BASE}_{QUOTE}BTC_USDT
合约{BASE}_{QUOTE}.swapBTC_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 交易对")

注意事项

  1. Python SDK 中 GetMarkets() 固定作用于 exchanges[0],在 exchanges[1] 上调用也会返回第一个交易所的数据。
  2. 返回数据量较大,建议启动时获取一次并缓存。
  3. 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_sizeGamma orderPriceMinTickSize,缺省 0.01
price_precision / amount_precisiontick_size 的小数位数
min_qtyGamma orderMinSize(最小下单份数),缺省 5
max_qty / max_notional无上限(极大值)
min_notionalmin_qty × tick_size
ct_val / ct_val_ccy固定 1 / "USDC"
infoGamma 原始市场数据: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)

一次拉取整个分类,耗时较长,不建议在主循环中高频调用。

相关方法