# HTTP API 参考 本文档根据 [`api/QMT_API.py`](../api/QMT_API.py) 的 Handler 与 `make_app()` 路由逐条整理。架构、鉴权、启动方式见 [README.md](./README.md)。 **公共约定** - Base URL:`http://:10086`(`PORT=10086`,绑定 `0.0.0.0`) - 鉴权:所有已注册接口均需请求头 `X-Token: `(源码当前值为 `QMTbyYanweidong`) - POST Body:JSON 对象。未特别说明的字段均可省略并走源码默认值 - 多值字符串:逗号分隔,例如 `"000001.SZ,600000.SH"` - 失败响应:`{"error": "", "status_code": }` - 「对应 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)。