使用IB_insync的accountvalues()获取'SettledCash'返回None求助
问题排查与解决建议
你的代码逻辑本身没问题,但返回None说明没有找到符合tag="SettledCash"且currency="USD"的账户条目,可以从以下几个方向排查:
1. 先确认账户数据里是否真的存在SettledCash
在调用函数前,先打印所有账户值的标签、货币和数值,确认目标条目是否存在:
# 先打印所有账户数据,排查可用标签 for item in ib.accountValues(): print(f"标签: {item.tag}, 货币: {item.currency}, 值: {item.value}")
如果输出里没有SettledCash(或者是带空格的Settled Cash),那就是标签名称不对,需要用实际存在的标签名。
2. 检查是否订阅了账户更新
IB的API需要主动订阅账户数据才会返回完整的实时信息,如果没调用过ib.reqAccountUpdates(True),accountValues()可能只返回缓存的部分数据。在你的函数开头加上这行代码试试:
def returnAccountValue(tag="SettledCash", currency="USD"): ib.reqAccountUpdates(True) # 开启账户数据订阅 accountValues = ib.accountValues() for a in accountValues: if a.tag == tag and a.currency == currency: return float(a.value)
3. 处理标签名称的大小写/空格差异
有些情况下,API返回的标签可能带空格(比如Settled Cash)或者大小写不同,你可以修改匹配逻辑,忽略这些差异:
def returnAccountValue(tag="SettledCash", currency="USD"): ib.reqAccountUpdates(True) target_tag = tag.strip().lower() accountValues = ib.accountValues() for a in accountValues: if a.tag.strip().lower() == target_tag and a.currency == currency: return float(a.value) # 没找到时打印所有可用标签,方便排查 print("可用标签列表:") for a in accountValues: print(f"- {a.tag} ({a.currency})") return None
4. 账户类型限制
部分账户类型(比如某些地区的现金账户)可能不会返回SettledCash字段,这种情况下你需要用IB提供的对应账户字段来替代。
内容的提问来源于stack exchange,提问作者OffensiveName
相关产品推荐
相关产品推荐

