组合订单
组合订单用于同时交易多个腿,例如期权价差、股票配对、期货价差等。TWS API 里组合合约的 secType 通常是 BAG,每条腿放在 comboLegs 中。
组合订单最重要的不是 Python 语法,而是每条腿的 conId、方向、比例和组合价格含义。新手不要凭感觉拼腿,先在 TWS 里构造同样的组合,看清楚买卖方向和报价,再写 API。
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。期权组合尤其要确认到期日、行权价、看涨/看跌、交易所和乘数。
ComboLeg 字段
Section titled “ComboLeg 字段”| 字段 | 中文说明 |
|---|---|
conId | 单腿合约 ID。组合能否正确识别,首先取决于它。 |
ratio | 腿比例。例如 1:1 价差两条腿都写 1。 |
action | 该腿方向,常见为 BUY 或 SELL。 |
exchange | 该腿交易所或路由。美股/期权常见为 SMART,但并非所有产品都一样。 |
openClose | 开仓/平仓标记,高级场景使用。 |
shortSaleSlot | 卖空相关字段,股票组合涉及卖空时可能用到。 |
designatedLocation | 卖空定位相关字段。 |
exemptCode | 卖空豁免代码,普通用户通常不用。 |
组合订单价格
Section titled “组合订单价格”组合订单也可以配合 Order 使用:
from ibapi.order import Order
order = Order()order.action = "BUY"order.orderType = "LMT"order.totalQuantity = 1order.lmtPrice = 0.50order.transmit = True组合订单的价格含义取决于腿的方向和组合类型。BUY 一个组合不一定等于“买入所有腿”;每条腿仍按自己的 ComboLeg.action 执行。组合的净价也不能简单理解为所有单腿价格相加。
- 先对每条腿分别请求
reqContractDetails(),确认conId。 - 确认每条腿的
ratio、action、exchange。 - 在 TWS 里手工构造同样组合,看报价方向和净价。
- 用
whatIf=True检查保证金和订单影响。 - 最后才提交模拟组合订单。
| 问题 | 结果 |
|---|---|
conId 写错 | 组合无法识别,或交易了错误的腿。 |
| 腿方向写反 | 价差方向完全相反,盈亏结构改变。 |
ratio 写错 | 实际仓位比例不符合策略。 |
| 组合净价理解反了 | 限价方向不对,订单无法成交或风险变大。 |
| 未先用 what-if | 保证金、权限、产品支持问题到正式提交时才暴露。 |