# 系统架构说明 ## 📐 整体架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 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. **可观测性** - 详细日志 - 健康检查 - 统计信息