Trade
exchange.IO()
调用交易所底层 REST API 接口,用于访问平台未封装的高级功能。
语法
python
result = exchange.IO(api, method, path, params="")参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| api | str | ✅ | API 标识(如 "api"、"currency" 等) |
| method | str | ✅ | HTTP 方法(支持: GET, POST, PUT, DELETE) |
| path | str | ✅ | API 端点路径(如 "/fapi/v2/account"、"/sapi/v1/asset/transfer") |
| params | str | ❌ | 请求参数(URL 查询字符串格式),默认 "" |
返回值
返回交易所 API 的原始响应数据(字典格式)。
使用场景
IO() 方法主要用于:
- 访问平台未封装的交易所专有功能
- 调用新上线的 API 接口
- 获取详细的账户、订单、持仓等信息
- 执行高级交易操作(如批量下单、设置风险参数等)
- 访问统一账户 API(如万向划转等 /sapi 接口)
示例
1. Binance - 获取账户详细信息
python
# 获取 Binance 期货账户详细信息
result = exchange.IO("api", "GET", "/fapi/v2/account")
Log("总权益:", result.get('totalWalletBalance'))
Log("可用余额:", result.get('availableBalance'))
Log("总未实现盈亏:", result.get('totalUnrealizedProfit'))
Log("总保证金余额:", result.get('totalMarginBalance'))
# 查看所有资产
for asset in result.get('assets', []):
if float(asset['walletBalance']) > 0:
Log(f"{asset['asset']}: {asset['walletBalance']}")2. Binance - 调整杠杆倍数
python
# 设置 BTCUSDT 杠杆为 10 倍
params = "symbol=BTCUSDT&leverage=10"
result = exchange.IO("api", "POST", "/fapi/v1/leverage", params)
if result.get('leverage') == 10:
Log("✅ 杠杆设置成功:", result)
else:
Log("❌ 杠杆设置失败:", result)3. Binance - 万向划转(统一账户 API)
python
# 从 U本位合约账户划转 50 USDT 到现货账户
params = "type=UMFUTURE_MAIN&asset=USDT&amount=50"
result = exchange.IO("api", "POST", "/sapi/v1/asset/transfer", params)
if result.get('tranId'):
Log("✅ 划转成功,交易ID:", result['tranId'])
else:
Log("❌ 划转失败:", result)4. Binance - 设置持仓模式(单向/双向)
python
# 开启双向持仓模式
params = "dualSidePosition=true"
result = exchange.IO("api", "POST", "/fapi/v1/positionSide/dual", params)
Log("持仓模式设置结果:", result)5. Binance - 批量下单
python
import json
# 批量下单(最多 5 个订单)
batch_orders = [
{
"symbol": "BTCUSDT",
"side": "BUY",
"type": "LIMIT",
"quantity": "0.001",
"price": "50000",
"timeInForce": "GTC"
},
{
"symbol": "ETHUSDT",
"side": "BUY",
"type": "LIMIT",
"quantity": "0.01",
"price": "3000",
"timeInForce": "GTC"
}
]
params = f"batchOrders={json.dumps(batch_orders)}"
result = exchange.IO("api", "POST", "/fapi/v1/batchOrders", params)
for order in result:
if order.get('code'):
Log(f"❌ 订单失败: {order}")
else:
Log(f"✅ 订单成功: {order['symbol']} OrderID={order['orderId']}")6. Binance - 获取持仓风险
python
# 获取所有持仓的风险信息
result = exchange.IO("api", "GET", "/fapi/v2/positionRisk")
for pos in result:
if float(pos['positionAmt']) != 0:
Log(f"交易对: {pos['symbol']}")
Log(f"持仓量: {pos['positionAmt']}")
Log(f"开仓均价: {pos['entryPrice']}")
Log(f"未实现盈亏: {pos['unRealizedProfit']}")
Log(f"杠杆倍数: {pos['leverage']}")
Log(f"强平价格: {pos['liquidationPrice']}")
Log("---")7. Gate.io - 获取账户详情
python
# Gate.io 期货账户信息
result = exchange.IO("api", "GET", "/api/v4/futures/usdt/accounts")
Log("用户ID:", result.get('user'))
Log("货币:", result.get('currency'))
Log("总余额:", result.get('total'))
Log("未实现盈亏:", result.get('unrealised_pnl'))
Log("持仓保证金:", result.get('position_margin'))
Log("订单保证金:", result.get('order_margin'))
Log("可用余额:", result.get('available'))8. Gate.io - 设置杠杆
python
# 设置 BTC_USDT 杠杆为 5 倍
params = "leverage=5&cross_leverage_limit=10"
result = exchange.IO("api", "POST", "/api/v4/futures/usdt/positions/BTC_USDT/leverage", params)
Log("杠杆设置结果:", result)9. 获取交易对配置信息
python
# Binance - 获取交易规则
result = exchange.IO("api", "GET", "/fapi/v1/exchangeInfo")
# 查找 BTCUSDT 配置
for symbol_info in result.get('symbols', []):
if symbol_info['symbol'] == 'BTCUSDT':
Log("交易对状态:", symbol_info['status'])
Log("最小下单量:", symbol_info['filters'][1]['minQty'])
Log("最大下单量:", symbol_info['filters'][1]['maxQty'])
Log("数量精度:", symbol_info['quantityPrecision'])
Log("价格精度:", symbol_info['pricePrecision'])
break10. 错误处理
python
try:
# 调用 API
params = "symbol=BTCUSDT"
result = exchange.IO("api", "GET", "/fapi/v1/openOrders", params)
Log("当前挂单:", result)
except Exception as e:
Log(f"❌ API 调用失败: {e}")
# 检查错误类型
if "Invalid symbol" in str(e):
Log("交易对不存在")
elif "Authentication" in str(e):
Log("API Key 认证失败")
elif "rate limit" in str(e):
Log("请求频率超限,稍后重试")11. 获取历史成交记录
python
# Binance - 获取最近的成交记录
params = "symbol=BTCUSDT&limit=10"
result = exchange.IO("api", "GET", "/fapi/v1/userTrades", params)
for trade in result:
Log(f"时间: {trade['time']}")
Log(f"价格: {trade['price']}")
Log(f"数量: {trade['qty']}")
Log(f"手续费: {trade['commission']} {trade['commissionAsset']}")
Log(f"方向: {'买入' if trade['buyer'] else '卖出'}")
Log("---")API 端点参考
Binance 期货常用端点
| 功能 | 端点 | 方法 |
|---|---|---|
| 账户信息 | /fapi/v2/account | GET |
| 持仓信息 | /fapi/v2/positionRisk | GET |
| 杠杆设置 | /fapi/v1/leverage | POST |
| 持仓模式 | /fapi/v1/positionSide/dual | POST |
| 批量下单 | /fapi/v1/batchOrders | POST |
| 当前挂单 | /fapi/v1/openOrders | GET |
| 历史订单 | /fapi/v1/allOrders | GET |
| 成交记录 | /fapi/v1/userTrades | GET |
| 交易规则 | /fapi/v1/exchangeInfo | GET |
Gate.io 期货常用端点
| 功能 | 端点 | 方法 |
|---|---|---|
| 账户信息 | /api/v4/futures/usdt/accounts | GET |
| 持仓列表 | /api/v4/futures/usdt/positions | GET |
| 杠杆设置 | /api/v4/futures/usdt/positions/{contract}/leverage | POST |
| 下单 | /api/v4/futures/usdt/orders | POST |
| 订单列表 | /api/v4/futures/usdt/orders | GET |
| 成交记录 | /api/v4/futures/usdt/my_trades | GET |
注意事项
-
API 文档:不同交易所的 API 端点和参数格式不同,请参考官方文档:
-
参数格式:
params使用 URL 查询字符串格式(key1=value1&key2=value2),而非 JSON -
路径前缀:Binance 支持多种 API 路径前缀:
/fapi/*- 期货 API(使用 fapi.binance.com)/sapi/*- 统一账户 API(使用 api.binance.com)/api/*- 现货 API(使用 api.binance.com)
-
请求频率限制:每个交易所都有请求频率限制,过于频繁会被限流或封禁
-
签名认证:
IO()方法会自动处理 API 签名,无需手动添加 -
错误处理:建议使用
try-except捕获异常,避免策略崩溃 -
安全性:不要在日志中输出完整的 API 响应,可能包含敏感信息
相关 API
完整示例:动态调整杠杆和持仓
python
import json
def adjust_leverage_and_position():
"""根据账户风险动态调整杠杆"""
# 1. 获取账户信息
account_info = exchange.IO("api", "GET", "/fapi/v2/account")
total_equity = float(account_info['totalWalletBalance'])
total_upnl = float(account_info['totalUnrealizedProfit'])
# 2. 计算风险率
risk_rate = abs(total_upnl) / total_equity * 100 if total_equity > 0 else 0
Log(f"总权益: {total_equity} USDT")
Log(f"未实现盈亏: {total_upnl} USDT")
Log(f"风险率: {risk_rate:.2f}%")
# 3. 根据风险动态调整杠杆
if risk_rate > 20:
# 风险过高,降低杠杆
new_leverage = 5
Log("⚠️ 风险过高,降低杠杆到 5x")
elif risk_rate < 5:
# 风险较低,可以提高杠杆
new_leverage = 20
Log("✅ 风险较低,提高杠杆到 20x")
else:
# 保持中等杠杆
new_leverage = 10
Log("📊 风险适中,保持杠杆 10x")
# 4. 设置杠杆
params = f"symbol=BTCUSDT&leverage={new_leverage}"
result = exchange.IO("api", "POST", "/fapi/v1/leverage", params)
Log(f"杠杆调整结果: {result['leverage']}x")
# 每小时检查一次
adjust_leverage_and_position()