This commit is contained in:
aaron 2025-12-04 01:36:32 +08:00
parent b404721e16
commit 1ec9030d1e
17 changed files with 25 additions and 2437 deletions

View File

@ -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. **可观测性**
- 详细日志
- 健康检查
- 统计信息

View File

@ -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深度分析机会

View File

@ -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`
- 在钉钉群中查看通知消息
祝交易顺利!🚀

View File

@ -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}&timestamp={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

View File

@ -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

View File

@ -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
# 定期导出数据用于回测
# (后续可以开发专门的回测工具)
```

View File

@ -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
View File

@ -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
```

View File

@ -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

View File

@ -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]}...")

View File

@ -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

View File

@ -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"

View File

@ -1,27 +1,18 @@
#!/bin/bash #!/bin/bash
# 运行交易信号生成器(量化 + LLM 一体分析) # 运行交易信号生成器
set -e # 遇到错误立即退出 set -e
echo "开始生成交易信号..." echo "Generating Trading Signal..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# 检查 scheduler 容器是否运行 cd "$(dirname "$0")"
if ! docker compose ps scheduler | grep -q "running"; then
echo "scheduler 容器未运行,正在启动..."
docker compose up -d
echo "等待服务就绪..."
sleep 3
fi
# 运行信号生成 # Run locally with Python
docker compose exec scheduler python /app/scripts/generate_trading_signal.py python scripts/generate_trading_signal.py "$@"
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "信号生成完成!" echo "Signal generation complete!"
echo "" echo ""
echo "查看完整结果:" echo "View result: ./view_signal.sh"
echo " cat output/latest_signal.json | python -m json.tool"
echo ""
echo "如果是 BUY/SELL 信号,已自动发送钉钉通知"

View File

@ -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
"

View File

@ -1,33 +1,28 @@
#!/bin/bash #!/bin/bash
# 启动信号生成服务 # 启动信号生成服务
echo "🚀 启动 Tradus AI 信号生成服务..." echo "Starting Tradus AI Signal Generator..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# 启动服务 cd "$(dirname "$0")"
docker compose up -d
# Build and start service
docker compose up -d --build
echo "" echo ""
echo "⏳ 等待服务就绪..." echo "Waiting for service to be ready..."
sleep 3 sleep 3
# 检查服务状态 # Check status
echo "" echo ""
echo "📊 服务状态:" echo "Service Status:"
docker compose ps docker compose ps
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ 系统启动完成!" echo "System started!"
echo "" echo ""
echo "📝 说明:" echo "Commands:"
echo " • Scheduler: 每15分钟自动从 Binance API 获取数据并生成交易信号" echo " View logs: docker compose logs -f scheduler"
echo " • 无需 Redis 依赖,直接通过 API 获取实时数据" echo " Stop system: ./stop_system.sh"
echo "" echo " View signal: ./view_signal.sh"
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"

View File

@ -1,10 +0,0 @@
#!/bin/bash
# 查看系统日志
SERVICE=${1:-scheduler} # 默认查看 scheduler
echo "📋 查看 $SERVICE 日志 (按 Ctrl+C 退出)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
docker compose logs -f --tail 50 $SERVICE

View File

@ -1,45 +1,16 @@
#!/bin/bash #!/bin/bash
# 查看最新交易信号 # 查看最新交易信号
set -e echo "Latest Trading Signal"
echo "📊 最新交易信号"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if [ ! -f "output/latest_signal.json" ]; then if [ ! -f "output/latest_signal.json" ]; then
echo "❌ 未找到信号文件" echo "No signal file found"
echo "💡 运行 ./run_signal.sh 生成新信号" echo "Run ./run_signal.sh to generate a new signal"
exit 1 exit 1
fi fi
# 使用 jq 格式化显示(如果安装了) cat output/latest_signal.json | python -m json.tool
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 "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "💡 查看完整信号: cat output/latest_signal.json | python -m json.tool"