如何使用ibpy在常规交易时段(RTH)外提交订单?
解决IBpy在常规交易时段外提交订单被延迟的问题
嘿,这问题我之前也碰到过!IB默认的订单设置是仅在常规交易时段(RTH)内生效,所以当你在盘前/盘后提交订单时,系统会自动延迟到RTH开始才发送到交易所。要解决这个问题,只需要给你的Order对象添加一个属性,明确允许订单在RTH外执行。
解决方案:修改Order对象的m_outsideRth属性
你只需要在创建newOrder的代码里,加上一行设置m_outsideRth = True,这样IB就会允许订单在扩展交易时段立即提交了。
修改后的完整代码如下:
from ib.opt import Connection from ib.ext.Contract import Contract from ib.ext.Order import Order import time port = 7496 client = 1 account = "XXXXX" newContract = Contract() newContract.m_symbol = "CL" newContract.m_secType = "FUT" newContract.m_exchange = "NYMEX" newContract.m_currency = "USD" newContract.m_expiry = "201806" newOrder = Order() newOrder.m_orderType = "LMT" newOrder.m_totalQuantity = 1 newOrder.m_action = "BUY" newOrder.m_lmtPrice = "65" # 添加这一行,允许在RTH外提交订单 newOrder.m_outsideRth = True tws_conn = Connection.create(port=port, clientId=client) print("------ Connecting.... --------") tws_conn.connect() time.sleep(1) # 注意:orderId需要每次递增,避免重复 orderId = 1 tws_conn.placeOrder(orderId, newContract, newOrder)
额外注意事项
- 确认你的合约支持扩展交易时段:比如你交易的NYMEX原油期货(CL)是支持盘前盘后交易的,但有些品种可能没有扩展时段,设置这个属性也不会生效。
- 检查TWS/IB Gateway的全局设置:确保在TWS的
Global Configuration->Trading->Hours里,已经开启了“Allow trading outside regular hours”的选项,否则即使代码里设置了,也可能被系统拦截。 - 订单ID的问题:你代码里用固定的
orderId=1,在实际使用中一定要记得每次提交新订单时递增订单ID,否则IB会拒绝重复的订单ID。
你收到的提示信息:
07:45:45:392 -> 4-2-1-399-Order Message: BUY 1 CL JUN'18 (CLM8) Warning: your order will not be placed at the exchange until 2018-05-14 09:30:00 US/Eastern-就是因为默认的订单只在RTH生效,添加
m_outsideRth=True后,这个提示就不会再出现,订单会立即提交到交易所的扩展时段交易池里。
内容的提问来源于stack exchange,提问作者Augusto




