跳转到内容

组合订单

组合订单用于同时交易多个腿,例如期权价差、股票配对、期货价差等。TWS API 里组合合约的 secType 通常是 BAG,每条腿放在 comboLegs 中。

组合订单最重要的不是 Python 语法,而是每条腿的 conId、方向、比例和组合价格含义。新手不要凭感觉拼腿,先在 TWS 里构造同样的组合,看清楚买卖方向和报价,再写 API。

官方参考:TWS API Documentation

from ibapi.contract import ComboLeg, Contract
def two_leg_combo() -> Contract:
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "BAG"
contract.currency = "USD"
contract.exchange = "SMART"
leg1 = ComboLeg()
leg1.conId = 111111 # 必须替换成真实合约 ID
leg1.ratio = 1 # 该腿数量比例
leg1.action = "BUY" # 该腿方向
leg1.exchange = "SMART"
leg2 = ComboLeg()
leg2.conId = 222222 # 必须替换成真实合约 ID
leg2.ratio = 1
leg2.action = "SELL"
leg2.exchange = "SMART"
contract.comboLegs = [leg1, leg2]
return contract

这里的 conId 不能随便写,必须先用合约详情接口查出真实合约 ID。期权组合尤其要确认到期日、行权价、看涨/看跌、交易所和乘数。

字段中文说明
conId单腿合约 ID。组合能否正确识别,首先取决于它。
ratio腿比例。例如 1:1 价差两条腿都写 1。
action该腿方向,常见为 BUYSELL
exchange该腿交易所或路由。美股/期权常见为 SMART,但并非所有产品都一样。
openClose开仓/平仓标记,高级场景使用。
shortSaleSlot卖空相关字段,股票组合涉及卖空时可能用到。
designatedLocation卖空定位相关字段。
exemptCode卖空豁免代码,普通用户通常不用。

组合订单也可以配合 Order 使用:

from ibapi.order import Order
order = Order()
order.action = "BUY"
order.orderType = "LMT"
order.totalQuantity = 1
order.lmtPrice = 0.50
order.transmit = True

组合订单的价格含义取决于腿的方向和组合类型。BUY 一个组合不一定等于“买入所有腿”;每条腿仍按自己的 ComboLeg.action 执行。组合的净价也不能简单理解为所有单腿价格相加。

  1. 先对每条腿分别请求 reqContractDetails(),确认 conId
  2. 确认每条腿的 ratioactionexchange
  3. 在 TWS 里手工构造同样组合,看报价方向和净价。
  4. whatIf=True 检查保证金和订单影响。
  5. 最后才提交模拟组合订单。
问题结果
conId 写错组合无法识别,或交易了错误的腿。
腿方向写反价差方向完全相反,盈亏结构改变。
ratio 写错实际仓位比例不符合策略。
组合净价理解反了限价方向不对,订单无法成交或风险变大。
未先用 what-if保证金、权限、产品支持问题到正式提交时才暴露。