Files
big-qmt/docs/api.md
2026-08-25 16:40:18 +08:00

1215 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 BodyJSON 对象。未特别说明的字段均可省略并走源码默认值
- 多值字符串:逗号分隔,例如 `"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