mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2025-12-06 13:54:41 +08:00
575 lines
16 KiB
Markdown
575 lines
16 KiB
Markdown
# 🏗️ NOFX 架构文档
|
||
|
||
**语言:** [English](README.md) | [中文](README.zh-CN.md)
|
||
|
||
为希望了解 NOFX 内部实现的开发者提供的技术文档。
|
||
|
||
---
|
||
|
||
## 📋 概述
|
||
|
||
NOFX 是一个全栈 AI 交易平台:
|
||
- **后端:** Go (Gin 框架, SQLite)
|
||
- **前端:** React/TypeScript (Vite, TailwindCSS)
|
||
- **架构:** 微服务启发的模块化设计
|
||
|
||
---
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
nofx/
|
||
├── main.go # 程序入口(多交易员管理器)
|
||
├── config.json # ~~多交易员配置~~ (现通过Web界面)
|
||
├── trading.db # SQLite 数据库(交易员、模型、交易所)
|
||
│
|
||
├── api/ # HTTP API 服务
|
||
│ └── server.go # Gin 框架,RESTful API
|
||
│
|
||
├── trader/ # 交易核心
|
||
│ ├── auto_trader.go # 自动交易主控制器
|
||
│ ├── interface.go # 统一交易员接口
|
||
│ ├── binance_futures.go # Binance API 包装器
|
||
│ ├── hyperliquid_trader.go # Hyperliquid DEX 包装器
|
||
│ └── aster_trader.go # Aster DEX 包装器
|
||
│
|
||
├── manager/ # 多交易员管理
|
||
│ └── trader_manager.go # 管理多个交易员实例
|
||
│
|
||
├── config/ # 配置与数据库
|
||
│ └── database.go # SQLite 操作和模式
|
||
│
|
||
├── auth/ # 认证
|
||
│ └── jwt.go # JWT token 管理 & 2FA
|
||
│
|
||
├── mcp/ # Model Context Protocol - AI 通信
|
||
│ └── client.go # AI API 客户端(DeepSeek/Qwen/自定义)
|
||
│
|
||
├── decision/ # AI 决策引擎
|
||
│ ├── engine.go # 带历史反馈的决策逻辑
|
||
│ └── prompt_manager.go # 提示词模板系统
|
||
│
|
||
├── market/ # 市场数据获取
|
||
│ └── data.go # 市场数据与技术指标(TA-Lib)
|
||
│ └── api_client.go # 行情获取 Api接口
|
||
│ └── websocket_client.go # 行情获取 Websocket接口
|
||
│ └── combined_streams.go # 行情获取 组合流式(单链接订阅多个币种)
|
||
│ └── monitor.go # 行情数据缓存
|
||
│ └── types.go # market结构体
|
||
│
|
||
├── pool/ # 币种池管理
|
||
│ └── coin_pool.go # AI500 + OI Top 合并池
|
||
│
|
||
├── logger/ # 日志系统
|
||
│ └── decision_logger.go # 决策记录 + 性能分析
|
||
│
|
||
├── decision_logs/ # 决策日志存储(JSON 文件)
|
||
│ ├── {trader_id}/ # 每个交易员的日志
|
||
│ └── {timestamp}.json # 单个决策
|
||
│
|
||
└── web/ # React 前端
|
||
├── src/
|
||
│ ├── components/ # React 组件
|
||
│ │ ├── EquityChart.tsx # 权益曲线图表
|
||
│ │ ├── ComparisonChart.tsx # 多 AI 对比图表
|
||
│ │ └── CompetitionPage.tsx # 竞赛排行榜
|
||
│ ├── lib/api.ts # API 调用包装器
|
||
│ ├── types/index.ts # TypeScript 类型
|
||
│ ├── stores/ # Zustand 状态管理
|
||
│ ├── index.css # Binance 风格样式
|
||
│ └── App.tsx # 主应用
|
||
├── package.json # 前端依赖
|
||
└── vite.config.ts # Vite 配置
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 核心依赖
|
||
|
||
### 后端 (Go)
|
||
|
||
| 包 | 用途 | 版本 |
|
||
|---------|---------|---------|
|
||
| `github.com/gin-gonic/gin` | HTTP API 框架 | v1.9+ |
|
||
| `github.com/adshao/go-binance/v2` | Binance API 客户端 | v2.4+ |
|
||
| `github.com/markcheno/go-talib` | 技术指标(TA-Lib) | 最新 |
|
||
| `github.com/lib/pq` | PostgreSQL 数据库驱动 | v1.10+ |
|
||
| `github.com/golang-jwt/jwt/v5` | JWT 认证 | v5.0+ |
|
||
| `github.com/pquerna/otp` | 2FA/TOTP 支持 | v1.4+ |
|
||
| `golang.org/x/crypto` | 密码哈希(bcrypt) | 最新 |
|
||
|
||
### 前端 (React + TypeScript)
|
||
|
||
| 包 | 用途 | 版本 |
|
||
|---------|---------|---------|
|
||
| `react` + `react-dom` | UI 框架 | 18.3+ |
|
||
| `typescript` | 类型安全 | 5.8+ |
|
||
| `vite` | 构建工具 | 6.0+ |
|
||
| `recharts` | 图表(权益、对比) | 2.15+ |
|
||
| `swr` | 数据获取与缓存 | 2.2+ |
|
||
| `zustand` | 状态管理 | 5.0+ |
|
||
| `tailwindcss` | CSS 框架 | 3.4+ |
|
||
| `lucide-react` | 图标库 | 最新 |
|
||
|
||
---
|
||
|
||
## 🗂️ 系统架构
|
||
|
||
### 高层架构概览
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ 表现层 │
|
||
│ React SPA (Vite + TypeScript + TailwindCSS) │
|
||
│ - 竞赛仪表板、交易员管理 UI │
|
||
│ - 实时图表 (Recharts)、认证页面 │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
↓ HTTP/JSON API
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ API 层 (Gin Router) │
|
||
│ /api/traders, /api/status, /api/positions, /api/decisions │
|
||
│ 认证中间件 (JWT)、CORS 处理 │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ 业务逻辑层 │
|
||
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
|
||
│ │ TraderManager │ │ DecisionEngine │ │ MarketData │ │
|
||
│ │ - 多交易员 │ │ - AI 推理 │ │ - K线数据 │ │
|
||
│ │ 编排 │ │ - 风险控制 │ │ - 技术指标 │ │
|
||
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ 数据访问层 │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌────────────────────┐ │
|
||
│ │ SQLite DB │ │ 文件日志 │ │ 外部 APIs │ │
|
||
│ │ - Traders │ │ - Decisions │ │ - Binance │ │
|
||
│ │ - Models │ │ - Performance│ │ - Hyperliquid │ │
|
||
│ │ - Exchanges │ │ analysis │ │ - Aster │ │
|
||
│ └──────────────┘ └──────────────┘ └────────────────────┘ │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 组件图
|
||
|
||
*(即将推出:详细的组件交互图)*
|
||
|
||
---
|
||
|
||
## 📚 核心模块
|
||
|
||
### 1. 交易系统 (`trader/`)
|
||
|
||
**用途:** 支持多交易所的交易执行层
|
||
|
||
**关键文件:**
|
||
- `auto_trader.go` - 主交易编排器(100+ 行)
|
||
- `interface.go` - 统一的交易员接口
|
||
- `binance_futures.go` - Binance API 包装器
|
||
- `hyperliquid_trader.go` - Hyperliquid DEX 包装器
|
||
- `aster_trader.go` - Aster DEX 包装器
|
||
|
||
**设计模式:** 基于接口抽象的策略模式
|
||
|
||
**示例:**
|
||
```go
|
||
type ExchangeClient interface {
|
||
GetAccount() (*AccountInfo, error)
|
||
GetPositions() ([]*Position, error)
|
||
CreateOrder(*OrderParams) (*Order, error)
|
||
// ... 更多方法
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 决策引擎 (`decision/`)
|
||
|
||
**用途:** AI 驱动的交易决策制定
|
||
|
||
**关键文件:**
|
||
- `engine.go` - 带历史反馈的决策逻辑
|
||
- `prompt_manager.go` - AI 提示词模板系统
|
||
|
||
**特性:**
|
||
- 思维链推理
|
||
- 历史表现分析
|
||
- 风险感知决策
|
||
- 多模型支持(DeepSeek、Qwen、自定义)
|
||
|
||
**流程:**
|
||
```
|
||
历史数据 → 提示词生成 → AI API 调用 →
|
||
决策解析 → 风险验证 → 执行
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 市场数据系统 (`market/`)
|
||
|
||
**用途:** 获取和分析市场数据
|
||
|
||
**关键文件:**
|
||
- `data.go` - 市场数据获取和技术指标
|
||
|
||
**特性:**
|
||
- 多时间周期 K线数据(3分钟、4小时)
|
||
- 通过 TA-Lib 计算技术指标:
|
||
- EMA (20, 50)
|
||
- MACD
|
||
- RSI (7, 14)
|
||
- ATR(波动率)
|
||
- 持仓量跟踪
|
||
|
||
---
|
||
|
||
### 4. 管理器 (`manager/`)
|
||
|
||
**用途:** 多交易员编排
|
||
|
||
**关键文件:**
|
||
- `trader_manager.go` - 管理多个交易员实例
|
||
|
||
**职责:**
|
||
- 交易员生命周期(启动、停止、重启)
|
||
- 资源分配
|
||
- 并发执行协调
|
||
|
||
---
|
||
|
||
### 5. API 服务器 (`api/`)
|
||
|
||
**用途:** 前端通信的 HTTP API
|
||
|
||
**关键文件:**
|
||
- `server.go` - Gin 框架 RESTful API
|
||
|
||
**端点:**
|
||
```
|
||
GET /api/traders # 列出所有交易员
|
||
POST /api/traders # 创建交易员
|
||
POST /api/traders/:id/start # 启动交易员
|
||
GET /api/status # 系统状态
|
||
GET /api/positions # 当前持仓
|
||
GET /api/decisions/latest # 最近决策
|
||
```
|
||
|
||
---
|
||
|
||
### 6. 数据库层 (`config/`)
|
||
|
||
**用途:** SQLite 数据持久化
|
||
|
||
**关键文件:**
|
||
- `database.go` - 数据库操作和模式
|
||
|
||
**表:**
|
||
- `users` - 用户账户(支持 2FA)
|
||
- `ai_models` - AI 模型配置
|
||
- `exchanges` - 交易所凭证
|
||
- `traders` - 交易员实例
|
||
- `equity_history` - 绩效跟踪
|
||
- `system_config` - 应用程序设置
|
||
|
||
---
|
||
|
||
### 7. 认证 (`auth/`)
|
||
|
||
**用途:** 用户认证和授权
|
||
|
||
**特性:**
|
||
- 基于 JWT token 的认证
|
||
- 使用 TOTP 的 2FA(Google Authenticator)
|
||
- Bcrypt 密码哈希
|
||
|
||
---
|
||
|
||
## 🔄 请求流程示例
|
||
|
||
### 示例 1:创建新交易员
|
||
|
||
```
|
||
用户操作(前端)
|
||
↓
|
||
POST /api/traders
|
||
↓
|
||
API 服务器(认证中间件)
|
||
↓
|
||
Database.CreateTrader()
|
||
↓
|
||
TraderManager.StartTrader()
|
||
↓
|
||
AutoTrader.Run() → goroutine
|
||
↓
|
||
响应: {trader_id, status}
|
||
```
|
||
|
||
### 示例 2:交易决策周期
|
||
|
||
```
|
||
AutoTrader(每 3-5 分钟)
|
||
↓
|
||
1. FetchAccountStatus()
|
||
↓
|
||
2. GetOpenPositions()
|
||
↓
|
||
3. FetchMarketData() → TA-Lib 指标
|
||
↓
|
||
4. AnalyzeHistory() → 最近 20 笔交易
|
||
↓
|
||
5. GeneratePrompt() → 完整上下文
|
||
↓
|
||
6. CallAI() → DeepSeek/Qwen
|
||
↓
|
||
7. ParseDecision() → 结构化输出
|
||
↓
|
||
8. ValidateRisk() → 仓位限制、保证金
|
||
↓
|
||
9. ExecuteOrders() → 交易所 API
|
||
↓
|
||
10. LogDecision() → JSON 文件 + 数据库
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 数据流
|
||
|
||
### 市场数据流
|
||
|
||
```
|
||
交易所 API
|
||
↓
|
||
market.FetchKlines()
|
||
↓
|
||
TA-Lib.Calculate(EMA, MACD, RSI)
|
||
↓
|
||
DecisionEngine(作为上下文)
|
||
↓
|
||
AI 模型(推理)
|
||
```
|
||
|
||
### 决策日志流
|
||
|
||
```
|
||
AI 响应
|
||
↓
|
||
decision_logger.go
|
||
↓
|
||
JSON 文件: decision_logs/{trader_id}/{timestamp}.json
|
||
↓
|
||
数据库: 绩效跟踪
|
||
↓
|
||
前端: /api/decisions/latest
|
||
```
|
||
|
||
---
|
||
|
||
## 🗄️ 数据库架构
|
||
|
||
### 核心表
|
||
|
||
**users**
|
||
```sql
|
||
- id (INTEGER PRIMARY KEY)
|
||
- username (TEXT UNIQUE)
|
||
- password_hash (TEXT)
|
||
- totp_secret (TEXT)
|
||
- is_admin (BOOLEAN)
|
||
- created_at (DATETIME)
|
||
```
|
||
|
||
**ai_models**
|
||
```sql
|
||
- id (INTEGER PRIMARY KEY)
|
||
- name (TEXT)
|
||
- model_type (TEXT) -- deepseek, qwen, custom
|
||
- api_key (TEXT)
|
||
- api_url (TEXT)
|
||
- enabled (BOOLEAN)
|
||
```
|
||
|
||
**traders**
|
||
```sql
|
||
- id (TEXT PRIMARY KEY)
|
||
- name (TEXT)
|
||
- ai_model_id (INTEGER FK)
|
||
- exchange_id (INTEGER FK)
|
||
- initial_balance (REAL)
|
||
- current_equity (REAL)
|
||
- status (TEXT) -- running, stopped
|
||
- created_at (DATETIME)
|
||
```
|
||
|
||
*(更多详情:database-schema.md - 即将推出)*
|
||
|
||
---
|
||
|
||
## 🔌 API 参考
|
||
|
||
### 认证
|
||
|
||
**POST /api/auth/login**
|
||
```json
|
||
请求: {
|
||
"username": "string",
|
||
"password": "string",
|
||
"totp_code": "string" // 可选
|
||
}
|
||
|
||
响应: {
|
||
"token": "jwt_token",
|
||
"user": {...}
|
||
}
|
||
```
|
||
|
||
### 交易员管理
|
||
|
||
**GET /api/traders**
|
||
```json
|
||
响应: {
|
||
"traders": [
|
||
{
|
||
"id": "string",
|
||
"name": "string",
|
||
"status": "running|stopped",
|
||
"balance": 1000.0,
|
||
"roi": 5.2
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
*(完整 API 参考:api-reference.md - 即将推出)*
|
||
|
||
---
|
||
|
||
## 🧪 测试架构
|
||
|
||
### 当前状态
|
||
- ⚠️ 尚无单元测试
|
||
- ⚠️ 仅手动测试
|
||
- ⚠️ 测试网验证
|
||
|
||
### 计划的测试策略
|
||
|
||
**单元测试(优先级 1)**
|
||
```
|
||
trader/binance_futures_test.go
|
||
- 模拟 API 响应
|
||
- 测试精度处理
|
||
- 验证订单构造
|
||
```
|
||
|
||
**集成测试(优先级 2)**
|
||
```
|
||
- 端到端交易流程(测试网)
|
||
- 多交易员场景
|
||
- 数据库操作
|
||
```
|
||
|
||
**前端测试(优先级 3)**
|
||
```
|
||
- 组件测试(Vitest + React Testing Library)
|
||
- API 集成测试
|
||
- E2E 测试(Playwright)
|
||
```
|
||
|
||
*(测试指南:testing-guide.md - 即将推出)*
|
||
|
||
---
|
||
|
||
## 🔧 开发工具
|
||
|
||
### 构建与运行
|
||
|
||
```bash
|
||
# 后端
|
||
go build -o nofx
|
||
./nofx
|
||
|
||
# 前端
|
||
cd web
|
||
npm run dev
|
||
|
||
# Docker
|
||
docker compose up --build
|
||
```
|
||
|
||
### 代码质量
|
||
|
||
```bash
|
||
# 格式化 Go 代码
|
||
go fmt ./...
|
||
|
||
# Lint(如果配置)
|
||
golangci-lint run
|
||
|
||
# TypeScript 类型检查
|
||
cd web && npm run build
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 性能考虑
|
||
|
||
### 后端
|
||
- **并发:** 每个交易员在独立的 goroutine 中运行
|
||
- **数据库:** SQLite(适用于 <100 个交易员)
|
||
- **API 速率限制:** 按交易所处理
|
||
- **内存:** 每个交易员 ~50-100MB
|
||
|
||
### 前端
|
||
- **数据获取:** SWR,5-10 秒轮询
|
||
- **状态:** Zustand(轻量级)
|
||
- **包大小:** ~500KB(gzipped)
|
||
|
||
---
|
||
|
||
## 🔮 未来架构计划
|
||
|
||
### 计划改进
|
||
|
||
1. **微服务拆分**(如需扩展)
|
||
- 独立的决策引擎服务
|
||
- 市场数据服务
|
||
- 执行服务
|
||
|
||
2. **数据库迁移**
|
||
- 生产环境使用 Mysql (>100 个交易员)
|
||
- Redis 缓存
|
||
|
||
3. **事件驱动架构**
|
||
- WebSocket 实时更新
|
||
- 消息队列(RabbitMQ/NATS)
|
||
|
||
4. **Kubernetes 部署**
|
||
- Helm charts
|
||
- 自动扩展
|
||
- 高可用性
|
||
|
||
---
|
||
|
||
## 🆘 开发者资源
|
||
|
||
**想要贡献?**
|
||
- 阅读[贡献指南](../../CONTRIBUTING.md)
|
||
- 查看[开放问题](https://github.com/tinkle-community/nofx/issues)
|
||
- 加入 [Telegram 社区](https://t.me/nofx_dev_community)
|
||
|
||
**需要澄清?**
|
||
- 开启 [GitHub 讨论](https://github.com/tinkle-community/nofx/discussions)
|
||
- 在 Telegram 提问
|
||
|
||
---
|
||
|
||
## 📚 相关文档
|
||
|
||
- [快速开始](../getting-started/README.zh-CN.md) - 设置和部署
|
||
- [贡献指南](../../CONTRIBUTING.md) - 如何贡献
|
||
- [社区](../community/README.md) - 悬赏和认可
|
||
|
||
---
|
||
|
||
[← 返回文档首页](../README.md)
|