# vn.py Web Trader 实现方式调研报告

## 调研结论摘要

根据官方设计，vn.py（VeighNa）的Web Trader采用**标准的双进程B-S架构**：
- **策略交易进程**：运行完整的VeighNa Trader核心（MainEngine、EventEngine、Gateways、Strategies），同时启动RPC服务端
- **Web服务进程**：运行web_trader模块，基于FastAPI提供REST接口+WebSocket推送，通过RPC客户端与交易进程通信

这是官方推荐的正确架构，之前如果走了"单进程整合"或"前后端不分离"的弯路，需要纠正为这种双进程架构。

---

## 1. 官方Web Trader定位与架构

### 1.1 模块定位

WebTrader是VeighNa框架针对**B-S（Browser-Server）架构需求**设计的Web服务模块，允许用户通过浏览器（而非PyQt桌面端）来运行管理VeighNa量化策略交易。

核心特点：
- 提供主动函数调用（REST API）
- 支持被动数据推送（WebSocket）
- 基于官方RPC模块实现跨进程通信

### 1.2 官方架构图

根据官方文档描述，整体架构如下：

```
┌─────────────────────────────────────────────────────────────┐
│                   Browser / Web前端                          │
│         (Vue/React/Angular 或 纯HTML前端)                   │
└─────────────┬───────────────────────────────────────────────┘
              │ HTTP / WebSocket
              ↓
┌─────────────────────────────────────────────────────────────┐
│  Web服务进程 (web_trader模块)                                │
│  - FastAPI Web服务器                                         │
│  - REST API 处理请求                                        │
│  - WebSocket 推送推送数据                                    │
│  - RPC 客户端  ←───────────┐                                │
└─────────────┬───────────────┘                            │
              │ RPC                                         │
              │ TCP                                         │
┌─────────────↓─────────────────┐                          │
│  策略交易进程 (VeighNa Trader)  │                          │
│  - MainEngine                   │                          │
│  - EventEngine                  │                          │
│  - All Gateways                 │                          │
│  - All Strategies               │                          │
│  - RPC 服务端  ←────────────────┘                          │
└─────────────────────────────────────────────────────────────┘
```

### 1.3 核心技术栈

| 层级 | 技术组件 | 作用 |
|------|---------|------|
| Web后端 | **FastAPI** | 提供RESTful API接口 |
| 实时通信 | **WebSocket** | 主动推送行情、成交、状态更新到前端 |
| 跨进程通信 | **vnpy.rpc** | Web进程 ↔ 交易进程之间的RPC通信 |
| 身份认证 | **OAuth2 JWT** | Token认证机制 |
| 前端 | 可选 | 用户可自行选用Vue/React等框架 |

---

## 2. 常见弯路分析

根据调研，常见的错误实现方式：

### ❌ 弯路1：单进程一体化架构

**错误做法**：
```
把FastAPI和MainEngine放在同一个进程中启动，依赖asyncio协程调度
```

**问题**：
- VeighNa核心是基于多线程事件驱动，与FastAPI的asyncio协程模型冲突
- 容易出现线程安全问题，事件引擎阻塞Web服务响应
- 不好做独立扩展，Web进程和交易进程难以分开部署
- 重启Web服务会中断交易策略

### ❌ 弯路2：过度拆分微服务

**错误做法**：
```
把Gateway、Strategy、Data、Web都拆分成独立服务，引入太多复杂度
```

**问题**：
- 增加不必要的分布式复杂度（一致性、网络延迟、运维负担）
- 违背vn.py原生设计理念，难以跟进官方更新
- 对于中小规模量化团队过度设计

### ❌ 弯路3：前端绑定后端耦合

**错误做法**：
```
用Django/Tornado模板引擎渲染页面，前后端强耦合
```

**问题**：
- 前端难以独立迭代开发
- 不支持移动端、APP端复用后端API
- 不符合现代Web开发最佳实践

---

## 3. 纠正方案：官方标准双进程架构

### 3.1 推荐架构

按照官方设计，采用：

```
[进程1] 交易核心进程
  - VeighNa Trader (MainEngine + EventEngine)
  - 所有交易Gateway (CTP/IB等)
  - 所有策略模块
  - RPC Service 服务端

[进程2] Web服务进程
  - vnpy_webtrader (FastAPI)
  - REST API 接口
  - WebSocket 推送
  - RPC Client 连接交易进程
  - CORS 支持跨域访问

[前端] 独立部署
  - 基于现代前端框架开发
  - 完全独立，通过API调用
  - 可单独部署到CDN
```

### 3.2 启动流程

1. **第一步：启动交易核心进程**
   ```python
   from vnpy.trader.main_engine import MainEngine
   from vnpy.trader.event_engine import EventEngine
   from vnpy.rpc import RpcServer
   
   event_engine = EventEngine()
   main_engine = MainEngine(event_engine)
   
   # 添加gateway、策略...
   
   # 启动RPC服务端
   rpc_server = RpcServer(main_engine, ("127.0.0.1", 2018))
   rpc_server.start()
   ```

2. **第二步：启动Web服务进程**
   ```python
   from vnpy_webtrader import run_web_trader
   
   # RPC连接配置
   rpc_request_address = "tcp://127.0.0.1:2018"
   rpc_subscribe_address = "tcp://127.0.0.1:4102"
   
   # 启动Web Trader
   run_web_trader(
       rpc_request_address,
       rpc_subscribe_address,
       host="0.0.0.0",
       port=8000
   )
   ```

3. **第三步：启动前端**
   - 打包前端静态文件
   - 独立部署到Nginx或CDN
   - 通过反向代理代理API请求到8000端口

### 3.3 技术优势

| 优势 | 说明 |
|------|------|
| **解耦** | Web服务和交易核心分离，互不影响 |
| **稳定** | Web服务重启不影响交易进程 |
| **安全** | 交易进程可不暴露公网，只允许Web进程连接 |
| **可扩展** | 支持一个交易进程配多个Web节点，支持多用户并发 |
| **符合官方设计** | 易于跟进社区版本更新 |

---

## 4. 具体实施步骤

### 步骤1：环境准备

```bash
# 安装依赖
pip install vnpy_webtrader
# 或
pip install fastapi uvicorn python-jose[cryptography] passlib[bcrypt]
```

### 步骤2：启动交易核心RPC服务

创建`start_trading_server.py`:

```python
from vnpy.trader.event_engine import EventEngine
from vnpy.trader.main_engine import MainEngine
from vnpy.rpc import RpcServer
from vnpy_ctp import CtpGateway
# 其他gateway...

def main():
    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)
    
    # 添加gateway
    main_engine.add_gateway(CtpGateway)
    # 添加其他gateway...
    
    # 添加应用模块
    # main_engine.add_app(CtaStrategy)
    # main_engine.add_app(PortfolioStrategy)
    
    # 启动RPC服务
    # 请求端口: 2018，订阅端口: 4102
    rpc_server = RpcServer(
        main_engine,
        ("0.0.0.0", 2018),
        ("0.0.0.0", 4102)
    )
    rpc_server.start()
    
    print(f"RPC服务已启动")
    print(f"- 请求地址: tcp://0.0.0.0:2018")
    print(f"- 订阅地址: tcp://0.0.0.0:4102")
    
    # 保持进程运行
    input()

if __name__ == "__main__":
    main()
```

### 步骤3：启动Web Trader服务

创建`start_web_trader.py`:

```python
from vnpy_webtrader import run_web_trader

def main():
    # RPC地址配置
    rpc_request_address = "tcp://127.0.0.1:2018"
    rpc_subscribe_address = "tcp://127.0.0.1:4102"
    
    # 启动Web服务
    run_web_trader(
        rpc_request_address,
        rpc_subscribe_address,
        host="0.0.0.0",
        port=8000,
        cors_allow_all=True  # 开发环境开启CORS
    )

if __name__ == "__main__":
    main()
```

### 步骤4：Nginx配置参考（生产环境）

```nginx
server {
    listen 80;
    server_name your-domain.com;

    # 前端静态文件
    location / {
        root /path/to/your/frontend/dist;
        try_files $uri $uri/ /index.html;
    }

    # API反向代理
    location /api {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # WebSocket反向代理
    location /ws {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}
```

---

## 5. 已提供API接口概览

vnpy_webtrader官方已提供：

### REST API
- `POST /token` - 获取认证token
- `GET /api/accounts` - 查询账户信息
- `GET /api/positions` - 查询持仓
- `GET /api/orders` - 查询订单
- `POST /api/orders` - 下单
- `DELETE /api/orders/{orderid}` - 撤单
- 以及更多...

### WebSocket
- 实时推送成交推送
- 实时推送订单更新
- 实时推送账户更新
- 实时推送持仓更新

---

## 6. 部署架构建议

### 开发环境
```
同一台机器：
- 交易进程 RPC: 127.0.0.1:2018/4102
- Web进程: 0.0.0.0:8000
- 前端开发服务器: 端口5173/3000，通过代理访问API
```

### 生产环境
```
- 交易进程：仅对内网开放RPC端口
- Web进程：和交易进程同机或不同机，监听内网8000
- Nginx：反向代理，暴露HTTPS 443端口
- 前端：打包后由Nginx直接提供静态文件
```

### 安全建议
1. **不要直接暴露交易RPC端口到公网**
2. **只允许Web进程连接交易RPC端口**
3. **Web服务启用HTTPS**
4. **强密码存储，使用JWT过期机制**

---

## 7. 总结纠正方案

| 项目 | 纠正前（弯路） | 纠正后（正确） |
|------|---------------|---------------|
| 进程模型 | 单进程一体化 | 双进程分离架构 |
| 通信方式 | 直接函数调用/协程调度 | RPC跨进程通信 |
| 前后端 | 耦合在一起 | 完全分离独立部署 |
| 架构复杂度 | 要么太简单，要么过度拆分 | 恰到好处的双进程 |
| 稳定性 | Web重启影响交易 | Web重启不影响交易 |
| 安全性 | 交易核心直接暴露 | 分层防护更安全 |

---

## 下一步行动建议

1. 按照双进程架构重构当前Web Trader实现
2. 基于官方vnpy_webtrader模块进行扩展，不重复造轮子
3. 前端独立开发，通过REST+WebSocket与后端交互
4. 先实现基础功能（登录、账户查询、持仓查询、下单撤单）
5. 逐步扩展支持更多策略模块

---

*调研完成时间：2026-03-31*
*调研人：姜维 伯约*
