Interactive Brokers Python API多订单下单标的错误问题修复
问题根因
你的orderId递增逻辑没有错误,bug来自循环结构设计失误:
- 你把合约构造、订单提交拆成了两个互不关联的独立for循环
- 第一个循环遍历股票代码列表
t时,每次迭代都会重写contract变量,循环全部执行完后,contract只会保留最后一次赋值的结果,也就是标的为CRM的股票合约 - 第二个循环遍历下单数量列表
n时,三次调用placeOrder接口传入的都是同一个固定为CRM的合约对象,最终三笔订单自然全部落在CRM标的上,和预期不符。
修正方案
把两个独立循环合并,每次迭代同步取出对应位置的股票代码、下单数量,在同一次循环内完成合约创建、订单配置、下单提交全流程,避免变量被后续迭代覆盖。推荐用zip()同步遍历两个列表,不需要手动维护索引,能避免索引错位问题。
修正后的start()方法代码如下:
def start(self): # 同步遍历标的列表和下单数量列表 for symbol, quantity in zip(t, n): # 为当前标的创建专属合约对象 contract = Contract() contract.symbol = symbol contract.secType = "STK" contract.exchange = "SMART" contract.currency = "USD" contract.primaryExchange = "NASDAQ" # 配置对应数量的市价买单 order = Order() order.action = "BUY" order.totalQuantity = quantity order.orderType = "Market" # 提交订单并递增订单ID self.placeOrder(self.nextOrderId, contract, order) self.nextOrderId += 1
注意事项:IB API要求每笔新提交的订单必须使用全局唯一的orderId,你原本写的下单完成后递增ID的逻辑完全符合要求,不需要调整。
内容的提问来源于stack exchange,提问作者Jasmine Scott
相关产品推荐
相关产品推荐

