17370845950

如何使用 CCXT 在 Bybit 上开仓与平仓空头头寸

本文详解如何通过 python 的 ccxt 库在 bybit 交易所开立和关闭现货/合约空头头寸,涵盖 api 配置、市价卖单开空、市价买单平空的完整流程,并强调关键参数设置与风险注意事项。

在 Bybit 上使用 CCXT 开仓与平仓空头头寸,核心在于正确调用市价订单(Market Order)并理解其在不同交易模式下的行为差异。需特别注意:Bybit 分为现货(Spot)与永续合约(USDT-M 或 COIN-M)两类市场,而 create_market_sell_order 是否真正开空,取决于当前账户类型与持仓模式

✅ 正确前提(以 USDT 本位永续合约为例):

  • 必须启用 逐仓(isolated)或全仓(cross)保证金模式
  • 确保已切换至合约交易接口(CCXT 默认 bybit() 实例连接的是永续合约 v5,但需显式指定 defaultType: 'swap' 更稳妥);
  • 若使用 BTC/USD(反向合约),请确认是否为 BTC/USD:BTC 格式;主流推荐使用 BTC/USDT:USDT(USDT 本位)。

以下是经过验证的完整示例代码(适配 Bybit v5 合约 API):

import ccxt
import time

# 初始化 Bybit 交易所实例(明确指定合约类型)
exchange = ccxt.bybit({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,
    'options': {
        'defaultType': 'swap',  # 关键!指定为永续合约
        'recvWindow': 10000,
    },
    'urls': {
        'api': 'https://api.bybit.com',  # 生产环境
        # 'api': 'https://api-testnet.bybit.com',  # 测试网(调试时启用)
    }
})

symbol = 'BTC/USDT:USDT'  # USDT 本位永续合约交易对(务必使用此格式)
amount = 0.001  # 开仓数量(按合约张数或基础币计,依 symbol 而定)

try:
    # ✅ 开空:发送市价卖单 → 建立空头头寸
    open_short = exchange.create_market_sell_order(symbol, amount)
    print(f"[OPEN] Short order ID: {open_short['id']}, Status: {open_short['status']}")

    time.sleep(1.5)
    # 查询订单详情(确认成交)
    filled_open = exchange.fetch_order(open_short['id'], symbol)
    print(f"[FILLED] Opened short at avg price: {filled_open['average']:.2f}")

    # ✅ 平空:发送市价买单 → 对冲并关闭空头头寸
    close_short = exchange.create_market_buy_order(symbol, amount)
    print(f"[CLOSE] Close order ID: {close_short['id']}, Status: {close_short['status']}")

    time.sleep(1.5)
    filled_close = exchange.fetch_order(close_short['id'], symbol)
    print(f"[FILLED] Short position closed at avg price: {filled_close['average']:.2f}")

except Exception as e:
    print(f"❌ Error: {str(e)}")

⚠️ 重要注意事项:

  • API 权限:确保你的 Bybit API 密钥已开启「合约交易」权限(在 API 管理后台勾选 Contract Trading);
  • 保证金模式:首次开仓前,建议先用 exchange.set_margin_mode('isolated', symbol) 和 exchange.set_leverage(10, symbol) 显式设置杠杆与保证金模式;
  • 订单类型限制:Bybit 合约不支持 create_limit_sell_order 直接开空(因需指定价格且可能触发拒绝),市价单(market)是最可靠方式;
  • 测试先行:强烈建议先在 Bybit Testnet 创建 API 并运行上述代码验证逻辑;
  • 错误处理:实际生产中应捕获 ccxt.InsufficientFunds、ccxt.OrderNotFound、ccxt.InvalidOrder 等异常,并加入重试与日志机制。

? 总结:开空即“卖出合约”,平空即“买入相同数量合约”——本质是方向相反的等量对冲操作。只要 symbol 正确、defaultType 设为 'swap'、API 权限完备,create_market_sell_order 与 create_market_buy_order 即可稳定实现空头建仓与平仓。切勿在现货市场误用该逻辑(现货卖币 ≠ 开空),务必区分交易品种类型。