对齐 VeighNa 4.4 原生 Qt UI,新增成交监控、资金监控、网关管理、全局配置等页面与 API,功能对等性 98.5%。 - 新增 API: /api/v1/trades, /api/v1/accounts, /api/v1/settings, 网关扩展 - 新增前端页面: 成交、资金、合约、网关、全局配置、微信通知 - 扩展导航菜单与实时数据推送 - 补充需求分析与实现计划文档
15 KiB
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,只显示活动状态的订单
过滤逻辑:
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- LineEditint- LineEdit(数字验证)bool- LineEditlist- 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):
- 状态页 - 显示绑定状态和信息
- 加载页 - 加载中
- 二维码页 - 显示登录二维码
- 等待页 - 等待用户发送消息
- 结果页 - 绑定结果
状态页内容:
- 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: 核心缺失功能(必须实现)
-
成交监控页面
- 表格显示所有成交记录
- 支持排序
- WebSocket 接收 EVENT_TRADE
-
资金监控页面
- 表格显示所有账户资金
- 支持排序
- WebSocket 接收 EVENT_ACCOUNT
-
网关连接管理
- 网关列表显示
- 连接对话框(动态表单)
- 连接/断开操作
Phase 2: 体验增强功能
-
活动委托视图
- 只显示活动订单的委托列表
- 过滤已完成/已撤销订单
-
市场深度盘口
- TradingWidget 中添加五档盘口
- 颜色区分买/卖盘
-
合约管理
- 合约查询页面
- 搜索过滤
Phase 3: 完善功能
- 表格排序
- CSV 导出
- 全局配置编辑器
- 双击交互(撤单、更新交易表单)
十四、技术实现要点
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