接收合约详情
reqContractDetails() 发出请求后,TWS 会通过两个回调返回结果:
def contractDetails(self, reqId, contractDetails): ...
def contractDetailsEnd(self, reqId): ...contractDetails() 可能触发一次,也可能触发多次。contractDetailsEnd(reqId) 表示这个请求编号的合约详情已经返回完毕。
| 字段 | 中文含义 | 说明 |
|---|---|---|
reqId | 请求编号 | 和你调用 reqContractDetails(reqId, contract) 时传入的编号对应。 |
contractDetails.contract | 合约对象 | 包含 conId、symbol、secType、exchange 等。 |
contractDetails.longName | 合约长名称 | 例如 APPLE INC。 |
contractDetails.marketName | 市场名称 | IBKR 返回的市场名。 |
contractDetails.minTick | 最小报价单位 | 例如 0.01。 |
contractDetails.validExchanges | 可用交易所 | 逗号分隔的字符串。 |
contractDetails.marketRuleIds | 市场规则 ID | 和交易所列表通常按位置对应。 |
contractDetails.timeZoneId | 交易时区 | 例如 US/Eastern。 |
contractDetails.tradingHours | 交易时段 | 字符串较长,适合单独解析。 |
contractDetails.liquidHours | 流动性较好的时段 | 不等同于完整交易时间。 |
ContractDetails 字段很多,可以按用途理解。
合约身份字段
Section titled “合约身份字段”这些字段大多在 contractDetails.contract 里:
| 字段 | 中文含义 |
|---|---|
contract.conId | IBKR 合约 ID |
contract.symbol | 标的代码 |
contract.secType | 证券类型 |
contract.exchange | 路由或交易所 |
contract.primaryExchange | 主要交易所 |
contract.currency | 币种 |
contract.localSymbol | 本地代码 |
contract.tradingClass | 交易类别 |
交易规则字段
Section titled “交易规则字段”| 字段 | 中文含义 | 使用场景 |
|---|---|---|
minTick | 最小报价单位 | 价格步长、报价显示、下单价格校验 |
validExchanges | 可用交易所 | 选择路由或排查交易所问题 |
marketRuleIds | 市场规则 ID | 继续调用 reqMarketRule() 查价格增量规则 |
orderTypes | 支持的订单类型 | 判断某合约能否使用某类订单 |
priceMagnifier | 价格放大系数 | 某些衍生品或债券价格显示相关 |
minSize | 最小数量 | 部分产品的数量限制 |
sizeIncrement | 数量增量 | 部分产品的数量步长 |
suggestedSizeIncrement | 建议数量增量 | 展示或默认下单数量时可参考 |
| 字段 | 中文含义 | 使用场景 |
|---|---|---|
timeZoneId | 交易所时区 | 历史 K 线、交易时段解析 |
tradingHours | 交易时段 | 判断完整可交易时间 |
liquidHours | 流动性较好的时段 | 风控或展示参考 |
contractMonth | 合约月份 | 期货、期权等衍生品 |
realExpirationDate | 真实到期日 | 期权、期货等到期判断 |
lastTradeTime | 最后交易时间 | 到期日附近交易逻辑 |
分类与描述字段
Section titled “分类与描述字段”| 字段 | 中文含义 |
|---|---|
longName | 合约长名称 |
industry | 行业 |
category | 类别 |
subcategory | 子类别 |
stockType | 股票类型 |
descAppend | 追加描述 |
底层合约字段
Section titled “底层合约字段”这些字段常见于期权、期货期权、结构化产品等:
| 字段 | 中文含义 |
|---|---|
underConId | 底层合约 ID |
underSymbol | 底层标的代码 |
underSecType | 底层证券类型 |
新手调试时可以直接打印。正式程序里,更建议先转成字典,后面写日志、数据库或接口返回都更清楚。
def contractDetails(self, reqId, details): contract = details.contract row = { "reqId": reqId, "conId": contract.conId, "symbol": contract.symbol, "secType": contract.secType, "exchange": contract.exchange, "primaryExchange": contract.primaryExchange, "currency": contract.currency, "localSymbol": contract.localSymbol, "tradingClass": contract.tradingClass, "longName": details.longName, "minTick": details.minTick, "timeZoneId": details.timeZoneId, "validExchanges": details.validExchanges, "marketRuleIds": details.marketRuleIds, } self.rows.append(row)AAPL 参考返回
Section titled “AAPL 参考返回”CONNECTED=TrueREQUEST_SENT=TrueCONTRACT_DETAILS_END_RECEIVED=TrueCONTRACT_DETAILS_ROW_COUNT=1SEC_TYPE_COUNTS=STK:1EXCHANGE_COUNTS=SMART:1PRIMARY_EXCHANGE_COUNTS=NASDAQ:1FIRST_CONID=265598FIRST_SYMBOL=AAPLFIRST_LOCAL_SYMBOL=AAPLFIRST_TRADING_CLASS=NMSFIRST_LONG_NAME=APPLE INCFIRST_MIN_TICK=0.01FIRST_TIME_ZONE_ID=US/EasternFIRST_MARKET_NAME=NMSFIRST_VALID_EXCHANGES=SMART,AMEX,NYSE,CBOE,PHLX,ISE,CHX,ARCA,NASDAQ,DRCTEDGE,BEX,BATS,EDGEA,BYX,IEX,EDGX,FOXRIVER,PEARL,NYSENAT,LTSE,MEMX,IBEOS,OVERNIGHT,TPLUS0,PSX,T24XINFO_CODES=2104,2106,2158NON_INFO_ERROR_COUNT=0IS_CONNECTED_AFTER_DISCONNECT=False这里最值得保存的是:
| 字段 | 为什么重要 |
|---|---|
conId=265598 | 可以用它精确引用 AAPL 股票。 |
primaryExchange=NASDAQ | 帮助消除股票同代码歧义。 |
tradingClass=NMS | 交易类别,后面查期权链或交易规则时常见。 |
minTick=0.01 | 下单价格需要符合最小价格单位。 |
timeZoneId=US/Eastern | 历史数据和交易时段要按交易所时区理解。 |
validExchanges 和 marketRuleIds 怎么对应?
Section titled “validExchanges 和 marketRuleIds 怎么对应?”它们通常是两个逗号分隔的字符串,位置一一对应。比如第 1 个交易所对应第 1 个市场规则 ID。真正要查价格增量规则时,还需要继续调用 reqMarketRule()。
tradingHours 可以直接展示吗?
Section titled “tradingHours 可以直接展示吗?”可以展示给开发者看,但不建议直接当作最终风控判断。它是交易所时区下的复杂字符串,包含日期、开收盘时间、休市信息等,正式系统应单独解析。
contractDetailsEnd() 一定会来吗?
Section titled “contractDetailsEnd() 一定会来吗?”正常请求结束时会来。程序不要只等第一条 contractDetails(),否则遇到多条结果时会提前结束。更稳的做法是:收集所有 contractDetails(),等 contractDetailsEnd() 后再统一处理。
能不能把 minTick 当成所有价格增量规则?
Section titled “能不能把 minTick 当成所有价格增量规则?”不能。minTick 是基础最小报价单位。很多产品在不同价格区间有不同价格增量,应该再结合 marketRuleIds 和 reqMarketRule() 判断。