1215 lines
30 KiB
Markdown
1215 lines
30 KiB
Markdown
# HTTP API 参考
|
||
|
||
本文档根据 [`api/QMT_API.py`](../api/QMT_API.py) 的 Handler 与 `make_app()` 路由逐条整理。架构、鉴权、启动方式见 [README.md](./README.md)。
|
||
|
||
**公共约定**
|
||
|
||
- Base URL:`http://<host>:10086`(`PORT=10086`,绑定 `0.0.0.0`)
|
||
- 鉴权:所有已注册接口均需请求头 `X-Token: <TOKEN>`(源码当前值为 `QMTbyYanweidong`)
|
||
- POST Body:JSON 对象。未特别说明的字段均可省略并走源码默认值
|
||
- 多值字符串:逗号分隔,例如 `"000001.SZ,600000.SH"`
|
||
- 失败响应:`{"error": "<reason>", "status_code": <int>}`
|
||
- 「对应 QMT」列标明封装的原函数或属性;账户类调用会自动填入 `self.acc()`(即 `init` 时的 `ACCOUNT_ID`)
|
||
|
||
文中 curl 的 `$TOKEN` 请自行替换。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
1. [兼容层 / v2](#1-兼容层--v2)
|
||
2. [策略上下文 `/api/context`](#2-策略上下文-apicontext)
|
||
3. [数据查询 `/api/data`](#3-数据查询-apidata)
|
||
4. [判定 `/api/check`](#4-判定-apicheck)
|
||
5. [交易 `/api/trade`](#5-交易-apitrade)
|
||
6. [扩展引用 `/api/ext`](#6-扩展引用-apiext)
|
||
7. [系统 `/api/sys`](#7-系统-apisys)
|
||
|
||
---
|
||
|
||
## 1. 兼容层 / v2
|
||
|
||
旧客户端路径与 `/api/v2/*` 共用同一 Handler。查询类 POST 即使只用默认值,也需要传 `{}`。
|
||
|
||
### 1.1 持仓列表
|
||
|
||
- **POST** `/api/holding`
|
||
- **POST** `/api/v2/positions`
|
||
- 对应 QMT:`get_trade_detail_data(accountId, account, 'position')`
|
||
|
||
**请求**
|
||
|
||
| 字段 | 类型 | 默认 | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `account` | string | `"stock"` | 账户类型,传入 QMT |
|
||
|
||
**响应**:对象,key 为 `InstrumentID.ExchangeID`。
|
||
|
||
```json
|
||
{
|
||
"600000.SH": {
|
||
"StockCode": "600000.SH",
|
||
"StockName": "...",
|
||
"Direction": "...",
|
||
"Volume": 0,
|
||
"OpenPrice": 0,
|
||
"FloatProfit": 0,
|
||
"MarketValue": 0,
|
||
"StockHolder": "...",
|
||
"FrozenVolume": 0,
|
||
"CanUseVolume": 0,
|
||
"OnRoadVolume": 0,
|
||
"YesterdayVolume": 0,
|
||
"LastPrice": 0,
|
||
"ProfitRate": 0,
|
||
"FutureTradeType": "...",
|
||
"ExpireDate": "..."
|
||
}
|
||
}
|
||
```
|
||
|
||
无持仓时为 `{}`。QMT 调用失败时 `safe_call` 返回 `None`,按空列表处理。
|
||
|
||
```bash
|
||
curl -s -X POST -H "X-Token: $TOKEN" -H "Content-Type: application/json" \
|
||
-d "{\"account\":\"stock\"}" http://127.0.0.1:10086/api/v2/positions
|
||
```
|
||
|
||
### 1.2 资产(总资产 + 可用)
|
||
|
||
- **POST** `/api/v2/assets`
|
||
- 对应 QMT:`get_trade_detail_data(..., 'account')`,取第一条
|
||
|
||
**请求**:`account` 默认 `"stock"`。
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{"total": 0.0, "available": 0.0}
|
||
```
|
||
|
||
金额来自 `m_dBalance` / `m_dAvailable`,四舍五入到 2 位。无数据时 **500** `资金数据获取失败`。
|
||
|
||
### 1.3 总资产
|
||
|
||
- **POST** `/api/money/total`
|
||
|
||
**响应**:`{"total_money": 0.0}`。无数据 500。
|
||
|
||
### 1.4 可用资金
|
||
|
||
- **POST** `/api/money/available`
|
||
|
||
**响应**:`{"available_money": 0.0}`。无数据 500。
|
||
|
||
### 1.5 简化买入
|
||
|
||
- **POST** `/api/order/buy`
|
||
- 对应 QMT:`passorder(23, 1101, acc, stock, prType, price, volume, 'qmt', 2, ctx)`
|
||
|
||
**请求**
|
||
|
||
| 字段 | 类型 | 必填 | 默认 | 说明 |
|
||
| --- | --- | --- | --- | --- |
|
||
| `stock` | string | 是 | | 代码,如 `600000.SH` |
|
||
| `price` | number | 是 | | 价格 |
|
||
| `volume` | int | 是 | | 数量 |
|
||
| `prType` | int | 否 | `11` | 报价类型 |
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{"status": "success", "action": "buy", "stock": "600000.SH", "order_ref": "..."}
|
||
```
|
||
|
||
`order_ref` 在 QMT 返回空时为 `"unknown"`。异常 **400** `下单失败: ...`。
|
||
|
||
### 1.6 简化卖出
|
||
|
||
- **POST** `/api/order/sell`
|
||
- 对应 QMT:`passorder(24, 1101, ...)`,其余同买入
|
||
|
||
**响应** `action` 为 `"sell"`。
|
||
|
||
### 1.7 委托状态列表
|
||
|
||
- **POST** `/api/order/status`
|
||
- 对应 QMT:`get_trade_detail_data(..., 'order', 'qmt')`
|
||
|
||
**请求**:`account` 默认 `"stock"`。
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{
|
||
"orders": [
|
||
{
|
||
"order_sys_id": "...",
|
||
"status": 0,
|
||
"volume_left": 0,
|
||
"volume_traded": 0
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
字段分别对应 `m_strOrderSysID`、`m_nOrderStatus`、`m_nVolumeTotal`、`m_nVolumeTraded`。
|
||
|
||
### 1.8 全部撤单
|
||
|
||
- **POST** `/api/order/cancel_all`
|
||
- 对应 QMT:遍历委托,`can_cancel_order` 为真则 `cancel`
|
||
|
||
**请求**:`account` 默认 `"stock"`。
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"message": "已发出 N 笔撤单请求",
|
||
"canceled_orders": [
|
||
{"order_sys_id": "...", "stock": "...", "volume_left": 0}
|
||
]
|
||
}
|
||
```
|
||
|
||
`stock` 仅 `m_strInstrumentID`(不含市场后缀)。异常 **500**。
|
||
|
||
### 1.9 按股票 + 数量规则撤单
|
||
|
||
- **POST** `/api/order/cancel_order`
|
||
|
||
**请求**
|
||
|
||
| 字段 | 类型 | 必填 | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `stock` | string | 是 | 必须为 `代码.市场`,与持仓 key 相同 |
|
||
| `volume` | int | 是 | 必须 `> 0`;匹配条件为 `VolumeTotal + VolumeTraded == volume` |
|
||
| `account` | string | 否 | 默认 `"stock"` |
|
||
|
||
匹配到 0 笔时仍 HTTP 200:
|
||
|
||
```json
|
||
{"status": "failed", "message": "未找到符合条件的活跃订单"}
|
||
```
|
||
|
||
成功:
|
||
|
||
```json
|
||
{
|
||
"status": "success",
|
||
"message": "匹配到 N 笔订单并发出撤单请求",
|
||
"canceled_sys_ids": ["..."]
|
||
}
|
||
```
|
||
|
||
缺参 **400** `参数错误:必须提供 stock 且 volume > 0`。
|
||
|
||
### 1.10 成交明细
|
||
|
||
- **POST** `/api/order/deal`
|
||
- 对应 QMT:`get_trade_detail_data(..., 'deal', 'qmt')`
|
||
|
||
**响应**:`{"deals": [ {对象全部非下划线、非可调用属性,值一律 str()} ] }`。
|
||
|
||
---
|
||
|
||
## 2. 策略上下文 `/api/context`
|
||
|
||
全部 **GET**,无请求体。数据来自 `self.application.ContextInfo`。
|
||
|
||
| 方法 | 路径 | 对应 QMT | 响应 |
|
||
| --- | --- | --- | --- |
|
||
| GET | `/api/context/period` | `.period` | `{"period": ...}` |
|
||
| GET | `/api/context/barpos` | `.barpos` | `{"barpos": ...}` |
|
||
| GET | `/api/context/time_tick_size` | `.time_tick_size` | `{"time_tick_size": ...}` |
|
||
| GET | `/api/context/stockcode` | `.stockcode` | `{"stockcode": ...}` |
|
||
| GET | `/api/context/dividend_type` | `.dividend_type` | `{"dividend_type": ...}` |
|
||
| GET | `/api/context/market` | `.market` | `{"market": ...}` |
|
||
| GET | `/api/context/do_back_test` | `.do_back_test` | `{"do_back_test": ...}` |
|
||
| GET | `/api/context/benchmark` | `.benchmark` | `{"benchmark": ...}` |
|
||
| GET | `/api/context/capital` | `.capital` | `{"capital": ...}` |
|
||
| GET | `/api/context/universe` | `.get_universe()` | `{"universe": [...]}` |
|
||
|
||
```bash
|
||
curl -s -H "X-Token: $TOKEN" http://127.0.0.1:10086/api/context/universe
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 数据查询 `/api/data`
|
||
|
||
除特别标明的 GET 外均为 POST。`safe_call` 失败时,部分接口返回字段为 `null`,部分返回 `{"error": "..."}` 或 500,以各条为准。
|
||
|
||
### 3.1 证券名称
|
||
|
||
- **POST** `/api/data/stock_name` → `ContextInfo.get_stock_name(stockcode)`
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `stockcode` | `""` | 证券代码 |
|
||
|
||
```json
|
||
{"stockcode": "600000.SH", "name": "..."}
|
||
```
|
||
|
||
### 3.2 上市日期
|
||
|
||
- **POST** `/api/data/open_date` → 全局 `get_open_date(stockcode)`
|
||
|
||
```json
|
||
{"stockcode": "600000.SH", "open_date": "..."}
|
||
```
|
||
|
||
### 3.3 最新流通股本
|
||
|
||
- **POST** `/api/data/last_volume` → `get_last_volume`
|
||
|
||
失败(`None`)时 **500** `获取流通股本失败`。
|
||
|
||
```json
|
||
{"stockcode": "600000.SH", "last_volume": ...}
|
||
```
|
||
|
||
### 3.4 K 线时间戳
|
||
|
||
- **POST** `/api/data/bar_timetag` → `get_bar_timetag(index)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `index` | `-1` |
|
||
|
||
```json
|
||
{"index": -1, "timetag": ...}
|
||
```
|
||
|
||
### 3.5 最新分笔时间戳
|
||
|
||
- **GET** `/api/data/tick_timetag` → `get_tick_timetag()`
|
||
|
||
```json
|
||
{"timetag": ...}
|
||
```
|
||
|
||
### 3.6 指数成份股
|
||
|
||
- **POST** `/api/data/sector` → `get_sector(sector, realtime)`
|
||
|
||
| 字段 | 必填 | 默认 | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `sector` | 是 | | 空则 400 `need args sector` |
|
||
| `realtime` | 否 | `"0"` | `"0"` 时第二参为 `0`,否则 `int(realtime)` |
|
||
|
||
```json
|
||
{"sector": "000300.SH", "stocks": []}
|
||
```
|
||
|
||
`stocks` 在调用失败时为 `[]`。
|
||
|
||
### 3.7 行业成份股
|
||
|
||
- **POST** `/api/data/industry` → `get_industry(industry)`
|
||
|
||
`industry` 为空则 400 `need args industry`。
|
||
|
||
```json
|
||
{"industry": "...", "stocks": []}
|
||
```
|
||
|
||
### 3.8 板块成份股
|
||
|
||
- **POST** `/api/data/stock_list_in_sector` → `get_stock_list_in_sector(sectorname)`
|
||
|
||
`sectorname` 为空则 400 `need args sectorname`。
|
||
|
||
```json
|
||
{"sectorname": "沪深A股", "stocks": []}
|
||
```
|
||
|
||
### 3.9 指数权重
|
||
|
||
- **POST** `/api/data/weight_in_index` → `get_weight_in_index(indexcode, stockcode)`
|
||
|
||
```json
|
||
{"indexcode": "000300.SH", "stockcode": "600000.SH", "weight": ...}
|
||
```
|
||
|
||
### 3.10 合约乘数
|
||
|
||
- **POST** `/api/data/contract_multiplier` → `get_contract_multiplier(contractcode)`
|
||
|
||
```json
|
||
{"contractcode": "...", "multiplier": ...}
|
||
```
|
||
|
||
### 3.11 无风险利率
|
||
|
||
- **POST** `/api/data/risk_free_rate` → `get_risk_free_rate(index)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `index` | `-1` |
|
||
|
||
```json
|
||
{"index": -1, "risk_free_rate": ...}
|
||
```
|
||
|
||
### 3.12 日期对应 K 线索引
|
||
|
||
- **POST** `/api/data/date_location` → `get_date_location(strdate)`
|
||
|
||
```json
|
||
{"strdate": "20240101", "location": ...}
|
||
```
|
||
|
||
### 3.13 历史行情(多品种字典)
|
||
|
||
- **POST** `/api/data/history_data` → `get_history_data(len, period, field, dividend_type, skip_paused)`
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `len` | `10` | 根数 |
|
||
| `period` | `"1d"` | 周期 |
|
||
| `field` | `"close"` | 字段 |
|
||
| `dividend_type` | `0` | 整数 |
|
||
| `skip_paused` | `"true"` | 小写等于 `"true"` 则为 Python `True` |
|
||
|
||
成功:`{"data": ...}`。`safe_call` 得到假值时:`{"error": "获取历史数据失败"}`(仍可能是 HTTP 200)。
|
||
|
||
### 3.14 行情 DataFrame
|
||
|
||
- **POST** `/api/data/market_data` → `get_market_data(fields, stocks, start, end, True, period, dividend_type, count)`
|
||
|
||
注意第五参在封装里 **写死为 `True`**(QMT 该位置一般为 `skip_paused` 一类开关,以官方签名为准)。
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `fields` | `""` | 逗号分隔;空则 `[]` |
|
||
| `stock_code` | `""` | 逗号分隔代码 |
|
||
| `start_time` | `""` | |
|
||
| `end_time` | `""` | |
|
||
| `period` | `"1d"` | |
|
||
| `dividend_type` | `"none"` | |
|
||
| `count` | `-1` | |
|
||
|
||
有 `to_dict` 则转 dict。失败 **500** `获取行情数据失败`。
|
||
|
||
```json
|
||
{"data": {}}
|
||
```
|
||
|
||
### 3.15 扩展行情(Level2)
|
||
|
||
- **POST** `/api/data/market_data_ex` → `get_market_data_ex(...)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `fields` | `""` |
|
||
| `stock_code` | `""` |
|
||
| `period` | `"follow"` |
|
||
| `start_time` | `""` |
|
||
| `end_time` | `""` |
|
||
| `count` | `-1` |
|
||
| `dividend_type` | `"follow"` |
|
||
|
||
返回字典:每个 value 优先 `to_dict()`,否则 `str()`。失败 500 `获取扩展行情失败`。
|
||
|
||
### 3.16 分笔 / 全推行情
|
||
|
||
- **POST** `/api/data/full_tick` → `get_full_tick(code_list)`
|
||
|
||
| 字段 | 必填 |
|
||
| --- | --- |
|
||
| `stocks` | 是,逗号分隔;空则 400 `need args stocks` |
|
||
|
||
成功时响应体 **就是 QMT 返回对象本身**(不是 `{data: ...}` 包裹)。失败 500 `获取分笔行情失败`。
|
||
|
||
### 3.17 除权除息 / 复权因子
|
||
|
||
- **POST** `/api/data/divid_factors`
|
||
|
||
```json
|
||
{"stockcode": "...", "factors": {}}
|
||
```
|
||
|
||
失败时 `factors` 为 `{}`。
|
||
|
||
### 3.18 期货主力合约
|
||
|
||
- **POST** `/api/data/main_contract`
|
||
|
||
```json
|
||
{"codemarket": "...", "main_contract": ...}
|
||
```
|
||
|
||
### 3.19 毫秒时间戳转日期
|
||
|
||
- **POST** `/api/data/timetag_to_datetime` → 全局 `timetag_to_datetime(timetag, format)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `timetag` | `0` |
|
||
| `format` | `"%Y-%m-%d %H:%M:%S"` |
|
||
|
||
```json
|
||
{"timetag": 0, "datetime": "..."}
|
||
```
|
||
|
||
### 3.20 总股本
|
||
|
||
- **POST** `/api/data/total_share`
|
||
|
||
```json
|
||
{"stockcode": "...", "total_share": ...}
|
||
```
|
||
|
||
### 3.21 交易日列表
|
||
|
||
- **POST** `/api/data/trading_dates` → `get_trading_dates(stockcode, start_date, end_date, count, period)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stockcode` | `""` |
|
||
| `start_date` | `""` |
|
||
| `end_date` | `""` |
|
||
| `count` | 空字符串 → 内部 `-1` |
|
||
| `period` | `"1d"` |
|
||
|
||
```json
|
||
{"dates": []}
|
||
```
|
||
|
||
### 3.22 内盘 / 外盘成交量
|
||
|
||
- **POST** `/api/data/svol` → `get_svol` → `{"stockcode", "svol"}`
|
||
- **POST** `/api/data/bvol` → `get_bvol` → `{"stockcode", "bvol"}`
|
||
|
||
### 3.23 龙虎榜
|
||
|
||
- **POST** `/api/data/longhubang` → `get_longhubang(stock_list, startTime, endTime)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stock_list` | `""` 逗号分隔 |
|
||
| `startTime` | `""` |
|
||
| `endTime` | `""` |
|
||
|
||
成功 `{"data": ...}`(DataFrame 会 `to_dict`)。假值时 `{"error": "获取龙虎榜数据失败"}`。
|
||
|
||
### 3.24 十大股东
|
||
|
||
- **POST** `/api/data/top10_share_holder` → 全局 `get_top10_share_holder`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stock_list` | `""` |
|
||
| `data_name` | `"holder"` |
|
||
| `start_time` | `""` |
|
||
| `end_time` | `""` |
|
||
|
||
失败文案:`获取十大股东数据失败`。
|
||
|
||
### 3.25 期权详情
|
||
|
||
- **POST** `/api/data/option_detail`
|
||
|
||
```json
|
||
{"optioncode": "...", "detail": {}}
|
||
```
|
||
|
||
### 3.26 换手率
|
||
|
||
- **POST** `/api/data/turnover_rate` → `get_turnover_rate(stock_list, startTime, endTime)`
|
||
|
||
字段同龙虎榜风格(`stock_list` / `startTime` / `endTime`)。失败:`获取换手率失败`。
|
||
|
||
### 3.27 ETF 申赎清单
|
||
|
||
- **POST** `/api/data/etf_info` → `get_etf_info(stockcode)`
|
||
|
||
```json
|
||
{"stockcode": "...", "info": {}}
|
||
```
|
||
|
||
### 3.28 ETF IOPV
|
||
|
||
- **POST** `/api/data/etf_iopv` → `get_etf_iopv(stockcode)`
|
||
|
||
```json
|
||
{"stockcode": "...", "iopv": ...}
|
||
```
|
||
|
||
### 3.29 合约详细信息
|
||
|
||
- **POST** `/api/data/instrumentdetail` → `get_instrumentdetail`
|
||
|
||
```json
|
||
{"stockcode": "...", "detail": {}}
|
||
```
|
||
|
||
### 3.30 期货到期日
|
||
|
||
- **POST** `/api/data/contract_expire_date`
|
||
|
||
```json
|
||
{"codemarket": "...", "expire_date": ...}
|
||
```
|
||
|
||
### 3.31 期权标的 → 期权列表
|
||
|
||
- **POST** `/api/data/option_undl_data`
|
||
|
||
| 字段 | 说明 |
|
||
| --- | --- |
|
||
| `undl_code_ref` | 标的代码 |
|
||
|
||
```json
|
||
{"data": []}
|
||
```
|
||
|
||
### 3.32 财务数据(两种调用约定)
|
||
|
||
- **POST** `/api/data/financial_data` → `ContextInfo.get_financial_data`
|
||
|
||
**约定 A**(单字段):`tabname`、`colname`、`market`、`code` **全部非空** 时调用:
|
||
|
||
```
|
||
get_financial_data(tabname, colname, market, code, report_type, barpos)
|
||
```
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `report_type` | `"report_time"` |
|
||
| `barpos` | `-1` |
|
||
|
||
**约定 B**(否则走批量):
|
||
|
||
```
|
||
get_financial_data(fieldList, stockList, startDate, endDate, report_type)
|
||
```
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `fieldList` | `""` | 逗号分隔 |
|
||
| `stockList` | `""` | 逗号分隔 |
|
||
| `startDate` | `""` | |
|
||
| `endDate` | `""` | |
|
||
| `report_type` | `"announce_time"` | 注意与约定 A 默认值不同 |
|
||
|
||
`ret is None` 时:`{"error": "获取财务数据失败"}`;否则 `{"data": ...}`。
|
||
|
||
### 3.33 多因子数据
|
||
|
||
- **POST** `/api/data/factor_data` → `get_factor_data`
|
||
|
||
| 字段 | 说明 |
|
||
| --- | --- |
|
||
| `fieldList` | 逗号分隔字段 |
|
||
| `stockCode` | 若非空:按 **单个代码** 调用 |
|
||
| `stockList` | 否则按代码列表调用 |
|
||
| `startDate` / `endDate` | 区间 |
|
||
|
||
失败:`{"error": "获取因子数据失败"}`。
|
||
|
||
### 3.34 历史 ST
|
||
|
||
- **POST** `/api/data/his_st_data`
|
||
|
||
```json
|
||
{"stockCode": "...", "data": {}}
|
||
```
|
||
|
||
注意请求字段是 **`stockCode`**(驼峰),与多数接口的 `stockcode` 不同。
|
||
|
||
### 3.35 历史指数
|
||
|
||
- **POST** `/api/data/his_index_data`
|
||
|
||
```json
|
||
{"index": "...", "data": {}}
|
||
```
|
||
|
||
### 3.36 当前全部行情订阅
|
||
|
||
- **GET** `/api/data/all_subscription` → `get_all_subscription()`
|
||
|
||
```json
|
||
{"subscriptions": {}}
|
||
```
|
||
|
||
### 3.37 指定期权列表
|
||
|
||
- **POST** `/api/data/option_list`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `undl_code` | `""` |
|
||
| `dedate` | `""` |
|
||
| `opttype` | `""` |
|
||
| `isavailable` | `"true"`(小写 `"true"` 为 True) |
|
||
|
||
```json
|
||
{"option_list": []}
|
||
```
|
||
|
||
### 3.38 过期合约列表
|
||
|
||
- **POST** `/api/data/his_contract_list`
|
||
|
||
```json
|
||
{"market": "...", "contracts": []}
|
||
```
|
||
|
||
### 3.39 期权隐含波动率(实时)
|
||
|
||
- **POST** `/api/data/option_iv`
|
||
|
||
```json
|
||
{"optioncode": "...", "iv": ...}
|
||
```
|
||
|
||
### 3.40 BS 理论价格
|
||
|
||
- **POST** `/api/data/bsm_price` → `bsm_price(optionType, objectPrices, strikePrice, riskFree, sigma, days, dividend)`
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `optionType` | `"C"` | |
|
||
| `objectPrices` | `""` | 能 `float()` 则标量;否则按逗号拆成 float 列表 |
|
||
| `strikePrice` | `0` | |
|
||
| `riskFree` | `0` | |
|
||
| `sigma` | `0` | |
|
||
| `days` | `0` | |
|
||
| `dividend` | `0` | |
|
||
|
||
```json
|
||
{"price": ...}
|
||
```
|
||
|
||
### 3.41 BS 隐含波动率
|
||
|
||
- **POST** `/api/data/bsm_iv`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `optionType` | `"C"` |
|
||
| `objectPrices` | `0`(float,与 bsm_price 不同) |
|
||
| `strikePrice` | `0` |
|
||
| `optionPrice` | `0` |
|
||
| `riskFree` | `0` |
|
||
| `days` | `0` |
|
||
| `dividend` | `0` |
|
||
|
||
```json
|
||
{"iv": ...}
|
||
```
|
||
|
||
### 3.42 本地行情
|
||
|
||
- **POST** `/api/data/local_data` → `get_local_data(stock_code, start_time, end_time, period, divid_type, count)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stock_code` | `""` |
|
||
| `start_time` | `""` |
|
||
| `end_time` | `""` |
|
||
| `period` | `"1d"` |
|
||
| `divid_type` | `"none"` |
|
||
| `count` | `-1` |
|
||
|
||
失败 500 `获取本地行情失败`。成功 `{"data": ...}`。
|
||
|
||
### 3.43 订阅行情
|
||
|
||
- **POST** `/api/data/subscribe_quote` → `subscribe_quote(stock_code, period, dividend_type)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stock_code` | `""` |
|
||
| `period` | `"follow"` |
|
||
| `dividend_type` | `"follow"` |
|
||
|
||
```json
|
||
{"status": "success" | "failed", "sub_id": ...}
|
||
```
|
||
|
||
`status` 取决于返回值是否为 `None`。
|
||
|
||
### 3.44 反订阅
|
||
|
||
- **POST** `/api/data/unsubscribe_quote` → `unsubscribe_quote(sub_id)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `sub_id` | `0` |
|
||
|
||
无论底层是否成功,都返回:
|
||
|
||
```json
|
||
{"status": "success", "sub_id": 0}
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 判定 `/api/check`
|
||
|
||
### 4.1 是否最后一根 K 线
|
||
|
||
- **GET** `/api/check/is_last_bar` → `is_last_bar()`
|
||
|
||
```json
|
||
{"is_last_bar": ...}
|
||
```
|
||
|
||
### 4.2 是否新 K 线
|
||
|
||
- **GET** `/api/check/is_new_bar`
|
||
|
||
```json
|
||
{"is_new_bar": ...}
|
||
```
|
||
|
||
### 4.3 是否停牌
|
||
|
||
- **POST** `/api/check/is_suspended_stock`
|
||
|
||
```json
|
||
{"stockcode": "...", "is_suspended": ...}
|
||
```
|
||
|
||
### 4.4 是否在指定板块
|
||
|
||
- **POST** `/api/check/is_sector_stock` → 全局 `is_sector_stock(sectorname, market, stockcode)`
|
||
|
||
```json
|
||
{"sectorname": "...", "stockcode": "...", "is_in_sector": ...}
|
||
```
|
||
|
||
响应未带回 `market`。
|
||
|
||
### 4.5 是否属于某类别
|
||
|
||
- **POST** `/api/check/is_typed_stock` → `is_typed_stock(stocktypenum, market, stockcode)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `stocktypenum` | `0` |
|
||
| `market` | `""` |
|
||
| `stockcode` | `""` |
|
||
|
||
```json
|
||
{"stocktypenum": 0, "stockcode": "...", "result": ...}
|
||
```
|
||
|
||
### 4.6 行业分类名称
|
||
|
||
- **POST** `/api/check/get_industry_name_of_stock` → `get_industry_name_of_stock(industryType, stockcode)`
|
||
|
||
```json
|
||
{"industryType": "...", "stockcode": "...", "industry_name": ...}
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 交易 `/api/trade`
|
||
|
||
下单类在 `try/except` 中捕获异常后 **400**,并 `logger.exception`。
|
||
`style` 类接口默认 `"LATEST"`,`accId` 默认当前 `ACCOUNT_ID`。
|
||
|
||
价格/数量等枚举含义以迅投 `passorder` 官方文档为准。本封装实际传入值如下。
|
||
|
||
### 5.1 综合下单 passorder
|
||
|
||
- **POST** `/api/trade/passorder`
|
||
|
||
调用:
|
||
|
||
```
|
||
passorder(opType, orderType, acc, stock, prType, price, volume, 'qmt', quickTrade, ctx)
|
||
```
|
||
|
||
策略名第三段写死为 `'qmt'`。
|
||
|
||
| 字段 | 必填 | 默认 | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `opType` | 是 | | 操作类型;兼容层买=23、卖=24 |
|
||
| `stock` | 是 | | |
|
||
| `price` | 是 | | |
|
||
| `volume` | 是 | | |
|
||
| `orderType` | 否 | `1101` | |
|
||
| `prType` | 否 | `11` | JSON 字段名为 `prType` |
|
||
| `quickTrade` | 否 | `2` | |
|
||
|
||
**响应**
|
||
|
||
```json
|
||
{"status": "success", "opType": 23, "stock": "600000.SH", "order_ref": "..."}
|
||
```
|
||
|
||
### 5.2 算法下单
|
||
|
||
- **POST** `/api/trade/algo_passorder` → `algo_passorder(...)`
|
||
|
||
| 字段 | 必填 | 默认 |
|
||
| --- | --- | --- |
|
||
| `opType` | 是 | |
|
||
| `stock` | 是 | |
|
||
| `price` | 是 | |
|
||
| `volume` | 是 | |
|
||
| `orderType` | 否 | `1101` |
|
||
| `prType` | 否 | `-1`(与 passorder 默认 11 不同) |
|
||
| `strategyName` | 否 | `""` |
|
||
| `quickTrade` | 否 | `2` |
|
||
| `userOrderId` | 否 | `""` |
|
||
| `userOrderParam` | 否 | `{}` |
|
||
|
||
```json
|
||
{"status": "success", "order_ref": "..."}
|
||
```
|
||
|
||
### 5.3 智能算法下单
|
||
|
||
- **POST** `/api/trade/smart_algo_passorder`
|
||
|
||
| 字段 | 必填 | 默认 |
|
||
| --- | --- | --- |
|
||
| `opType` / `stock` / `price` / `volume` | 是 | |
|
||
| `smartAlgoType` | 是 | |
|
||
| `orderType` | 否 | `1101` |
|
||
| `prType` | 否 | `-1` |
|
||
| `limitOverRate` | 否 | `0` |
|
||
| `minAmountPerOrder` | 否 | `0` |
|
||
| `startTime` | 否 | `""` |
|
||
| `endTime` | 否 | `""` |
|
||
|
||
### 5.4 指定手数 / 价值 / 比例 / 目标 / 股数
|
||
|
||
下列接口模式相同:成功返回 `{"status":"success","action":"<函数名>","stock":"..."}`。
|
||
|
||
| 路径 | QMT | 关键字段 | 其它默认 |
|
||
| --- | --- | --- | --- |
|
||
| POST `/api/trade/order_lots` | `order_lots` | `lots` int | `style=LATEST`, `price=0`, `accId` |
|
||
| POST `/api/trade/order_value` | `order_value` | `value` float | 同上 |
|
||
| POST `/api/trade/order_percent` | `order_percent` | `percent` float | 同上 |
|
||
| POST `/api/trade/order_target_value` | `order_target_value` | `tar_value` float | 同上 |
|
||
| POST `/api/trade/order_target_percent` | `order_target_percent` | `tar_percent` float | 同上 |
|
||
| POST `/api/trade/order_shares` | `order_shares` | `shares` int | 同上 |
|
||
|
||
均需 `stock`。
|
||
|
||
```bash
|
||
curl -s -X POST -H "X-Token: $TOKEN" -H "Content-Type: application/json" \
|
||
-d "{\"stock\":\"600000.SH\",\"shares\":100,\"style\":\"LATEST\",\"price\":0}" \
|
||
http://127.0.0.1:10086/api/trade/order_shares
|
||
```
|
||
|
||
### 5.5 期货开平仓
|
||
|
||
均需 `stock`、`amount`(手数,int)。可选 `style`、`price`、`accId`。
|
||
|
||
| 路径 | QMT 函数 | `action` |
|
||
| --- | --- | --- |
|
||
| POST `/api/trade/futures/buy_open` | `buy_open` | `buy_open` |
|
||
| POST `/api/trade/futures/buy_close_tdayfirst` | `buy_close_tdayfirst` | `buy_close_tdayfirst` |
|
||
| POST `/api/trade/futures/buy_close_ydayfirst` | `buy_close_ydayfirst` | `buy_close_ydayfirst` |
|
||
| POST `/api/trade/futures/sell_open` | `sell_open` | `sell_open` |
|
||
| POST `/api/trade/futures/sell_close_tdayfirst` | `sell_close_tdayfirst` | `sell_close_tdayfirst` |
|
||
| POST `/api/trade/futures/sell_close_ydayfirst` | `sell_close_ydayfirst` | `sell_close_ydayfirst` |
|
||
|
||
成功体例:
|
||
|
||
```json
|
||
{"status": "success", "action": "buy_open", "stock": "IF2509.IF"}
|
||
```
|
||
|
||
### 5.6 任务:撤销 / 暂停 / 继续
|
||
|
||
| 路径 | QMT |
|
||
| --- | --- |
|
||
| POST `/api/trade/cancel_task` | `cancel_task(taskId, acc, accountType, ctx)` |
|
||
| POST `/api/trade/pause_task` | `pause_task` |
|
||
| POST `/api/trade/resume_task` | `resume_task` |
|
||
|
||
| 字段 | 必填 | 默认 |
|
||
| --- | --- | --- |
|
||
| `taskId` | 是 | |
|
||
| `accountType` | 否 | `"stock"` |
|
||
|
||
```json
|
||
{"status": "success" | "failed", "taskId": "..."}
|
||
```
|
||
|
||
`status` 由 QMT 返回值的真假决定。
|
||
|
||
### 5.7 触发前一根 bar 信号
|
||
|
||
- **POST** `/api/trade/do_order` → `do_order(ctx)`
|
||
|
||
无需解析 Body(空 Body 也可)。
|
||
|
||
```json
|
||
{"status": "success", "message": "信号已触发"}
|
||
```
|
||
|
||
### 5.8 交易明细(原始对象属性)
|
||
|
||
- **POST** `/api/trade/trade_detail_data` → `get_trade_detail_data(acc, account, datatype, 'qmt')`
|
||
|
||
| 字段 | 默认 | 说明 |
|
||
| --- | --- | --- |
|
||
| `account` | `"stock"` | 账户类型 |
|
||
| `datatype` | `"position"` | 如 `position` / `order` / `deal` / `account`(以 QMT 为准) |
|
||
|
||
每个元素展开为「非 `_` 开头且不可调用」的属性,值 `str()`。
|
||
|
||
```json
|
||
{"data": [{ "...": "..." }]}
|
||
```
|
||
|
||
调用失败时 `data` 为 `[]`。
|
||
|
||
### 5.9 按委托号取委托/成交
|
||
|
||
- **POST** `/api/trade/value_by_order_id` → `get_value_by_order_id(orderId, acc, accountType, datatype)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `orderId` | `""` |
|
||
| `accountType` | `"stock"` |
|
||
| `datatype` | `"ORDER"` |
|
||
|
||
```json
|
||
{"orderId": "...", "data": {}}
|
||
```
|
||
|
||
### 5.10 最新委托号
|
||
|
||
- **POST** `/api/trade/last_order_id` → `get_last_order_id(acc, account, datatype, 'qmt')`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `account` | `"stock"` |
|
||
| `datatype` | `"ORDER"` |
|
||
|
||
```json
|
||
{"last_order_id": ...}
|
||
```
|
||
|
||
### 5.11 委托是否可撤
|
||
|
||
- **POST** `/api/trade/can_cancel_order`
|
||
|
||
```json
|
||
{"orderId": "...", "can_cancel": ...}
|
||
```
|
||
|
||
`accountType` 默认 `"stock"`。
|
||
|
||
### 5.12 两融:负债 / 担保 / 可融券
|
||
|
||
均 POST,可选 `accId`(默认当前账号)。返回对象列表,属性展开方式同 5.8。
|
||
|
||
| 路径 | QMT | 响应 |
|
||
| --- | --- | --- |
|
||
| `/api/trade/debt_contract` | `get_debt_contract(accId)` | `{"data": [...]}` |
|
||
| `/api/trade/assure_contract` | `get_assure_contract` | 同上 |
|
||
| `/api/trade/enable_short_contract` | `get_enable_short_contract` | 同上 |
|
||
|
||
### 5.13 当日新股新债
|
||
|
||
- **POST** `/api/trade/ipo_data` → `get_ipo_data(type)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `type` | `""` |
|
||
|
||
```json
|
||
{"data": {}}
|
||
```
|
||
|
||
### 5.14 新股申购额度
|
||
|
||
- **POST** `/api/trade/new_purchase_limit` → `get_new_purchase_limit(accid)`
|
||
|
||
| 字段 | 默认 |
|
||
| --- | --- |
|
||
| `accid` | 当前账号 |
|
||
|
||
```json
|
||
{"data": {}}
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 扩展引用 `/api/ext`
|
||
|
||
四个接口结构相同:`name` + `stockcode` + `deviation`(默认 0),并传入 `ContextInfo`。
|
||
|
||
| 路径 | QMT | 响应对 |
|
||
| --- | --- | --- |
|
||
| POST `/api/ext/ext_data` | `ext_data(extdataname, stockcode, deviation, ctx)` | `extdataname` + `value` |
|
||
| POST `/api/ext/ext_data_rank` | `ext_data_rank` | `rank` |
|
||
| POST `/api/ext/get_factor_value` | `get_factor_value(factorname, ...)` | `factorname` + `value` |
|
||
| POST `/api/ext/get_factor_rank` | `get_factor_rank` | `rank` |
|
||
|
||
示例:
|
||
|
||
```json
|
||
{"factorname": "...", "stockcode": "600000.SH", "value": ...}
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 系统 `/api/sys`
|
||
|
||
这两支同样需要 `X-Token`。
|
||
|
||
### 7.1 Python 版本
|
||
|
||
- **GET** `/api/sys/python_version`
|
||
|
||
```json
|
||
{
|
||
"python_version": "...",
|
||
"python_version_info": {
|
||
"major": 3,
|
||
"minor": 0,
|
||
"micro": 0,
|
||
"releaselevel": "final",
|
||
"serial": 0
|
||
}
|
||
}
|
||
```
|
||
|
||
用于确认 QMT 内嵌解释器版本。
|
||
|
||
### 7.2 关闭 HTTP 服务
|
||
|
||
- **POST** `/api/sys/shutdown`
|
||
|
||
先写入响应再 `finish()`,然后 `IOLoop.stop()`。策略进程内的 HTTP 循环结束;是否退出整个 QMT 策略取决于宿主行为。
|
||
|
||
```json
|
||
{"status": "success", "message": "服务器正在关闭..."}
|
||
```
|
||
|
||
```bash
|
||
curl -s -X POST -H "X-Token: $TOKEN" http://127.0.0.1:10086/api/sys/shutdown
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 快速对照表
|
||
|
||
| 方法 | 路径 |
|
||
| --- | --- |
|
||
| POST | `/api/v2/positions` |
|
||
| POST | `/api/v2/assets` |
|
||
| POST | `/api/holding` |
|
||
| POST | `/api/money/total` |
|
||
| POST | `/api/money/available` |
|
||
| POST | `/api/order/buy` |
|
||
| POST | `/api/order/sell` |
|
||
| POST | `/api/order/status` |
|
||
| POST | `/api/order/cancel_all` |
|
||
| POST | `/api/order/cancel_order` |
|
||
| POST | `/api/order/deal` |
|
||
| GET | `/api/context/period` |
|
||
| GET | `/api/context/barpos` |
|
||
| GET | `/api/context/time_tick_size` |
|
||
| GET | `/api/context/stockcode` |
|
||
| GET | `/api/context/dividend_type` |
|
||
| GET | `/api/context/market` |
|
||
| GET | `/api/context/do_back_test` |
|
||
| GET | `/api/context/benchmark` |
|
||
| GET | `/api/context/capital` |
|
||
| GET | `/api/context/universe` |
|
||
| POST | `/api/data/stock_name` |
|
||
| POST | `/api/data/open_date` |
|
||
| POST | `/api/data/last_volume` |
|
||
| POST | `/api/data/bar_timetag` |
|
||
| GET | `/api/data/tick_timetag` |
|
||
| POST | `/api/data/sector` |
|
||
| POST | `/api/data/industry` |
|
||
| POST | `/api/data/stock_list_in_sector` |
|
||
| POST | `/api/data/weight_in_index` |
|
||
| POST | `/api/data/contract_multiplier` |
|
||
| POST | `/api/data/risk_free_rate` |
|
||
| POST | `/api/data/date_location` |
|
||
| POST | `/api/data/history_data` |
|
||
| POST | `/api/data/market_data` |
|
||
| POST | `/api/data/market_data_ex` |
|
||
| POST | `/api/data/full_tick` |
|
||
| POST | `/api/data/divid_factors` |
|
||
| POST | `/api/data/main_contract` |
|
||
| POST | `/api/data/timetag_to_datetime` |
|
||
| POST | `/api/data/total_share` |
|
||
| POST | `/api/data/trading_dates` |
|
||
| POST | `/api/data/svol` |
|
||
| POST | `/api/data/bvol` |
|
||
| POST | `/api/data/longhubang` |
|
||
| POST | `/api/data/top10_share_holder` |
|
||
| POST | `/api/data/option_detail` |
|
||
| POST | `/api/data/turnover_rate` |
|
||
| POST | `/api/data/etf_info` |
|
||
| POST | `/api/data/etf_iopv` |
|
||
| POST | `/api/data/instrumentdetail` |
|
||
| POST | `/api/data/contract_expire_date` |
|
||
| POST | `/api/data/option_undl_data` |
|
||
| POST | `/api/data/financial_data` |
|
||
| POST | `/api/data/factor_data` |
|
||
| POST | `/api/data/his_st_data` |
|
||
| POST | `/api/data/his_index_data` |
|
||
| GET | `/api/data/all_subscription` |
|
||
| POST | `/api/data/option_list` |
|
||
| POST | `/api/data/his_contract_list` |
|
||
| POST | `/api/data/option_iv` |
|
||
| POST | `/api/data/bsm_price` |
|
||
| POST | `/api/data/bsm_iv` |
|
||
| POST | `/api/data/local_data` |
|
||
| POST | `/api/data/subscribe_quote` |
|
||
| POST | `/api/data/unsubscribe_quote` |
|
||
| GET | `/api/check/is_last_bar` |
|
||
| GET | `/api/check/is_new_bar` |
|
||
| POST | `/api/check/is_suspended_stock` |
|
||
| POST | `/api/check/is_sector_stock` |
|
||
| POST | `/api/check/is_typed_stock` |
|
||
| POST | `/api/check/get_industry_name_of_stock` |
|
||
| POST | `/api/trade/passorder` |
|
||
| POST | `/api/trade/algo_passorder` |
|
||
| POST | `/api/trade/smart_algo_passorder` |
|
||
| POST | `/api/trade/order_lots` |
|
||
| POST | `/api/trade/order_value` |
|
||
| POST | `/api/trade/order_percent` |
|
||
| POST | `/api/trade/order_target_value` |
|
||
| POST | `/api/trade/order_target_percent` |
|
||
| POST | `/api/trade/order_shares` |
|
||
| POST | `/api/trade/futures/buy_open` |
|
||
| POST | `/api/trade/futures/buy_close_tdayfirst` |
|
||
| POST | `/api/trade/futures/buy_close_ydayfirst` |
|
||
| POST | `/api/trade/futures/sell_open` |
|
||
| POST | `/api/trade/futures/sell_close_tdayfirst` |
|
||
| POST | `/api/trade/futures/sell_close_ydayfirst` |
|
||
| POST | `/api/trade/cancel_task` |
|
||
| POST | `/api/trade/pause_task` |
|
||
| POST | `/api/trade/resume_task` |
|
||
| POST | `/api/trade/do_order` |
|
||
| POST | `/api/trade/trade_detail_data` |
|
||
| POST | `/api/trade/value_by_order_id` |
|
||
| POST | `/api/trade/last_order_id` |
|
||
| POST | `/api/trade/can_cancel_order` |
|
||
| POST | `/api/trade/debt_contract` |
|
||
| POST | `/api/trade/assure_contract` |
|
||
| POST | `/api/trade/enable_short_contract` |
|
||
| POST | `/api/trade/ipo_data` |
|
||
| POST | `/api/trade/new_purchase_limit` |
|
||
| POST | `/api/ext/ext_data` |
|
||
| POST | `/api/ext/ext_data_rank` |
|
||
| POST | `/api/ext/get_factor_value` |
|
||
| POST | `/api/ext/get_factor_rank` |
|
||
| GET | `/api/sys/python_version` |
|
||
| POST | `/api/sys/shutdown` |
|
||
|
||
合计 **104** 条路由(`/api/holding` 与 `/api/v2/positions`、`/api/v2/assets` 与资金类为不同路径、部分共用 Handler)。
|