TWS API OCA组订单实盘账户提交失败 模拟账户运行正常问题求助
问题根因
- 实盘账户对OCA组订单的提交校验规则远严于模拟账户:当你把第一个Transmit=true的订单提交到OCA组后,实盘会立刻锁定该OCA组的结构,后续再提交同组订单会被直接拒绝,你现有代码两个订单都设了Transmit=true,第一个提交后就触发了组锁,导致第二个订单报错。
- 带AdjustedOrderType的调整止损单属于特殊订单类型,和普通限价止盈单同组时,实盘要求必须批量提交全部组内订单,不允许逐个提交。
修复方案
代码修改点
- 同OCA组内的所有非最后一个订单,Transmit属性统一设为false,仅最后一个订单设为Transmit=true,触发批量提交
- 若业务场景为止损/止盈二选一成交,将OcaType修改为1(组内任意订单成交后其余订单自动取消),实盘对该类型的兼容性更高
- 确保同组订单使用连续的有效订单ID
修改后代码
int ordId = getNextValidId(); string ocaGroup = $"S_{ordId}"; Order adjustedStop = new Order(); adjustedStop.OrderId = ordId; adjustedStop.Action = "SELL"; adjustedStop.OrderType = "STP"; adjustedStop.AuxPrice = stopLossPrice1; adjustedStop.TotalQuantity = quantity; adjustedStop.TriggerPrice = stopTriggerPrice; adjustedStop.AdjustedOrderType = "STP"; adjustedStop.AdjustedStopPrice = stopLossPrice2; adjustedStop.OcaGroup = ocaGroup; adjustedStop.OcaType = 1; // 可根据业务需求调整,该参数实盘兼容性更高 adjustedStop.OverridePercentageConstraints = true; adjustedStop.Transmit = false; // 第一个订单不触发提交 Order takeProfit = new Order(); takeProfit.OrderId = getNextValidId(); // 确保和第一个订单取到连续的有效ID takeProfit.Action = "SELL"; takeProfit.OrderType = "LMT"; takeProfit.TotalQuantity = quantity; takeProfit.LmtPrice = takeProfitPrice; takeProfit.OcaGroup = ocaGroup; takeProfit.OcaType = 1; takeProfit.OverridePercentageConstraints = true; takeProfit.Transmit = true; // 最后一个订单触发全组批量提交 Scanner.placeOrder(adjustedStop.OrderId, contract_, adjustedStop ); Scanner.placeOrder(takeProfit.OrderId, contract_, takeProfit);
额外校验项
如果修改后仍有报错,可按以下顺序排查:
- 确认实盘TWS的「API设置」中已开启「支持OCA组提交」、「允许API修改订单」选项,模拟账户默认开启但实盘需要手动确认
- 确认调整止损单的价格偏移符合你开户券商的实盘订单价格限制,模拟账户无价格校验但实盘有明确限制
- 确认两个订单的持仓数量合计不超过当前可用持仓,实盘对超额卖单的校验更严格
内容的提问来源于stack exchange,提问作者Mr. G
相关产品推荐
相关产品推荐

