1
This commit is contained in:
parent
b404721e16
commit
1ec9030d1e
309
ARCHITECTURE.md
309
ARCHITECTURE.md
@ -1,309 +0,0 @@
|
||||
# 系统架构说明
|
||||
|
||||
## 📐 整体架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 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. **可观测性**
|
||||
- 详细日志
|
||||
- 健康检查
|
||||
- 统计信息
|
||||
@ -1,131 +0,0 @@
|
||||
# 代码清理总结
|
||||
|
||||
## 清理日期
|
||||
2025-11-30
|
||||
|
||||
## 1. 删除的测试日志文件 (10个)
|
||||
|
||||
✅ 已删除所有测试log文件:
|
||||
- signal_simplified_gate.log
|
||||
- signal_optimized_gate.log
|
||||
- signal_fixed_indicators.log
|
||||
- signal_clean_prompt.log
|
||||
- signal_optimized_prompt.log
|
||||
- signal_mtf.log
|
||||
- signal_with_daily_weekly.log
|
||||
- signal_final_test.log
|
||||
- signal_with_prompt.log
|
||||
- signal_opportunities.log
|
||||
|
||||
## 2. 删除的不需要的代码
|
||||
|
||||
### signals/llm_gate.py
|
||||
|
||||
**删除的方法 (3个):**
|
||||
- `_check_delivery_time()` - 交割时段检查(已不使用)
|
||||
- `_check_market_health()` - 市场健康度检查(已不使用)
|
||||
- `_identify_high_value_scenario()` - 高价值场景识别(已不使用)
|
||||
|
||||
**简化的参数 (从10个减少到4个):**
|
||||
- ❌ 删除: `volatility_min`, `volatility_max`, `min_liquidity_depth`
|
||||
- ❌ 删除: `min_consensus_score`, `min_volume_ratio`
|
||||
- ✅ 保留: `min_candles`, `min_composite_score`, `max_calls_per_day`, `min_call_interval_minutes`
|
||||
|
||||
**简化的检查逻辑:**
|
||||
- 从6层复杂检查简化为3层极简检查
|
||||
- 只保留:频率限制 + 数据基本可用 + 综合得分
|
||||
|
||||
### config/settings.py
|
||||
|
||||
**删除的配置项 (5个):**
|
||||
- ❌ `LLM_VOLATILITY_MIN`
|
||||
- ❌ `LLM_VOLATILITY_MAX`
|
||||
- ❌ `LLM_MIN_LIQUIDITY`
|
||||
- ❌ `LLM_MIN_CONSENSUS`
|
||||
- ❌ `LLM_MIN_VOLUME_RATIO`
|
||||
|
||||
**保留的配置项 (4个):**
|
||||
- ✅ `LLM_MIN_CANDLES`
|
||||
- ✅ `LLM_MIN_COMPOSITE_SCORE`
|
||||
- ✅ `LLM_MAX_CALLS_PER_DAY`
|
||||
- ✅ `LLM_MIN_INTERVAL_MINUTES`
|
||||
|
||||
### .env
|
||||
|
||||
**删除的环境变量 (5个):**
|
||||
同 settings.py
|
||||
|
||||
### scripts/generate_trading_signal.py
|
||||
|
||||
**简化的LLMGate初始化:**
|
||||
- 从13行参数传递简化为4行
|
||||
- 删除所有不再使用的参数
|
||||
|
||||
## 3. 更新的文档字符串
|
||||
|
||||
### signals/llm_gate.py
|
||||
|
||||
**之前:**
|
||||
```
|
||||
LLM Gate - 高级门控系统,严格控制LLM调用频率和质量
|
||||
|
||||
只在以下情况调用 LLM:
|
||||
1. 市场状态健康 (波动率适中、流动性充足、资金费率正常)
|
||||
2. 信号质量高 (多时间框架一致、成交量验证、订单簿支持、共识≥0.75)
|
||||
3. 高价值场景 (趋势回调、真假突破、多因子冲突、重大事件)
|
||||
4. 频率受限 (每天最多3~5次、间隔≥30分钟、避开交割和极端行情)
|
||||
```
|
||||
|
||||
**现在:**
|
||||
```
|
||||
LLM Gate - 极简门控系统,以频率控制为主
|
||||
|
||||
核心原则:
|
||||
1. 频率限制 - 每天最多12次,间隔≥15分钟(核心控制!)
|
||||
2. 数据基本可用 - 至少100根K线,基础指标完整
|
||||
3. 信号基本质量 - 综合得分≥15(只过滤完全中性的信号)
|
||||
```
|
||||
|
||||
## 4. 测试结果
|
||||
|
||||
✅ 所有清理后的代码测试通过:
|
||||
- LLM Gate初始化成功(极简模式)
|
||||
- 频率限制正常工作(距离上次6.3分钟 < 15分钟 → 拦截)
|
||||
- 信号生成正常(量化信号BUY,综合得分51.5)
|
||||
- 无错误或警告
|
||||
|
||||
## 5. 代码行数减少
|
||||
|
||||
| 文件 | 之前行数 | 现在行数 | 减少 |
|
||||
|------|----------|----------|------|
|
||||
| signals/llm_gate.py | ~437行 | ~280行 | ~157行 (-36%) |
|
||||
| config/settings.py | ~87行 | ~76行 | ~11行 (-13%) |
|
||||
| scripts/generate_trading_signal.py | ~331行 | ~322行 | ~9行 (-3%) |
|
||||
| .env | ~53行 | ~45行 | ~8行 (-15%) |
|
||||
|
||||
**总计减少: ~185行代码**
|
||||
|
||||
## 6. 清理效果
|
||||
|
||||
- ✅ 代码更简洁、易维护
|
||||
- ✅ 参数更少、配置更简单
|
||||
- ✅ 逻辑更清晰、注释更准确
|
||||
- ✅ 无冗余代码、无测试日志
|
||||
- ✅ 功能完整、测试通过
|
||||
|
||||
## 7. 核心改进
|
||||
|
||||
**之前(复杂模式):**
|
||||
- 6层检查:频率 + 交割时段 + 数据充足 + 市场健康 + 信号质量 + 高价值场景
|
||||
- 10个参数配置
|
||||
- 严格门槛(共识≥0.75, 波动率0.8%-2.5%, 成交量≥1.2x)
|
||||
|
||||
**现在(极简模式):**
|
||||
- 3层检查:频率 + 数据充足 + 综合得分
|
||||
- 4个参数配置
|
||||
- 宽松门槛(综合得分≥15, 频率12次/天)
|
||||
|
||||
**目标达成:**
|
||||
- ✅ 频率控制为主(防止过度调用)
|
||||
- ✅ 量化初筛为辅(过滤完全中性信号)
|
||||
- ✅ 最大化LLM深度分析机会
|
||||
@ -1,363 +0,0 @@
|
||||
# 钉钉消息通知配置指南
|
||||
|
||||
## 📱 功能说明
|
||||
|
||||
系统支持通过钉钉群机器人自动推送交易信号通知,包括:
|
||||
|
||||
- ✅ 实时交易信号推送(BUY/SELL)
|
||||
- ✅ 量化分析 + AI深度分析结果
|
||||
- ✅ 日内/中长线/埋伏点位机会详情
|
||||
- ✅ 进场价/止损/止盈建议
|
||||
- ✅ 风险评估和综合建议
|
||||
- ✅ Markdown格式,可读性强
|
||||
|
||||
## 🔧 配置步骤
|
||||
|
||||
### 第一步:创建钉钉群机器人
|
||||
|
||||
1. **打开钉钉群**
|
||||
- 在电脑端或手机端打开需要接收通知的钉钉群
|
||||
|
||||
2. **添加自定义机器人**
|
||||
- 点击群设置 → 智能群助手 → 添加机器人
|
||||
- 选择"自定义"机器人
|
||||
- 点击"添加"
|
||||
|
||||
3. **配置机器人**
|
||||
- **机器人名称**: 例如 "交易信号助手"
|
||||
- **消息推送**:
|
||||
- ✅ 勾选 "加签"(推荐,更安全)
|
||||
- 或 勾选 "自定义关键词"(输入:信号、交易)
|
||||
- 或 勾选 "IP地址段"(如果固定IP)
|
||||
|
||||
4. **获取配置信息**
|
||||
- **Webhook地址**: 复制形如 `https://oapi.dingtalk.com/robot/send?access_token=xxxxx` 的URL
|
||||
- **加签密钥**: 如果选择了"加签",复制 `SEC` 开头的密钥
|
||||
|
||||
5. **完成配置**
|
||||
- 点击"完成"
|
||||
- 机器人添加成功
|
||||
|
||||
---
|
||||
|
||||
### 第二步:配置系统环境变量
|
||||
|
||||
有两种配置方式:
|
||||
|
||||
#### 方式A: 修改 docker-compose.yml(推荐)
|
||||
|
||||
编辑 `docker-compose.yml` 文件,找到 `scheduler` 服务,取消注释并填入配置:
|
||||
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
# DingTalk Notification
|
||||
- DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=你的access_token
|
||||
- DINGTALK_SECRET=SEC你的加签密钥 # 如果使用了加签
|
||||
```
|
||||
|
||||
**示例**:
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
# DingTalk Notification
|
||||
- DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=1a2b3c4d5e6f7g8h9i0j
|
||||
- DINGTALK_SECRET=SEC1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0
|
||||
```
|
||||
|
||||
#### 方式B: 使用 .env.local 文件
|
||||
|
||||
创建 `.env.local` 文件:
|
||||
|
||||
```bash
|
||||
# DingTalk Configuration
|
||||
DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=你的access_token
|
||||
DINGTALK_SECRET=SEC你的加签密钥
|
||||
```
|
||||
|
||||
然后在 `docker-compose.yml` 中添加:
|
||||
|
||||
```yaml
|
||||
scheduler:
|
||||
env_file:
|
||||
- .env.local
|
||||
```
|
||||
|
||||
⚠️ **重要**: 将 `.env.local` 添加到 `.gitignore`,避免泄露敏感信息
|
||||
|
||||
---
|
||||
|
||||
### 第三步:重启服务
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
docker compose down
|
||||
|
||||
# 重新构建镜像(如果修改了requirements.txt)
|
||||
docker compose build scheduler
|
||||
|
||||
# 启动服务
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 查看日志,确认钉钉已启用
|
||||
docker compose logs scheduler
|
||||
```
|
||||
|
||||
**预期日志**:
|
||||
```
|
||||
📱 钉钉通知已启用 - Webhook: https://oapi.dingtalk.com/robot/send?access...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 消息示例
|
||||
|
||||
### BUY信号示例
|
||||
|
||||
```markdown
|
||||
# 🟢 交易信号: BUY
|
||||
|
||||
**时间**: 2025-11-30 21:45:23
|
||||
**置信度**: 75.0%
|
||||
**共识**: QUANT_LLM_AGREE
|
||||
|
||||
---
|
||||
|
||||
## 📊 量化分析
|
||||
|
||||
- **信号**: BUY
|
||||
- **综合得分**: 51.5
|
||||
- **置信度**: 75.0%
|
||||
- **趋势得分**: 99.0
|
||||
- **动量得分**: 75.0
|
||||
- **订单流得分**: -7.8
|
||||
|
||||
## 🤖 AI深度分析
|
||||
|
||||
- **信号**: BUY
|
||||
- **置信度**: 60.0%
|
||||
- **风险等级**: MEDIUM
|
||||
|
||||
### 📊 日内交易机会
|
||||
- **方向**: LONG
|
||||
- **入场**: $91,128.00
|
||||
- **止损**: $91,000.00
|
||||
- **止盈**: $91,342.00
|
||||
- **说明**: 5分钟和15分钟周期呈现上涨趋势,MACD金叉扩大...
|
||||
|
||||
### 📌 埋伏点位
|
||||
- **埋伏价位**: $90,612.00
|
||||
- **说明**: 等待价格回调至4小时支撑位90612附近...
|
||||
|
||||
### 💡 AI分析
|
||||
> 当前市场呈现多周期趋势分歧,日线下跌但短周期上涨,形成震荡格局...
|
||||
|
||||
**关键因素**:
|
||||
- 多周期趋势分歧
|
||||
- 成交量萎缩
|
||||
- RSI中性区域
|
||||
|
||||
## 💰 价格位
|
||||
|
||||
- **当前价格**: $91,650.10
|
||||
- **入场价**: $91,650.10
|
||||
- **止损价**: $90,985.52
|
||||
- **目标价1**: $92,646.96
|
||||
- **目标价2**: $93,311.54
|
||||
- **目标价3**: $94,308.40
|
||||
- **风险回报比**: 1:1.50
|
||||
|
||||
## 📝 综合建议
|
||||
|
||||
> 量化和AI分析一致看多,建议在回调时逢低做多
|
||||
|
||||
---
|
||||
|
||||
*本信号由AI量化系统自动生成,仅供参考,不构成投资建议*
|
||||
```
|
||||
|
||||
### SELL信号示例
|
||||
|
||||
```markdown
|
||||
# 🔴 交易信号: SELL
|
||||
|
||||
**时间**: 2025-11-30 22:30:15
|
||||
**置信度**: 68.0%
|
||||
**共识**: QUANT_ONLY
|
||||
|
||||
---
|
||||
|
||||
[类似格式,信号为SELL]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 通知规则
|
||||
|
||||
### 何时发送通知
|
||||
|
||||
- ✅ **BUY信号**: 立即发送通知
|
||||
- ✅ **SELL信号**: 立即发送通知
|
||||
- ❌ **HOLD信号**: 不发送通知(避免噪音)
|
||||
|
||||
### 消息去重
|
||||
|
||||
- 每次只发送最新的信号
|
||||
- 不会重复发送相同的信号
|
||||
|
||||
---
|
||||
|
||||
## 🔐 安全建议
|
||||
|
||||
### 1. 使用加签(强烈推荐)
|
||||
|
||||
加签可以验证请求来源,防止webhook被滥用:
|
||||
|
||||
```yaml
|
||||
- DINGTALK_SECRET=SEC你的加签密钥
|
||||
```
|
||||
|
||||
### 2. 限制IP地址(可选)
|
||||
|
||||
如果服务器IP固定,可以在钉钉机器人设置中配置IP白名单。
|
||||
|
||||
### 3. 保护webhook地址
|
||||
|
||||
- ❌ 不要将webhook地址提交到Git仓库
|
||||
- ❌ 不要在公开场合分享webhook地址
|
||||
- ✅ 使用 `.env.local` 文件存储
|
||||
- ✅ 添加 `.env.local` 到 `.gitignore`
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 问题1: 未收到通知
|
||||
|
||||
**检查步骤**:
|
||||
|
||||
1. **确认钉钉配置是否正确**
|
||||
```bash
|
||||
docker compose logs scheduler | grep "钉钉"
|
||||
```
|
||||
|
||||
期望输出: `📱 钉钉通知已启用`
|
||||
|
||||
2. **确认是否有BUY/SELL信号**
|
||||
```bash
|
||||
docker compose logs scheduler | grep "发送钉钉通知"
|
||||
```
|
||||
|
||||
3. **检查钉钉机器人配置**
|
||||
- webhook地址是否正确
|
||||
- 加签密钥是否匹配
|
||||
- 关键词是否配置正确
|
||||
|
||||
4. **手动测试webhook**
|
||||
```bash
|
||||
docker compose exec scheduler python -c "
|
||||
from notifiers.dingtalk import DingTalkNotifier
|
||||
import os
|
||||
notifier = DingTalkNotifier(
|
||||
webhook_url=os.getenv('DINGTALK_WEBHOOK'),
|
||||
secret=os.getenv('DINGTALK_SECRET')
|
||||
)
|
||||
notifier.send_markdown('测试', '# 测试消息\n\n这是一条测试消息')
|
||||
"
|
||||
```
|
||||
|
||||
### 问题2: 发送失败
|
||||
|
||||
**可能原因**:
|
||||
|
||||
1. **Webhook地址错误**
|
||||
- 检查是否完整复制了webhook URL
|
||||
- 确认access_token没有遗漏
|
||||
|
||||
2. **加签密钥错误**
|
||||
- 检查密钥是否以 `SEC` 开头
|
||||
- 确认密钥完整
|
||||
|
||||
3. **网络问题**
|
||||
- 检查容器是否能访问外网
|
||||
- 尝试 `docker compose exec scheduler ping oapi.dingtalk.com`
|
||||
|
||||
4. **关键词不匹配**
|
||||
- 如果使用"自定义关键词",确保消息包含关键词
|
||||
- 推荐使用"加签"方式
|
||||
|
||||
### 问题3: 消息格式错误
|
||||
|
||||
**症状**: 收到消息但格式混乱
|
||||
|
||||
**解决**:
|
||||
- 确保使用最新版本的代码
|
||||
- 检查日志中是否有错误信息
|
||||
- 联系开发者反馈问题
|
||||
|
||||
---
|
||||
|
||||
## 📞 支持的通知场景
|
||||
|
||||
### 当前已支持
|
||||
|
||||
- ✅ 交易信号通知(BUY/SELL)
|
||||
- ✅ 包含量化 + AI分析
|
||||
- ✅ 包含价格位和风险建议
|
||||
|
||||
### 未来计划支持
|
||||
|
||||
- ⏳ 系统错误通知
|
||||
- ⏳ 每日汇总报告
|
||||
- ⏳ 重要市场事件提醒
|
||||
- ⏳ 仓位管理提醒
|
||||
|
||||
---
|
||||
|
||||
## 🔄 取消通知
|
||||
|
||||
如果需要暂时关闭钉钉通知:
|
||||
|
||||
### 方法1: 注释环境变量
|
||||
|
||||
编辑 `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
# - DINGTALK_WEBHOOK=... # 注释掉
|
||||
# - DINGTALK_SECRET=... # 注释掉
|
||||
```
|
||||
|
||||
### 方法2: 删除机器人
|
||||
|
||||
在钉钉群中删除机器人即可。
|
||||
|
||||
### 重新启动服务
|
||||
|
||||
```bash
|
||||
docker compose --profile scheduler restart scheduler
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 最佳实践
|
||||
|
||||
1. **专用群组**: 建议为交易信号创建专门的钉钉群,避免干扰其他讨论
|
||||
2. **多环境隔离**: 测试环境和生产环境使用不同的webhook
|
||||
3. **定期检查**: 定期查看通知是否正常,避免错过重要信号
|
||||
4. **备份配置**: 保存webhook和密钥的备份,避免丢失
|
||||
5. **安全第一**: 始终使用加签,不要分享webhook地址
|
||||
|
||||
---
|
||||
|
||||
## 🎉 配置完成
|
||||
|
||||
完成上述配置后,系统会在生成BUY/SELL信号时自动发送钉钉通知!
|
||||
|
||||
**下一步**:
|
||||
- 等待下一次信号生成(根据SIGNAL_INTERVAL_MINUTES配置)
|
||||
- 或手动触发一次: `docker compose exec scheduler python /app/scripts/generate_trading_signal.py`
|
||||
- 在钉钉群中查看通知消息
|
||||
|
||||
祝交易顺利!🚀
|
||||
@ -1,339 +0,0 @@
|
||||
# 钉钉通知功能实现总结
|
||||
|
||||
## ✅ 已完成功能
|
||||
|
||||
### 1. 核心模块开发
|
||||
|
||||
#### notifiers/dingtalk.py
|
||||
- ✅ 钉钉Markdown消息发送
|
||||
- ✅ 加签验证(安全增强)
|
||||
- ✅ 交易信号格式化
|
||||
- ✅ 错误通知支持
|
||||
- ✅ 发送统计和重试机制
|
||||
|
||||
#### scheduler.py 集成
|
||||
- ✅ 自动初始化钉钉通知器
|
||||
- ✅ 在生成BUY/SELL信号后自动发送
|
||||
- ✅ HOLD信号不发送(减少噪音)
|
||||
- ✅ 异常处理和日志记录
|
||||
|
||||
### 2. 配置管理
|
||||
|
||||
#### docker-compose.yml
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
- DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=...
|
||||
- DINGTALK_SECRET=SEC...
|
||||
```
|
||||
|
||||
#### requirements.txt
|
||||
- ✅ 添加 requests==2.31.0 依赖
|
||||
|
||||
### 3. 文档完善
|
||||
|
||||
- ✅ DINGTALK_SETUP.md - 详细配置指南
|
||||
- ✅ 包含钉钉机器人创建步骤
|
||||
- ✅ 包含故障排查指南
|
||||
- ✅ 包含消息示例
|
||||
|
||||
---
|
||||
|
||||
## 📊 消息格式特性
|
||||
|
||||
### 支持的消息类型
|
||||
|
||||
1. **交易信号通知** (BUY/SELL)
|
||||
- 信号类型和置信度
|
||||
- 量化分析详情
|
||||
- AI深度分析(如果启用)
|
||||
- 交易机会细分:
|
||||
- 📊 日内交易机会 (Intraday)
|
||||
- 📈 中长线交易机会 (Swing)
|
||||
- 📌 埋伏点位 (Ambush)
|
||||
- 价格位建议(入场/止损/止盈)
|
||||
- 风险回报比
|
||||
- 综合建议和警告
|
||||
|
||||
2. **系统错误通知** (未来支持)
|
||||
- 错误消息
|
||||
- 上下文信息
|
||||
- @所有人
|
||||
|
||||
### Markdown格式优化
|
||||
|
||||
- ✅ 清晰的层级结构(标题/子标题)
|
||||
- ✅ 信号类型emoji标识(🟢 BUY / 🔴 SELL / 🟡 HOLD)
|
||||
- ✅ 关键信息加粗
|
||||
- ✅ 引用格式的AI分析
|
||||
- ✅ 列表格式的价格位和因素
|
||||
- ✅ 分隔线划分区块
|
||||
- ✅ 页脚免责声明
|
||||
|
||||
---
|
||||
|
||||
## 🔐 安全特性
|
||||
|
||||
### 1. 加签验证
|
||||
```python
|
||||
# 自动生成时间戳和签名
|
||||
timestamp = int(time.time() * 1000)
|
||||
sign = hmac_sha256(f"{timestamp}\n{secret}", secret)
|
||||
url = f"{webhook}×tamp={timestamp}&sign={sign}"
|
||||
```
|
||||
|
||||
### 2. 敏感信息保护
|
||||
- ✅ Webhook和密钥通过环境变量配置
|
||||
- ✅ 不硬编码在代码中
|
||||
- ✅ 建议使用 .env.local 文件
|
||||
|
||||
### 3. 请求限流
|
||||
- ✅ 只在BUY/SELL信号时发送
|
||||
- ✅ HOLD信号不发送
|
||||
- ✅ 避免频繁通知骚扰
|
||||
|
||||
---
|
||||
|
||||
## 📱 当前配置状态
|
||||
|
||||
### 已配置信息
|
||||
```
|
||||
Webhook: https://oapi.dingtalk.com/robot/send?access_token=9438788...
|
||||
Secret: SEC88678d8970f0882a1cca36476b92947409fea5f562a09db4cd03524...
|
||||
状态: ✅ 已启用
|
||||
```
|
||||
|
||||
### 测试结果
|
||||
```
|
||||
✅ 测试消息发送成功
|
||||
✅ 模拟交易信号发送成功
|
||||
✅ 统计信息正常
|
||||
- 发送成功: 2次
|
||||
- 发送失败: 0次
|
||||
- 成功率: 100%
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 使用方式
|
||||
|
||||
### 自动发送(推荐)
|
||||
|
||||
启动scheduler服务后,系统会自动:
|
||||
1. 每5分钟生成一次交易信号
|
||||
2. 如果信号为BUY或SELL,自动发送钉钉通知
|
||||
3. 如果信号为HOLD,跳过通知
|
||||
|
||||
```bash
|
||||
# 启动自动信号生成
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 查看日志
|
||||
docker compose logs -f scheduler
|
||||
```
|
||||
|
||||
### 手动测试
|
||||
|
||||
```bash
|
||||
# 测试钉钉通知
|
||||
docker compose exec ingestion python -c "
|
||||
from notifiers.dingtalk import DingTalkNotifier
|
||||
import os
|
||||
notifier = DingTalkNotifier(
|
||||
webhook_url=os.getenv('DINGTALK_WEBHOOK'),
|
||||
secret=os.getenv('DINGTALK_SECRET')
|
||||
)
|
||||
notifier.send_markdown('测试', '# 测试消息\n\n这是一条测试消息')
|
||||
"
|
||||
|
||||
# 手动生成信号(会自动发送通知)
|
||||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 预期效果
|
||||
|
||||
### 钉钉群将收到
|
||||
|
||||
#### 测试消息
|
||||
```markdown
|
||||
# 🚀 钉钉通知测试
|
||||
|
||||
这是一条测试消息,用于验证钉钉webhook配置是否正确。
|
||||
|
||||
**测试时间**: 2025-11-30 14:55:00
|
||||
|
||||
---
|
||||
|
||||
*如果您收到此消息,说明配置成功!*
|
||||
```
|
||||
|
||||
#### 真实交易信号(示例)
|
||||
```markdown
|
||||
# 🟢 交易信号: BUY
|
||||
|
||||
**时间**: 2025-11-30 14:55:28
|
||||
**置信度**: 75.0%
|
||||
**共识**: QUANT_LLM_AGREE
|
||||
|
||||
---
|
||||
|
||||
## 📊 量化分析
|
||||
- **信号**: BUY
|
||||
- **综合得分**: 51.5
|
||||
- **置信度**: 75.0%
|
||||
- **趋势得分**: 99.0
|
||||
- **动量得分**: 75.0
|
||||
- **订单流得分**: -7.8
|
||||
|
||||
## 🤖 AI深度分析
|
||||
- **信号**: BUY
|
||||
- **置信度**: 60.0%
|
||||
- **风险等级**: MEDIUM
|
||||
|
||||
### 📊 日内交易机会
|
||||
- **方向**: LONG
|
||||
- **入场**: $91,128.00
|
||||
- **止损**: $91,000.00
|
||||
- **止盈**: $91,342.00
|
||||
- **说明**: 5分钟和15分钟周期呈现上涨趋势,MACD金叉扩大...
|
||||
|
||||
### 📌 埋伏点位
|
||||
- **埋伏价位**: $90,612.00
|
||||
- **说明**: 等待价格回调至4小时支撑位90612附近...
|
||||
|
||||
### 💡 AI分析
|
||||
> 当前市场呈现多周期趋势分歧,日线下跌但短周期上涨...
|
||||
|
||||
**关键因素**:
|
||||
- 多周期趋势分歧
|
||||
- 成交量萎缩
|
||||
- RSI中性区域
|
||||
|
||||
## 💰 价格位
|
||||
- **当前价格**: $91,650.10
|
||||
- **入场价**: $91,650.10
|
||||
- **止损价**: $90,985.52
|
||||
- **目标价1**: $92,646.96
|
||||
- **目标价2**: $93,311.54
|
||||
- **目标价3**: $94,308.40
|
||||
- **风险回报比**: 1:1.50
|
||||
|
||||
## 📝 综合建议
|
||||
> 量化和AI分析一致看多,建议在回调时逢低做多
|
||||
|
||||
## ⚠️ 风险提示
|
||||
- 市场波动较大,注意风险控制
|
||||
|
||||
---
|
||||
|
||||
*本信号由AI量化系统自动生成,仅供参考,不构成投资建议*
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 日志示例
|
||||
|
||||
### 成功发送
|
||||
```
|
||||
📱 发送钉钉通知...
|
||||
✅ 钉钉消息发送成功: 🚨 交易信号: BUY (置信度: 75%)
|
||||
✅ 钉钉通知发送成功
|
||||
```
|
||||
|
||||
### 跳过发送
|
||||
```
|
||||
ℹ️ HOLD信号,跳过钉钉通知
|
||||
```
|
||||
|
||||
### 未配置
|
||||
```
|
||||
⚠️ 钉钉通知发送失败或未配置
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ 技术实现细节
|
||||
|
||||
### 依赖库
|
||||
- requests==2.31.0 - HTTP请求
|
||||
- hmac, hashlib, base64 - 加签验证(内置库)
|
||||
|
||||
### 关键类和方法
|
||||
|
||||
#### DingTalkNotifier
|
||||
```python
|
||||
class DingTalkNotifier:
|
||||
def __init__(webhook_url, secret, enabled)
|
||||
def send_markdown(title, text, at_mobiles, at_all) -> bool
|
||||
def send_signal(aggregated_signal) -> bool
|
||||
def send_error(error_msg, context) -> bool
|
||||
def get_stats() -> dict
|
||||
```
|
||||
|
||||
#### SignalScheduler集成
|
||||
```python
|
||||
# 初始化
|
||||
self.dingtalk = DingTalkNotifier(
|
||||
webhook_url=os.getenv('DINGTALK_WEBHOOK'),
|
||||
secret=os.getenv('DINGTALK_SECRET')
|
||||
)
|
||||
|
||||
# 发送
|
||||
if final_signal in ['BUY', 'SELL']:
|
||||
self.dingtalk.send_signal(aggregated)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 下一步优化建议
|
||||
|
||||
### 短期
|
||||
- ✅ 基础功能已完成
|
||||
- ⏳ 添加消息去重(避免短时间内重复发送相同信号)
|
||||
- ⏳ 添加@特定人员功能
|
||||
- ⏳ 支持自定义消息模板
|
||||
|
||||
### 中期
|
||||
- ⏳ 每日交易汇总报告
|
||||
- ⏳ 系统错误实时告警
|
||||
- ⏳ 重要市场事件推送(如大幅波动)
|
||||
- ⏳ 信号准确率统计和回测结果推送
|
||||
|
||||
### 长期
|
||||
- ⏳ 支持企业微信
|
||||
- ⏳ 支持Telegram
|
||||
- ⏳ 支持邮件通知
|
||||
- ⏳ 支持Webhook回调(供第三方系统集成)
|
||||
|
||||
---
|
||||
|
||||
## ✅ 验收清单
|
||||
|
||||
- [x] notifiers模块创建完成
|
||||
- [x] DingTalkNotifier类实现
|
||||
- [x] 加签验证功能
|
||||
- [x] Markdown格式化
|
||||
- [x] scheduler集成
|
||||
- [x] docker-compose配置
|
||||
- [x] requirements.txt更新
|
||||
- [x] 配置文档编写
|
||||
- [x] 测试消息发送成功
|
||||
- [x] 模拟信号发送成功
|
||||
- [x] 用户配置已应用
|
||||
|
||||
---
|
||||
|
||||
## 📞 支持
|
||||
|
||||
如有问题,请参考:
|
||||
1. DINGTALK_SETUP.md - 配置指南
|
||||
2. 查看日志: `docker compose logs scheduler`
|
||||
3. 检查统计: 调用 `notifier.get_stats()`
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 完全实现并测试通过
|
||||
**版本**: 1.0.0
|
||||
**日期**: 2025-11-30
|
||||
250
QUICK_START.md
250
QUICK_START.md
@ -1,250 +0,0 @@
|
||||
# 🚀 Tradus AI 快速开始指南
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [系统启动](#系统启动)
|
||||
- [手动运行分析](#手动运行分析)
|
||||
- [查看结果](#查看结果)
|
||||
- [日志监控](#日志监控)
|
||||
- [系统管理](#系统管理)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 系统启动
|
||||
|
||||
### 方式一:使用脚本(推荐)
|
||||
|
||||
```bash
|
||||
# 启动完整系统(数据采集 + 自动信号生成)
|
||||
./start_system.sh
|
||||
|
||||
# 停止系统
|
||||
./stop_system.sh
|
||||
```
|
||||
|
||||
### 方式二:使用 Docker Compose
|
||||
|
||||
```bash
|
||||
# 启动完整系统
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 仅启动数据采集(不生成信号)
|
||||
docker compose up -d
|
||||
|
||||
# 停止系统
|
||||
docker compose --profile scheduler down
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 手动运行分析
|
||||
|
||||
### 运行一次完整的量化+LLM分析
|
||||
|
||||
```bash
|
||||
# 使用脚本(推荐)
|
||||
./run_signal.sh
|
||||
|
||||
# 或直接运行
|
||||
docker compose exec scheduler python /app/scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
**系统会自动**:
|
||||
- ✅ 执行量化分析
|
||||
- ✅ 调用 DeepSeek LLM 分析(如果通过 Gate)
|
||||
- ✅ 聚合两种分析结果
|
||||
- ✅ 保存到 `output/latest_signal.json`
|
||||
- ✅ 如果是 BUY/SELL 信号,发送钉钉通知
|
||||
|
||||
---
|
||||
|
||||
## 📊 查看结果
|
||||
|
||||
### 查看最新信号
|
||||
|
||||
```bash
|
||||
# 使用脚本(格式化显示)
|
||||
./view_signal.sh
|
||||
|
||||
# 或查看完整 JSON
|
||||
cat output/latest_signal.json | python -m json.tool
|
||||
```
|
||||
|
||||
### 信号包含内容
|
||||
|
||||
- **最终信号**: BUY / SELL / HOLD
|
||||
- **置信度**: 0-100%
|
||||
- **共识状态**: QUANT_LLM_AGREE / LLM_LEADING / QUANT_ONLY
|
||||
- **量化分析**: 趋势、动量、订单流得分
|
||||
- **LLM 分析**: 深度推理、交易计划、风险评估
|
||||
- **价格建议**: 入场/止损/止盈
|
||||
|
||||
---
|
||||
|
||||
## 📋 日志监控
|
||||
|
||||
### 查看实时日志
|
||||
|
||||
```bash
|
||||
# 使用脚本
|
||||
./view_logs.sh scheduler
|
||||
|
||||
# 或直接查看
|
||||
docker compose logs -f scheduler --tail 50
|
||||
```
|
||||
|
||||
### 查看特定日志
|
||||
|
||||
```bash
|
||||
# 查看数据采集日志
|
||||
docker compose logs -f ingestion
|
||||
|
||||
# 查看 Redis 日志
|
||||
docker compose logs -f redis
|
||||
|
||||
# 查看所有服务
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎛️ 系统管理
|
||||
|
||||
### 检查服务状态
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### 重启服务
|
||||
|
||||
```bash
|
||||
# 重启 scheduler
|
||||
docker compose restart scheduler
|
||||
|
||||
# 重启所有服务
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### 重新构建
|
||||
|
||||
```bash
|
||||
# 重新构建 scheduler(应用代码更改)
|
||||
docker compose build scheduler
|
||||
docker compose --profile scheduler up -d
|
||||
```
|
||||
|
||||
### 完全清理并重启
|
||||
|
||||
```bash
|
||||
# 停止并删除所有容器和卷
|
||||
docker compose --profile scheduler down -v
|
||||
|
||||
# 重新启动
|
||||
./start_system.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 配置调整
|
||||
|
||||
### LLM Gate 阈值
|
||||
|
||||
编辑 `config/settings.py`:
|
||||
|
||||
```python
|
||||
LLM_MIN_COMPOSITE_SCORE: float = 15.0 # 降低到 5.0 可看到更多 LLM 分析
|
||||
```
|
||||
|
||||
### 信号生成频率
|
||||
|
||||
编辑 `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- SIGNAL_INTERVAL_MINUTES=5 # 修改为想要的分钟数
|
||||
```
|
||||
|
||||
### 钉钉配置
|
||||
|
||||
编辑 `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- DINGTALK_WEBHOOK=你的webhook地址
|
||||
- DINGTALK_SECRET=你的密钥
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔔 钉钉通知规则
|
||||
|
||||
- ✅ **BUY 信号**: 自动发送简洁通知
|
||||
- ✅ **SELL 信号**: 自动发送简洁通知
|
||||
- ❌ **HOLD 信号**: 不发送(减少噪音)
|
||||
|
||||
**通知内容**:
|
||||
- 信号类型和置信度
|
||||
- 当前价格
|
||||
- 交易计划(入场/止损/止盈)
|
||||
- 风险回报比
|
||||
- 简短原因
|
||||
|
||||
---
|
||||
|
||||
## 📞 常见问题
|
||||
|
||||
### Q: 如何强制 LLM 分析每次都运行?
|
||||
|
||||
A: 降低 Gate 阈值到 5.0 或更低:
|
||||
|
||||
```bash
|
||||
# 临时降低阈值,然后重启
|
||||
docker compose restart scheduler
|
||||
```
|
||||
|
||||
### Q: 如何查看 DeepSeek 调用情况?
|
||||
|
||||
A: 查看日志中的 LLM 相关信息:
|
||||
|
||||
```bash
|
||||
docker compose logs scheduler | grep -E "LLM|Deepseek"
|
||||
```
|
||||
|
||||
### Q: 信号文件在哪里?
|
||||
|
||||
A: `output/latest_signal.json`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 典型工作流
|
||||
|
||||
```bash
|
||||
# 1. 启动系统
|
||||
./start_system.sh
|
||||
|
||||
# 2. 监控日志(新终端窗口)
|
||||
./view_logs.sh scheduler
|
||||
|
||||
# 3. 手动运行分析(可选)
|
||||
./run_signal.sh
|
||||
|
||||
# 4. 查看结果
|
||||
./view_signal.sh
|
||||
|
||||
# 5. 停止系统(工作完成后)
|
||||
./stop_system.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 更多文档
|
||||
|
||||
- `DINGTALK_SETUP.md` - 钉钉配置详细指南
|
||||
- `NOTIFICATION_SUMMARY.md` - 通知功能实现总结
|
||||
- `README.md` - 完整系统文档
|
||||
|
||||
---
|
||||
|
||||
**系统版本**: 1.0.0
|
||||
**最后更新**: 2025-12-01
|
||||
@ -1,423 +0,0 @@
|
||||
# 交易信号生成指南
|
||||
|
||||
## 📊 系统架构
|
||||
|
||||
系统分为两个独立的服务:
|
||||
|
||||
### 1. 数据采集服务 (ingestion) - 持续运行
|
||||
- **功能**: WebSocket实时数据采集
|
||||
- **数据源**: Binance期货WebSocket (K线、订单簿、交易流)
|
||||
- **存储**: Redis Streams
|
||||
- **状态**: 24/7持续运行
|
||||
|
||||
### 2. 信号生成服务 (scheduler) - 可选运行
|
||||
- **功能**: 定时执行量化分析 + LLM决策
|
||||
- **数据源**: 从Redis读取历史数据
|
||||
- **输出**: 交易信号JSON文件
|
||||
- **运行模式**: 定时自动 或 手动执行
|
||||
|
||||
---
|
||||
|
||||
## 🚀 运行方式
|
||||
|
||||
### 方式一:只运行数据采集(默认)
|
||||
|
||||
**适用场景**: 只需要采集数据,手动生成信号
|
||||
|
||||
```bash
|
||||
# 启动数据采集服务
|
||||
docker compose up -d
|
||||
|
||||
# 查看状态
|
||||
docker compose ps
|
||||
|
||||
# 查看日志
|
||||
docker compose logs -f ingestion
|
||||
```
|
||||
|
||||
**运行的服务**:
|
||||
- ✅ `redis` - 数据存储
|
||||
- ✅ `ingestion` - WebSocket数据采集
|
||||
- ❌ `scheduler` - 未启动
|
||||
|
||||
**手动生成信号**:
|
||||
```bash
|
||||
# 随时可以手动执行
|
||||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 方式二:数据采集 + 自动信号生成(推荐)
|
||||
|
||||
**适用场景**: 完全自动化,定时生成交易信号
|
||||
|
||||
```bash
|
||||
# 启动数据采集 + 信号调度器
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 查看状态
|
||||
docker compose --profile scheduler ps
|
||||
|
||||
# 查看调度器日志
|
||||
docker compose logs -f scheduler
|
||||
|
||||
# 查看采集服务日志
|
||||
docker compose logs -f ingestion
|
||||
```
|
||||
|
||||
**运行的服务**:
|
||||
- ✅ `redis` - 数据存储
|
||||
- ✅ `ingestion` - WebSocket数据采集
|
||||
- ✅ `scheduler` - 定时信号生成 (每5分钟)
|
||||
|
||||
**配置信号生成间隔**:
|
||||
|
||||
编辑 `docker-compose.yml` 修改环境变量:
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
- SIGNAL_INTERVAL_MINUTES=5 # 改为你想要的间隔(分钟)
|
||||
```
|
||||
|
||||
支持的间隔:
|
||||
- `1` - 每1分钟(高频,适合测试)
|
||||
- `5` - 每5分钟(推荐,平衡频率和成本)
|
||||
- `15` - 每15分钟(低频,节省LLM调用)
|
||||
- `60` - 每1小时(很低频)
|
||||
|
||||
---
|
||||
|
||||
### 方式三:手动执行单次信号生成
|
||||
|
||||
**适用场景**: 测试、调试、手动判断
|
||||
|
||||
```bash
|
||||
# 确保数据采集服务在运行
|
||||
docker compose up -d
|
||||
|
||||
# 手动执行一次信号生成
|
||||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 信号输出
|
||||
|
||||
### 输出文件位置
|
||||
```
|
||||
./output/latest_signal.json
|
||||
```
|
||||
|
||||
### 输出文件格式
|
||||
```json
|
||||
{
|
||||
"timestamp": "2025-11-30T13:23:24.816000",
|
||||
"aggregated_signal": {
|
||||
"final_signal": "BUY",
|
||||
"final_confidence": 0.75,
|
||||
"consensus": "QUANT_ONLY",
|
||||
"opportunities": {
|
||||
"intraday": {
|
||||
"exists": true,
|
||||
"direction": "LONG",
|
||||
"entry_price": 91128.0,
|
||||
"stop_loss": 91000.0,
|
||||
"take_profit": 91342.0
|
||||
},
|
||||
"swing": {...},
|
||||
"ambush": {...}
|
||||
}
|
||||
},
|
||||
"market_analysis": {...},
|
||||
"quantitative_signal": {...},
|
||||
"llm_signal": {...}
|
||||
}
|
||||
```
|
||||
|
||||
### 查看最新信号
|
||||
```bash
|
||||
# 直接查看
|
||||
cat output/latest_signal.json
|
||||
|
||||
# 格式化查看
|
||||
cat output/latest_signal.json | jq .
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 配置LLM API(可选)
|
||||
|
||||
如果需要LLM深度分析,配置API key:
|
||||
|
||||
### 方法1: 修改 docker-compose.yml
|
||||
|
||||
编辑 `docker-compose.yml` 的 `scheduler` 服务:
|
||||
|
||||
```yaml
|
||||
scheduler:
|
||||
environment:
|
||||
# 使用 Deepseek (推荐,低成本)
|
||||
- OPENAI_API_KEY=sk-your-deepseek-key
|
||||
- OPENAI_BASE_URL=https://api.deepseek.com
|
||||
|
||||
# 或使用 OpenAI GPT
|
||||
# - OPENAI_API_KEY=sk-your-openai-key
|
||||
|
||||
# 或使用 Claude
|
||||
# - ANTHROPIC_API_KEY=sk-ant-your-key
|
||||
```
|
||||
|
||||
### 方法2: 使用 .env 文件
|
||||
|
||||
创建 `.env.local` 文件:
|
||||
```bash
|
||||
OPENAI_API_KEY=sk-your-key
|
||||
OPENAI_BASE_URL=https://api.deepseek.com
|
||||
```
|
||||
|
||||
修改 docker-compose.yml:
|
||||
```yaml
|
||||
scheduler:
|
||||
env_file:
|
||||
- .env.local
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 LLM Gate 控制
|
||||
|
||||
### 当前配置(极简模式)
|
||||
|
||||
LLM Gate 确保合理使用LLM API:
|
||||
|
||||
```yaml
|
||||
LLM_GATE_ENABLED: true # 启用门控
|
||||
LLM_MIN_CANDLES: 100 # 最少K线数量
|
||||
LLM_MIN_COMPOSITE_SCORE: 15.0 # 综合得分门槛
|
||||
LLM_MAX_CALLS_PER_DAY: 12 # 每天最多调用12次
|
||||
LLM_MIN_INTERVAL_MINUTES: 15 # 调用间隔≥15分钟
|
||||
```
|
||||
|
||||
### Gate 逻辑
|
||||
|
||||
信号生成时,LLM调用需要通过:
|
||||
|
||||
1. ✅ **频率检查** - 今日调用 < 12次,且距上次 ≥ 15分钟
|
||||
2. ✅ **数据检查** - K线数量 ≥ 100根
|
||||
3. ✅ **质量检查** - 综合得分 ≥ 15(过滤完全中性信号)
|
||||
|
||||
### 查看Gate统计
|
||||
|
||||
```bash
|
||||
docker compose exec scheduler python -c "
|
||||
from signals.llm_gate import LLMGate
|
||||
gate = LLMGate()
|
||||
stats = gate.get_stats()
|
||||
print(f'今日调用: {stats[\"today_calls\"]}/{stats[\"max_calls_per_day\"]}')
|
||||
print(f'剩余配额: {stats[\"remaining_calls_today\"]}')
|
||||
print(f'距离上次: {stats[\"minutes_since_last_call\"]:.1f} 分钟' if stats['minutes_since_last_call'] else '从未调用')
|
||||
"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 监控和日志
|
||||
|
||||
### 查看实时日志
|
||||
|
||||
```bash
|
||||
# 数据采集日志
|
||||
docker compose logs -f ingestion
|
||||
|
||||
# 信号生成日志
|
||||
docker compose logs -f scheduler
|
||||
|
||||
# 所有服务日志
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### 日志关键信息
|
||||
|
||||
**数据采集 (ingestion)**:
|
||||
```
|
||||
Health Check | WebSocket: ✓ | Redis: ✓ | Buffer: 0.5% | Written: 12345
|
||||
```
|
||||
|
||||
**信号生成 (scheduler)**:
|
||||
```
|
||||
📊 开始生成交易信号 - 2025-11-30 13:23:24
|
||||
✅ 市场分析完成 - 价格: $91,650.10, 趋势: 上涨
|
||||
📈 量化信号: BUY (得分: 51.5)
|
||||
✅ LLM Gate: PASSED - 信号类型: BUY, 综合得分: 51.5
|
||||
🤖 LLM信号: BUY (置信度: 60.00%)
|
||||
🎯 最终信号: BUY (置信度: 75.00%)
|
||||
💾 信号已保存到: /app/output/latest_signal.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 常用命令
|
||||
|
||||
### 启动/停止服务
|
||||
|
||||
```bash
|
||||
# 只启动数据采集
|
||||
docker compose up -d
|
||||
|
||||
# 启动数据采集 + 信号调度
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 停止所有服务
|
||||
docker compose down
|
||||
|
||||
# 重启某个服务
|
||||
docker compose restart scheduler
|
||||
docker compose restart ingestion
|
||||
```
|
||||
|
||||
### 查看状态
|
||||
|
||||
```bash
|
||||
# 查看运行状态
|
||||
docker compose ps
|
||||
|
||||
# 查看资源使用
|
||||
docker stats tradus-ingestion tradus-scheduler
|
||||
|
||||
# 查看网络
|
||||
docker network inspect realtime-ingestion_tradus-network
|
||||
```
|
||||
|
||||
### 进入容器
|
||||
|
||||
```bash
|
||||
# 进入数据采集容器
|
||||
docker compose exec ingestion bash
|
||||
|
||||
# 进入调度器容器
|
||||
docker compose exec scheduler bash
|
||||
|
||||
# 进入Redis
|
||||
docker compose exec redis redis-cli
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 问题1: scheduler未启动
|
||||
|
||||
**症状**: `docker compose ps` 看不到 `tradus-scheduler`
|
||||
|
||||
**原因**: 默认情况下scheduler是profile服务,不会自动启动
|
||||
|
||||
**解决**:
|
||||
```bash
|
||||
docker compose --profile scheduler up -d
|
||||
```
|
||||
|
||||
### 问题2: LLM总是被Gate拦截
|
||||
|
||||
**症状**: 日志显示 `🚫 LLM Gate: BLOCKED`
|
||||
|
||||
**可能原因**:
|
||||
1. 综合得分太低 (< 15)
|
||||
2. 调用频率太高 (< 15分钟)
|
||||
3. 今日配额用完 (≥ 12次)
|
||||
|
||||
**解决**:
|
||||
```bash
|
||||
# 查看Gate状态
|
||||
docker compose exec scheduler python -c "from signals.llm_gate import LLMGate; print(LLMGate().get_stats())"
|
||||
|
||||
# 降低综合得分门槛 (修改 .env)
|
||||
LLM_MIN_COMPOSITE_SCORE=10.0
|
||||
|
||||
# 增加每日配额 (修改 .env)
|
||||
LLM_MAX_CALLS_PER_DAY=20
|
||||
|
||||
# 重启服务
|
||||
docker compose --profile scheduler restart scheduler
|
||||
```
|
||||
|
||||
### 问题3: 生成信号失败
|
||||
|
||||
**症状**: 日志显示 `❌ 信号生成失败`
|
||||
|
||||
**可能原因**:
|
||||
1. Redis数据不足
|
||||
2. K线数据 < 100根
|
||||
|
||||
**解决**:
|
||||
```bash
|
||||
# 检查Redis数据
|
||||
docker compose exec redis redis-cli
|
||||
> XLEN binance:raw:kline:5m
|
||||
|
||||
# 等待数据累积(至少20分钟)
|
||||
# 或手动从Binance API获取历史数据
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 性能优化
|
||||
|
||||
### 调整信号生成间隔
|
||||
|
||||
根据交易策略调整:
|
||||
|
||||
- **高频策略**: 1-5分钟
|
||||
- **中频策略**: 5-15分钟(推荐)
|
||||
- **低频策略**: 15-60分钟
|
||||
|
||||
### 调整LLM调用频率
|
||||
|
||||
在 `.env` 中配置:
|
||||
|
||||
```bash
|
||||
# 保守模式(节省成本)
|
||||
LLM_MAX_CALLS_PER_DAY=5
|
||||
LLM_MIN_INTERVAL_MINUTES=30
|
||||
LLM_MIN_COMPOSITE_SCORE=20.0
|
||||
|
||||
# 激进模式(更多LLM分析)
|
||||
LLM_MAX_CALLS_PER_DAY=20
|
||||
LLM_MIN_INTERVAL_MINUTES=10
|
||||
LLM_MIN_COMPOSITE_SCORE=10.0
|
||||
|
||||
# 平衡模式(推荐)
|
||||
LLM_MAX_CALLS_PER_DAY=12
|
||||
LLM_MIN_INTERVAL_MINUTES=15
|
||||
LLM_MIN_COMPOSITE_SCORE=15.0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 推荐使用方式
|
||||
|
||||
### 开发/测试阶段
|
||||
```bash
|
||||
# 只运行数据采集,手动测试信号生成
|
||||
docker compose up -d
|
||||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
### 生产/自动化阶段
|
||||
```bash
|
||||
# 运行数据采集 + 自动信号生成
|
||||
docker compose --profile scheduler up -d
|
||||
|
||||
# 配置LLM API key(在docker-compose.yml中)
|
||||
# 监控日志
|
||||
docker compose logs -f scheduler
|
||||
```
|
||||
|
||||
### 回测/分析阶段
|
||||
```bash
|
||||
# 只运行数据采集,积累历史数据
|
||||
docker compose up -d
|
||||
|
||||
# 定期导出数据用于回测
|
||||
# (后续可以开发专门的回测工具)
|
||||
```
|
||||
@ -1,38 +0,0 @@
|
||||
# 🚀 快速开始
|
||||
|
||||
## 一键运行命令
|
||||
|
||||
```bash
|
||||
cd /Users/aaron/source_code/tradus-ai/realtime-ingestion
|
||||
|
||||
# 1️⃣ 生成交易信号(含 AI 分析)
|
||||
./run_signal.sh
|
||||
|
||||
# 2️⃣ 查看最新信号
|
||||
./view_signal.sh
|
||||
|
||||
# 3️⃣ 查看实时数据
|
||||
./view_data.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 所有可用命令
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
| `./run_signal.sh` | 生成交易信号(每次调用 AI) |
|
||||
| `./run_signal_smart.sh` | 生成交易信号(智能门控,节省成本) |
|
||||
| `./view_signal.sh` | 查看最新信号 |
|
||||
| `./view_data.sh` | 查看实时数据 |
|
||||
| `make logs` | 查看系统日志 |
|
||||
| `make monitor` | 系统监控 |
|
||||
|
||||
---
|
||||
|
||||
## 💡 详细说明
|
||||
|
||||
查看完整使用指南:
|
||||
```bash
|
||||
cat USAGE.md
|
||||
```
|
||||
260
USAGE.md
260
USAGE.md
@ -1,260 +0,0 @@
|
||||
# 🚀 快速使用指南
|
||||
|
||||
## 📋 前置条件
|
||||
|
||||
确保 Docker 服务正在运行:
|
||||
```bash
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
如果服务未运行,先启动:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 运行交易信号分析
|
||||
|
||||
### 方式 1: 完整 AI 分析(推荐测试)
|
||||
每次都调用 Deepseek AI 进行深度分析:
|
||||
|
||||
```bash
|
||||
./run_signal.sh
|
||||
```
|
||||
|
||||
**特点**:
|
||||
- ✅ 每次运行都会调用 Deepseek AI
|
||||
- ✅ 获得量化 + AI 双重分析
|
||||
- ⚠️ 每次调用成本约 ¥0.005 元
|
||||
|
||||
---
|
||||
|
||||
### 方式 2: 智能门控模式(推荐生产)
|
||||
只在高质量信号时调用 AI,节省 95% 成本:
|
||||
|
||||
```bash
|
||||
./run_signal_smart.sh
|
||||
```
|
||||
|
||||
**特点**:
|
||||
- ✅ 自动判断是否需要 AI 分析
|
||||
- ✅ 节省 API 调用成本
|
||||
- ✅ 每天最多调用 5 次
|
||||
- ✅ 只在关键时刻使用 AI
|
||||
|
||||
**何时调用 AI**:
|
||||
- 综合得分 ≥ 20.0
|
||||
- 共识度 ≥ 0.75
|
||||
- 数据充足(≥50 根 K 线)
|
||||
- 属于高价值场景(趋势回调/真假突破等)
|
||||
|
||||
---
|
||||
|
||||
## 📊 查看结果
|
||||
|
||||
### 查看最新信号
|
||||
```bash
|
||||
./view_signal.sh
|
||||
```
|
||||
|
||||
**输出示例**:
|
||||
```
|
||||
════════════════════════════════════════════════════════════════
|
||||
📊 最新交易信号
|
||||
════════════════════════════════════════════════════════════════
|
||||
|
||||
🎯 最终信号: HOLD
|
||||
📈 置信度: 33%
|
||||
🤝 共识: CONSENSUS_HOLD
|
||||
📊 当前价格: $90,662.10
|
||||
|
||||
────────────────────────────────────────────────────────────────
|
||||
🔢 量化信号: HOLD (置信度: 25%)
|
||||
综合得分: -2.6
|
||||
趋势: 23.1 | 动量: 5.0
|
||||
订单流: -47.6 | 突破: 0.0
|
||||
|
||||
────────────────────────────────────────────────────────────────
|
||||
🤖 AI 信号: HOLD (置信度: 40%)
|
||||
推理: 当前价格处于上涨后的回调阶段,RSI显示中性偏强...
|
||||
关键因素: RSI中性区域, MACD死叉收窄, 成交量萎缩
|
||||
|
||||
────────────────────────────────────────────────────────────────
|
||||
💡 建议: 量化和AI分析均建议观望,等待更好的机会
|
||||
════════════════════════════════════════════════════════════════
|
||||
```
|
||||
|
||||
### 查看实时数据
|
||||
```bash
|
||||
./view_data.sh
|
||||
```
|
||||
|
||||
**输出示例**:
|
||||
```
|
||||
════════════════════════════════════════════════════════════════
|
||||
📡 实时数据监控
|
||||
════════════════════════════════════════════════════════════════
|
||||
|
||||
📊 当前 BTC 价格:
|
||||
$ 90,662.10 (最新)
|
||||
$ 90,680.00 (5分钟最高)
|
||||
$ 90,640.00 (5分钟最低)
|
||||
成交量: 45.23 BTC
|
||||
|
||||
─────────────────────────────────────────────────────────────────
|
||||
|
||||
📈 数据流状态:
|
||||
kline:5m : 10,007 条消息
|
||||
kline:15m : 3,500 条消息
|
||||
kline:1h : 1,200 条消息
|
||||
trade : 50,000 条消息
|
||||
depth:20 : 80,000 条消息
|
||||
|
||||
─────────────────────────────────────────────────────────────────
|
||||
|
||||
🚀 服务状态:
|
||||
tradus-redis: Up
|
||||
tradus-ingestion: Up
|
||||
════════════════════════════════════════════════════════════════
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 查看完整 JSON 结果
|
||||
|
||||
```bash
|
||||
docker compose exec ingestion cat /app/output/latest_signal.json | python3 -m json.tool
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 高级用法
|
||||
|
||||
### 使用 Makefile 快捷命令
|
||||
|
||||
```bash
|
||||
# 查看所有可用命令
|
||||
make help
|
||||
|
||||
# 查看日志
|
||||
make logs
|
||||
|
||||
# 查看系统监控
|
||||
make monitor
|
||||
|
||||
# 进入 Redis CLI
|
||||
make redis-cli
|
||||
|
||||
# 重启服务
|
||||
make restart
|
||||
```
|
||||
|
||||
### 手动运行分析
|
||||
|
||||
```bash
|
||||
# 进入容器
|
||||
docker compose exec ingestion bash
|
||||
|
||||
# 设置 API Key
|
||||
export OPENAI_API_KEY='sk-9f6b56f08796435d988cf202e37f6ee3'
|
||||
export OPENAI_BASE_URL='https://api.deepseek.com'
|
||||
|
||||
# 运行市场分析
|
||||
python scripts/run_analysis.py
|
||||
|
||||
# 运行信号生成
|
||||
python scripts/generate_trading_signal.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 定时自动运行(可选)
|
||||
|
||||
### 使用 cron 定时任务
|
||||
|
||||
每 30 分钟运行一次(智能门控模式):
|
||||
|
||||
```bash
|
||||
# 编辑 crontab
|
||||
crontab -e
|
||||
|
||||
# 添加以下行:
|
||||
*/30 * * * * cd /Users/aaron/source_code/tradus-ai/realtime-ingestion && ./run_signal_smart.sh >> logs/signal.log 2>&1
|
||||
```
|
||||
|
||||
每小时运行一次(完整 AI 分析):
|
||||
|
||||
```bash
|
||||
0 * * * * cd /Users/aaron/source_code/tradus-ai/realtime-ingestion && ./run_signal.sh >> logs/signal.log 2>&1
|
||||
```
|
||||
|
||||
### 使用 watch 命令持续监控
|
||||
|
||||
```bash
|
||||
# 每 5 分钟运行一次
|
||||
watch -n 300 ./run_signal_smart.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📌 常见问题
|
||||
|
||||
### Q: 如何切换 LLM 服务商?
|
||||
|
||||
**使用 Claude**:
|
||||
```bash
|
||||
export ANTHROPIC_API_KEY='your-claude-key'
|
||||
# 然后修改 scripts/generate_trading_signal.py 中的
|
||||
# LLMDecisionMaker(provider='claude')
|
||||
```
|
||||
|
||||
**使用 OpenAI GPT**:
|
||||
```bash
|
||||
export OPENAI_API_KEY='your-openai-key'
|
||||
unset OPENAI_BASE_URL # 删除 Deepseek 的 base_url
|
||||
```
|
||||
|
||||
### Q: 如何调整门控参数?
|
||||
|
||||
编辑 `.env` 文件:
|
||||
```bash
|
||||
LLM_GATE_ENABLED=true
|
||||
LLM_MIN_CONSENSUS=0.75 # 共识度阈值
|
||||
LLM_MIN_COMPOSITE_SCORE=40 # 综合得分阈值
|
||||
LLM_MAX_CALLS_PER_DAY=5 # 每天最多调用次数
|
||||
```
|
||||
|
||||
### Q: 数据不足怎么办?
|
||||
|
||||
系统会自动从 Binance API 获取历史数据。如果仍然提示数据不足,请等待:
|
||||
- 5分钟图: 需要约 17 小时积累 200 根 K 线
|
||||
- 或让系统持续运行,会自动补全历史数据
|
||||
|
||||
---
|
||||
|
||||
## 🎓 下一步
|
||||
|
||||
1. **了解信号含义**: 查看生成的 JSON 结果,理解各个字段
|
||||
2. **调整参数**: 根据自己的交易风格调整门控阈值
|
||||
3. **集成通知**: 添加 Telegram/钉钉通知高质量信号
|
||||
4. **回测验证**: 使用历史数据验证信号准确性
|
||||
|
||||
---
|
||||
|
||||
## 📞 获取帮助
|
||||
|
||||
查看日志:
|
||||
```bash
|
||||
make logs
|
||||
```
|
||||
|
||||
查看系统状态:
|
||||
```bash
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
查看 Redis 数据:
|
||||
```bash
|
||||
make redis-cli
|
||||
```
|
||||
@ -1,20 +0,0 @@
|
||||
# Data processing
|
||||
pandas==2.1.4
|
||||
numpy==1.26.2
|
||||
|
||||
# Technical analysis
|
||||
pandas-ta==0.3.14b0
|
||||
|
||||
# Redis client
|
||||
redis==5.0.1
|
||||
|
||||
# JSON handling
|
||||
orjson==3.9.10
|
||||
|
||||
# Configuration
|
||||
pydantic==2.5.3
|
||||
pydantic-settings==2.1.0
|
||||
python-dotenv==1.0.0
|
||||
|
||||
# Utilities
|
||||
python-dateutil==2.8.2
|
||||
@ -1,71 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Preview DingTalk message format using saved signal"""
|
||||
import json
|
||||
import sys
|
||||
|
||||
# Add current directory to path
|
||||
sys.path.insert(0, '/Users/aaron/source_code/tradus-ai/realtime-ingestion')
|
||||
|
||||
from notifiers.dingtalk import DingTalkNotifier
|
||||
|
||||
# Load the saved signal
|
||||
with open('/Users/aaron/source_code/tradus-ai/realtime-ingestion/output/latest_signal.json', 'r') as f:
|
||||
signal = json.load(f)
|
||||
|
||||
# Create DingTalk notifier (without webhook for preview only)
|
||||
notifier = DingTalkNotifier(webhook_url=None, enabled=False)
|
||||
|
||||
# Debug: Check signal structure
|
||||
print("Signal keys:", list(signal.keys()))
|
||||
|
||||
# Format the message
|
||||
aggregated_signal = signal.get('aggregated_signal', {})
|
||||
if not aggregated_signal:
|
||||
print("ERROR: aggregated_signal is empty!")
|
||||
aggregated_signal = signal # Maybe the whole signal is the aggregated_signal
|
||||
|
||||
print("Aggregated signal keys:", list(aggregated_signal.keys()) if aggregated_signal else "None")
|
||||
|
||||
try:
|
||||
markdown = notifier._format_signal_markdown(aggregated_signal)
|
||||
except Exception as e:
|
||||
print(f"ERROR formatting markdown: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
markdown = "Error formatting message"
|
||||
|
||||
print("=" * 80)
|
||||
print("📱 DINGTALK MESSAGE PREVIEW")
|
||||
print("=" * 80)
|
||||
print(markdown)
|
||||
print("=" * 80)
|
||||
|
||||
# Show data structure for debugging
|
||||
print("\n\n")
|
||||
print("=" * 80)
|
||||
print("📊 DATA STRUCTURE DEBUG")
|
||||
print("=" * 80)
|
||||
|
||||
llm_signal = aggregated_signal.get('llm_signal', {})
|
||||
opportunities = llm_signal.get('opportunities', {})
|
||||
recommendations = llm_signal.get('recommendations_by_timeframe', {})
|
||||
|
||||
print("\nopportunities keys:")
|
||||
for key in opportunities.keys():
|
||||
print(f" - {key}")
|
||||
|
||||
print("\nshort_term_5m_15m_1h:")
|
||||
short_term = opportunities.get('short_term_5m_15m_1h', {})
|
||||
print(f" exists: {short_term.get('exists')}")
|
||||
print(f" direction: {short_term.get('direction')}")
|
||||
print(f" reasoning: {short_term.get('reasoning', '')[:100]}...")
|
||||
|
||||
print("\nmedium_term_4h_1d:")
|
||||
medium_term = opportunities.get('medium_term_4h_1d', {})
|
||||
print(f" exists: {medium_term.get('exists')}")
|
||||
print(f" reasoning: {medium_term.get('reasoning', '')[:100]}...")
|
||||
|
||||
print("\nrecommendations_by_timeframe:")
|
||||
print(f" short_term: {recommendations.get('short_term', '')[:100]}...")
|
||||
print(f" medium_term: {recommendations.get('medium_term', '')[:100]}...")
|
||||
print(f" long_term: {recommendations.get('long_term', '')[:100]}...")
|
||||
115
run_analysis.sh
115
run_analysis.sh
@ -1,115 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 运行量化+LLM分析(可控制Gate)
|
||||
#
|
||||
# 用法:
|
||||
# ./run_analysis.sh # 使用Gate(智能过滤)
|
||||
# ./run_analysis.sh --no-gate # 强制调用LLM(绕过Gate)
|
||||
# ./run_analysis.sh --help # 显示帮助
|
||||
|
||||
set -e
|
||||
|
||||
# 颜色定义
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 显示帮助
|
||||
show_help() {
|
||||
echo "📊 交易信号分析工具"
|
||||
echo ""
|
||||
echo "用法:"
|
||||
echo " ./run_analysis.sh [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " --no-gate, -n 强制调用LLM(绕过Gate,每次都分析)"
|
||||
echo " --gate, -g 使用Gate(默认,智能过滤低质量信号)"
|
||||
echo " --help, -h 显示此帮助信息"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " ./run_analysis.sh # 智能模式(推荐)"
|
||||
echo " ./run_analysis.sh --no-gate # 强制LLM分析"
|
||||
echo ""
|
||||
echo "说明:"
|
||||
echo " • Gate模式: 只有综合得分≥5.0的信号才会调用LLM(节省成本)"
|
||||
echo " • No-Gate模式: 每次都调用LLM(适合测试或重要行情)"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# 解析参数
|
||||
USE_GATE=true
|
||||
|
||||
if [ $# -gt 0 ]; then
|
||||
case "$1" in
|
||||
--no-gate|-n)
|
||||
USE_GATE=false
|
||||
;;
|
||||
--gate|-g)
|
||||
USE_GATE=true
|
||||
;;
|
||||
--help|-h)
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
echo "❌ 未知参数: $1"
|
||||
echo "使用 --help 查看帮助"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# 显示运行模式
|
||||
echo -e "${BLUE}🚀 开始生成交易信号...${NC}"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
if [ "$USE_GATE" = false ]; then
|
||||
echo -e "${YELLOW}⚠️ 模式: 强制LLM分析(绕过Gate)${NC}"
|
||||
echo " 每次都会调用 DeepSeek AI"
|
||||
else
|
||||
echo -e "${GREEN}✅ 模式: 智能Gate(推荐)${NC}"
|
||||
echo " 只有高质量信号才会调用 LLM"
|
||||
fi
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# 检查 scheduler 容器是否运行
|
||||
if ! docker compose ps scheduler 2>/dev/null | grep -q "running"; then
|
||||
echo -e "${YELLOW}⚠️ scheduler 容器未运行,正在启动...${NC}"
|
||||
docker compose --profile scheduler up -d
|
||||
echo "⏳ 等待服务就绪..."
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# 运行分析
|
||||
if [ "$USE_GATE" = false ]; then
|
||||
# 绕过Gate:临时设置极低阈值
|
||||
docker compose exec scheduler python -c "
|
||||
import os
|
||||
os.environ['LLM_MIN_COMPOSITE_SCORE'] = '0.0' # 绕过Gate
|
||||
|
||||
# 运行分析
|
||||
import sys
|
||||
sys.path.insert(0, '/app')
|
||||
from scripts.generate_trading_signal import main
|
||||
main()
|
||||
"
|
||||
else
|
||||
# 正常使用Gate
|
||||
docker compose exec scheduler python /app/scripts/generate_trading_signal.py
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo -e "${GREEN}✅ 信号生成完成!${NC}"
|
||||
echo ""
|
||||
echo "📊 查看结果:"
|
||||
echo " ./view_signal.sh"
|
||||
echo " cat output/latest_signal.json | python -m json.tool"
|
||||
echo ""
|
||||
echo "📱 钉钉通知:"
|
||||
if docker compose logs scheduler --tail 20 | grep -q "钉钉消息发送成功"; then
|
||||
echo -e " ${GREEN}✅ 已发送${NC}"
|
||||
else
|
||||
echo -e " ${YELLOW}⚠️ 未发送(可能是HOLD信号)${NC}"
|
||||
fi
|
||||
25
run_llm.sh
25
run_llm.sh
@ -1,25 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 运行量化+LLM完整分析(Gate关闭,每次都调用LLM)
|
||||
|
||||
echo "🚀 运行完整分析(量化 + DeepSeek AI)"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "⚠️ Gate已关闭 - 每次都会调用 DeepSeek"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# 检查容器
|
||||
if ! docker compose ps scheduler 2>/dev/null | grep -q "running"; then
|
||||
echo "⚠️ 启动 scheduler..."
|
||||
docker compose --profile scheduler up -d
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# 临时降低Gate阈值到0,强制调用LLM,并发送钉钉消息
|
||||
docker compose exec scheduler bash -c '
|
||||
export LLM_MIN_COMPOSITE_SCORE=0.0
|
||||
python /app/scripts/generate_trading_signal.py --send-dingtalk
|
||||
'
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✅ 完成!查看结果: ./view_signal.sh"
|
||||
@ -1,27 +1,18 @@
|
||||
#!/bin/bash
|
||||
# 运行交易信号生成器(量化 + LLM 一体分析)
|
||||
# 运行交易信号生成器
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
set -e
|
||||
|
||||
echo "开始生成交易信号..."
|
||||
echo "Generating Trading Signal..."
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# 检查 scheduler 容器是否运行
|
||||
if ! docker compose ps scheduler | grep -q "running"; then
|
||||
echo "scheduler 容器未运行,正在启动..."
|
||||
docker compose up -d
|
||||
echo "等待服务就绪..."
|
||||
sleep 3
|
||||
fi
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# 运行信号生成
|
||||
docker compose exec scheduler python /app/scripts/generate_trading_signal.py
|
||||
# Run locally with Python
|
||||
python scripts/generate_trading_signal.py "$@"
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "信号生成完成!"
|
||||
echo "Signal generation complete!"
|
||||
echo ""
|
||||
echo "查看完整结果:"
|
||||
echo " cat output/latest_signal.json | python -m json.tool"
|
||||
echo ""
|
||||
echo "如果是 BUY/SELL 信号,已自动发送钉钉通知"
|
||||
echo "View result: ./view_signal.sh"
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 运行交易信号生成器(智能门控 - 只在高质量信号时调用AI,节省成本)
|
||||
|
||||
# 设置 Deepseek API
|
||||
export OPENAI_API_KEY='sk-9f6b56f08796435d988cf202e37f6ee3'
|
||||
export OPENAI_BASE_URL='https://api.deepseek.com'
|
||||
export LLM_GATE_ENABLED=true # 启用智能门控,节省95%成本
|
||||
|
||||
# 运行信号生成
|
||||
docker compose exec ingestion bash -c "
|
||||
export OPENAI_API_KEY='$OPENAI_API_KEY'
|
||||
export OPENAI_BASE_URL='$OPENAI_BASE_URL'
|
||||
export LLM_GATE_ENABLED=$LLM_GATE_ENABLED
|
||||
python scripts/generate_trading_signal.py
|
||||
"
|
||||
@ -1,33 +1,28 @@
|
||||
#!/bin/bash
|
||||
# 启动信号生成服务
|
||||
|
||||
echo "🚀 启动 Tradus AI 信号生成服务..."
|
||||
echo "Starting Tradus AI Signal Generator..."
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# 启动服务
|
||||
docker compose up -d
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Build and start service
|
||||
docker compose up -d --build
|
||||
|
||||
echo ""
|
||||
echo "⏳ 等待服务就绪..."
|
||||
echo "Waiting for service to be ready..."
|
||||
sleep 3
|
||||
|
||||
# 检查服务状态
|
||||
# Check status
|
||||
echo ""
|
||||
echo "📊 服务状态:"
|
||||
echo "Service Status:"
|
||||
docker compose ps
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✅ 系统启动完成!"
|
||||
echo "System started!"
|
||||
echo ""
|
||||
echo "📝 说明:"
|
||||
echo " • Scheduler: 每15分钟自动从 Binance API 获取数据并生成交易信号"
|
||||
echo " • 无需 Redis 依赖,直接通过 API 获取实时数据"
|
||||
echo ""
|
||||
echo "📱 钉钉通知: BUY/SELL 信号会自动推送"
|
||||
echo ""
|
||||
echo "📖 常用命令:"
|
||||
echo " 查看日志: docker compose logs -f scheduler"
|
||||
echo " 手动生成信号: ./run_signal.sh"
|
||||
echo " 查看最新信号: cat output/latest_signal.json | python -m json.tool"
|
||||
echo " 停止系统: ./stop_system.sh"
|
||||
echo "Commands:"
|
||||
echo " View logs: docker compose logs -f scheduler"
|
||||
echo " Stop system: ./stop_system.sh"
|
||||
echo " View signal: ./view_signal.sh"
|
||||
|
||||
10
view_logs.sh
10
view_logs.sh
@ -1,10 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 查看系统日志
|
||||
|
||||
SERVICE=${1:-scheduler} # 默认查看 scheduler
|
||||
|
||||
echo "📋 查看 $SERVICE 日志 (按 Ctrl+C 退出)"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
docker compose logs -f --tail 50 $SERVICE
|
||||
@ -1,45 +1,16 @@
|
||||
#!/bin/bash
|
||||
# 查看最新交易信号
|
||||
|
||||
set -e
|
||||
|
||||
echo "📊 最新交易信号"
|
||||
echo "Latest Trading Signal"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
if [ ! -f "output/latest_signal.json" ]; then
|
||||
echo "❌ 未找到信号文件"
|
||||
echo "💡 运行 ./run_signal.sh 生成新信号"
|
||||
echo "No signal file found"
|
||||
echo "Run ./run_signal.sh to generate a new signal"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 使用 jq 格式化显示(如果安装了)
|
||||
if command -v jq &> /dev/null; then
|
||||
cat output/latest_signal.json | jq '
|
||||
{
|
||||
"信号": .final_signal,
|
||||
"置信度": (.final_confidence * 100 | tostring + "%"),
|
||||
"共识": .consensus,
|
||||
"当前价格": ("$" + (.levels.current_price | tostring)),
|
||||
"生成时间": .generated_at,
|
||||
"量化信号": {
|
||||
"信号": .quantitative_signal.signal,
|
||||
"综合得分": .quantitative_signal.composite_score,
|
||||
"推理": .quantitative_signal.reasoning
|
||||
},
|
||||
"LLM信号": (
|
||||
if .llm_signal then {
|
||||
"信号": .llm_signal.signal,
|
||||
"置信度": (.llm_signal.confidence * 100 | tostring + "%"),
|
||||
"推理": .llm_signal.reasoning
|
||||
} else "未启用" end
|
||||
)
|
||||
}'
|
||||
else
|
||||
# 使用 Python 格式化
|
||||
cat output/latest_signal.json | python -m json.tool
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "💡 查看完整信号: cat output/latest_signal.json | python -m json.tool"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user