653472def3
对齐 VeighNa 4.4 原生 Qt UI,新增成交监控、资金监控、网关管理、全局配置等页面与 API,功能对等性 98.5%。 - 新增 API: /api/v1/trades, /api/v1/accounts, /api/v1/settings, 网关扩展 - 新增前端页面: 成交、资金、合约、网关、全局配置、微信通知 - 扩展导航菜单与实时数据推送 - 补充需求分析与实现计划文档
640 lines
15 KiB
Markdown
640 lines
15 KiB
Markdown
# VeighNa 4.4 原生 UI 功能深度分析
|
||
|
||
## 分析目的
|
||
|
||
分析 VeighNa 4.4.0 原生 Qt UI 的完整功能,为 Web 前端实现对等功能提供参考。
|
||
|
||
---
|
||
|
||
## 一、UI 架构概览
|
||
|
||
### 1.1 MainWindow(主窗口)
|
||
|
||
**文件**: `vnpy/trader/ui/mainwindow.py`
|
||
|
||
**窗口标题格式**: `VeighNa Trader 社区版 - {version} [{trader_path}]`
|
||
|
||
**核心结构**:
|
||
- Dock 系统组件(可拖拽、浮动、最小化)
|
||
- 菜单栏(系统、功能、帮助)
|
||
- 工具栏(左侧,固定大小和间距)
|
||
- 窗口设置保存/恢复(默认布局 + 自定义布局)
|
||
|
||
---
|
||
|
||
## 二、Dock 组件清单
|
||
|
||
### 2.1 TradingWidget(交易组件)
|
||
|
||
**位置**: `LeftDockWidgetArea`
|
||
|
||
**功能**:
|
||
|
||
#### 下单表单区域
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| 交易所 | ComboBox | 下拉选择 |
|
||
| 代码 | LineEdit | 文本输入,回车确认 |
|
||
| 名称 | LineEdit | 只读显示 |
|
||
| 方向 | ComboBox | LONG(多)/SHORT(空) |
|
||
| 开平 | ComboBox | OPEN(开)/CLOSE(平)/CLOSETODAY(平今)/CLOSEYESTERDAY(平昨) |
|
||
| 类型 | ComboBox | LIMIT(限价)/MARKET(市价)/STOP(止损) |
|
||
| 价格 | LineEdit | 数字输入,可选 |
|
||
| 数量 | LineEdit | 数字输入,必填 |
|
||
| 接口 | ComboBox | 下拉选择 |
|
||
| 价格随行情更新 | CheckBox | 勾选后价格自动跟随最新价 |
|
||
|
||
#### 按钮
|
||
- **委托按钮** - 发送订单
|
||
- **全撤按钮** - 撤销所有活动订单
|
||
|
||
#### 市场深度显示(盘口)
|
||
```
|
||
┌─────────────────────┐
|
||
│ 卖5价 卖5量 │
|
||
│ 卖4价 卖4量 │
|
||
│ 卖3价 卖3量 │
|
||
│ 卖2价 卖2量 │
|
||
│ 卖1价 卖1量 │
|
||
│ ──────────────── │
|
||
│ 最新价 涨跌幅% │
|
||
│ ──────────────── │
|
||
│ 买1价 买1量 │
|
||
│ 买2价 买2量 │
|
||
│ 买3价 买3量 │
|
||
│ 买4价 买4量 │
|
||
│ 买5价 买5量 │
|
||
└─────────────────────┘
|
||
```
|
||
|
||
**颜色方案**:
|
||
- 买盘(Bid): `rgb(255, 174, 201)` 粉红色
|
||
- 卖盘(Ask): `rgb(160, 255, 160)` 浅绿色
|
||
- 多头(LONG): 红色
|
||
- 空头(SHORT): 绿色
|
||
|
||
#### 交互特性
|
||
- 行情双击更新: 双击 TickMonitor 或 PositionMonitor 的行,自动填充交易表单
|
||
- 持仓反向填充: 双击持仓时自动设置反向方向和平仓
|
||
- 价格自动更新: 勾选"价格随行情更新"后,价格跟随最新价
|
||
|
||
---
|
||
|
||
### 2.2 TickMonitor(行情监控)
|
||
|
||
**位置**: `RightDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 代码 | symbol | 否 | ✅ |
|
||
| 交易所 | exchange | 否 | ✅ |
|
||
| 名称 | name | **是** | ✅ |
|
||
| 最新价 | last_price | **是** | ✅ |
|
||
| 成交量 | volume | **是** | ✅ |
|
||
| 开盘价 | open_price | **是** | ✅ |
|
||
| 最高价 | high_price | **是** | ✅ |
|
||
| 最低价 | low_price | **是** | ✅ |
|
||
| 买1价 | bid_price_1 | **是** | ✅ |
|
||
| 买1量 | bid_volume_1 | **是** | ✅ |
|
||
| 卖1价 | ask_price_1 | **是** | ✅ |
|
||
| 卖1量 | ask_volume_1 | **是** | ✅ |
|
||
| 时间 | datetime | **是** | ✅ |
|
||
| 接口 | gateway_name | 否 | ✅ |
|
||
|
||
**数据键**: `vt_symbol`(按此键更新现有行)
|
||
|
||
---
|
||
|
||
### 2.3 OrderMonitor(委托监控)
|
||
|
||
**位置**: `RightDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 委托号 | orderid | 否 | ✅ |
|
||
| 来源 | reference | 否 | ✅ |
|
||
| 代码 | symbol | 否 | ✅ |
|
||
| 交易所 | exchange | 否 | ✅ |
|
||
| 类型 | type | 否 | ✅ |
|
||
| 方向 | direction | 否 | ✅ |
|
||
| 开平 | offset | 否 | ✅ |
|
||
| 价格 | price | 否 | ✅ |
|
||
| 总数量 | volume | **是** | ✅ |
|
||
| 已成交 | traded | **是** | ✅ |
|
||
| 状态 | status | **是** | ✅ |
|
||
| 时间 | datetime | **是** | ✅ |
|
||
| 接口 | gateway_name | 否 | ✅ |
|
||
|
||
**数据键**: `vt_orderid`
|
||
|
||
**交互**: 双击单元格撤单
|
||
|
||
---
|
||
|
||
### 2.4 ActiveOrderMonitor(活动委托监控)
|
||
|
||
**位置**: `RightDockWidgetArea`
|
||
|
||
**说明**: 继承自 OrderMonitor,只显示活动状态的订单
|
||
|
||
**过滤逻辑**:
|
||
```python
|
||
if order.is_active():
|
||
showRow(row) # 显示活动订单
|
||
else:
|
||
hideRow(row) # 隐藏已完成/已撤销订单
|
||
```
|
||
|
||
**活动状态**: 未成交、部分成交
|
||
|
||
---
|
||
|
||
### 2.5 TradeMonitor(成交监控)
|
||
|
||
**位置**: `RightDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 成交号 | tradeid | 否 | ✅ |
|
||
| 委托号 | orderid | 否 | ✅ |
|
||
| 代码 | symbol | 否 | ✅ |
|
||
| 交易所 | exchange | 否 | ✅ |
|
||
| 方向 | direction | 否 | ✅ |
|
||
| 开平 | offset | 否 | ✅ |
|
||
| 价格 | price | 否 | ✅ |
|
||
| 数量 | volume | 否 | ✅ |
|
||
| 时间 | datetime | 否 | ✅ |
|
||
| 接口 | gateway_name | 否 | ✅ |
|
||
|
||
**数据键**: 空(只插入新行,不更新)
|
||
|
||
---
|
||
|
||
### 2.6 PositionMonitor(持仓监控)
|
||
|
||
**位置**: `BottomDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 代码 | symbol | 否 | ✅ |
|
||
| 交易所 | exchange | 否 | ✅ |
|
||
| 方向 | direction | 否 | ✅ |
|
||
| 数量 | volume | **是** | ✅ |
|
||
| 昨仓 | yd_volume | **是** | ✅ |
|
||
| 冻结 | frozen | **是** | ✅ |
|
||
| 均价 | price | **是** | ✅ |
|
||
| 盈亏 | pnl | **是** | ✅ |
|
||
| 接口 | gateway_name | 否 | ✅ |
|
||
|
||
**数据键**: `vt_positionid`
|
||
|
||
**交互**: 双击单元格更新交易组件
|
||
|
||
---
|
||
|
||
### 2.7 AccountMonitor(资金监控)
|
||
|
||
**位置**: `BottomDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 账号 | accountid | 否 | ✅ |
|
||
| 余额 | balance | **是** | ✅ |
|
||
| 冻结 | frozen | **是** | ✅ |
|
||
| 可用 | available | **是** | ✅ |
|
||
| 接口 | gateway_name | 否 | ✅ |
|
||
|
||
**数据键**: `vt_accountid`
|
||
|
||
---
|
||
|
||
### 2.8 LogMonitor(日志监控)
|
||
|
||
**位置**: `BottomDockWidgetArea`
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 | 更新 | 排序 |
|
||
|------|------|------|------|
|
||
| 时间 | time | 否 | ❌ |
|
||
| 信息 | msg | 否 | ❌ |
|
||
| 接口 | gateway_name | 否 | ❌ |
|
||
|
||
**数据键**: 空(只插入新行)
|
||
|
||
**时间格式**: `HH:MM:SS.mmm`(毫秒)
|
||
|
||
---
|
||
|
||
## 三、菜单系统
|
||
|
||
### 3.1 系统菜单
|
||
|
||
**动态生成网关连接选项**:
|
||
```
|
||
系统
|
||
├── 连接{Gateway1}
|
||
├── 连接{Gateway2}
|
||
├── ...
|
||
├── ────────
|
||
└── 退出
|
||
```
|
||
|
||
**退出确认**: 显示确认对话框
|
||
|
||
---
|
||
|
||
### 3.2 功能菜单
|
||
|
||
**动态生成 App 选项**(基于已加载的 Apps):
|
||
```
|
||
功能
|
||
├── {App1显示名}
|
||
├── {App2显示名}
|
||
├── ...
|
||
```
|
||
|
||
---
|
||
|
||
### 3.3 菜单栏操作
|
||
|
||
| 菜单项 | 功能 |
|
||
|--------|------|
|
||
| 配置 | 打开全局配置对话框 |
|
||
| 微信 | 打开微信通知对话框 |
|
||
|
||
---
|
||
|
||
### 3.4 帮助菜单
|
||
|
||
```
|
||
帮助
|
||
├── 查询合约
|
||
├── 还原窗口
|
||
├── 测试邮件
|
||
├── 社区论坛
|
||
└── 关于
|
||
```
|
||
|
||
---
|
||
|
||
## 四、对话框组件
|
||
|
||
### 4.1 ConnectDialog(网关连接对话框)
|
||
|
||
**标题**: `连接{GatewayName}`
|
||
|
||
**功能**:
|
||
- 动态生成表单字段(基于 Gateway 的 default_setting)
|
||
- 字段类型支持:
|
||
- `str` - LineEdit
|
||
- `int` - LineEdit(数字验证)
|
||
- `bool` - LineEdit
|
||
- `list` - ComboBox(下拉选择)
|
||
- 密码字段自动隐藏显示
|
||
- 加载上次保存的设置
|
||
- 保存本次设置
|
||
- 连接网关
|
||
|
||
**表单格式**:
|
||
```
|
||
{字段名} <{类型}>: [输入控件]
|
||
```
|
||
|
||
---
|
||
|
||
### 4.2 ContractManager(合约管理器)
|
||
|
||
**标题**: `合约查询`
|
||
|
||
**尺寸**: 1000x600
|
||
|
||
**功能**:
|
||
- 过滤输入(支持代码或交易所筛选)
|
||
- 查询按钮
|
||
- 合约表格(12列)
|
||
|
||
**表格列**:
|
||
| 列名 | 字段 |
|
||
|------|------|
|
||
| 本地代码 | vt_symbol |
|
||
| 代码 | symbol |
|
||
| 交易所 | exchange |
|
||
| 名称 | name |
|
||
| 合约分类 | product |
|
||
| 合约乘数 | size |
|
||
| 价格跳动 | pricetick |
|
||
| 最小委托量 | min_volume |
|
||
| 期权产品 | option_portfolio |
|
||
| 期权到期日 | option_expiry |
|
||
| 期权行权价 | option_strike |
|
||
| 期权类型 | option_type |
|
||
| 交易接口 | gateway_name |
|
||
|
||
---
|
||
|
||
### 4.3 GlobalDialog(全局配置)
|
||
|
||
**标题**: `全局配置`
|
||
|
||
**最小宽度**: 800
|
||
|
||
**功能**:
|
||
- 显示所有全局配置字段
|
||
- 字段名和类型显示
|
||
- 修改后保存
|
||
- 提示: "全局配置的修改需要重启后才会生效!"
|
||
|
||
**表单格式**:
|
||
```
|
||
{字段名} <{类型}>: [当前值]
|
||
```
|
||
|
||
---
|
||
|
||
### 4.4 WechatDialog(微信通知)
|
||
|
||
**标题**: `微信通知`
|
||
|
||
**最小宽度**: 380
|
||
|
||
**页面结构**(StackedWidget):
|
||
1. **状态页** - 显示绑定状态和信息
|
||
2. **加载页** - 加载中
|
||
3. **二维码页** - 显示登录二维码
|
||
4. **等待页** - 等待用户发送消息
|
||
5. **结果页** - 绑定结果
|
||
|
||
**状态页内容**:
|
||
- Bot ID
|
||
- 用户 ID
|
||
- 网关
|
||
- 推送间隔设置(SpinBox,1-8640秒)
|
||
- 开始绑定按钮
|
||
- 测试消息按钮
|
||
- 解除绑定按钮
|
||
|
||
**推送间隔说明**:
|
||
> 控制两次微信推送之间的间隔时间。间隔内的新消息会暂存,并在下次推送时合并发送。用户每发送 1 条消息,机器人可在 24 小时内推送 10 条;超限后需用户再次发送消息才能恢复。
|
||
|
||
---
|
||
|
||
### 4.5 AboutDialog(关于对话框)
|
||
|
||
显示软件版本和相关信息的对话框。
|
||
|
||
---
|
||
|
||
## 五、工具栏
|
||
|
||
**位置**: `LeftToolBarArea`
|
||
|
||
**特性**:
|
||
- 固定图标大小: 40x40
|
||
- 按钮间距: 10
|
||
- 不可浮动
|
||
- 不可移动
|
||
|
||
---
|
||
|
||
## 六、右键菜单(通用)
|
||
|
||
所有表格组件(BaseMonitor)都有统一右键菜单:
|
||
|
||
| 菜单项 | 功能 |
|
||
|--------|------|
|
||
| 调整列宽 | 根据内容自动调整所有列宽 |
|
||
| 保存数据 | 导出表格为 CSV 文件 |
|
||
|
||
---
|
||
|
||
## 七、单元格类型
|
||
|
||
### 7.1 BaseCell
|
||
基础单元格,文本居中对齐
|
||
|
||
### 7.2 EnumCell
|
||
枚举单元格,显示 `enum.value`
|
||
|
||
### 7.3 DirectionCell
|
||
方向单元格,根据方向设置颜色:
|
||
- SHORT: 绿色
|
||
- LONG: 红色
|
||
|
||
### 7.4 BidCell
|
||
买盘单元格,粉红色
|
||
|
||
### 7.5 AskCell
|
||
卖盘单元格,浅绿色
|
||
|
||
### 7.6 PnlCell
|
||
盈亏单元格,根据盈亏设置颜色:
|
||
- 正: 红
|
||
- 负: 绿
|
||
- 零: 黑
|
||
|
||
### 7.7 TimeCell
|
||
时间单元格,格式: `HH:MM:SS.mmm`
|
||
|
||
### 7.8 DateCell
|
||
日期单元格,格式: `YYYY-MM-DD`
|
||
|
||
### 7.9 MsgCell
|
||
消息单元格,左对齐
|
||
|
||
---
|
||
|
||
## 八、事件系统
|
||
|
||
### 8.1 事件类型
|
||
|
||
| 事件类型 | 说明 | 监听组件 |
|
||
|----------|------|----------|
|
||
| EVENT_TICK | 行情数据 | TickMonitor, TradingWidget |
|
||
| EVENT_TRADE | 成交数据 | TradeMonitor |
|
||
| EVENT_ORDER | 委托数据 | OrderMonitor, ActiveOrderMonitor |
|
||
| EVENT_POSITION | 持仓数据 | PositionMonitor |
|
||
| EVENT_ACCOUNT | 资金数据 | AccountMonitor |
|
||
| EVENT_LOG | 日志数据 | LogMonitor |
|
||
| EVENT_QUOTE | 报价数据 | QuoteMonitor |
|
||
|
||
### 8.2 数据更新逻辑
|
||
|
||
**有数据键**(如 vt_symbol):
|
||
- 如果键已存在 → 更新现有行
|
||
- 如果键不存在 → 插入新行
|
||
|
||
**无数据键**:
|
||
- 总是插入新行
|
||
|
||
---
|
||
|
||
## 九、窗口状态管理
|
||
|
||
### 9.1 保存
|
||
保存内容:
|
||
- 窗口几何信息(geometry)
|
||
- Dock 状态(state)
|
||
|
||
### 9.2 加载
|
||
支持两种布局:
|
||
- `default` - 默认布局
|
||
- `custom` - 自定义布局
|
||
|
||
---
|
||
|
||
## 十、交互特性总结
|
||
|
||
### 10.1 表格功能
|
||
- 排序: 大部分表格支持排序
|
||
- 列宽调整: 右键菜单
|
||
- CSV 导出: 右键菜单
|
||
- 列状态保存/恢复: 自动保存列宽和排序状态
|
||
|
||
### 10.2 双击交互
|
||
| 组件 | 双击行为 |
|
||
|------|----------|
|
||
| TickMonitor | 更新交易组件 |
|
||
| OrderMonitor | 撤单 |
|
||
| PositionMonitor | 更新交易组件(反向) |
|
||
| QuoteMonitor | 撤销报价 |
|
||
|
||
### 10.3 数据更新模式
|
||
| 组件 | 更新字段 |
|
||
|------|----------|
|
||
| TickMonitor | name, last_price, volume, OHLC, bid/ask, datetime |
|
||
| OrderMonitor | volume, traded, status, datetime |
|
||
| PositionMonitor | volume, yd_volume, frozen, price, pnl |
|
||
| AccountMonitor | balance, frozen, available |
|
||
|
||
---
|
||
|
||
## 十一、颜色方案
|
||
|
||
| 用途 | 颜色 |
|
||
|------|------|
|
||
| 多头(LONG) | 红色 |
|
||
| 空头(SHORT) | 绿色 |
|
||
| 买盘(Bid) | `rgb(255, 174, 201)` |
|
||
| 卖盘(Ask) | `rgb(160, 255, 160)` |
|
||
| 盈利 | 红色 |
|
||
| 亏损 | 绿色 |
|
||
| 零盈亏 | 黑色 |
|
||
|
||
---
|
||
|
||
## 十二、与当前 Web 前端对比
|
||
|
||
### 12.1 已实现功能
|
||
|
||
| 功能 | VeighNa Qt | Web 前端 | 对等程度 |
|
||
|------|------------|----------|----------|
|
||
| 登录认证 | ✅ | ✅ | ✅ 完全对等 |
|
||
| 总览 Dashboard | ✅ | ✅ | ⚠️ 部分对等 |
|
||
| 行情监控 | ✅ | ✅ | ⚠️ 缺少多档盘口 |
|
||
| 交易下单 | ✅ | ✅ | ❌ 缺少深度盘口 |
|
||
| 委托监控 | ✅ | ✅ | ⚠️ 缺少双击撤单 |
|
||
| 持仓监控 | ✅ | ✅ | ⚠️ 缺少双击交互 |
|
||
| 日志监控 | ✅ | ✅ | ✅ 完全对等 |
|
||
| 策略管理 | ✅ | ✅ | ✅ 完全对等 |
|
||
|
||
### 12.2 缺失功能
|
||
|
||
| 功能 | VeighNa Qt | Web 前端 | 优先级 |
|
||
|------|------------|----------|--------|
|
||
| **成交监控** | ✅ | ❌ | 🔴 高 |
|
||
| **资金监控** | ✅ | ❌ | 🔴 高 |
|
||
| **活动委托视图** | ✅ | ❌ | 🟡 中 |
|
||
| **网关连接管理** | ✅ | ❌ | 🔴 高 |
|
||
| **合约管理** | ✅ | ❌ | 🟡 中 |
|
||
| **全局配置编辑器** | ✅ | ❌ | 🟢 低 |
|
||
| **市场深度盘口** | ✅ | ❌ | 🟡 中 |
|
||
| **窗口布局保存** | ✅ | ❌ | 🟢 低 |
|
||
| **表格排序** | ✅ | ❌ | 🟡 中 |
|
||
| **CSV 导出** | ✅ | ❌ | 🟢 低 |
|
||
| **微信通知** | ✅ | ❌ | 🟢 低 |
|
||
| **右键菜单** | ✅ | ❌ | 🟢 低 |
|
||
|
||
---
|
||
|
||
## 十三、实现优先级建议
|
||
|
||
### Phase 1: 核心缺失功能(必须实现)
|
||
|
||
1. **成交监控页面**
|
||
- 表格显示所有成交记录
|
||
- 支持排序
|
||
- WebSocket 接收 EVENT_TRADE
|
||
|
||
2. **资金监控页面**
|
||
- 表格显示所有账户资金
|
||
- 支持排序
|
||
- WebSocket 接收 EVENT_ACCOUNT
|
||
|
||
3. **网关连接管理**
|
||
- 网关列表显示
|
||
- 连接对话框(动态表单)
|
||
- 连接/断开操作
|
||
|
||
### Phase 2: 体验增强功能
|
||
|
||
4. **活动委托视图**
|
||
- 只显示活动订单的委托列表
|
||
- 过滤已完成/已撤销订单
|
||
|
||
5. **市场深度盘口**
|
||
- TradingWidget 中添加五档盘口
|
||
- 颜色区分买/卖盘
|
||
|
||
6. **合约管理**
|
||
- 合约查询页面
|
||
- 搜索过滤
|
||
|
||
### Phase 3: 完善功能
|
||
|
||
7. **表格排序**
|
||
8. **CSV 导出**
|
||
9. **全局配置编辑器**
|
||
10. **双击交互**(撤单、更新交易表单)
|
||
|
||
---
|
||
|
||
## 十四、技术实现要点
|
||
|
||
### 14.1 后端 API 需求
|
||
|
||
| API | 方法 | 说明 |
|
||
|-----|------|------|
|
||
| /api/trades | GET | 获取所有成交记录 |
|
||
| /api/accounts | GET | 获取所有账户资金 |
|
||
| /api/gateways | GET | 获取所有可用网关 |
|
||
| /api/gateways/{name}/connect | POST | 连接网关 |
|
||
| /api/gateways/{name}/disconnect | POST | 断开网关 |
|
||
| /api/gateways/{name}/setting | GET | 获取网关连接配置模板 |
|
||
| /api/contracts | GET | 获取所有合约 |
|
||
|
||
### 14.2 WebSocket 事件
|
||
|
||
需要监听的事件:
|
||
- `EVENT_TRADE` - 成交数据
|
||
- `EVENT_ACCOUNT` - 账户数据
|
||
- `EVENT_GATEWAY` - 网关状态变化
|
||
|
||
### 14.3 前端组件
|
||
|
||
新增页面:
|
||
- `TradesPage` - 成交监控
|
||
- `AccountPage` - 资金监控
|
||
- `GatewayPage` - 网关管理
|
||
- `ContractPage` - 合约管理
|
||
- `ActiveOrdersPage` - 活动委托
|
||
|
||
---
|
||
|
||
*分析日期: 2026-07-02*
|
||
*VeighNa 版本: 4.4.0*
|