tradusai/ARCHITECTURE.md
2025-12-02 22:54:03 +08:00

310 lines
15 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 系统架构说明
## 📐 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Binance Futures │
│ (WebSocket Streams) │
└────────────────┬────────────────────────────────────────────────┘
│ WebSocket连接
┌─────────────────────────────────────────────────────────────────┐
│ Data Ingestion Service (ingestion) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ • K线数据流 (5m, 15m, 1h, 4h) │ │
│ │ • 订单簿快照 (Top 20) │ │
│ │ • 实时成交流 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ │ 去重 → 缓冲 → 批量写入 │
│ ▼ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Redis (数据存储) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Stream: binance:raw:kline:5m (5分钟K线) │ │
│ │ Stream: binance:raw:kline:15m (15分钟K线) │ │
│ │ Stream: binance:raw:kline:1h (1小时K线) │ │
│ │ Stream: binance:raw:kline:4h (4小时K线) │ │
│ │ Stream: binance:raw:depth:20 (订单簿Top20) │ │
│ │ Stream: binance:raw:trade (实时成交) │ │
│ └──────────────────────────────────────────────────────────┘ │
└────────────────┬────────────────────────────────────────────────┘
│ 读取历史数据
┌─────────────────────────────────────────────────────────────────┐
│ Signal Generation Service (scheduler) │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 1⃣ Market Analysis Engine │ │
│ │ • 获取6个时间周期数据 (5m/15m/1h/4h/1d/1w) │ │
│ │ • 计算技术指标 (RSI/MACD/ATR/EMA/ADX...) │ │
│ │ • 识别支撑压力位 │ │
│ │ • 分析订单流 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 2⃣ Quantitative Signal Generator │ │
│ │ • 趋势得分 (Trend Score) │ │
│ │ • 动量得分 (Momentum Score) │ │
│ │ • 订单流得分 (OrderFlow Score) │ │
│ │ • 突破得分 (Breakout Score) │ │
│ │ • 综合得分 = 加权平均 │ │
│ │ → 输出: BUY/SELL/HOLD + 置信度 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 3⃣ LLM Gate (极简门控) │ │
│ │ ✓ 频率限制 (12次/天, 间隔≥15分钟) │ │
│ │ ✓ 数据检查 (K线≥100根) │ │
│ │ ✓ 质量检查 (综合得分≥15) │ │
│ │ → PASS / BLOCK │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ (if PASS) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 4⃣ LLM Decision Maker (可选) │ │
│ │ • 使用: Deepseek / GPT / Claude │ │
│ │ • 输入: 多时间周期完整技术分析 │ │
│ │ • 输出: 交易机会识别 │ │
│ │ - 日内机会 (Intraday) │ │
│ │ - 中长线机会 (Swing) │ │
│ │ - 埋伏点位 (Ambush) │ │
│ │ • 包含: 进场价/止损/止盈/风险评估 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 5⃣ Signal Aggregator │ │
│ │ • 融合量化信号 + LLM信号 │ │
│ │ • 检查一致性 (Consensus) │ │
│ │ • 计算最终置信度 │ │
│ │ • 生成综合建议 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 保存到文件 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Output (输出文件) │
│ │
│ ./output/latest_signal.json │
│ { │
│ "timestamp": "2025-11-30T13:23:24", │
│ "aggregated_signal": { │
│ "final_signal": "BUY", │
│ "final_confidence": 0.75, │
│ "opportunities": {...} │
│ }, │
│ "quantitative_signal": {...}, │
│ "llm_signal": {...} │
│ } │
└─────────────────────────────────────────────────────────────────┘
```
## 🔄 数据流详解
### 1. 实时数据采集 (24/7持续)
```
Binance WebSocket → Ingestion Service → Redis Streams
↓ ↓ ↓
• K线更新 • 去重过滤 • 持久化存储
• 订单簿快照 • 缓冲优化 • 时间序列
• 实时成交 • 批量写入 • 可回溯查询
```
**特点**:
- ✅ 低延迟 (< 100ms)
- 高可靠 (自动重连)
- 防重复 (去重缓存)
- 流量控制 (缓冲 + 速率限制)
### 2. 信号生成 (定时或手动)
#### 模式A: 定时自动生成 (scheduler服务)
```
每N分钟触发
读取Redis历史数据
执行完整分析链路
保存信号到文件
```
**配置**: `SIGNAL_INTERVAL_MINUTES=5` (可调整)
#### 模式B: 手动执行
```
用户触发
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
一次性生成信号
```
### 3. LLM调用控制流程
```
量化信号生成
┌───────────────────┐
│ LLM Gate检查 │
│ │
│ ✓ 频率OK? │────NO───→ 跳过LLM使用量化信号
│ ✓ 数据OK? │
│ ✓ 质量OK? │
└───────┬───────────┘
│ YES
调用 LLM API
获取深度分析
融合量化+LLM
输出最终信号
```
**Gate保护机制**:
- 🚦 防止过度调用 (成本控制)
- 🚦 确保数据质量 (分析准确性)
- 🚦 频率合理分布 (避免集中消耗)
## ⚙️ 服务依赖关系
```
┌──────────┐
│ Redis │ ← 基础服务,必须先启动
└────┬─────┘
├─────→ ┌──────────────┐
│ │ Ingestion │ ← 数据采集,持续运行
│ └──────────────┘
└─────→ ┌──────────────┐
│ Scheduler │ ← 信号生成,可选启动
└──────────────┘
```
**启动顺序**:
1. Redis (自动健康检查)
2. Ingestion (依赖Redis健康)
3. Scheduler (依赖Redis健康可选)
## 🗂️ 数据存储结构
### Redis Streams 结构
```
binance:raw:kline:5m
├─ 消息ID: 1701234567890-0
│ ├─ event_time: 1701234567890
│ ├─ symbol: BTCUSDT
│ ├─ kline_start_time: 1701234500000
│ ├─ kline_close_time: 1701234599999
│ ├─ open: "91650.10"
│ ├─ high: "91680.50"
│ ├─ low: "91620.00"
│ ├─ close: "91670.30"
│ ├─ volume: "123.45"
│ └─ ...
├─ 消息ID: 1701234567891-0
│ └─ ...
└─ (最多保留10000条)
```
### 输出文件结构
```json
{
"timestamp": "ISO格式时间戳",
"aggregated_signal": {
"final_signal": "BUY|SELL|HOLD",
"final_confidence": 0.0-1.0,
"consensus": "字符串描述",
"opportunities": {
"intraday": "日内机会详情",
"swing": "中长线机会详情",
"ambush": "埋伏点位详情"
},
"levels": "价格位详情",
"recommendation": "综合建议"
},
"market_analysis": "市场分析详情",
"quantitative_signal": "量化信号详情",
"llm_signal": "LLM信号详情"
}
```
## 🔐 安全和配置
### 环境变量层级
```
1. docker-compose.yml (服务默认配置)
↓ 可被覆盖
2. .env 文件 (本地配置)
↓ 可被覆盖
3. 环境变量 (运行时配置)
```
### 敏感信息保护
```
✅ 推荐: 使用 .env.local 文件 (添加到 .gitignore)
❌ 避免: 直接在 docker-compose.yml 中硬编码API key
```
## 📊 性能特征
### 数据采集服务 (Ingestion)
- **吞吐量**: ~1000 消息/
- **延迟**: < 100ms (WebSocket Redis)
- **内存**: ~50-100 MB
- **CPU**: < 5% (空闲时)
### 信号生成服务 (Scheduler)
- **执行时间**: 2-5秒/ (无LLM), 10-30秒/ (有LLM)
- **内存**: ~200-300 MB
- **CPU**: 10-20% (计算时), < 1% (等待时)
### LLM API调用
- **延迟**: 5-20秒 (Deepseek), 2-10秒 (GPT-4)
- **成本**: ~$0.001/ (Deepseek), ~$0.01/ (GPT-4)
- **限流**: 通过LLM Gate控制
## 🎯 设计原则
1. **关注点分离**
- 数据采集 信号生成
- 可独立部署独立扩展
2. **可靠性优先**
- WebSocket自动重连
- Redis持久化
- 优雅关闭
3. **成本可控**
- LLM Gate严格限流
- 只在高质量场景调用
4. **灵活配置**
- 环境变量控制所有参数
- 支持多种运行模式
5. **可观测性**
- 详细日志
- 健康检查
- 统计信息