Pharos
Trade

exchange.IO()

调用交易所底层 REST API 接口,用于访问平台未封装的高级功能。

语法

python
result = exchange.IO(api, method, path, params="")

参数

参数类型必填说明
apistrAPI 标识(如 "api"、"currency" 等)
methodstrHTTP 方法(支持: GET, POST, PUT, DELETE)
pathstrAPI 端点路径(如 "/fapi/v2/account"、"/sapi/v1/asset/transfer")
paramsstr请求参数(URL 查询字符串格式),默认 ""

返回值

返回交易所 API 的原始响应数据(字典格式)。

使用场景

IO() 方法主要用于:

  1. 访问平台未封装的交易所专有功能
  2. 调用新上线的 API 接口
  3. 获取详细的账户、订单、持仓等信息
  4. 执行高级交易操作(如批量下单、设置风险参数等)
  5. 访问统一账户 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'])
        break

10. 错误处理

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/accountGET
持仓信息/fapi/v2/positionRiskGET
杠杆设置/fapi/v1/leveragePOST
持仓模式/fapi/v1/positionSide/dualPOST
批量下单/fapi/v1/batchOrdersPOST
当前挂单/fapi/v1/openOrdersGET
历史订单/fapi/v1/allOrdersGET
成交记录/fapi/v1/userTradesGET
交易规则/fapi/v1/exchangeInfoGET

Gate.io 期货常用端点

功能端点方法
账户信息/api/v4/futures/usdt/accountsGET
持仓列表/api/v4/futures/usdt/positionsGET
杠杆设置/api/v4/futures/usdt/positions/{contract}/leveragePOST
下单/api/v4/futures/usdt/ordersPOST
订单列表/api/v4/futures/usdt/ordersGET
成交记录/api/v4/futures/usdt/my_tradesGET

注意事项

  1. API 文档:不同交易所的 API 端点和参数格式不同,请参考官方文档:

  2. 参数格式params 使用 URL 查询字符串格式key1=value1&key2=value2),而非 JSON

  3. 路径前缀:Binance 支持多种 API 路径前缀:

    • /fapi/* - 期货 API(使用 fapi.binance.com)
    • /sapi/* - 统一账户 API(使用 api.binance.com)
    • /api/* - 现货 API(使用 api.binance.com)
  4. 请求频率限制:每个交易所都有请求频率限制,过于频繁会被限流或封禁

  5. 签名认证IO() 方法会自动处理 API 签名,无需手动添加

  6. 错误处理:建议使用 try-except 捕获异常,避免策略崩溃

  7. 安全性:不要在日志中输出完整的 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()