You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TWS API OCA组订单实盘账户提交失败 模拟账户运行正常问题求助

问题根因
  • 实盘账户对OCA组订单的提交校验规则远严于模拟账户:当你把第一个Transmit=true的订单提交到OCA组后,实盘会立刻锁定该OCA组的结构,后续再提交同组订单会被直接拒绝,你现有代码两个订单都设了Transmit=true,第一个提交后就触发了组锁,导致第二个订单报错。
  • 带AdjustedOrderType的调整止损单属于特殊订单类型,和普通限价止盈单同组时,实盘要求必须批量提交全部组内订单,不允许逐个提交。
修复方案

代码修改点

  1. 同OCA组内的所有非最后一个订单,Transmit属性统一设为false,仅最后一个订单设为Transmit=true,触发批量提交
  2. 若业务场景为止损/止盈二选一成交,将OcaType修改为1(组内任意订单成交后其余订单自动取消),实盘对该类型的兼容性更高
  3. 确保同组订单使用连续的有效订单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:36:01