请求 FA 组和配置
requestFA() 用来向 TWS 请求财务顾问账户的分配配置。它只读取配置,不会修改账户组,也不会提交订单。
这个接口只有在账户具备 FA 能力时才会返回 XML。普通个人账户连接成功后,通常会收到 321 权限错误。
官方参考:
app.requestFA(faData)| 参数 | 类型 | 中文含义 | 常见取值 |
|---|---|---|---|
faData | int | 要请求的 FA 数据类型 | 1 账户组,3 账户别名;2 是旧 Profile 兼容项,新项目不要围绕它设计。 |
在 Python 代码里建议定义成可读常量:
FA_GROUPS = 1FA_ALIASES = 3FA_PROFILES_LEGACY = 2def request_fa_config(app): # 请求账户组配置。新项目主要围绕 Group 设计。 app.requestFA(FA_GROUPS)
# 请求账户别名,便于把账户编号映射成更易读的名称。 app.requestFA(FA_ALIASES)
# 旧 Profile 配置只用于维护老系统。TWS 983+ 后新项目通常不用它。 app.requestFA(FA_PROFILES_LEGACY)请求结果不会从 requestFA() 返回值里拿到,而是异步进入 receiveFA()。如果账户没有权限,则进入 error()。
最小脚本结构
Section titled “最小脚本结构”from ibapi.client import EClientfrom ibapi.wrapper import EWrapper
class FAApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self)
def nextValidId(self, orderId): # 连接初始化完成后再发 FA 请求。 self.requestFA(1) self.requestFA(3)
def receiveFA(self, faDataType, cxml): # cxml 是 TWS 返回的 XML 字符串。 print("收到 FA 配置类型:", faDataType) print(cxml)
def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""): print("错误:", reqId, errorCode, errorString)普通账户参考结果
Section titled “普通账户参考结果”REQUEST_FA_SENT=1REQUEST_FA_SENT=3REQUEST_FA_SENT=2CONNECTED=TrueFA_CALLBACK_COUNT=0INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=3ERROR=reqId=-1;code=321;msg=确认请求时出错。:-'X':导致- FA data operations ignored for non FA customers.判断方式:
| 现象 | 含义 |
|---|---|
CONNECTED=True | TWS Socket 连接正常。 |
INFO_CODES 只有 2104、2106、2158 | 行情服务器/历史数据服务器连接提示,不是失败。 |
FA_CALLBACK_COUNT=0 | 没有收到 FA XML。 |
code=321 且包含 non FA customers | 账户不是 FA 账户,不能读取 FA 配置。 |
如果是 FA 账户,预期会收到 receiveFA(faDataType, cxml),其中 cxml 是解析、备份和替换配置的核心数据。不要在没有收到 XML 的情况下构造 replaceFA() 请求。