{"id":51014350,"url":"https://github.com/zillionare/qmt-gateway","last_synced_at":"2026-06-21T08:03:42.849Z","repository":{"id":359512570,"uuid":"1245237442","full_name":"zillionare/qmt-gateway","owner":"zillionare","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-11T08:19:50.000Z","size":3412,"stargazers_count":1,"open_issues_count":4,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T09:04:27.298Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zillionare.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-21T03:25:18.000Z","updated_at":"2026-06-11T08:21:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"23176eed-758b-47cf-8b7f-ea7630a12ea5","html_url":"https://github.com/zillionare/qmt-gateway","commit_stats":null,"previous_names":["zillionare/qmt-gateway"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zillionare/qmt-gateway","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zillionare%2Fqmt-gateway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zillionare%2Fqmt-gateway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zillionare%2Fqmt-gateway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zillionare%2Fqmt-gateway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zillionare","download_url":"https://codeload.github.com/zillionare/qmt-gateway/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zillionare%2Fqmt-gateway/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34601665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-21T08:03:42.121Z","updated_at":"2026-06-21T08:03:42.842Z","avatar_url":"https://github.com/zillionare.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# qmt-gateway\n\n**qmt-gateway** 是一个独立的 Windows 网关服务，封装了 [QMT（迅投量化交易终端）](https://www.thinktrader.net/) 的 `xtquant` SDK，将交易、行情等功能以 HTTP / WebSocket API 的形式对外暴露。策略程序可以在任意平台运行，无需依赖 QMT 自带的 Python 环境。\n\n## 功能概览\n\n- **交易 API** — 买入、卖出、撤单，查询委托、成交、持仓、资产\n- **实时行情** — WebSocket（`/ws/quotes`）推送合成后的 K 线数据（1 分钟、30 分钟、日线）\n- **集合竞价行情** — 独立 WebSocket（`/ws/auction`）推送 09:15–09:30 原始撮合 tick\n- **历史数据下载** — 按板块 / 日期下载分钟线 Parquet 文件\n- **Web 交易台** — 内置交易界面，含下单表单、速拨盘、持仓 / 委托表格、日志查看器、数据管理\n- **初始化向导** — 首次运行逐步引导 QMT 路径、账户、密码、服务器配置\n- **自动启动 QMT** — 可选在网关启动时自动拉起 QMT 并填入交易密码，密码加密存储\n- **API Key 鉴权** — Web 端使用 session 登录；对外程序化访问使用 `X-API-Key` 长令牌\n- **在线更新与回滚** — 从 Web UI 检查版本、一键更新、一键回滚\n\n## 环境要求\n\n| 依赖 | 说明 |\n|---|---|\n| 操作系统 | Windows 10 / 11 |\n| Python | **3.13**（64 位） |\n| QMT | 安装在本机，已完成授权 |\n| xtquant | 通过配置的 QMT 路径可加载 |\n\n## 安装\n\n### 方式一：Windows 安装程序（推荐）\n\n从 [Releases](https://github.com/zillionare/qmt-gateway/releases) 页面下载最新的 Windows 安装程序，双击运行即可。安装程序会自动完成 Python 环境配置、依赖安装和服务启动。\n\n\u003c!-- TODO: 补充安装程序截图 --\u003e\n\n### 方式二：从源码安装\n\n#### 1. 克隆仓库\n\n```bat\ngit clone https://github.com/zillionare/qmt-gateway.git\ncd qmt-gateway\n```\n\n#### 2. 安装依赖\n\n运行安装脚本，自动检测 Python 3.13+、创建虚拟环境并安装所有依赖：\n\n```bat\nsetup-venv.bat\n```\n\n#### 3. 启动服务\n\n```bat\nstart-qmt-gateway.bat\n```\n\n## 首次使用\n\n服务启动后访问 **http://localhost:8130**。首次运行会进入初始化向导，引导你完成以下配置：\n\n1. **QMT 路径** — 指定 QMT 客户端安装目录\n2. **管理员账号** — 设置 Web 管理界面的登录密码\n3. **QMT 交易密码**（可选）— 用于自动启动 QMT 时填入密码\n4. **自动启动**（可选）— 网关启动时自动拉起 QMT 并完成登录\n\n\u003c!-- TODO: 补充初始化向导截图 --\u003e\n\n配置完成后：\n\n- **浏览器** — 打开 `http://localhost:8130`，用设置的管理员密码登录\n- **程序化访问** — 在 Web UI 中创建 API Key，请求时带上 `X-API-Key` 请求头\n\n## 配置说明\n\n### 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `QMT_GATEWAY_HOST` | `0.0.0.0` | 服务监听地址 |\n| `QMT_GATEWAY_PORT` | `8130` | 服务端口 |\n| `QMT_GATEWAY_HOME` | `~/.qmt-gateway` | 数据主目录（数据库、日志、导出文件） |\n\n### 命令行参数\n\n```\nqmt-gateway --host 0.0.0.0 --port 8130 [--home \u003cpath\u003e] [--init-wizard] [--force]\n```\n\n| 参数 | 说明 |\n|---|---|\n| `--host` | 监听地址 |\n| `--port` | 端口（覆盖配置文件） |\n| `--home` | 数据主目录 |\n| `--init-wizard` | 显示初始化向导 |\n| `--force` | 强制重新初始化（配合 `--init-wizard` 使用） |\n\n### 数据目录\n\n所有持久化数据存放在数据主目录下：\n\n```\n~/.qmt-gateway/\n├── data/\n│   └── app.db          # SQLite 数据库（配置、委托、持仓、资产）\n├── log/\n│   └── qmt-gateway.log # 应用日志（自动轮转，每份 10 MB）\n└── exports/            # 历史数据导出文件\n```\n\n## API 参考\n\n所有 API 端点均需要认证——浏览器 session（Web UI）或 `X-API-Key` 请求头（程序化访问）二选一。\n\n### 认证\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/login` | 登录页面 |\n| `POST` | `/auth/login` | 用户名 + 密码登录 |\n| `GET` | `/auth/logout` | 登出 |\n| `POST` | `/api/api-keys` | 创建 API Key（仅 session 可用） |\n| `GET` | `/api/api-keys` | 列出所有 API Key |\n| `DELETE` | `/api/api-keys/{key_id}` | 吊销 API Key |\n\n**程序化访问示例：**\n\n```bash\ncurl -H \"X-API-Key: qmt_abc123...\" http://localhost:8130/api/trade/asset\n```\n\n### 交易\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/api/trade/asset` | 账户资产（现金、市值、总资产、盈亏） |\n| `GET` | `/api/trade/positions` | 当前持仓列表 |\n| `GET` | `/api/trade/orders` | 当日委托列表 |\n| `GET` | `/api/trade/trades` | 当日成交列表 |\n| `POST` | `/api/trade/buy` | 买入委托 |\n| `POST` | `/api/trade/sell` | 卖出委托 |\n| `POST` | `/api/trade/cancel` | 按 qtoid 撤单 |\n| `GET` | `/api/trade/connection-status` | QMT 连接状态 |\n| `POST` | `/api/trade/restart-qmt` | 重启 QMT 并自动登录 |\n| `POST` | `/api/asset/principal` | 修改本金 |\n\n**买入示例：**\n\n```bash\ncurl -X POST \"http://localhost:8130/api/trade/buy\" \\\n  -H \"X-API-Key: qmt_...\" \\\n  -d \"symbol=000001.SZ\u0026price=12.50\u0026shares=100\"\n```\n\n**返回示例：**\n\n```json\n{\n  \"success\": true,\n  \"qtoid\": \"12345\",\n  \"order_id\": \"67890\"\n}\n```\n\n### 行情数据\n\n#### WebSocket：实时行情 — `ws://host:port/ws/quotes`\n\n推送所有已订阅标的的合成 K 线数据，消息格式为 JSON：\n\n```json\n{\n  \"symbol\": \"000001.SZ\",\n  \"interval\": 60,\n  \"ts\": 1717387200,\n  \"open\": 12.30,\n  \"high\": 12.55,\n  \"low\": 12.28,\n  \"close\": 12.50,\n  \"volume\": 150000,\n  \"amount\": 1867500.0\n}\n```\n\n支持的 `interval` 值：`60`（1 分钟）、`1800`（30 分钟）、`86400`（日线）。\n\n#### WebSocket：集合竞价 — `ws://host:port/ws/auction`\n\n09:15–09:30 期间推送原始撮合 tick，每条消息包含竞价阶段标识（`auction_a`、`auction_b`、`matching`）：\n\n```json\n{\n  \"type\": \"auction\",\n  \"symbol\": \"000001.SZ\",\n  \"phase\": \"auction_b\",\n  \"price\": 12.34,\n  \"open\": 0.0,\n  \"volume\": 0,\n  \"server_time\": \"2026-06-12T09:23:45.000\"\n}\n```\n\n#### REST\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/api/v1/quotes/status` | 行情服务状态（是否运行、客户端数量） |\n\n### 股票信息\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/api/stocks` | 获取全部股票列表 |\n| `GET` | `/api/stocks/search?stock_search=\u003c关键词\u003e` | 按代码、名称或拼音搜索股票 |\n| `GET` | `/api/stock/info?symbol=\u003c代码\u003e` | 获取股票信息及昨收价 |\n| `GET` | `/api/stock/resolve?q=\u003c关键词\u003e` | 将关键词解析为股票代码 |\n\n### 历史数据\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `POST` | `/api/history/minutes/jobs` | 创建分钟线下载任务 |\n| `GET` | `/api/history/minutes/jobs/{job_id}` | 查询任务状态 |\n| `GET` | `/api/history/minutes/jobs/{job_id}/file` | 下载已完成的 Parquet 文件 |\n\n### 系统管理\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/api/ping` | 健康检查（连通性 + 鉴权） |\n| `GET` | `/api/system/version` | 当前版本及更新信息 |\n| `POST` | `/api/system/update` | 触发自动更新 |\n| `GET` | `/api/system/autostart` | 查询开机自启状态 |\n| `POST` | `/api/system/autostart` | 启用 / 禁用开机自启 |\n| `GET` | `/api/system/firewall` | 查询防火墙规则状态 |\n| `POST` | `/api/system/firewall` | 更新防火墙规则（放行当前端口） |\n\n### 日志流\n\n| 方法 | 端点 | 说明 |\n|---|---|---|\n| `GET` | `/logs/stream` | SSE 端点，实时推送日志更新 |\n\n## 架构\n\n```\n┌──────────────────────────────────────────────────┐\n│              qmt-gateway (Windows)                │\n│                                                   │\n│  ┌──────────┐  ┌───────────┐  ┌──────────────┐  │\n│  │ REST API │  │ WebSocket │  │  Web UI       │  │\n│  │ (交易,   │  │ (行情,    │  │  (FastHTML +  │  │\n│  │  股票,   │  │  竞价)    │  │   HTMX)       │  │\n│  │  系统)   │  │           │  │               │  │\n│  └────┬─────┘  └─────┬─────┘  └──────┬───────┘  │\n│       │              │               │            │\n│  ┌────┴──────────────┴───────────────┴──────┐    │\n│  │              服务层                        │    │\n│  │  TradeService · QuoteService · StockService│   │\n│  │  HistoryDownloadService · Scheduler       │    │\n│  └────────────────┬──────────────────────────┘    │\n│                   │                                │\n│  ┌────────────────┴─────────────────────────┐     │\n│  │        xtquant (xttrader + xtdata)        │    │\n│  └────────────────┬─────────────────────────┘     │\n└───────────────────┼───────────────────────────────┘\n                    │\n              ┌─────┴──────┐\n              │  QMT 客户端 │\n              │ (XtMiniQmt) │\n              └────────────┘\n```\n\n**技术栈：** Python 3.13 · FastHTML · Starlette · uvicorn · SQLite · orjson · pywinauto · bcrypt · cryptography\n\n## 认证机制\n\n网关支持两种认证方式：\n\n1. **Session** — 在 `/login` 页面进行浏览器登录，Web 管理界面使用\n2. **API Key** — 长生命周期令牌（前缀 `qmt_`），通过 `X-API-Key` 请求头传递。在 Web UI 中创建，明文仅显示一次，网关只存储 SHA-256 摘要\n\nAPI Key 不能用于创建或吊销其他 Key——这些操作需要交互式 session。\n\n## 开发\n\n```bat\n# 安装开发依赖（pytest, ruff, black）\nsetup-venv.bat\n\n# 运行测试\n.venv\\Scripts\\python.exe -m pytest -q\n\n# 代码检查\n.venv\\Scripts\\python.exe -m ruff check qmt_gateway/\n```\n\n## License\n\n本项目为私有项目，详见 [LICENSE](LICENSE)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzillionare%2Fqmt-gateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzillionare%2Fqmt-gateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzillionare%2Fqmt-gateway/lists"}