跳转到内容

分配方法与组

财务顾问账户的核心能力,是把一笔交易分配到多个客户账户。TWS API 不会替开发者自动决定“哪些账户参与、每个账户分多少”,这些规则需要在 TWS 的 FA 配置里定义,再由订单引用对应账户组。

普通个人账户通常没有 FA 配置。代码可以连接 TWS,但请求 FA 数据时会被拒绝,这是账户类型限制,不是 Socket 连接问题。

名称中文含义作用
Account Group账户组一组参与分配的子账户。
Profile旧式分配配置旧版本文档常见;新项目优先使用 Group。
Allocation Method分配方法决定订单数量如何拆到不同账户。
XML配置载体requestFA() 返回、replaceFA() 提交的配置文本。
faGroup订单字段指定这笔订单使用哪个账户组。
faMethod订单字段可用于部分旧式 Profile 或需要覆盖默认方法的场景;新项目优先读取组默认方法。
faPercentage订单字段主要用于百分比变化等旧式用法;不要把它当成所有百分比分配的唯一入口。
方法名中文理解订单数量是否需要填写典型用途
EqualQuantity / Equal等数量或等持仓目标需要TWS 不同界面可能显示不同名称,代码以 XML 返回值为准。
NetLiq按净清算价值分配需要按账户整体规模分配。
AvailableEquity按可用权益分配需要按账户可用资金承接能力分配。
PctChange按持仓百分比增减通常不需要增加、减少或清空已有持仓。
Percentages按指定百分比分配需要按固定权重拆分总订单。
Ratios / Financial Ratios按相对比例分配需要用 2:1、4:2:1 这类比例拆分。
Shares按绝对股数或合约数分配由配置计算每个账户的数量提前确定。
MonetaryAmount按金额分配由配置和价格换算每个账户按指定金额换算数量。

PctChange 容易被误解。它不是“把订单总量按百分比分掉”,而是对已有持仓做百分比增减;例如 -100 常用于尝试完全减少已有持仓。新手应先用模拟环境理解行为,再把它放进策略。

from ibapi.order import Order
def build_fa_order():
order = Order()
order.action = "BUY"
order.orderType = "LMT"
order.totalQuantity = 100
order.lmtPrice = 10.00
# 使用 TWS 中已经存在的账户组。真实组名来自 requestFA(1) 返回的 XML。
order.faGroup = "Group_Equal"
# 如果组内已经有默认方法,通常可以不写 faMethod。
# 只有在明确知道账户配置和 TWS 行为时才覆盖它。
order.faMethod = ""
# 大多数现代 Group 场景留空,分配参数来自 TWS 里的组配置。
order.faPercentage = ""
return order

placeOrder() 本身和普通订单一样,差异在 Order 对象里是否带了 FA 字段。组名不存在、方法不匹配、账户不是 FA 账户,都会进入 error() 回调。

非 FA 账户请求三类 FA 配置时,TWS 连接正常,但不会返回 XML:

REQUEST_FA_SENT=1
REQUEST_FA_SENT=3
REQUEST_FA_SENT=2
CONNECTED=True
FA_CALLBACK_COUNT=0
NON_INFO_ERROR_COUNT=3
ERROR=reqId=-1;code=321;msg=FA data operations ignored for non FA customers.

中文界面的 TWS 可能在错误文本前加上“确认请求时出错”,但只要错误码是 321,并且消息包含 non FA customers,含义就是账户没有 FA 权限。遇到这个结果时,应停止 FA 分配测试,改用具备 Financial Advisor 或 IBroker 权限的账户验证。

  1. 先在 TWS 中确认账户是 FA 账户,并创建账户组。
  2. requestFA() 读取组 XML。
  3. 解析 XML,展示组名、默认方法和账户数量。
  4. 构造带 faGroup / faMethod 的订单。
  5. 在模拟环境提交小数量订单,检查 openOrder()orderStatus()error()
  6. 分配结果符合预期后,再考虑真实交易环境。