请求家庭代码
reqFamilyCodes() 用来请求这个 TWS 会话可见账户的家庭代码信息。这个方法没有参数,也不需要 reqId。
app.reqFamilyCodes()请求发出后,结果会通过 familyCodes(familyCodes) 回调返回。
| 检查项 | 原因 |
|---|---|
| TWS 或 IB Gateway 已登录 | API 不能绕过登录和账户权限 |
| API Socket 已启用 | 程序需要连接 TWS API 端口 |
已收到 nextValidId() | 表示基础连接握手已经完成 |
| 账户类型可能支持 account family | 普通单账户也能请求,但 family code 可能为空 |
这个接口不需要市场数据权限,也不涉及下单权限。它返回的是账户结构信息。
最小请求流程
Section titled “最小请求流程”连接 TWS / IB Gateway -> 等待 nextValidId() -> reqFamilyCodes() -> familyCodes(familyCodes) -> disconnect()因为 reqFamilyCodes() 没有参数,排查问题时重点看两件事:
- 是否收到了
familyCodes()回调。 - 是否出现非信息类错误。
Python 请求示例
Section titled “Python 请求示例”下面示例只演示请求动作和回调是否到达,不公开打印真实账户号。
import threadingfrom ibapi.client import EClientfrom ibapi.wrapper import EWrapper
INFO_CODES = {2100, 2104, 2106, 2158}
class RequestFamilyCodesApp(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.ready = threading.Event() self.family_ready = threading.Event() self.family_code_count = 0 self.info_codes = [] self.errors_seen = []
def nextValidId(self, orderId): self.ready.set()
def familyCodes(self, familyCodes): self.family_code_count = len(familyCodes or []) self.family_ready.set()
def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""): if errorCode in INFO_CODES: self.info_codes.append(errorCode) else: self.errors_seen.append((reqId, errorCode, errorString))
app = RequestFamilyCodesApp()
try: app.connect("127.0.0.1", 7497, clientId=979)
thread = threading.Thread(target=app.run, daemon=True) thread.start()
if not app.ready.wait(8): raise RuntimeError("等待 nextValidId 超时")
app.reqFamilyCodes()
callback_received = app.family_ready.wait(8)
finally: if app.isConnected(): app.disconnect()
print(f"REQUEST_SENT=True")print(f"FAMILY_CALLBACK_RECEIVED={callback_received}")print(f"FAMILY_CODE_ROW_COUNT={app.family_code_count}")print("INFO_CODES=" + (",".join(map(str, sorted(set(app.info_codes)))) if app.info_codes else "NONE"))print(f"NON_INFO_ERROR_COUNT={len(app.errors_seen)}")print(f"IS_CONNECTED_AFTER_DISCONNECT={app.isConnected()}")TWS 模拟账户环境下,脱敏输出如下:
REQUEST_SENT=TrueFAMILY_CALLBACK_RECEIVED=TrueFAMILY_CODE_ROW_COUNT=1INFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0IS_CONNECTED_AFTER_DISCONNECT=False这说明 reqFamilyCodes() 请求成功,TWS 返回了 familyCodes() 回调。是否有真实 family code,要在接收页面里读取 FamilyCode.familyCodeStr 判断。
为什么这个方法没有 reqId?
Section titled “为什么这个方法没有 reqId?”家庭代码请求属于简单账户结构查询,官方 Python API 的方法签名就是无参数。程序里如果需要追踪日志,可以自己在调用前后打印业务流水号,但这个流水号不会由 TWS 带回。
是否需要取消?
Section titled “是否需要取消?”不需要。reqFamilyCodes() 不是持续订阅型接口,没有对应的取消方法。收到回调后,本次请求就结束了。
普通模拟账户能请求吗?
Section titled “普通模拟账户能请求吗?”可以请求。普通账户常见结果是有账户行,但 familyCodeStr 为空。这个结果表示账户没有可用 family code,不代表请求失败。