# qmt_trader_http_server **Repository Path**: gznofeng/qmt_trader_http_server ## Basic Information - **Project Name**: qmt_trader_http_server - **Description**: https://github.com/zzquant/qmt_trader_http_server 基于qmt_trader_http_server的优化 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-28 - **Last Updated**: 2026-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

🚀 QMT Trader HTTP Server

QMT量化交易HTTP服务 · 远程下单 · 多账户管理

快速开始API接口Python客户端配置说明

--- ## ✨ 特性 - 🌐 **HTTP API** - 将QMT交易能力封装为RESTful API,支持远程调用 - 📈 **行情数据** - 历史K线、实时行情、五档盘口、指数成分股、股票名称,支持自动下载缺失数据 - 👥 **多账户** - 支持配置多个QMT交易账户,统一管理 - 🔐 **安全认证** - HMAC-SHA256签名验证,支持URL参数鉴权(浏览器友好) - 📊 **Web界面** - 可视化交易界面,实时持仓和资产查看 - 🔔 **钉钉通知** - 交易信号自动推送到钉钉群 - 📝 **完整日志** - 所有交易操作记录在案 --- ## 📦 安装 ### 环境要求 - Windows 系统 (QMT仅支持Windows) - Python 3.8 - 3.11 - QMT交易终端 (已安装配置) ### 安装步骤 ```bash # 1. 克隆项目 git clone https://github.com/yourname/qmt_trader_http_server.git cd qmt_trader_http_server # 2. 安装依赖 pip install -r requirements.txt # 3. 配置环境变量 copy .env.example .env # 编辑 .env 文件,配置账户信息 # 4. 启动服务 python app.py ``` 启动后访问:`http://localhost:9091` --- ## 🚀 快速开始 ### 方式一:Web界面 浏览器访问 `http://localhost:9091`,登录后即可: - 查看实时持仓和资产 - 执行买入/卖出操作 - 管理订单和撤单 ### 方式二:Python客户端 (推荐) ```python from qmt_trader_client import call_buy, call_sell # 买入:平安银行,价格10.50,仓位10% call_buy("000001", 10.50, 0.1, "我的策略") # 卖出:平安银行,价格11.00,仓位50% call_sell("000001", 11.00, 0.5, "我的策略") ``` ### 方式三:HTTP API ```bash # 查询持仓 curl http://localhost:9091/qmt/trade/api/positions/0 # 买入股票 curl -X POST http://localhost:9091/qmt/trade/api/trade \ -H "Content-Type: application/json" \ -d '{"trader_index": 0, "symbol": "000001", "volume": 100, "price": 10.50}' ``` --- ## 🐍 Python客户端 项目提供开箱即用的Python客户端 `qmt_trader_client.py`: ```python from qmt_trader_client import call_buy, call_sell, call_trade # 配置 (修改 qmt_trader_client.py 中的配置) base_url = "http://yourip:9091" client_id = "outer_client_002" secret_key = "your_secret_key" # 买入 call_buy(symbol="000001", trade_price=10.50, position_pct=0.1, strategy_name="策略A") # 卖出 call_sell(symbol="000001", trade_price=11.00, position_pct=0.5, strategy_name="策略A") # 通用调用 call_trade( symbol="000001", trade_price=10.50, position_pct=0.1, operation='buy', # 'buy' 或 'sell' strategy_name="策略A" ) ``` **参数说明:** | 参数 | 说明 | 示例 | |:---|:---|:---| | `symbol` | 股票代码 | `"000001"` | | `trade_price` | 交易价格 | `10.50` | | `position_pct` | 仓位比例 (0.1=10%) | `0.1` | | `operation` | 操作类型 | `"buy"` 或 `"sell"` | | `strategy_name` | 策略名称 (自定义) | `"我的策略"` | --- ## 📡 API接口 ### 账户与持仓 | 接口 | 方法 | 描述 | |:---|:---|:---| | `/qmt/trade/api/accounts` | GET | 获取所有账户 | | `/qmt/trade/api/portfolio/{index}` | GET | 获取资产组合 | | `/qmt/trade/api/query_stock_asset` | GET/POST | 查询账户资产(原生XtAsset,支持json/df双格式) | | `/qmt/trade/api/positions/{index}` | GET | 获取持仓列表 | ### 交易操作 | 接口 | 方法 | 描述 | |:---|:---|:---| | `/qmt/trade/api/trade/buy` | GET/POST | 买入 | | `/qmt/trade/api/trade/sell` | GET/POST | 卖出 | | `/qmt/trade/api/trade/allin` | GET/POST | 全仓买入 | | `/qmt/trade/api/trade/nhg` | GET/POST | 逆回购 | ### 订单管理 | 接口 | 方法 | 描述 | |:---|:---|:---| | `/qmt/trade/api/orders` | GET/POST | 查询订单 | | `/qmt/trade/api/order` | GET/POST | 查询单个订单 | | `/qmt/trade/api/cancel_order` | GET/POST | 撤销订单 | | `/qmt/trade/api/cancel_orders/buy` | GET/POST | 撤销所有买单 | | `/qmt/trade/api/cancel_orders/sale` | GET/POST | 撤销所有卖单 | ### 行情数据 | 接口 | 方法 | 描述 | |:---|:---|:---| | `/qmt/data/api/get_market_data_ex` | GET | 获取历史K线数据(自动下载缺失数据,日K实时更新) | | `/qmt/data/api/get_full_tick` | GET | 获取实时行情快照(含五档盘口) | | `/qmt/data/api/get_stock_list_in_sector` | GET | 获取板块股票列表 | | `/qmt/data/api/get_sector_list` | GET | 获取板块列表 | | `/qmt/data/api/get_index_weight` | GET | 获取指数成分股权重(支持多指数) | | `/qmt/data/api/get_stock_name` | GET | 获取股票名称(支持多股票) | ### 外部接口 | 接口 | 方法 | 描述 | |:---|:---|:---| | `/qmt/trade/api/outer/trade/{operation}` | POST | 外部策略调用 | > 💡 完整API文档见 [api_signature_example.md](api_signature_example.md) ### API 调用示例 所有接口都支持 URL 参数鉴权,格式:`?client_id=nofeng&client_secret=nofeng` **行情数据接口:** ```bash # 获取历史K线数据(默认格式) http://127.0.0.1:9091/qmt/data/api/get_market_data_ex?stock_list=510300&period=1d&client_id=nofeng&client_secret=nofeng # 获取历史K线数据(JSON格式) http://127.0.0.1:9091/qmt/data/api/get_market_data_ex?stock_list=510300,515050&period=1d&json=1&client_id=nofeng&client_secret=nofeng # 获取实时行情快照(含五档盘口) http://127.0.0.1:9091/qmt/data/api/get_full_tick?stock_list=510300,515050&client_id=nofeng&client_secret=nofeng # 获取板块股票列表 http://127.0.0.1:9091/qmt/data/api/get_stock_list_in_sector?sector=创业板&client_id=nofeng&client_secret=nofeng # 获取板块列表 http://127.0.0.1:9091/qmt/data/api/get_sector_list?client_id=nofeng&client_secret=nofeng # 获取板块列表(JSON格式,含股票数量) http://127.0.0.1:9091/qmt/data/api/get_sector_list?json=1&client_id=nofeng&client_secret=nofeng # 获取指数成分股权重(默认格式) http://127.0.0.1:9091/qmt/data/api/get_index_weight?index_code=000300.SH&client_id=nofeng&client_secret=nofeng # 获取指数成分股权重(多指数,JSON格式) http://127.0.0.1:9091/qmt/data/api/get_index_weight?index_code=000300.SH,000016.SH&json=1&client_id=nofeng&client_secret=nofeng # 获取股票名称(默认格式) http://127.0.0.1:9091/qmt/data/api/get_stock_name?stock_list=000001,600000&client_id=nofeng&client_secret=nofeng # 获取股票名称(JSON格式) http://127.0.0.1:9091/qmt/data/api/get_stock_name?stock_list=000001,600000,000300&json=1&client_id=nofeng&client_secret=nofeng ``` **账户与持仓接口:** ```bash # 获取所有账户 http://127.0.0.1:9091/qmt/trade/api/accounts?client_id=nofeng&client_secret=nofeng # 获取资产组合 http://127.0.0.1:9091/qmt/trade/api/portfolio/0?client_id=nofeng&client_secret=nofeng # 查询账户资产(DataFrame格式,默认) http://127.0.0.1:9091/qmt/trade/api/query_stock_asset?trader_index=0&client_id=nofeng&client_secret=nofeng # 查询账户资产(JSON对象数组格式) http://127.0.0.1:9091/qmt/trade/api/query_stock_asset?trader_index=0&json=1&client_id=nofeng&client_secret=nofeng # 获取持仓列表 http://127.0.0.1:9091/qmt/trade/api/positions/0?client_id=nofeng&client_secret=nofeng ``` **交易接口:** ```bash # 买入(按仓位百分比) http://127.0.0.1:9091/qmt/trade/api/trade/buy?symbol=510300&trade_price=4.9&position_pct=50&client_id=nofeng&client_secret=nofeng # 买入(按股数,买入100股) http://127.0.0.1:9091/qmt/trade/api/trade/buy?symbol=510300&trade_price=4.9&shares=100&client_id=nofeng&client_secret=nofeng # 卖出(按仓位百分比) http://127.0.0.1:9091/qmt/trade/api/trade/sell?symbol=510300&trade_price=4.9&position_pct=50&client_id=nofeng&client_secret=nofeng # 卖出(按股数,卖出100股) http://127.0.0.1:9091/qmt/trade/api/trade/sell?symbol=510300&trade_price=4.9&shares=100&client_id=nofeng&client_secret=nofeng # 全仓买入 http://127.0.0.1:9091/qmt/trade/api/trade/allin?symbol=510300&cur_price=4.9&client_id=nofeng&client_secret=nofeng # 逆回购 http://127.0.0.1:9091/qmt/trade/api/trade/nhg?client_id=nofeng&client_secret=nofeng ``` **订单管理接口:** ```bash # 查询所有订单 http://127.0.0.1:9091/qmt/trade/api/orders?trader_index=0&client_id=nofeng&client_secret=nofeng # 查询单个订单 http://127.0.0.1:9091/qmt/trade/api/order?order_id=xxx&trader_index=0&client_id=nofeng&client_secret=nofeng # 撤销订单 http://127.0.0.1:9091/qmt/trade/api/cancel_order?order_id=xxx&trader_index=0&client_id=nofeng&client_secret=nofeng # 撤销所有买单 http://127.0.0.1:9091/qmt/trade/api/cancel_orders/buy?trader_index=0&client_id=nofeng&client_secret=nofeng # 撤销所有卖单 http://127.0.0.1:9091/qmt/trade/api/cancel_orders/sale?trader_index=0&client_id=nofeng&client_secret=nofeng ``` --- ## ⚙️ 配置说明 编辑 `.env` 文件配置以下内容: ### 基础配置 ```env FLASK_SECRET_KEY=your-secret-key FLASK_PORT=9091 ``` ### 用户认证 ```env ADMIN_PASSWORD=your-admin-password TRADER_PASSWORD=your-trader-password ``` ### API客户端 ```env QMT_CLIENT_ACCOUNT=qmt_client_001 QMT_CLIENT_SECRET=your-client-secret ``` ### QMT账户配置 ```env TRADER_CONFIGS="[ { 'account_id': '3880000xxxxxx', 'account_type': 1001, 'account_name': '主账户', 'qmt_path': 'C:/迅投极速策略交易系统交易终端 华鑫证券QMT实盘/userdata_mini', 'enabled': True } ]" ``` ### 钉钉通知 (可选) ```env DINGTALK_ACCESS_TOKEN=your_token DINGTALK_SECRET=your_secret ``` > 📖 完整配置说明见 [CONFIG.md](CONFIG.md) --- ## 🔐 API签名认证 ### 方式一:URL参数鉴权(浏览器友好) 直接在URL中传递 `client_id` 和 `client_secret`,无需计算签名: ``` GET http://localhost:9091/qmt/data/api/get_market_data_ex?stock_list=510300&client_id=nofeng&client_secret=nofeng ``` ### 方式二:HMAC签名鉴权(推荐用于程序调用) 使用HMAC-SHA256签名保证API安全: ``` 请求头: X-Client-ID: your_client_id X-Timestamp: unix_timestamp X-Signature: hmac_sha256_signature ``` 签名规则: ``` 签名字符串 = {method}\n{path}\n{query}\n{body}\n{timestamp}\n{client_id} 签名 = HMAC-SHA256(secret_key, 签名字符串) ``` > 📖 详细签名说明见 [api_signature_example.md](api_signature_example.md) --- ## ❓ 常见问题
Q: QMT连接失败怎么办? 1. 确保QMT交易终端已启动并登录 2. 检查 `qmt_path` 路径配置是否正确 3. 验证账户ID和类型配置
Q: API签名验证失败? 1. 检查 client_id 和 secret_key 是否匹配 2. 确保时间戳误差在5分钟以内 3. 验证签名字符串构建顺序
Q: 支持哪些券商? 理论上支持所有提供QMT接入的券商,已测试: - 华鑫证券 - 其他支持QMT的券商
--- ## 🛡️ 安全建议 - ⚠️ 生产环境务必修改默认密码 - ⚠️ 妥善保管API密钥,不要提交到Git - ⚠️ 建议使用HTTPS部署 - ⚠️ 建议先在模拟环境测试 --- ## 📄 License MIT License - 仅供学习研究使用 --- ## 📋 更新日志 ### 2026-06-17 指数权重 & 股票名称接口 & NaN修复 **新增功能:** - 📊 **指数成分股权重接口** - `GET /qmt/data/api/get_index_weight` - 获取指数成分股权重 - 支持多指数逗号分隔(如 `000300.SH,000016.SH`) - 自动下载缺失的指数权重数据(`download_index_weight` 一次全量下载) - 支持 `json=1` 返回对象数组格式(含 `index_code`, `stock_code`, `stock_name`, `weight`) - `download_kline_history.py` 新增 `--index-weight` 参数,支持批量初始化指数权重数据 - 🏷️ **股票名称接口** - `GET /qmt/data/api/get_stock_name` - 获取股票名称 - 支持多股票逗号分隔(如 `000001,600000`) - 支持简写代码自动补全后缀 - 支持 `json=1` 返回对象数组格式 **修复:** - 🐛 **NaN值修复** — `get_market_data_ex` 输出中 NaN 替换为 `null`,确保 JSON 序列化合法 - 🐛 **今日行情行 time 字段修复** — 追加今日实时行情行时正确设置 `time` 毫秒时间戳,确保 `timeFmt` 正常生成 ### 2026-06-15 get_market_data_ex K线缺失修复 **修复:** - 🐛 **K线数据缺失问题** — `get_market_data_ex()` 改为先下载再获取 - 先调用 `download_history_data` 下载完整历史数据 - 再调用 `get_market_data_ex(subscribe=False)` 获取,禁止实时订阅避免干扰 - 移除旧的"检查空结果→补下载"逻辑(无法检测部分数据缺失) ### 2026-06-10 query_stock_asset 资产查询接口 **新增功能:** - 📊 **资产查询接口** - `GET/POST /qmt/trade/api/query_stock_asset` - 原生XtAsset资产查询 - 路由函数名与 miniQMT API 保持一致 - 支持 GET/POST 双方法 - 参数:`trader_index`(必选)、`json`(可选,默认0) - `json=0`(默认):返回 DataFrame 友好格式 `{columns, index, data}` - `json=1`:返回对象数组格式 `[{account_id, cash, ...}]` - 直接透传 XtAsset 原生属性,不做字段转换 ### 2026-05-28 行情数据接口 & 交易路由优化 **新增功能:** - 📈 **行情数据接口** - `GET /qmt/data/api/get_market_data_ex` - 历史K线数据 - 支持股票代码自动转换(如 `510300` → `510300.SH`) - 自动下载缺失的历史数据 - 日K数据自动用实时行情更新最后一天 - 支持 `json=1` 参数返回JSON对象数组格式 - 自动添加 `timeFmt` 字段(YYYYMMDD格式) - `GET /qmt/data/api/get_full_tick` - 实时行情快照 - 包含五档盘口数据 - 自动添加 `timeFmt` 字段 - `GET /qmt/data/api/get_stock_list_in_sector` - 板块股票列表 - 支持 `json=1` 返回对象数组(含股票名称) - `GET /qmt/data/api/get_sector_list` - 板块列表 - 支持 `json=1` 返回对象数组(含股票数量) - 🔐 **URL参数鉴权** - 支持通过URL参数传递 `client_id` 和 `client_secret` - 浏览器直接访问,无需计算签名 - 示例:`?client_id=nofeng&client_secret=nofeng` - 🔄 **交易路由优化** - 新增 `GET /qmt/trade/api/trade/buy` - 买入接口 - 新增 `GET /qmt/trade/api/trade/sell` - 卖出接口 - 所有交易接口支持 GET/POST 双方法 - 所有接口统一使用 `login_or_signature_required` 认证 - 买入/卖出支持两种方式: - `position_pct` - 按仓位百分比(如 50 表示总资产的50%) - `shares` - 按股数(如 100 表示买入100股) **技术改进:** - Flask 热更新支持(debug模式自动重载) - 行情数据返回格式双模式(DataFrame友好 / JSON对象数组) ---

⚠️ 免责声明:本软件仅供学习研究,使用者需自行承担交易风险。

⭐ 如果这个项目对你有帮助,请给它一个 Star!