# 合约查询

## 查询列表

```python
futures = api.query_symbols("FUTURE")
main_futures = api.query_symbols("FUTURE", exchange_id="SHFE", is_main=True)
rebar = api.query_symbols("FUTURE", exchange_id="SHFE", product_id="rb")
options = api.query_symbols("OPTION", exchange_id="DCE")
```

`ins_class` 必填，只能是 `"FUTURE"` 或 `"OPTION"`。需要两类时分别查询。`exchange_id`、`product_id` 默认 `None`，表示不筛选；传入时必须是非空字符串。`is_main` 支持 `True`、`False`、`None`，不接受数字代替布尔值。期权的 `is_main` 均为 `False`。

返回 `list[str]`，可能为空。订阅前先检查长度，不假定列表顺序具有策略含义。

## 合约代码

格式为 `交易所.合约`。例如 `SHFE.rb2610`、`DCE.a2611-C-3700` 仅用于说明格式，并不保证该合约在你运行程序时仍然有效。交易所和品种代码大小写按服务返回值保留，不把整段代码统一转成大写或小写。

## 查询详情

```python
symbols = api.query_symbols("FUTURE", is_main=True)
if symbols:
    info = api.query_symbol_info(symbols[0])
    print(info["symbol"], info["ins_class"])
    print(info["data"])
```

顶层字段：`symbol: str`、`exchange_id: str`、`product_id: str`、`ins_class: str`、`is_main: bool`、`data: dict`。

`data` 是合约详细信息。期权还包含标的、认购/认沽类别、行权价等信息；具体键由数据服务提供，SDK 没有为 `data` 定义固定静态字段集合。程序应检查实际返回值，不假定未在当前服务确认过的键必然存在。

这两个方法都是调用时的一次性查询，不返回观察句柄，无需调用 `.data()` 或 `.is_changing()`，也不会在 `wait_update()` 后原地更新查询结果。
