跳转到内容

行情

Client Portal API 的行情接口以 conid 为核心。你先通过合约接口查到 conid,再请求行情快照或订阅行情。

和 TWS Socket API 一样,行情数据受账户权限、交易所订阅、延迟行情规则和地区限制影响。能查到合约,不代表一定能拿到实时价格。

官方参考:Client Portal API

接口方法用途
/iserver/marketdata/snapshotGET获取一个或多个合约的行情快照。
/iserver/marketdata/historyGET获取历史行情序列。
/iserver/marketdata/unsubscribeGET取消某个行情订阅。
Terminal window
curl -k "https://localhost:5000/v1/api/iserver/marketdata/snapshot?conids=265598&fields=31,55,84,86"

参数解释:

参数中文说明
conids合约编号。多个合约通常用逗号分隔。
fields需要返回的行情字段 ID。

常见字段:

字段 ID常见含义
31最新价或最近可用价格。
55Symbol。
84买价。
86卖价。
6509市场数据可用性或状态标签。
_updatedGateway 返回数据的更新时间戳。

返回通常是数组。下面是字段结构示例,具体价格、时间和字段是否出现,要以账户权限、行情订阅和实际市场状态为准:

[
{
"conid": "265598",
"55": "AAPL",
"31": "最新价字符串",
"84": "买价字符串",
"86": "卖价字符串",
"_updated": "更新时间戳"
}
]

字段 ID 来自 IBKR 行情字段体系。程序里建议把字段 ID 映射成中文变量名,不要在业务代码里到处写魔法数字。

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 字段,可用于确认合约。
返回中有 318486收到价格类字段,但仍要判断是否实时、延迟或权限受限。
返回中有错误文本或空价格可能是行情权限、会话、字段 ID 或合约 ID 问题。

Web API 快照和 TWS Socket 实时订阅不是完全一样的权限路径。文档和代码里要把“接口能连通”和“有实时行情权限”分开判断。

现象说明
返回数组为空合约编号错误、会话未初始化,或该品种无可用数据。
有 symbol 但没有价格可能没有行情权限,或字段没有请求对。
价格字段是字符串IBKR 返回经常用字符串表示数值,入库前自行转换。
价格延迟模拟账户或未订阅实时行情时,可能只能看到延迟数据。