FA 下单
FA 下单仍然使用 placeOrder(orderId, contract, order)。区别在于 Order 对象会携带分配字段,让 TWS 知道这笔订单要进入哪个账户组。具体怎么拆分,通常来自 TWS 中这个组的默认分配方法。
基本限价单示例
Section titled “基本限价单示例”from ibapi.contract import Contractfrom ibapi.order import Order
def aapl_contract(): contract = Contract() contract.symbol = "AAPL" contract.secType = "STK" contract.exchange = "SMART" contract.currency = "USD" contract.primaryExchange = "NASDAQ" return contract
def fa_limit_order(): order = Order() order.action = "BUY" order.orderType = "LMT" order.totalQuantity = 100 order.lmtPrice = 10.00
# 账户组必须已经存在于 TWS 的 FA 配置中。 # 真实组名应来自 requestFA(1) 返回的 XML。 order.faGroup = "Group_Equal"
# 新项目优先使用组默认方法;只有明确需要覆盖时才填写。 order.faMethod = ""
# 大多数 Group 场景留空。不要把百分比参数当成通用分配配置。 order.faPercentage = "" return order提交方式:
app.placeOrder(next_order_id, aapl_contract(), fa_limit_order())| 字段 | 中文含义 | 常见错误 |
|---|---|---|
account | 指定主账户或目标账户 | FA 场景不要随意填子账户,需按账户结构确认。 |
faGroup | 账户组名称 | 组名拼错会被 TWS 拒绝。 |
faMethod | 分配方法覆盖项 | 与组配置不匹配时可能导致拒单或非预期分配;不确定时留空。 |
faPercentage | 百分比相关参数 | 只适合明确需要该字段的旧式或特殊分配方式;顺序必须和账户配置一致。 |
modelCode | 模型组合代码 | 用于模型组合订单,不等同于 faGroup。 |
| 检查项 | 为什么重要 |
|---|---|
requestFA() 能返回 XML | 说明账户具备 FA 数据权限。 |
| XML 中存在目标组 | 避免提交不存在的 faGroup。 |
| 组内账户数量正确 | 避免分配到缺失或错误账户。 |
| 合约详情能返回 | 先确认交易标的本身有效。 |
| 订单价格和数量合理 | 避免触发价格、保证金或最小单位错误。 |
| 模拟账户先验证 | 观察 openOrder() 和 TWS 分配结果。 |
| 回调 | 用途 |
|---|---|
openOrder() | 查看 TWS 接收的订单字段。 |
orderStatus() | 查看订单是否提交、成交、取消或拒绝。 |
error() | 查看权限、组名、方法、价格和风控错误。 |
execDetails() | 查看成交明细。 |
如果订单进入 TWS 后分配不符合预期,应先停止策略,重新读取 FA XML 并核对组、方法、账户顺序和 TWS 设置。
账户权限限制
Section titled “账户权限限制”普通模拟账户可以连接 TWS,但如果 requestFA() 返回 321 non FA customers,就不能验证真实 FA 分配下单,只能验证普通合约、普通订单字段和连接流程。FA 下单需要切换到具备 FA 权限的模拟或真实账户。
如果只是验证 TWS Socket、合约详情、普通 placeOrder()、openOrder() 和 orderStatus(),可以继续使用普通模拟账户;如果要验证 faGroup、faMethod、faPercentage 的真实分配结果,就必须使用 FA 账户。