跳转到内容

请求家庭代码

reqFamilyCodes() 用来请求这个 TWS 会话可见账户的家庭代码信息。这个方法没有参数,也不需要 reqId

app.reqFamilyCodes()

请求发出后,结果会通过 familyCodes(familyCodes) 回调返回。

检查项原因
TWS 或 IB Gateway 已登录API 不能绕过登录和账户权限
API Socket 已启用程序需要连接 TWS API 端口
已收到 nextValidId()表示基础连接握手已经完成
账户类型可能支持 account family普通单账户也能请求,但 family code 可能为空

这个接口不需要市场数据权限,也不涉及下单权限。它返回的是账户结构信息。

连接 TWS / IB Gateway
-> 等待 nextValidId()
-> reqFamilyCodes()
-> familyCodes(familyCodes)
-> disconnect()

因为 reqFamilyCodes() 没有参数,排查问题时重点看两件事:

  • 是否收到了 familyCodes() 回调。
  • 是否出现非信息类错误。

下面示例只演示请求动作和回调是否到达,不公开打印真实账户号。

import threading
from ibapi.client import EClient
from 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=True
FAMILY_CALLBACK_RECEIVED=True
FAMILY_CODE_ROW_COUNT=1
INFO_CODES=2104,2106,2158
NON_INFO_ERROR_COUNT=0
IS_CONNECTED_AFTER_DISCONNECT=False

这说明 reqFamilyCodes() 请求成功,TWS 返回了 familyCodes() 回调。是否有真实 family code,要在接收页面里读取 FamilyCode.familyCodeStr 判断。

家庭代码请求属于简单账户结构查询,官方 Python API 的方法签名就是无参数。程序里如果需要追踪日志,可以自己在调用前后打印业务流水号,但这个流水号不会由 TWS 带回。

不需要。reqFamilyCodes() 不是持续订阅型接口,没有对应的取消方法。收到回调后,本次请求就结束了。

可以请求。普通账户常见结果是有账户行,但 familyCodeStr 为空。这个结果表示账户没有可用 family code,不代表请求失败。

IBKR Campus: TWS API Documentation