15 KiB
15 KiB
系统架构说明
📐 整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 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 │ ← 信号生成,可选启动
└──────────────┘
启动顺序:
- Redis (自动健康检查)
- Ingestion (依赖Redis健康)
- 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条)
输出文件结构
{
"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控制
🎯 设计原则
-
关注点分离
- 数据采集 ≠ 信号生成
- 可独立部署、独立扩展
-
可靠性优先
- WebSocket自动重连
- Redis持久化
- 优雅关闭
-
成本可控
- LLM Gate严格限流
- 只在高质量场景调用
-
灵活配置
- 环境变量控制所有参数
- 支持多种运行模式
-
可观测性
- 详细日志
- 健康检查
- 统计信息