行情
Client Portal API 的行情接口以 conid 为核心。你先通过合约接口查到 conid,再请求行情快照或订阅行情。
和 TWS Socket API 一样,行情数据受账户权限、交易所订阅、延迟行情规则和地区限制影响。能查到合约,不代表一定能拿到实时价格。
官方参考:Client Portal API
| 接口 | 方法 | 用途 |
|---|---|---|
/iserver/marketdata/snapshot | GET | 获取一个或多个合约的行情快照。 |
/iserver/marketdata/history | GET | 获取历史行情序列。 |
/iserver/marketdata/unsubscribe | GET | 取消某个行情订阅。 |
curl -k "https://localhost:5000/v1/api/iserver/marketdata/snapshot?conids=265598&fields=31,55,84,86"参数解释:
| 参数 | 中文说明 |
|---|---|
conids | 合约编号。多个合约通常用逗号分隔。 |
fields | 需要返回的行情字段 ID。 |
常见字段:
| 字段 ID | 常见含义 |
|---|---|
31 | 最新价或最近可用价格。 |
55 | Symbol。 |
84 | 买价。 |
86 | 卖价。 |
6509 | 市场数据可用性或状态标签。 |
_updated | Gateway 返回数据的更新时间戳。 |
返回通常是数组。下面是字段结构示例,具体价格、时间和字段是否出现,要以账户权限、行情订阅和实际市场状态为准:
[ { "conid": "265598", "55": "AAPL", "31": "最新价字符串", "84": "买价字符串", "86": "卖价字符串", "_updated": "更新时间戳" }]字段 ID 来自 IBKR 行情字段体系。程序里建议把字段 ID 映射成中文变量名,不要在业务代码里到处写魔法数字。
Python 示例
Section titled “Python 示例”import requests
BASE_URL = "https://localhost:5000/v1/api"
params = { "conids": "265598", # AAPL 的示例 conid "fields": "31,55,84,86" # 最新价、symbol、买价、卖价}
response = requests.get( f"{BASE_URL}/iserver/marketdata/snapshot", params=params, verify=False, # 仅限开发调试;正式环境请配置受信任证书 timeout=10,)response.raise_for_status()
for row in response.json(): print({ "symbol": row.get("55"), "last": row.get("31"), "bid": row.get("84"), "ask": row.get("86"), })运行示例后,应重点检查这些结果:
| 检查项 | 正常含义 |
|---|---|
| 返回数组不为空 | Gateway 收到了该合约的行情快照响应。 |
返回中有 55 | 响应至少包含 symbol 字段,可用于确认合约。 |
返回中有 31、84 或 86 | 收到价格类字段,但仍要判断是否实时、延迟或权限受限。 |
| 返回中有错误文本或空价格 | 可能是行情权限、会话、字段 ID 或合约 ID 问题。 |
Web API 快照和 TWS Socket 实时订阅不是完全一样的权限路径。文档和代码里要把“接口能连通”和“有实时行情权限”分开判断。
| 现象 | 说明 |
|---|---|
| 返回数组为空 | 合约编号错误、会话未初始化,或该品种无可用数据。 |
| 有 symbol 但没有价格 | 可能没有行情权限,或字段没有请求对。 |
| 价格字段是字符串 | IBKR 返回经常用字符串表示数值,入库前自行转换。 |
| 价格延迟 | 模拟账户或未订阅实时行情时,可能只能看到延迟数据。 |