使用Interactive Brokers无法获取外汇历史数据求助
解决IB获取EUR/USD历史数据的Error 162问题
错误原因分析
你碰到的Error 162是IB提示无对应合约的历史数据,核心问题出在这几个细节:
whatToShow='ADJUSTED_LAST':这个参数是给股票复权收盘价设计的,外汇现金合约(CASH)不支持该选项useRTH=True:外汇是24小时交易品种,常规交易时间(RTH)覆盖范围极小,开启后会导致大部分时间段无数据- 部分barSize与duration的组合可能不在IB历史数据的覆盖范围内
修复后的代码
直接调整关键参数,同时保留正确的合约设置,修改后代码如下:
import datetime from ib_insync import * if __name__ == '__main__': ib = IB() # 连接IB网关/TWS,注意端口:实盘用7496,模拟盘用7497 ib.connect('127.0.0.1', port=7497, clientId=1) # EUR/USD现金合约设置无需修改 contract = Contract() contract.symbol = "EUR" contract.secType = "CASH" contract.currency = "USD" contract.exchange = "IDEALPRO" # 修正历史数据请求参数 data = ib.reqHistoricalData( contract=contract, endDateTime='', # 为空默认取最新数据 durationStr='100 D', barSizeSetting='30 mins', useRTH=False, # 关闭常规交易时间限制,获取24小时全时段数据 whatToShow='LAST', # 外汇可选LAST/BID/ASK,按需选择 keepUpToDate=False # 不需要实时更新时设为False ) # 打印前5条数据验证结果 if data: print(data[:5]) ib.disconnect()
额外注意事项
- 若仍报错,先检查IB Gateway/TWS是否已登录,且账户具备外汇数据访问权限(模拟账户默认开通,实盘需确认是否订阅对应数据)
- 避免使用冷门的barSize+duration组合,比如1分钟数据对应duration建议不超过7天,IB对不同周期的数据保留时长有明确限制
- 可尝试将
whatToShow替换为BID或ASK,确认是否能正常获取数据
内容的提问来源于stack exchange,提问作者Volatil3
相关产品推荐
相关产品推荐

