From 1ec9030d1eccd724551a6d16827485238278b29d Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 4 Dec 2025 01:36:32 +0800 Subject: [PATCH] 1 --- ARCHITECTURE.md | 309 --------------------------- CLEANUP_SUMMARY.md | 131 ------------ DINGTALK_SETUP.md | 363 ------------------------------- NOTIFICATION_SUMMARY.md | 339 ----------------------------- QUICK_START.md | 250 ---------------------- SIGNAL_GENERATION_GUIDE.md | 423 ------------------------------------- START_HERE.md | 38 ---- USAGE.md | 260 ----------------------- analysis/requirements.txt | 20 -- preview_message.py | 71 ------- run_analysis.sh | 115 ---------- run_llm.sh | 25 --- run_signal.sh | 25 +-- run_signal_smart.sh | 15 -- start_system.sh | 31 ++- view_logs.sh | 10 - view_signal.sh | 37 +--- 17 files changed, 25 insertions(+), 2437 deletions(-) delete mode 100644 ARCHITECTURE.md delete mode 100644 CLEANUP_SUMMARY.md delete mode 100644 DINGTALK_SETUP.md delete mode 100644 NOTIFICATION_SUMMARY.md delete mode 100644 QUICK_START.md delete mode 100644 SIGNAL_GENERATION_GUIDE.md delete mode 100755 START_HERE.md delete mode 100644 USAGE.md delete mode 100644 analysis/requirements.txt delete mode 100644 preview_message.py delete mode 100644 run_analysis.sh delete mode 100755 run_llm.sh delete mode 100755 run_signal_smart.sh delete mode 100755 view_logs.sh diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md deleted file mode 100644 index 6a8c128..0000000 --- a/ARCHITECTURE.md +++ /dev/null @@ -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. **可观测性** - - 详细日志 - - 健康检查 - - 统计信息 diff --git a/CLEANUP_SUMMARY.md b/CLEANUP_SUMMARY.md deleted file mode 100644 index 3361d91..0000000 --- a/CLEANUP_SUMMARY.md +++ /dev/null @@ -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深度分析机会 diff --git a/DINGTALK_SETUP.md b/DINGTALK_SETUP.md deleted file mode 100644 index 7e94653..0000000 --- a/DINGTALK_SETUP.md +++ /dev/null @@ -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` -- 在钉钉群中查看通知消息 - -祝交易顺利!🚀 diff --git a/NOTIFICATION_SUMMARY.md b/NOTIFICATION_SUMMARY.md deleted file mode 100644 index 48a3bc0..0000000 --- a/NOTIFICATION_SUMMARY.md +++ /dev/null @@ -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 diff --git a/QUICK_START.md b/QUICK_START.md deleted file mode 100644 index 7a23b12..0000000 --- a/QUICK_START.md +++ /dev/null @@ -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 diff --git a/SIGNAL_GENERATION_GUIDE.md b/SIGNAL_GENERATION_GUIDE.md deleted file mode 100644 index f8de8a1..0000000 --- a/SIGNAL_GENERATION_GUIDE.md +++ /dev/null @@ -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 - -# 定期导出数据用于回测 -# (后续可以开发专门的回测工具) -``` diff --git a/START_HERE.md b/START_HERE.md deleted file mode 100755 index c2cc89e..0000000 --- a/START_HERE.md +++ /dev/null @@ -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 -``` diff --git a/USAGE.md b/USAGE.md deleted file mode 100644 index ad3d3aa..0000000 --- a/USAGE.md +++ /dev/null @@ -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 -``` diff --git a/analysis/requirements.txt b/analysis/requirements.txt deleted file mode 100644 index 9bc68ff..0000000 --- a/analysis/requirements.txt +++ /dev/null @@ -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 diff --git a/preview_message.py b/preview_message.py deleted file mode 100644 index e0ccb58..0000000 --- a/preview_message.py +++ /dev/null @@ -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]}...") diff --git a/run_analysis.sh b/run_analysis.sh deleted file mode 100644 index f95c8a2..0000000 --- a/run_analysis.sh +++ /dev/null @@ -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 diff --git a/run_llm.sh b/run_llm.sh deleted file mode 100755 index 17649a9..0000000 --- a/run_llm.sh +++ /dev/null @@ -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" diff --git a/run_signal.sh b/run_signal.sh index f97b5f5..a83be84 100755 --- a/run_signal.sh +++ b/run_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" diff --git a/run_signal_smart.sh b/run_signal_smart.sh deleted file mode 100755 index 39b3d8c..0000000 --- a/run_signal_smart.sh +++ /dev/null @@ -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 -" diff --git a/start_system.sh b/start_system.sh index d591bb2..7fff68b 100755 --- a/start_system.sh +++ b/start_system.sh @@ -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" diff --git a/view_logs.sh b/view_logs.sh deleted file mode 100755 index b182f80..0000000 --- a/view_logs.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# 查看系统日志 - -SERVICE=${1:-scheduler} # 默认查看 scheduler - -echo "📋 查看 $SERVICE 日志 (按 Ctrl+C 退出)" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "" - -docker compose logs -f --tail 50 $SERVICE diff --git a/view_signal.sh b/view_signal.sh index 23c36f7..540dd81 100755 --- a/view_signal.sh +++ b/view_signal.sh @@ -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 +cat output/latest_signal.json | python -m json.tool echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "💡 查看完整信号: cat output/latest_signal.json | python -m json.tool"