跳转到内容

请求直方图数据

reqHistogramData() 用来请求某个合约在一段时间内的价格直方图。它的参数比历史 K 线少,不需要 barSizeSetting,因为它不按时间切 bar。

官方参考:Histogram Data

from ibapi.contract import Contract
def make_aapl_contract():
"""创建 AAPL 股票合约。"""
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.exchange = "SMART"
contract.currency = "USD"
contract.primaryExchange = "NASDAQ"
return contract
contract = make_aapl_contract()
app.reqHistogramData(
4301, # reqId:请求编号
contract, # contract:合约对象
True, # useRTH:True 表示只统计常规交易时段
"1 week", # period:统计最近 1 周
)
参数中文解释说明
tickerId / reqId请求编号回调时用于识别请求
contract合约对象必须能被 TWS 识别
useRTH是否只使用常规交易时段True 只统计常规交易时段,False 包含更多时段
period统计窗口例如 1 day1 week。可用值受 TWS 支持范围影响。

同一合约分别测试 1 week1 day,TWS 返回历史数据服务器正常的系统提示,并触发 histogramData() 回调:

REQUEST_SENT=reqId=4301;symbol=AAPL;useRTH=True;period=1 week
REQUEST_SENT=reqId=4302;symbol=AAPL;useRTH=False;period=1 week
REQUEST_SENT=reqId=4303;symbol=AAPL;useRTH=True;period=1 day
CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
CALLBACK_RECEIVED=reqId=4301;name=aapl_rth_1_week;value=True
HISTOGRAM_ROWS=reqId=4301;name=aapl_rth_1_week;count=2951
CALLBACK_RECEIVED=reqId=4302;name=aapl_all_1_week;value=True
HISTOGRAM_ROWS=reqId=4302;name=aapl_all_1_week;count=2999
CALLBACK_RECEIVED=reqId=4303;name=aapl_rth_1_day;value=True
HISTOGRAM_ROWS=reqId=4303;name=aapl_rth_1_day;count=0
NON_INFO_ERROR_COUNT=0

所以直方图示例代码应当带超时处理。没有错误码不等于已经拿到数据;只有收到 histogramData() 才说明本次请求有明确结果。数组为空也要作为一种结果处理。

直方图仍依赖历史数据权限和合约可用性。建议先用 reqContractDetails() 确认合约,再用一个较短 period 测试返回结果。不要一开始就对大量合约批量请求,否则很容易把问题混在限频、权限和合约解析里。