如何在Python版IBKR API提交的订单中添加时间条件
IBKR API 添加时间触发条件单实现方法
核心修改步骤
IBKR服务端原生支持时间条件单,不需要本地写定时任务轮询,订单提交后条件存储在券商服务器,到点自动触发报单,修改逻辑如下:
- 补充导入订单条件类型枚举
OrderConditionType - 调用
Create(OrderConditionType.Time)生成时间条件实例 - 配置时间条件参数:
isMore=True代表系统时间晚于设定值时触发,time字段严格按YYYYMMDD HH:MM:SS格式填写触发时间,注意时区必须和TWS/IB网关的设置保持一致 - 将条件实例追加到订单的
conditions列表,配置好条件生效规则后提交订单即可
需求对应完整可运行代码
针对2023年7月20日美东时间下午2:30买入100股AAPL市价单的需求,修改后的代码如下,时间条件部分已做明确标注:
from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.contract import Contract from ibapi.order import * from threading import Timer from ibapi.order_condition import OrderCondition, Create, OrderConditionType class TestApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) def error(self, reqId , errorCode, errorString): print("Error: ", reqId, " ", errorCode, " ", errorString) def nextValidId(self, orderId ): self.nextOrderId = orderId self.start() def orderStatus(self, orderId , status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld, mktCapPrice): print("OrderStatus. Id: ", orderId, ", Status: ", status, ", Filled: ", filled, ", Remaining: ", remaining, ", LastFillPrice: ", lastFillPrice) def openOrder(self, orderId, contract, order, orderState): print("OpenOrder. ID:", orderId, contract.symbol, contract.secType, "@", contract.exchange, ":", order.action, order.orderType, order.totalQuantity, orderState.status) def execDetails(self, reqId, contract, execution): print("ExecDetails. ", reqId, contract.symbol, contract.secType, contract.currency, execution.execId, execution.orderId, execution.shares, execution.lastLiquidity) def start(self): contract = Contract() contract.symbol = "AAPL" contract.secType = "STK" contract.exchange = "SMART" contract.currency = "USD" contract.primaryExchange = "NASDAQ" order = Order() order.action = "BUY" order.totalQuantity = 100 order.orderType = "MKT" # ========== 时间条件配置开始 ========== time_cond = Create(OrderConditionType.Time) time_cond.isMore = True # 触发时间:2023年7月20日14:30:00 美东时间 time_cond.time = "20230720 14:30:00" order.conditions.append(time_cond) # 设为False代表仅常规交易时段判断条件,盘前盘后不触发 order.conditionsIgnoreRth = False order.transmit = True # ========== 时间条件配置结束 ========== self.placeOrder(self.nextOrderId, contract, order) def stop(self): self.done = True self.disconnect() def main(): app = TestApp() app.nextOrderId = 0 # 模拟盘默认端口7497,实盘默认端口7496,根据自身TWS设置调整 app.connect("127.0.0.1", 7497, 9) Timer(3, app.stop).start() app.run() if __name__ == "__main__": main()
注意事项
- 提交订单前先打开TWS的API设置页,确认已开启订单条件相关权限,否则接口会返回权限类报错
- 时间字段的时区必须和TWS登录时选择的时区完全匹配,否则触发时间会出现偏移。例如TWS设为北京时间时,美东2023年7月20日14:30对应北京时间2023年7月21日02:30,时间字段需要改为
"20230721 02:30:00" - 条件单提交后存储在IBKR服务器,不需要本地程序一直保持运行,到点会自动触发。需要撤销时直接调用
cancelOrder传入对应订单ID即可 - 支持叠加多类条件,比如同时添加价格、成交量触发规则,全部追加到
order.conditions列表即可,默认所有条件同时满足时才会触发报单。
内容的提问来源于stack exchange,提问作者Jasmine Scott
相关产品推荐
相关产品推荐

