Python IBKR/IB API/IB TWS 如何将类方法参数作为代码输入获取账户余额
问题解决:IB API异步请求获取账户余额输出异常
错误原因
reqAccountSummary是IB API提供的异步请求接口,本身没有返回值,调用后仅向TWS服务端发送查询请求,所以直接打印该方法的返回值必然得到None- 账户余额数据是服务端返回后通过
accountSummary回调方法接收的,你在回调里直接打印了value,所以余额会单独出现在另一行 - 回调方法中
IBapi.USD_cash_balance = value是给类属性赋值,而非给当前实例的属性赋值,逻辑有误
修正方案
修改逻辑说明
- 回调内改为给实例的
USD_cash_balance属性赋值 - 发送查询请求后添加等待逻辑,待回调更新余额后再拼接输出
- 最终输出直接读取实例存储的余额属性
修正后完整代码
from ibapi.wrapper import EWrapper # 处理服务端返回的消息 from ibapi.client import EClient from ibapi.contract import Contract from ibapi.order import * import threading import time class IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) self.contract_details = {} self.bardata = {} # 存储K线数据的字典 self.USD_cash_balance = None # 初始设为None方便判断是否返回数据 def nextValidId(self, orderId: int): super().nextValidId(orderId) self.nextorderId = orderId print('下一个可用订单ID为: ', self.nextorderId) def accountSummary(self, reqId: int, account: str, tag: str, value: str, currency: str): if tag == "CashBalance" and reqId == 131: # 给当前实例的余额属性赋值 self.USD_cash_balance = value def run_loop(): app.run() # 启动和TWS的通信 app = IBapi() app.nextorderId = None app.connect('127.0.0.1', 7497, 123) # 单独线程启动socket通信 api_thread = threading.Thread(target=run_loop, daemon=True) api_thread.start() # 等待API连接成功 while True: if isinstance(app.nextorderId, int): print('连接成功') break else: print('等待连接中') time.sleep(2) # 发送账户余额查询请求 app.reqAccountSummary(131, "All", "$LEDGER:USD") # 等待回调返回余额数据 while app.USD_cash_balance is None: time.sleep(0.5) # 拼接输出结果 print(f"My account balance in USD is: {app.USD_cash_balance}") # 可选:查询完成后断开连接 app.disconnect()
内容的提问来源于stack exchange,提问作者Bryce Turner
相关产品推荐
相关产品推荐

