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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:45:43