CyTrade2
CyTrade2 是一个基于 xtquant / QMT 的 Python 量化交易框架,覆盖以下完整链路:
- 交易连接与自动重连
- 实时行情订阅与分发
- 策略运行与状态恢复
- 订单追踪与成交回调
- 持仓管理与盈亏统计
- Watchdog 监控告警
- FastAPI + Vue Web 控制台
当前仓库适合以下用途:
- 作为个人量化交易框架骨架
- 作为 xtquant/QMT 集成示例
- 作为策略开发、回放验证、Web 控台集成的学习项目
安全说明:仓库默认不再包含任何真实账号、密码、令牌或本地客户端路径。运行前请自行配置本地环境。
特性
| 模块 | 能力 |
|---|---|
| 连接管理 | QMT 连接、断线重连、重连回调 |
| 数据订阅 | 个股订阅、全市场订阅、重连后恢复订阅 |
| 交易执行 | 限价、市价、按金额下单、平仓、撤单 |
| 订单管理 | UUID 追踪、柜台单号映射、成交/状态更新 |
| 持仓管理 | 移动平均成本、FIFO、实时浮盈/实盈统计 |
| 策略框架 | BaseStrategy、信号与交易分离、风控前置 |
| 策略运行 | 选股、行情分发、调度、快照恢复、停止归档 |
| 数据持久化 | SQLite、本地状态恢复、可选 PostgreSQL 同步 |
| 监控告警 | 心跳、连接状态、数据超时、CPU/内存、钉钉通知 |
| Web 控制台 | FastAPI REST、WebSocket、Vue 3 前端 |
项目结构
cytrade2/
├── config/ # 枚举、配置
├── core/ # QMT 回调、连接、订阅、历史数据
├── data/ # SQLite / 状态文件 / 可选远程同步
├── monitor/ # 日志、看门狗
├── position/ # 持仓模型与管理器
├── strategy/ # 策略基类、运行器、示例策略
├── trading/ # 交易执行、订单管理、交易模型
├── web/ # FastAPI 后端 + Vue 前端
├── tests/ # pytest 回归测试
├── main.py # 主入口
├── requirements.txt
├── 设计文档.md
├── plan.md
└── 终审.md
运行环境
- Python 3.10 推荐
- Windows
- 已安装并可登录的 QMT 客户端
- Node.js 18+(仅前端开发时需要)
Python 依赖见 requirements.txt,前端依赖见 web/frontend/package.json。
快速开始
1. 安装 Python 依赖
pip install -r requirements.txt
2. 配置本地环境
框架支持两种配置方式:
- 直接修改
config/settings.py - 通过环境变量覆盖默认值(推荐开源使用方式)
常用环境变量如下:
| 变量名 | 说明 | 示例 |
|---|---|---|
QMT_PATH |
QMT 客户端路径 | D:\QMT\XtMiniQmt.exe |
ACCOUNT_ID |
资金账号 | your_account_id |
ACCOUNT_PASSWORD |
登录密码 | your_password |
SQLITE_DB_PATH |
SQLite 路径 | ./data/db/cytrade2.db |
STATE_SAVE_DIR |
策略状态目录 | ./saved_states |
LOG_DIR |
日志目录 | ./logs |
WEB_PORT |
Web 端口 | 8080 |
LOG_LEVEL |
日志级别 | INFO |
ENABLE_REMOTE_DB |
是否启用远程同步 | false |
参考环境变量模板见 .env.example。
3. 启动主程序
python main.py
默认会加载示例策略 TestGridStrategy。
启动后默认可访问:
- REST API:
http://localhost:8080/api - WebSocket:
ws://localhost:8080/ws/realtime
4. 启动前端(可选)
cd web/frontend
npm install
npm run dev
核心设计
交易主链路
xtquant/QMT
-> callback.py
-> order_manager.py / connection.py
-> position/manager.py
-> strategy/runner.py
-> strategy/base.py
-> trading/executor.py
设计原则
- 策略只产出信号,不直接操作底层接口
- 订单、成交、持仓分层处理
- 回调统一做异常保护
- 重连后自动恢复订阅
- 清仓后自动归档策略盈亏
- Web 撤单走真实交易执行链路
开发策略
在 strategy/ 下新增策略文件,并继承 BaseStrategy。
最小示例如下:
from strategy.base import BaseStrategy
from strategy.models import StrategyConfig
from core.models import TickData
class MyStrategy(BaseStrategy):
strategy_name = "MyStrategy"
def select_stocks(self) -> list[StrategyConfig]:
return [
StrategyConfig(
stock_code="000001",
entry_price=10.0,
stop_loss_price=9.5,
take_profit_price=11.0,
max_position_amount=50_000,
)
]
def on_tick(self, tick: TickData) -> dict | None:
if tick.last_price <= self.config.entry_price:
return {
"action": "BUY",
"price": tick.last_price,
"amount": 10_000,
"remark": "entry signal",
}
return None
然后在 main.py 中注册:
from strategy.my_strategy import MyStrategy
run(strategy_classes=[MyStrategy])
参考实现:strategy/test_grid_strategy.py
Web 接口概览
后端提供常用控制与监控接口:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/strategies |
查询策略 |
| POST | /api/strategies/{id}/pause |
暂停策略 |
| POST | /api/strategies/{id}/resume |
恢复策略 |
| POST | /api/strategies/{id}/close |
强制平仓 |
| GET | /api/positions |
查询持仓 |
| GET | /api/orders |
查询订单 |
| POST | /api/orders/{uuid}/cancel |
撤单 |
| GET | /api/trades |
查询成交 |
| GET | /api/system/status |
系统状态 |
| GET | /api/system/logs |
最近日志 |
前端技术栈:
- Vue 3
- Vite
- Element Plus
- Pinia
测试
当前基线:50 passed
python -m pytest tests/ -v
当前已覆盖:
- 连接管理
- 数据管理
- 数据订阅恢复
- 主入口装配
- 订单管理
- 交易执行
- 持仓计算
- 策略运行
- Web 撤单链路
说明:策略状态持久化当前采用 pickle,用于项目内部跨交易日恢复;
不保证跨大版本结构变更后的兼容性。
开源使用建议
1. 不要提交真实配置
请勿把以下信息提交到仓库:
- QMT 客户端真实路径
- 资金账号和密码
- 钉钉 Webhook / Secret
- 数据库账号密码
- 任意 Git / API Token
2. 建议本地忽略的内容
项目已附带 .gitignore,建议本地运行文件、日志、数据库、状态文件都不要纳入版本控制。
3. 当前已知限制
- 强依赖 Windows + QMT 环境
xtquant不同版本的订阅参数细节可能存在差异- 状态恢复基于
pickle,更适合内部运行态恢复,不适合作为长期兼容存档格式
相关文档
设计文档.md:总体设计说明plan.md:详细实施计划整改追踪表.md:问题与整改跟踪终审.md:终审结论与修复回写CONTRIBUTING.md:贡献约定SECURITY.md:安全说明RELEASE_CHECKLIST.md:发布前检查清单CHANGELOG.md:版本变更记录
免责声明
本项目仅用于学习、研究和自有环境验证,不构成任何投资建议。
实盘使用前,请自行完成:
- 账户权限核验
- 行情与交易接口版本核验
- 风控规则核验
- 长时间稳定性测试
- 真实环境回归测试
License
本项目采用 MIT License。
2. 日期格式:统一使用 "YYYYMMDD" 字符串(如 "20260227")。
3. Mock 模式:未连接 QMT 时,TradeExecutor 自动进入 Mock 模式,订单在内存中模拟成交,适用于策略逻辑调试。
4. 跨交易日恢复:每日 15:05 定时保存策略快照到 saved_states/;下次启动时自动加载当天状态文件。
5. 最小下单单位:buy_by_amount 按 100 股取整,不足 100 股时不下单。
Metadata
Release files for cytrade2 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cytrade2-0.1.0.tar.gz | 108.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cytrade2-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 176.3 kB
Release files / cytrade2-0.1.0.tar.gz
| Download URL | cytrade2-0.1.0.tar.gz |
|---|---|
| Size | 108.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
403d498d10185fb1c0fb35c73d626016f69653a391ea7ce13c31999dbf9ffaca
|
|
BLAKE2b-256 checksum How to use checksums |
72cd439abfd0d887f563aab9d90ef01602d6d40283ceb554a9a6b97a52cc9e97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.16
|
Release files / cytrade2-0.1.0-py3-none-any.whl
| Download URL | cytrade2-0.1.0-py3-none-any.whl |
|---|---|
| Size | 68.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d0711bcec9944bdfa9e6107bb080b679d854de84a38acd38f950cebd8dcbae8
|
|
BLAKE2b-256 checksum How to use checksums |
12f2fd5a8153faa23ead794cdaeabb7b37faefbda375a2b598e940b205adbd2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.16
|