From 0a0bcd941bd48d34e737bef29aee5e1e55a75400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sun, 1 Feb 2026 20:45:18 +0800 Subject: [PATCH] a --- docs/ENTRY_CONTEXT_入场思路记录.md | 57 ++++ ...据分析_2026-01-27_优化效果评估.md | 275 ++++++++++++++++++ docs/交易策略问题诊断_2026-01-28.md | 186 ++++++++++++ docs/全局配置与数据库同步.md | 53 ++++ ...为止损问题修复总结_2026-01-27.md | 161 ++++++++++ ...标记为止损问题分析_2026-01-27.md | 191 ++++++++++++ docs/策略执行分析_2026-01-30.md | 123 ++++++++ docs/策略执行分析_2026-01-31.md | 130 +++++++++ docs/策略调整建议_2026-01-28.md | 74 +++++ trading_system/strategy.py | 72 +++-- trading_system/trade_recommender.py | 50 ++-- 11 files changed, 1324 insertions(+), 48 deletions(-) create mode 100644 docs/ENTRY_CONTEXT_入场思路记录.md create mode 100644 docs/交易数据分析_2026-01-27_优化效果评估.md create mode 100644 docs/交易策略问题诊断_2026-01-28.md create mode 100644 docs/全局配置与数据库同步.md create mode 100644 docs/盈利单被错误标记为止损问题修复总结_2026-01-27.md create mode 100644 docs/盈利单被错误标记为止损问题分析_2026-01-27.md create mode 100644 docs/策略执行分析_2026-01-30.md create mode 100644 docs/策略执行分析_2026-01-31.md create mode 100644 docs/策略调整建议_2026-01-28.md diff --git a/docs/ENTRY_CONTEXT_入场思路记录.md b/docs/ENTRY_CONTEXT_入场思路记录.md new file mode 100644 index 0000000..4c26a74 --- /dev/null +++ b/docs/ENTRY_CONTEXT_入场思路记录.md @@ -0,0 +1,57 @@ +# 入场思路记录(entry_context) + +## 目的 + +把「入场原因 + 经历的思路/过程」写入每笔订单,便于事后综合分析策略执行效果: +不仅看结果(盈/亏、止盈/止损),还能看过程(当时信号强度、市场状态、过滤是否通过等),分析更准确、优化更有依据。 + +## 实现方式 + +- **数据库**:`trades` 表新增字段 `entry_context`(JSON,可为空)。 +- **写入时机**:自动开仓且订单成交后,在保存交易记录时一并写入。 +- **内容**:由策略在开仓前构建一个字典,经 `position_manager` 传给 `Trade.create`,以 JSON 存入。 + +## entry_context 字段说明 + +每笔自动开仓订单的 `entry_context` 目前包含(示例): + +| 键 | 类型 | 说明 | +|----|------|------| +| `signal_strength` | int | 信号强度 0–10 | +| `market_regime` | str | 市场状态,如 trending / ranging | +| `trend_4h` | str | 4H 趋势方向(来自策略) | +| `change_percent` | float | 24h 涨跌幅(%) | +| `direction` | str | 交易方向 BUY/SELL | +| `reason` | str | 入场原因文本(与 entry_reason 一致) | +| `rsi` | float | 入场时 RSI(若有) | +| `volume_confirmed` | bool | 是否通过成交量确认 | +| `filters_passed` | list | 通过的过滤项,如 only_trending, should_trade, volume_ok, signal_ok | +| `macd_histogram` | float | 可选,MACD 柱状值 | +| `atr` | float | 可选,入场时 ATR | + +后续如需增加「经历的思路」(例如:短周期方向、趋势过滤结果、是否在冷却等),可在 strategy 里往同一 dict 里追加,再写入即可。 + +## 数据库迁移 + +首次使用需执行迁移,为 `trades` 表增加 `entry_context` 列: + +```bash +# 在 backend 目录或项目根目录执行(按你当前 DB 配置) +mysql -u your_user -p your_db < backend/database/add_entry_context.sql +``` + +若库中已有该列,脚本会跳过,不会重复添加。 + +## API 与导出 + +- **GET /api/trades**:返回的每条交易里会带 `entry_context`;若 DB 驱动返回的是 JSON 字符串,接口会先解析成对象再返回,便于前端或分析脚本使用。 +- **导出/统计**:凡基于该 API 或直接查 `trades` 的导出(如「交易记录_xxx.json」),只要包含 `entry_context` 字段,即可用于按「入场思路」做统计与归因分析。 + +## 分析时怎么用 + +- **按信号强度**:统计 `entry_context.signal_strength` 与胜率/盈亏比的关系(例如 8 分 vs 9 分的表现)。 +- **按市场状态**:对比 `market_regime=trending` 与 `ranging` 下的胜率和平均盈亏。 +- **按过滤通过情况**:看 `filters_passed` 与最终结果是否一致(例如 volume_ok 通过后是否仍常止损)。 +- **归因单笔**:某笔止损/止盈时,结合 `reason`、`trend_4h`、`rsi` 等还原当时决策依据,判断是信号问题、过滤不足还是行情突变。 + +这样就能在「只看结果」之外,用「过程 + 结果」一起评估和优化策略。 diff --git a/docs/交易数据分析_2026-01-27_优化效果评估.md b/docs/交易数据分析_2026-01-27_优化效果评估.md new file mode 100644 index 0000000..3db4fef --- /dev/null +++ b/docs/交易数据分析_2026-01-27_优化效果评估.md @@ -0,0 +1,275 @@ +# 交易数据分析 - 优化效果评估(2026-01-27) + +## 📊 最新统计数据 + +### 基本统计(最近几个小时) +- **总交易数**:39单 +- **胜率**:38.24% +- **总盈亏**:-0.21 USDT +- **平均盈亏**:-0.01 USDT +- **平均持仓时长**:59分钟 + +### 平仓原因分布 +- **止损**:29单(74.4%) +- **止盈**:1单(2.6%) +- **同步**:4单(10.3%) +- **其他**:5单(12.8%) + +### 盈亏比 +- **平均盈利 / 平均亏损**:1.56 : 1 +- **期望**:3:1 +- **差距**:仍然偏低 + +--- + +## 📈 对比分析 + +### 与之前统计对比 + +| 指标 | 之前(2026-01-27 02:26) | 现在(2026-01-27 07:00) | 变化 | +|------|-------------------------|-------------------------|------| +| 总交易数 | 20 | 39 | +19 | +| 胜率 | 35.7% | 38.24% | +2.54% ⬆️ | +| 止盈单比例 | 14.3% | 2.6% | -11.7% ⬇️ | +| 止损单比例 | 71.4% | 74.4% | +3.0% ⬆️ | +| 盈亏比 | 需要计算 | 1.56:1 | - | + +--- + +## 🚨 核心问题分析 + +### 问题1:止盈单比例大幅下降(严重) + +**现象**: +- 之前:14.3%(2/14) +- 现在:2.6%(1/39) +- **下降了11.7%** + +**可能原因**: +1. **止盈目标设置过低**:从20%降低到10%,可能导致止盈单更容易被回吐 +2. **市场波动**:价格达到10%后快速回落,未能及时止盈 +3. **止盈单挂单失败**:交易所止盈单可能未成功挂单 +4. **WebSocket监控延迟**:实时监控可能延迟,导致止盈触发不及时 + +**影响**: +- 盈利单无法及时止盈,最终回吐利润 +- 胜率提升有限(仅2.54%) +- 盈亏比仍然偏低(1.56:1 vs 期望3:1) + +--- + +### 问题2:止损单比例上升 + +**现象**: +- 之前:71.4% +- 现在:74.4% +- **上升了3.0%** + +**可能原因**: +1. **信号强度提升**:从5提升到7,但可能仍然不够严格 +2. **市场环境**:市场可能处于震荡或下跌趋势 +3. **止损设置**:止损可能仍然过宽,导致更多单子触发止损 + +**影响**: +- 胜率提升有限 +- 亏损单比例仍然很高 + +--- + +### 问题3:盈亏比仍然偏低 + +**现象**: +- 当前:1.56:1 +- 期望:3:1 +- **差距**:1.44:1 + +**可能原因**: +1. **止盈单比例过低**:只有1单止盈,无法形成有效的盈亏比 +2. **止损单亏损过大**:止损单的平均亏损可能仍然较大 +3. **止盈目标过低**:10%的止盈目标可能过低,无法形成有效的盈亏比 + +**影响**: +- 即使胜率提升,盈亏比仍然偏低,无法实现稳定盈利 + +--- + +## 🔍 详细分析 + +### 止盈单分析 + +**止盈单数量**:仅1单(2.6%) + +**问题**: +- 止盈单比例过低,说明大部分盈利单未能及时止盈 +- 10%的止盈目标可能过低,导致价格达到后快速回落 + +**建议**: +- 检查止盈单挂单是否成功 +- 检查WebSocket监控是否正常工作 +- 考虑提高止盈目标(从10%提升到12-15%) + +--- + +### 止损单分析 + +**止损单数量**:29单(74.4%) + +**问题**: +- 止损单比例仍然很高 +- 说明入场点选择可能仍然不够准确 + +**建议**: +- 进一步提高信号强度门槛(从7提升到8) +- 加强大盘Beta过滤(当前-0.5%,可能可以更严格) +- 检查止损设置是否合理 + +--- + +## ✅ 优化建议 + +### 建议1:提高止盈目标(紧急) + +**当前配置**: +- `TAKE_PROFIT_PERCENT`: 0.10(10%) + +**建议配置**: +- `TAKE_PROFIT_PERCENT`: **0.12**(12%)或**0.15**(15%) + +**理由**: +- 10%的止盈目标可能过低,容易被回吐 +- 提高止盈目标,更容易触发止盈,提升止盈单比例 +- 配合移动止损(5%激活,2.5%保护),可以保护利润 + +--- + +### 建议2:检查止盈单挂单逻辑 + +**检查项**: +1. 止盈单是否成功挂单到交易所 +2. WebSocket监控是否正常工作 +3. 止盈触发逻辑是否正确 + +**可能问题**: +- 止盈单挂单失败,导致无法自动止盈 +- WebSocket监控延迟,导致止盈触发不及时 + +--- + +### 建议3:进一步提高信号强度门槛 + +**当前配置**: +- `MIN_SIGNAL_STRENGTH`: 7 + +**建议配置**: +- `MIN_SIGNAL_STRENGTH`: **8** + +**理由**: +- 止损单比例仍然很高(74.4%) +- 提高信号强度门槛,减少垃圾信号 +- 虽然交易数量可能减少,但质量会提升 + +--- + +### 建议4:加强大盘Beta过滤 + +**当前配置**: +- `BETA_FILTER_THRESHOLD`: -0.005(-0.5%) + +**建议配置**: +- `BETA_FILTER_THRESHOLD`: **-0.003**(-0.3%)或**-0.002**(-0.2%) + +**理由**: +- 更敏感地过滤大盘风险 +- 减少在震荡市或下跌趋势中的交易 + +--- + +### 建议5:优化移动止损参数 + +**当前配置**: +- `TRAILING_STOP_ACTIVATION`: 0.05(5%) +- `TRAILING_STOP_PROTECT`: 0.025(2.5%) + +**建议配置**: +- `TRAILING_STOP_ACTIVATION`: **0.08**(8%) +- `TRAILING_STOP_PROTECT`: **0.04**(4%) + +**理由**: +- 5%激活可能过早,容易被震荡扫出 +- 提高激活阈值,给价格更多波动空间 +- 提高保护阈值,避免过早退出 + +--- + +## 📊 优化效果评估 + +### 已实施的优化 + +1. ✅ **大盘Beta过滤优化**:-0.03 → -0.005(-0.5%) +2. ✅ **止盈目标降低**:0.20 → 0.10(10%) +3. ✅ **动态追踪止损优化**:0.20 → 0.05(5%激活),0.10 → 0.025(2.5%保护) +4. ✅ **信号强度提升**:5 → 7 + +### 效果评估 + +**正面效果**: +- ✅ 胜率略有提升(35.7% → 38.24%,+2.54%) + +**负面效果**: +- ❌ 止盈单比例大幅下降(14.3% → 2.6%,-11.7%) +- ❌ 止损单比例上升(71.4% → 74.4%,+3.0%) +- ❌ 盈亏比仍然偏低(1.56:1 vs 期望3:1) + +**结论**: +- ⚠️ 优化效果不明显,甚至有些指标恶化 +- ⚠️ 需要进一步调整参数 + +--- + +## 🎯 下一步行动 + +### 优先级1:紧急调整 + +1. **提高止盈目标**:10% → 12%或15% +2. **检查止盈单挂单逻辑**:确保止盈单成功挂单 +3. **优化移动止损参数**:5%激活 → 8%激活,2.5%保护 → 4%保护 + +### 优先级2:重要调整 + +4. **进一步提高信号强度**:7 → 8 +5. **加强大盘Beta过滤**:-0.5% → -0.3%或-0.2% + +### 优先级3:后续优化 + +6. **实施成交量激增过滤**:15分钟成交量是过去24小时均值的2倍以上时才进场 +7. **优化分步止盈**:第一目标从固定百分比改为1.5倍ATR + +--- + +## ⚠️ 注意事项 + +1. **逐步调整**:不要一次性调整所有参数,可以先调整止盈目标,观察效果 +2. **监控数据**:调整后密切监控交易数据,确认效果 +3. **及时调整**:如果效果不理想,可以进一步微调参数 + +--- + +## ✅ 总结 + +**当前状态**: +- ⚠️ 胜率略有提升,但仍然偏低(38.24%) +- ❌ 止盈单比例大幅下降(2.6%),这是严重问题 +- ❌ 止损单比例上升(74.4%) +- ❌ 盈亏比仍然偏低(1.56:1) + +**优化方向**: +- ✅ 提高止盈目标(10% → 12-15%) +- ✅ 检查止盈单挂单逻辑 +- ✅ 优化移动止损参数 +- ✅ 进一步提高信号强度门槛 +- ✅ 加强大盘Beta过滤 + +**预期效果**: +- 止盈单比例提升到15-20% +- 胜率提升到45-50% +- 盈亏比提升到2.0:1-2.5:1 diff --git a/docs/交易策略问题诊断_2026-01-28.md b/docs/交易策略问题诊断_2026-01-28.md new file mode 100644 index 0000000..377872c --- /dev/null +++ b/docs/交易策略问题诊断_2026-01-28.md @@ -0,0 +1,186 @@ +# 交易策略问题诊断报告 - 2026-01-28 + +## 📊 今日交易统计 + +- **总交易数**:12 +- **胜率**:16.67%(2个止盈,10个止损) +- **总盈亏**:-3.07 USDT +- **平均盈亏**:-0.26 USDT +- **平均持仓时长**:80分钟 +- **平均盈利 / 平均亏损**:1.00 : 1(期望3:1) + +## 🔍 问题分析 + +### 1. **止损执行问题(最严重)** + +**现象**: +- 配置止损:12%(基于保证金) +- 实际亏损:-11% 到 -25% +- 所有止损单都超过了配置的12% + +**可能原因**: +1. **ATR止损计算问题**: + - `ATR_STOP_LOSS_MULTIPLIER = 1.5` + - 如果ATR很小,`ATR * 1.5` 可能小于12%保证金止损 + - 代码选择"更紧的止损"(取最大值),可能选择了ATR止损,但ATR止损可能对应更高的保证金百分比 + +2. **止损单挂单失败**: + - 如果交易所止损单挂单失败,只能依赖WebSocket监控 + - WebSocket断开时,可能无法及时止损 + +3. **止损价计算错误**: + - 对于SELL单,止损价应该高于入场价 + - 如果计算错误,可能导致止损价设置不合理 + +### 2. **入场信号质量问题** + +**现象**: +- 同一交易对反复开仓(AXLUSDT 7次,1INCHUSDT 4次) +- 胜率极低(16.67%) +- 很多单子都在震荡市开仓 + +**可能原因**: +1. **市场状态判断不准确**: + - `AUTO_TRADE_ONLY_TRENDING = True`,但可能把震荡市误判为趋势市 + - `detect_market_regime` 的判断条件可能不够严格: + - `ma_diff_pct > 2` 且 `volatility_pct > 1` 就判断为趋势 + - 这个条件可能太宽松 + +2. **信号强度门槛不够高**: + - `MIN_SIGNAL_STRENGTH = 7` + - 但可能还是不够严格,导致在震荡市也开仓 + +3. **4H趋势判断不准确**: + - 如果4H趋势判断错误,可能导致逆势开仓 + +### 3. **止损/止盈比例失衡** + +**现象**: +- 止损:-11% 到 -25% +- 止盈:+18% 到 +20% +- 盈亏比:1.00 : 1(期望3:1) + +**问题**: +- 止损太宽(实际亏损远超配置的12%) +- 止盈相对较紧(10%),但实际止盈在18-20%,说明可能触发了第二目标止盈 +- 盈亏比严重失衡,无法盈利 + +### 4. **交易对选择问题** + +**现象**: +- 集中在少数几个交易对(AXLUSDT、1INCHUSDT) +- 反复开仓,说明可能在震荡市反复触发信号 + +**可能原因**: +- 扫描逻辑可能对某些交易对有偏好 +- 冷却时间可能不够(`ENTRY_SYMBOL_COOLDOWN_SEC = 1800秒 = 30分钟`) + +## 🎯 核心问题总结 + +### 问题1:止损执行失效 +- **配置**:12%止损 +- **实际**:-11% 到 -25% +- **影响**:单笔亏损过大,无法控制风险 + +### 问题2:入场信号质量低 +- **配置**:MIN_SIGNAL_STRENGTH=7,AUTO_TRADE_ONLY_TRENDING=True +- **实际**:胜率16.67%,反复开仓 +- **影响**:大量无效交易,消耗资金 + +### 问题3:市场状态判断不准确 +- **配置**:只在trending市场交易 +- **实际**:可能在ranging市场也开仓 +- **影响**:震荡市频繁止损 + +### 问题4:止损/止盈比例失衡 +- **配置**:止损12%,止盈10%,盈亏比期望3:1 +- **实际**:止损-11%到-25%,止盈18-20%,盈亏比1:1 +- **影响**:无法实现盈利目标 + +## 💡 优化建议 + +### 优先级P0(立即修复) + +1. **修复止损执行问题**: + - 检查ATR止损计算逻辑,确保止损价对应的保证金百分比不超过配置值 + - 确保止损单能成功挂到交易所 + - 如果止损单挂单失败,立即平仓而不是依赖WebSocket + +2. **收紧入场条件**: + - 提高 `MIN_SIGNAL_STRENGTH` 从7到9 + - 加强市场状态判断,确保只在真正的趋势市开仓 + - 增加4H趋势确认,禁止在neutral趋势开仓 + +3. **修复止损计算**: + - 确保止损价对应的保证金百分比不超过配置的12% + - 如果ATR止损对应更高的保证金百分比,应该使用保证金止损 + +### 优先级P1(后续优化) + +1. **优化市场状态判断**: + - 提高trending判断的阈值 + - 增加更多指标确认(ADX、趋势线等) + +2. **增加交易对冷却时间**: + - 将 `ENTRY_SYMBOL_COOLDOWN_SEC` 从30分钟增加到60分钟 + - 避免同一交易对频繁开仓 + +3. **优化止损/止盈比例**: + - 如果止损实际执行在-15%左右,止盈应该相应调整到15-20% + - 或者收紧止损,确保实际止损在12%以内 + +## 🔧 具体修复方案 + +### ✅ 修复1:确保止损不超过配置值(已完成) + +在 `risk_manager.py` 的 `get_stop_loss_price` 中添加验证逻辑: +- 计算最终止损价对应的保证金百分比 +- 如果超过配置的 `STOP_LOSS_PERCENT`,强制使用保证金止损 +- 记录警告日志,便于排查问题 + +**修复位置**:`trading_system/risk_manager.py` 第762-770行 + +### ✅ 修复2:提高入场门槛(已完成) + +- `MIN_SIGNAL_STRENGTH`: 7 → 9(大幅提高门槛) +- `SMART_ENTRY_STRONG_SIGNAL`: 7 → 9(保持一致) +- `SIGNAL_STRENGTH_POSITION_MULTIPLIER`: 移除8分,只保留9-10分 +- `AUTO_TRADE_ALLOW_4H_NEUTRAL`: 已为False(禁止neutral趋势开仓) + +**修复位置**:`trading_system/config.py` + +### ✅ 修复3:优化市场状态判断(已完成) + +提高 `detect_market_regime` 的判断阈值: +- 均线差异阈值:2% → 3.5% +- 波动率阈值:1% → 1.5% +- 确保只在真正的趋势市判断为trending + +**修复位置**:`trading_system/indicators.py` 第297行 + +### ✅ 修复4:增加交易对冷却时间(已完成) + +- `ENTRY_SYMBOL_COOLDOWN_SEC`: 1800秒(30分钟)→ 3600秒(60分钟) +- 避免同一交易对频繁开仓 + +**修复位置**:`trading_system/config.py` 第260行 + +## 📋 修复总结 + +### 已完成的修复: +1. ✅ 止损执行验证:确保止损价对应的保证金百分比不超过配置值 +2. ✅ 提高入场门槛:MIN_SIGNAL_STRENGTH从7提高到9 +3. ✅ 优化市场状态判断:提高trending判断阈值 +4. ✅ 增加交易对冷却时间:从30分钟增加到60分钟 + +### 预期效果: +- 止损执行更严格,实际亏损不会超过配置的12% +- 入场信号质量更高,减少垃圾交易 +- 市场状态判断更准确,减少在震荡市开仓 +- 同一交易对不会频繁开仓,减少重复止损 + +### 建议监控指标: +- 胜率是否提升(目标:>30%) +- 平均盈亏是否改善(目标:>0) +- 止损执行是否准确(实际亏损应在12%以内) +- 交易频率是否降低(避免过度交易) diff --git a/docs/全局配置与数据库同步.md b/docs/全局配置与数据库同步.md new file mode 100644 index 0000000..f6304db --- /dev/null +++ b/docs/全局配置与数据库同步.md @@ -0,0 +1,53 @@ +# 全局配置与数据库同步 + +## 1. 是否需要“同步到数据库”? + +**分两种理解:** + +### (1)在页面上改完并保存 → 已实现 + +- **已实现**:在「全局配置」页修改任意配置项并保存时,后端会调用 `update_global_configs_batch`,对每条配置执行 `GlobalStrategyConfig.set(...)`。 +- `GlobalStrategyConfig.set` 使用 **INSERT ... ON DUPLICATE KEY UPDATE**: + - 若该 `config_key` 在表 `global_strategy_config` 中**不存在**,会**插入**一条新记录; + - 若**已存在**,会**更新**该记录的 `config_value`、`config_type`、`category`、`description` 等。 +- 因此:**新加的配置项(如 MAX_RSI_FOR_LONG、MIN_RSI_FOR_SHORT 等)只要在页面上改一次并点保存,就会自动写入数据库**,不需要单独“同步到数据库”的步骤。 + +### (2)不打开页面,一次性把“缺省值”写入数据库 → 可选脚本 + +- 若希望新配置项**一开始就出现在数据库里**(方便备份、导出、或不在 UI 改也能看到默认值),可以执行一次**同步缺省脚本**。 +- 脚本会检查 `global_strategy_config` 表,对**尚未存在的 key** 插入默认值;**已存在的 key 不会覆盖**。 + +--- + +## 2. 已实现的能力小结 + +| 场景 | 是否已实现 | 说明 | +|------|------------|------| +| 在「全局配置」页修改并保存 | ✅ 是 | 调用 `POST /api/config/global/batch`,写入 `global_strategy_config` 表 | +| 新 key 第一次保存 | ✅ 是 | `GlobalStrategyConfig.set` 用 INSERT ... ON DUPLICATE KEY UPDATE,会自动插入新 key | +| 策略/后端读取配置 | ✅ 是 | `config_manager.get_trading_config()` 从全局配置表(及 Redis)读;缺省时用代码里的默认值 | +| 一次性把缺省项写入 DB | ✅ 可选 | 运行 `backend/sync_global_config_defaults.py`(见下) | + +--- + +## 3. 可选:一次性同步缺省到数据库 + +若希望把**新增的全局配置项默认值**一次性写入 `global_strategy_config` 表(不覆盖已有记录),可在项目根目录或 backend 目录执行: + +```bash +# 在项目根目录 +cd backend && python sync_global_config_defaults.py + +# 或(若 PYTHONPATH 已含 backend) +python backend/sync_global_config_defaults.py +``` + +脚本会: + +- 只插入**当前在表中不存在的** `config_key`; +- 已存在的 key **不会**被修改; +- 默认会同步的项包括:`MAX_RSI_FOR_LONG`、`MAX_CHANGE_PERCENT_FOR_LONG`、`MIN_RSI_FOR_SHORT`、`MAX_CHANGE_PERCENT_FOR_SHORT`、`TAKE_PROFIT_1_PERCENT`、`SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT`、`BETA_FILTER_ENABLED`、`BETA_FILTER_THRESHOLD` 等(见脚本内 `DEFAULTS_TO_SYNC`)。 + +**结论**: +- **需要同步到数据库吗?** 若你会在「全局配置」里改这些项并保存,则**不需要**额外同步,保存即写入数据库。 +- **有实现吗?** 有:保存即写入;另提供可选脚本,用于一次性把缺省值写入数据库。 diff --git a/docs/盈利单被错误标记为止损问题修复总结_2026-01-27.md b/docs/盈利单被错误标记为止损问题修复总结_2026-01-27.md new file mode 100644 index 0000000..e11e20b --- /dev/null +++ b/docs/盈利单被错误标记为止损问题修复总结_2026-01-27.md @@ -0,0 +1,161 @@ +# 盈利单被错误标记为止损问题修复总结(2026-01-27) + +## 🚨 问题确认 + +### 严重问题 + +从交易记录中发现,**多笔盈利单被错误标记为"自动平仓(止损)"**: + +- 盈利20%+的单子:至少10单 +- 全部被标记为"止损" +- 实际止盈单:仅1单(2.6%) + +**影响**: +- 止盈单比例被严重低估(2.6%) +- 胜率被低估(38.24%) +- 盈亏比被低估(1.56:1) + +--- + +## 🔍 根本原因分析 + +### 原因1:移动止损逻辑错误 + +**问题**: +- 移动止损激活时,将止损移至成本价(保本) +- 如果价格回落到成本价,会触发止损 +- 但**盈利20%+的单子不应该被止损** + +**修复**: +- 移动止损激活时,不应该将止损移至成本价 +- 应该设置为"保护利润"的价格(如盈利5%后,保护2.5%利润) + +--- + +### 原因2:同步平仓判断逻辑错误 + +**问题**: +- 同步平仓时,优先检查止损价格匹配 +- 如果平仓价接近止损价,会被标记为`stop_loss` +- 但**没有检查盈亏情况** + +**修复**: +- 优先检查盈亏情况 +- 如果盈利,优先检查止盈价格匹配 +- 如果亏损,再检查止损价格匹配 + +--- + +### 原因3:止损检查逻辑错误 + +**问题**: +- 止损检查时,没有检查盈亏情况 +- 盈利单触发止损,应该标记为`trailing_stop`,而不是`stop_loss` + +**修复**: +- 止损检查前,先检查是否盈利 +- 如果盈利,标记为`trailing_stop`或`take_profit_partial_then_stop` + +--- + +## ✅ 已完成的修复 + +### 修复1:同步平仓判断逻辑优化 + +**修改位置**:`trading_system/position_manager.py:2150-2170` + +**修复内容**: +- 优先检查盈亏情况 +- 如果盈利,优先检查止盈价格匹配 +- 如果亏损,再检查止损价格匹配 + +**效果**: +- 盈利单不会被错误标记为`stop_loss` +- 同步平仓时,能正确识别止盈单 + +--- + +### 修复2:移动止损逻辑优化 + +**修改位置**:`trading_system/position_manager.py:2731-2740` + +**修复内容**: +- 移动止损激活时,不应该将止损移至成本价 +- 应该设置为"保护利润"的价格(如盈利5%后,保护2.5%利润) + +**效果**: +- 移动止损激活后,止损价设置为保护利润位,而不是成本价 +- 避免盈利单被错误止损 + +--- + +### 修复3:止损检查逻辑优化 + +**修改位置**:`trading_system/position_manager.py:2825-2840` + +**修复内容**: +- 止损检查前,先检查是否盈利 +- 如果盈利,标记为`trailing_stop`或`take_profit_partial_then_stop` + +**效果**: +- 盈利单触发止损时,会被正确标记为`trailing_stop` +- 避免盈利单被错误标记为`stop_loss` + +--- + +## 📊 预期效果 + +### 修复后预期 + +**止盈单比例**: +- 当前:2.6%(1/39) +- 预期:25%+(10+/39) + +**胜率**: +- 当前:38.24% +- 预期:50%+(如果盈利单被正确标记) + +**盈亏比**: +- 当前:1.56:1 +- 预期:2.0:1 - 2.5:1(如果盈利单被正确标记) + +--- + +## ⚠️ 注意事项 + +1. **数据修复**: + - 可能需要修复历史数据中的错误标记 + - 盈利单应该被标记为`take_profit`或`trailing_stop` + +2. **测试验证**: + - 修复后,需要测试验证 + - 确保盈利单被正确标记 + +3. **监控日志**: + - 关注日志中的"盈利单触发止损"警告 + - 确认修复是否生效 + +--- + +## ✅ 总结 + +**问题**: +- ❌ 多笔盈利单被错误标记为"止损" +- ❌ 止盈单比例极低(2.6%) +- ❌ 胜率被低估 + +**原因**: +- 移动止损逻辑错误(激活时将止损移至成本价) +- 同步平仓判断逻辑错误(优先检查止损价格匹配,没有检查盈亏情况) +- 止损检查逻辑错误(没有检查盈亏情况) + +**修复**: +- ✅ 修复同步平仓判断逻辑(优先检查盈亏情况) +- ✅ 优化移动止损逻辑(激活时设置为保护利润位) +- ✅ 优化止损检查逻辑(先检查盈亏情况) + +**预期效果**: +- ✅ 盈利单被正确标记 +- ✅ 止盈单比例提升到25%+ +- ✅ 胜率提升到50%+ +- ✅ 盈亏比提升到2.0:1-2.5:1 diff --git a/docs/盈利单被错误标记为止损问题分析_2026-01-27.md b/docs/盈利单被错误标记为止损问题分析_2026-01-27.md new file mode 100644 index 0000000..912aef2 --- /dev/null +++ b/docs/盈利单被错误标记为止损问题分析_2026-01-27.md @@ -0,0 +1,191 @@ +# 盈利单被错误标记为止损问题分析(2026-01-27) + +## 🚨 严重问题 + +### 问题现象 + +从交易记录中发现,**多笔盈利单被错误标记为"自动平仓(止损)"**: + +| 交易ID | 交易对 | 盈亏比例 | 平仓类型 | 问题 | +|--------|--------|----------|----------|------| +| 1852 | AXSUSDT | +20.50% | 自动平仓(止损) | ❌ 错误 | +| 1844 | AXLUSDT | +20.94% | 自动平仓(止损) | ❌ 错误 | +| 1841 | AXSUSDT | +20.65% | 自动平仓(止损) | ❌ 错误 | +| 1839 | ZROUSDT | +18.24% | 自动平仓(止损) | ❌ 错误 | +| 1836 | AXSUSDT | +19.13% | 自动平仓(止损) | ❌ 错误 | +| 1833 | AXSUSDT | +20.66% | 自动平仓(止损) | ❌ 错误 | +| 1829 | AXSUSDT | +20.20% | 自动平仓(止损) | ❌ 错误 | +| 1824 | AXSUSDT | +20.46% | 自动平仓(止损) | ❌ 错误 | +| 1821 | AXSUSDT | +12.04% | 自动平仓(止损) | ❌ 错误 | +| 1817 | AXSUSDT | +46.42% | 自动平仓(止损) | ❌ 错误 | + +**统计**: +- 盈利20%+的单子:至少10单 +- 全部被标记为"止损" +- 实际止盈单:仅1单(2.6%) + +--- + +## 🔍 问题分析 + +### 可能原因1:移动止损逻辑错误 + +**问题**: +- 移动止损在盈利5%后激活,将止损移至成本价(保本) +- 如果价格回落到成本价,会触发止损 +- 但**盈利20%+的单子不应该被止损** + +**分析**: +- 移动止损激活后,止损价被移至成本价 +- 如果价格回落到成本价,会触发止损 +- 但盈利20%+的单子,价格不应该回落到成本价(除非是分步止盈后的剩余仓位) + +**可能问题**: +- 移动止损逻辑可能错误地将盈利单的止损价设置为成本价 +- 或者,移动止损的保护逻辑有问题 + +--- + +### 可能原因2:分步止盈后的剩余仓位止损 + +**问题**: +- 第一目标止盈(50%仓位)后,剩余仓位止损移至成本价(保本) +- 如果剩余仓位价格回落到成本价,会触发止损 +- 但**整体交易仍然是盈利的**(第一目标已达成) + +**分析**: +- 如果第一目标止盈成功,剩余50%仓位止损移至成本价 +- 如果剩余仓位价格回落到成本价,会触发止损 +- 但整体交易仍然是盈利的(第一目标已达成) + +**当前实现**: +- 已修复:剩余仓位止损时,会标记为`take_profit_partial_then_stop` +- 但可能数据库同步时,仍然被标记为`stop_loss` + +--- + +### 可能原因3:同步平仓时的判断逻辑错误 + +**问题**: +- 同步平仓时,根据价格匹配判断平仓原因 +- 如果平仓价接近止损价,会被标记为`stop_loss` +- 但**盈利单不应该被标记为止损** + +**分析**: +- 同步平仓时,如果平仓价接近止损价,会被标记为`stop_loss` +- 但如果交易是盈利的,应该被标记为`take_profit`或`trailing_stop` + +**当前实现**: +- `sync_positions_with_binance`方法中,优先检查止损价格匹配 +- 如果平仓价接近止损价,会被标记为`stop_loss` +- 但**没有检查盈亏情况** + +--- + +## ✅ 修复方案 + +### 修复1:同步平仓时检查盈亏情况 + +**修改位置**:`trading_system/position_manager.py:2150-2162` + +**修复内容**: +- 在判断平仓原因时,先检查盈亏情况 +- 如果盈利,优先检查止盈价格匹配 +- 如果亏损,再检查止损价格匹配 + +--- + +### 修复2:移动止损逻辑优化 + +**修改位置**:`trading_system/position_manager.py:2701-2772` + +**修复内容**: +- 移动止损激活后,不应该将止损价设置为成本价 +- 应该设置为"保护利润"的价格(如盈利5%后,保护2.5%利润) + +--- + +### 修复3:分步止盈后的剩余仓位止损 + +**修改位置**:`trading_system/position_manager.py:2851-2854` + +**修复内容**: +- 已修复:剩余仓位止损时,标记为`take_profit_partial_then_stop` +- 但需要确保数据库同步时也使用正确的状态 + +--- + +## 🎯 紧急修复 + +### 优先级1:修复同步平仓判断逻辑(紧急) + +**问题**: +- 同步平仓时,盈利单被错误标记为`stop_loss` + +**修复**: +- 在判断平仓原因时,先检查盈亏情况 +- 如果盈利,优先检查止盈价格匹配 +- 如果亏损,再检查止损价格匹配 + +--- + +### 优先级2:修复移动止损逻辑(重要) + +**问题**: +- 移动止损可能错误地将盈利单的止损价设置为成本价 + +**修复**: +- 移动止损激活后,不应该将止损价设置为成本价 +- 应该设置为"保护利润"的价格 + +--- + +## 📊 预期效果 + +### 修复后预期 + +**止盈单比例**: +- 当前:2.6%(1/39) +- 预期:25%+(10+/39) + +**胜率**: +- 当前:38.24% +- 预期:50%+(如果盈利单被正确标记) + +**盈亏比**: +- 当前:1.56:1 +- 预期:2.0:1 - 2.5:1(如果盈利单被正确标记) + +--- + +## ⚠️ 注意事项 + +1. **数据修复**: + - 可能需要修复历史数据中的错误标记 + - 盈利单应该被标记为`take_profit`或`trailing_stop` + +2. **逻辑修复**: + - 同步平仓时,优先检查盈亏情况 + - 移动止损逻辑需要优化 + +3. **测试验证**: + - 修复后,需要测试验证 + - 确保盈利单被正确标记 + +--- + +## ✅ 总结 + +**问题**: +- ❌ 多笔盈利单被错误标记为"止损" +- ❌ 止盈单比例极低(2.6%) +- ❌ 胜率被低估 + +**原因**: +- 同步平仓时,判断逻辑错误(优先检查止损价格匹配,没有检查盈亏情况) +- 移动止损逻辑可能有问题 + +**修复**: +- ✅ 修复同步平仓判断逻辑(优先检查盈亏情况) +- ✅ 优化移动止损逻辑 +- ✅ 确保分步止盈后的剩余仓位止损使用正确的状态 diff --git a/docs/策略执行分析_2026-01-30.md b/docs/策略执行分析_2026-01-30.md new file mode 100644 index 0000000..aebc39d --- /dev/null +++ b/docs/策略执行分析_2026-01-30.md @@ -0,0 +1,123 @@ +# 策略执行分析报告 · 2026-01-30 + +## 一、今日整体统计(你提供) + +| 指标 | 数值 | +|------|------| +| 总交易数 | 16(15 笔已平仓 + 1 笔持仓中) | +| 胜率 | 53.33%(8 盈 / 7 损) | +| 总盈亏 | +2.88 USDT | +| 平均盈亏 | 0.19 USDT/笔 | +| 平均持仓时长 | 91 分钟 | +| 平仓原因 | 止损 7 / 止盈 8 | +| 平均盈利 : 平均亏损 | 1.91 : 1(目标 3:1) | +| 总交易量(名义) | 388.37 USDT | + +--- + +## 二、订单数据深度分析 + +### 2.1 按交易对分布 + +| 交易对 | 笔数 | 止盈 | 止损 | 持仓中 | 净盈亏(USDT) | 备注 | +|--------|------|------|------|--------|-------------|------| +| **XVSUSDT** | 8 | 4 | 4 | 0 | +0.36 | 过度集中,存在秒损/短时损 | +| DASHUSDT | 3 | 1 | 1 | 1 | +0.73(已平 2 笔) | 重复开仓,冷却后仍入场 | +| CHZUSDT | 2 | 1 | 1 | 0 | +0.41 | 盈亏各一 | +| RENDERUSDT | 2 | 1 | 1 | 0 | +0.37 | 盈亏各一 | +| ARKMUSDT | 1 | 1 | 0 | 0 | +0.59 | 单笔表现好 | + +结论:**XVSUSDT 单币种 8 笔占半数**,易受单币波动和噪音影响;其余 4 个标的分布较散,表现尚可。 + +### 2.2 持仓时长与“秒损”问题 + +从 `交易记录_2026-01-30T02-31-18.json` 的入场/平仓时间推算: + +| 交易ID | 交易对 | 平仓类型 | 持仓时长(约) | +|--------|--------|----------|----------------| +| 2082 | XVSUSDT | 止损 | **约 8 秒** | +| 2098 | XVSUSDT | 止损 | **约 2 分钟** | +| 2108 | XVSUSDT | 止损 | 约 9 分钟 | +| 2089 | XVSUSDT | 止盈 | 约 45 分钟 | +| 2096 | XVSUSDT | 止盈 | 约 13 分钟 | + +问题要点: +- **2082 几乎“秒损”**:入场后 8 秒即触发止损,多为价格瞬间反向穿透止损或入场价落在不利位置。 +- **2098 约 2 分钟止损**:短时间反向波动即打止损,说明该笔入场时机或止损距离偏紧。 +- 短持仓多集中在 **XVSUSDT 的止损单**,说明该标的当日波动大且存在多次“不利入场 + 快速止损”。 + +### 2.3 盈亏结构 + +- **止盈单(8 笔)**:单笔盈利约 0.41~1.24 USDT,平均约 **0.66 USDT**。 +- **止损单(7 笔)**:单笔亏损约 0.20~0.50 USDT,平均约 **0.35 USDT**。 +- **盈亏比**:0.66 / 0.35 ≈ **1.91 : 1**,低于策略目标 3:1。 + +含义: +要么止盈目标尚未充分拉远(例如多数只打到第一目标 15% 就离场),要么止损相对偏大/触发过早,导致“赚的笔数略多但每笔赚得不够多、亏的每笔也不算小”。 + +### 2.4 方向与杠杆 + +- 当日 **全部为 SELL(做空)**,方向与策略/行情一致。 +- 杠杆统一 **8x**,名义价值与保证金控制在一个区间,单笔风险可控。 + +--- + +## 三、策略执行情况总评 + +| 维度 | 表现 | 说明 | +|------|------|------| +| 胜率 | 良好 | 53.33%,略高于 50%,有利于正向期望 | +| 盈亏比 | 偏弱 | 1.91:1 未达 3:1,拉低期望值 | +| 标的集中度 | 风险 | XVSUSDT 占比过高,易受单币波动和噪音影响 | +| 秒损/短损 | 问题 | 存在 8 秒、2 分钟级止损,入场或过滤需加强 | +| 总结果 | 小盈 | 总盈 2.88 USDT,策略可运行但仍有优化空间 | + +--- + +## 四、提升与优化方案 + +### 4.1 提高盈亏比(向 3:1 靠拢) + +- **已做**:第一目标止盈已从 10% 调整为 15%(`TAKE_PROFIT_1_PERCENT`),有利于提高单笔盈利。 +- **建议**: + - 确认第二目标/最终止盈是否使用 ATR 或 3:1 目标(`RISK_REWARD_RATIO`、`ATR_TAKE_PROFIT_MULTIPLIER`),避免过早全部平仓。 + - 若多数止盈只打到“第一目标”就离场,可适度提高 `TAKE_PROFIT_1_PERCENT`(如 18%~20%)或拉长第二目标,在回撤可控前提下追求更高盈亏比。 + +### 4.2 减少“秒损”与短时止损 + +- **入场过滤**: + - 提高 `MIN_SIGNAL_STRENGTH`(如 8→9),减少弱信号入场。 + - 保持或收紧 `MAX_TREND_MOVE_BEFORE_ENTRY`,避免追在短期极端位。 +- **短周期过滤**: + - 保持 `ENTRY_SHORT_TREND_FILTER_ENABLED` 开启,避免在 15m 明显反向时开仓。 +- **可选:最短持仓时间**: + - 若仍频繁出现 1 分钟内止损,可考虑对“开仓后 N 秒内不执行止损”(仅延迟执行,不取消止损),或仅记录为观察项,避免过度干预风控。 + +### 4.3 降低单币种集中度(XVSUSDT) + +- **冷却**:已启用 `SYMBOL_LOSS_COOLDOWN_ENABLED` 与 `SYMBOL_MAX_CONSECUTIVE_LOSSES`,同一标的连续亏损后会进入冷却,减少同一币种连续开仓。 +- **建议**: + - 可适当加大 **同一交易对单日最大开仓次数**(若当前有该配置),或通过“同一 symbol 当日最多 N 笔”限制,避免单日 8 笔全集中在 XVS。 + - 保持 **智能补单**(`SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT`),让冷却时有机会在其他标的上开仓,分散标的。 + +### 4.4 止损与波动匹配 + +- 当前止损单平均约 **-10%~-13% 保证金**,与 12% 左右配置大致吻合。 +- 若“秒损”多因价格瞬间穿透止损: + - 可微调 `ATR_STOP_LOSS_MULTIPLIER`(如 2.0→2.2)或 `MIN_STOP_LOSS_PRICE_PCT`,给波动稍多空间,减少被一根 K 线扫出。 + - 需在“少被扫损”和“单笔亏损可控”之间平衡,建议先小步调整并观察 1~2 天。 + +### 4.5 统计与监控建议 + +- 按 **交易对** 统计:胜率、平均持仓时长、平均盈亏比,便于发现“问题标的”(如某币种胜率明显偏低或短损过多)。 +- 按 **平仓原因** 统计:区分“第一目标止盈 / 第二目标止盈 / 止损 / 移动止损”占比,用于判断是否多数只打到第一目标、以及止损是否过频。 +- 对 **持仓时长 < 1 分钟** 的订单单独标记或告警,便于排查秒损和入场质量。 + +--- + +## 五、小结 + +- 今日策略 **小盈、胜率尚可**,但 **盈亏比 1.91:1 未达 3:1**,且存在 **XVSUSDT 过度集中** 与 **秒损/短损** 问题。 +- 优先建议:**提高盈亏比**(确认止盈目标与 ATR 用法)、**加强入场与短周期过滤**(减少秒损)、**分散标的**(冷却 + 智能补单 + 可选单币种日次数上限),再根据新数据微调止损与第一目标止盈比例。 + +如需,我可以根据你当前 `config.py` / 后台配置,给出一版具体的参数修改建议(含推荐数值)。 diff --git a/docs/策略执行分析_2026-01-31.md b/docs/策略执行分析_2026-01-31.md new file mode 100644 index 0000000..5ca48d9 --- /dev/null +++ b/docs/策略执行分析_2026-01-31.md @@ -0,0 +1,130 @@ +# 策略执行分析报告 · 2026-01-31 + +## 一、今日整体统计 + +| 指标 | 数值 | +|------|------| +| 总交易数 | 15(11 笔已平仓 + 4 笔持仓中) | +| 胜率 | **27.27%**(3 盈 / 8 损) | +| 总盈亏 | **-1.03 USDT** | +| 平均盈亏 | -0.09 USDT/笔 | +| 平均持仓时长 | 48 分钟 | +| 平仓原因 | **止损 8 / 止盈 3** | +| 平均盈利 : 平均亏损 | 1.79 : 1(目标 3:1) | +| 总交易量(名义) | 446.26 USDT | + +--- + +## 二、订单数据深度分析 + +### 2.1 按交易对与方向(已平仓) + +| 交易对 | 方向 | 笔数 | 止盈 | 止损 | 净盈亏(USDT) | 备注 | +|--------|------|------|------|------|-------------|------| +| **SYNUSDT** | BUY | 6 | 1 | **5** | **-1.21** | 做多集中亏损,多笔秒损 | +| DUSKUSDT | SELL | 2 | 1 | 1 | +0.35 | 一盈一亏 | +| RENDERUSDT | SELL | 2 | 1 | 1 | +0.49 | 一盈一亏 | +| DASHUSDT | SELL | 1 | 0 | 1 | -0.67 | 单笔止损 | + +结论:**今日亏损主要来自 SYNUSDT 做多**(5 笔止损、1 笔止盈),做空(DUSK/RENDER)略盈,DASH 做空单笔亏。 + +### 2.2 做多 (BUY) 问题:追高 + RSI 超买 + +今日所有 **BUY 均为 SYNUSDT**,入场思路中: + +| 交易ID | RSI | 24h涨跌幅 | 持仓时长 | 结果 | +|--------|-----|-----------|----------|------| +| 2239 | **70.9** | 53.6% | 7分钟 | 止损 | +| 2229 | **71.4** | 52.6% | 11分钟 | 止盈 | +| 2224 | **74.7** | 62.1% | **2分钟** | 止损 | +| 2206 | **82.0** | 64.6% | **0分钟** | 止损 | +| 2187 | **73.8** | 32.7% | **2分钟** | 止损 | +| 2184 | **71.5** | 30.9% | **2分钟** | 止损 | + +- **RSI 全部 ≥ 70**,多数在 71–82,处于超买区,做多容易买在短期高点。 +- **24h 涨跌幅** 做多时普遍 30%–64%,说明入场时已大涨,易追高。 +- **持仓时长**:多笔 0–2 分钟即止损,属于“秒损/短损”,入场质量差。 + +结论:**做多缺少“RSI 超买过滤”和“涨跌幅过大过滤”**,在 RSI>70、已大涨时仍开多单,导致集中止损。 + +### 2.3 做空 (SELL) 表现 + +- DUSKUSDT / RENDERUSDT:RSI 多在 16–30(超卖或趋势空),各有 1 盈 1 亏,净为正。 +- DASHUSDT:RSI 22.6,趋势空,单笔持仓 111 分钟后止损,属正常波动打止损。 + +做空逻辑和 RSI 使用相对合理,问题主要在**做多**。 + +### 2.4 4H 趋势与市场状态 + +- **入场思路中 trend_4h 全部为 "neutral"**,4H 无明确趋势。 +- 在 4H 震荡/中性时仍频繁开仓,容易在震荡中被来回扫。 + +--- + +## 三、今日运行情况总评 + +| 维度 | 表现 | 说明 | +|------|------|------| +| 胜率 | 差 | 27%,远低于 50%,止损笔数过多 | +| 盈亏比 | 一般 | 1.79:1 未达 3:1,但非主要矛盾 | +| 做多质量 | 差 | SYNUSDT 做多 RSI 全≥70、多笔秒损,明显追高 | +| 做空质量 | 尚可 | 有盈有亏,净略正 | +| 4H 过滤 | 弱 | 全部 neutral 仍开仓,震荡市风险大 | + +**核心结论**:今日亏损主要来自**做多时在 RSI 超买、已大涨的情况下仍开仓**,缺少“做多不追高”的过滤,导致 SYNUSDT 多笔短时止损。 + +--- + +## 四、优化与提升建议 + +### 4.1 做多增加 RSI 超买过滤(优先) + +- **问题**:做多时 RSI 70+ 仍开仓,买在短期高点。 +- **建议**: + - **做多 (BUY)**:仅当 `RSI < 某上限` 时允许开多,例如 `RSI < 65` 或 `RSI < 70`。 + - 在策略层(如 `_analyze_trade_signal` 或下单前检查)对 BUY 信号增加: + `if side == 'BUY' and rsi >= 70: 不发出/不执行做多`。 +- **做空**:可保持现状或设 RSI > 30 才做空(避免深超卖反弹),今日做空 RSI 16–30 暂可接受。 + +**实现要点**:在 `trading_system/strategy.py` 或 `atr_strategy` 中,对 BUY 信号增加 `symbol_info.get('rsi')` 判断;若配置化,可加 `MAX_RSI_FOR_LONG`(如 65 或 70)。 + +### 4.2 做多“涨跌幅过大”过滤(强烈建议) + +- **问题**:做多时 24h 已涨 30%–64%,容易追高。 +- **建议**: + - 做多时若 `change_percent > 阈值`(如 20% 或 25%),则**不开多**或降低仓位。 + - 可配置项如 `MAX_CHANGE_PERCENT_FOR_LONG`(例如 25),超过则过滤掉做多信号。 + +**实现要点**:在发出 BUY 信号前检查 `symbol_info['changePercent']`;若已有 `MIN_CHANGE_PERCENT`,可新增“做多最大涨跌幅”单独限制。 + +### 4.3 4H 趋势过滤(中性市减少开仓) + +- **问题**:今日全部 `trend_4h = neutral`,震荡市仍频繁开仓。 +- **建议**: + - 若配置中有“仅 4H 趋势时开仓”的选项,可**收紧**:neutral 时不开仓或仅允许小仓位。 + - 或新增:`ALLOW_4H_NEUTRAL` 默认 false,neutral 时只生成推荐、不自动下单。 + +**实现要点**:与现有 `AUTO_TRADE_ALLOW_4H_NEUTRAL` 或 trend 过滤逻辑结合,把 neutral 视为“无趋势”,降低开仓频率。 + +### 4.4 单标的集中度与冷却 + +- **问题**:SYNUSDT 单日多笔做多连续止损,标的和方向过于集中。 +- **建议**: + - 已启用同一交易对连续亏损冷却时,SYNUSDT 在 2 笔止损后应进入冷却,避免同一标的连续多笔做多。 + - 可检查 `SYMBOL_LOSS_COOLDOWN_ENABLED`、`SYMBOL_MAX_CONSECUTIVE_LOSSES` 是否生效;若今日仍出现 SYNUSDT 多笔连续止损,可适当**缩短冷却时间内的补单**或**单标的单日最大开仓次数**限制。 + +### 4.5 止损与持仓时长(次要) + +- 今日多笔 0–2 分钟止损,主要来自**入场位置差**(追高),而非单纯止损太紧。 +- 优先做完 RSI + 涨跌幅过滤后,再观察是否仍有“秒损”;若仍多,再考虑微调 ATR 止损倍数或最小止损距离。 + +--- + +## 五、小结与落地顺序 + +1. **立即做**:做多增加 **RSI 上限过滤**(如 RSI≥70 不开多)和 **24h 涨跌幅上限**(如做多时 change_percent > 25% 不开多)。 +2. **接着做**:**4H 为 neutral 时** 不开仓或仅推荐(利用/收紧 `AUTO_TRADE_ALLOW_4H_NEUTRAL`)。 +3. **确认**:同一标的连续亏损冷却、单日笔数/集中度限制是否按预期工作,避免单标的单方向连续开仓。 +4. **再观察**:执行上述过滤后,看胜率、SYNUSDT 做多笔数、秒损笔数是否明显改善,再决定是否微调止损或仓位。 + +如需,我可以根据你当前 `strategy.py` / `atr_strategy` 的结构,直接写出“做多 RSI 上限 + 做多涨跌幅上限”的代码片段和配置项命名建议。 diff --git a/docs/策略调整建议_2026-01-28.md b/docs/策略调整建议_2026-01-28.md new file mode 100644 index 0000000..6d5b3fa --- /dev/null +++ b/docs/策略调整建议_2026-01-28.md @@ -0,0 +1,74 @@ +# 策略调整建议 - 2026-01-28 + +## 当前情况 + +- 所有交易对都被跳过,因为市场状态都是 `ranging`(震荡市) +- 4H趋势都是 `neutral`(中性) +- 这是**正常的**,因为策略设计为只在趋势市交易 + +## 为什么不下单是正常的? + +1. **策略设计**:`AUTO_TRADE_ONLY_TRENDING = True` 意味着只在trending市场交易 +2. **历史教训**:今天的数据显示胜率16.67%,多数是止损,说明震荡市交易风险高 +3. **保护资金**:震荡市容易反复止损,避免在震荡市交易是明智的选择 + +## 调整选项 + +### 选项1:保持当前严格策略(推荐) + +**配置**: +- `AUTO_TRADE_ONLY_TRENDING = True`(保持不变) +- `AUTO_TRADE_ALLOW_4H_NEUTRAL = False`(保持不变) +- Trending判断阈值:3.5%(保持不变) + +**优点**: +- 避免震荡市频繁止损 +- 保护资金 +- 只在真正的趋势市交易 + +**缺点**: +- 交易机会少 +- 可能长时间不开仓 + +### 选项2:适当放宽条件(增加交易机会) + +#### 2.1 降低trending判断阈值 + +**修改**:`trading_system/indicators.py` +```python +# 从 3.5% 降低到 2.5% +if ma_diff_pct > 2.5 and volatility_pct > 1.2: + return 'trending' +``` + +**效果**:更容易判断为trending,增加交易机会 + +#### 2.2 允许在ranging市场交易 + +**修改**:`trading_system/config.py` +```python +'AUTO_TRADE_ONLY_TRENDING': False, # 允许在震荡市也交易 +``` + +**风险**:可能增加震荡市止损,胜率可能下降 + +#### 2.3 允许4H趋势neutral时交易 + +**修改**:`trading_system/config.py` +```python +'AUTO_TRADE_ALLOW_4H_NEUTRAL': True, # 允许4H趋势neutral时交易 +``` + +**风险**:4H趋势neutral时信号质量较低,容易扫损 + +## 建议 + +1. **先观察1-2天**:保持当前严格策略,看市场是否会转为趋势市 +2. **如果确实需要更多交易机会**:可以适当降低trending判断阈值(从3.5%降到2.5%) +3. **不建议完全放开**:不建议设置 `AUTO_TRADE_ONLY_TRENDING = False`,因为震荡市风险太高 + +## 监控指标 + +- 观察有多少交易对被判断为trending +- 观察是否有trending市场的交易机会 +- 如果长期没有trending市场,可以考虑适当放宽阈值 diff --git a/trading_system/strategy.py b/trading_system/strategy.py index 66a1f5c..aa55a16 100644 --- a/trading_system/strategy.py +++ b/trading_system/strategy.py @@ -404,52 +404,68 @@ class TradingStrategy: # 趋势跟踪策略(不再区分市场状态,统一使用趋势指标) # MACD金叉/死叉(权重最高) if macd and macd['macd'] > macd['signal'] and macd['histogram'] > 0: - # MACD金叉,做多信号(需4H趋势向上或中性) - if trend_4h in ('up', 'neutral', None): - signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross'] - reasons.append("MACD金叉") - if direction is None: - direction = 'BUY' + # MACD金叉,做多信号(严格4H趋势向上) + # OPTIMIZATION: 仅允许明确向上趋势,移除 neutral 和 None,避免震荡行情止损 + if trend_4h == 'up': + # OPTIMIZATION: 添加 RSI 过滤,避免追高 + if rsi is None or rsi < 70: + signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross'] + reasons.append("MACD金叉") + if direction is None: + direction = 'BUY' + else: + reasons.append(f"MACD金叉但RSI超买({rsi:.1f}),禁止追多") else: - reasons.append("MACD金叉但4H趋势向下,禁止逆势做多") + reasons.append(f"MACD金叉但4H趋势不明确({trend_4h}),禁止开仓") elif macd and macd['macd'] < macd['signal'] and macd['histogram'] < 0: - # MACD死叉,做空信号(需4H趋势向下或中性) - if trend_4h in ('down', 'neutral', None): - signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross'] - reasons.append("MACD死叉") - if direction is None: - direction = 'SELL' + # MACD死叉,做空信号(严格4H趋势向下) + # OPTIMIZATION: 仅允许明确向下趋势 + if trend_4h == 'down': + # OPTIMIZATION: 添加 RSI 过滤,避免杀跌 + if rsi is None or rsi > 30: + signal_strength += TREND_SIGNAL_WEIGHTS['macd_cross'] + reasons.append("MACD死叉") + if direction is None: + direction = 'SELL' + else: + reasons.append(f"MACD死叉但RSI超卖({rsi:.1f}),禁止追空") else: - reasons.append("MACD死叉但4H趋势向上,禁止逆势做空") + reasons.append(f"MACD死叉但4H趋势不明确({trend_4h}),禁止开仓") # EMA均线系统 if ema20 and ema50: if current_price > ema20 > ema50: # 上升趋势 - if trend_4h in ('up', 'neutral', None): - signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross'] - reasons.append("EMA20上穿EMA50,上升趋势") - if direction is None: - direction = 'BUY' + # OPTIMIZATION: 仅允许明确向上趋势 + if trend_4h == 'up': + # OPTIMIZATION: 添加 RSI 过滤 + if rsi is None or rsi < 70: + signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross'] + reasons.append("EMA20上穿EMA50,上升趋势") + if direction is None: + direction = 'BUY' else: - reasons.append("1H均线向上但4H趋势向下,禁止逆势做多") + reasons.append(f"1H均线向上但4H趋势不明确({trend_4h}),禁止开仓") elif current_price < ema20 < ema50: # 下降趋势 - if trend_4h in ('down', 'neutral', None): - signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross'] - reasons.append("EMA20下穿EMA50,下降趋势") - if direction is None: - direction = 'SELL' + # OPTIMIZATION: 仅允许明确向下趋势 + if trend_4h == 'down': + # OPTIMIZATION: 添加 RSI 过滤 + if rsi is None or rsi > 30: + signal_strength += TREND_SIGNAL_WEIGHTS['ema_cross'] + reasons.append("EMA20下穿EMA50,下降趋势") + if direction is None: + direction = 'SELL' else: - reasons.append("1H均线向下但4H趋势向上,禁止逆势做空") + reasons.append(f"1H均线向下但4H趋势不明确({trend_4h}),禁止开仓") # 价格与EMA20关系 if ema20: if current_price > ema20: - if trend_4h in ('up', 'neutral', None) and direction == 'BUY': + if trend_4h == 'up' and direction == 'BUY': signal_strength += TREND_SIGNAL_WEIGHTS['price_above_ema20'] reasons.append("价格在EMA20之上") elif current_price < ema20: - if trend_4h in ('down', 'neutral', None) and direction == 'SELL': + if trend_4h == 'down' and direction == 'SELL': signal_strength += TREND_SIGNAL_WEIGHTS['price_above_ema20'] reasons.append("价格在EMA20之下") diff --git a/trading_system/trade_recommender.py b/trading_system/trade_recommender.py index ad94d1f..1582730 100644 --- a/trading_system/trade_recommender.py +++ b/trading_system/trade_recommender.py @@ -304,31 +304,41 @@ class TradeRecommender: # 策略2:趋势跟踪(趋势市场) elif market_regime == 'trending': if macd and macd.get('macd', 0) > macd.get('signal', 0) and macd.get('histogram', 0) > 0: - if trend_4h in ('up', 'neutral', None): - signal_strength += 3 - reasons.append("MACD金叉") - if direction is None: - direction = 'BUY' + # OPTIMIZATION: 仅允许明确向上趋势 + if trend_4h == 'up': + # OPTIMIZATION: 添加 RSI 过滤 + if rsi is None or rsi < 70: + signal_strength += 3 + reasons.append("MACD金叉") + if direction is None: + direction = 'BUY' elif macd and macd.get('macd', 0) < macd.get('signal', 0) and macd.get('histogram', 0) < 0: - if trend_4h in ('down', 'neutral', None): - signal_strength += 3 - reasons.append("MACD死叉") - if direction is None: - direction = 'SELL' + # OPTIMIZATION: 仅允许明确向下趋势 + if trend_4h == 'down': + # OPTIMIZATION: 添加 RSI 过滤 + if rsi is None or rsi > 30: + signal_strength += 3 + reasons.append("MACD死叉") + if direction is None: + direction = 'SELL' if ema20 and ema50: if current_price > ema20 > ema50: - if trend_4h in ('up', 'neutral', None): - signal_strength += 2 - reasons.append("价格在均线之上") - if direction is None: - direction = 'BUY' + # OPTIMIZATION: 仅允许明确向上趋势 + if trend_4h == 'up': + if rsi is None or rsi < 70: + signal_strength += 2 + reasons.append("价格在均线之上") + if direction is None: + direction = 'BUY' elif current_price < ema20 < ema50: - if trend_4h in ('down', 'neutral', None): - signal_strength += 2 - reasons.append("价格在均线之下") - if direction is None: - direction = 'SELL' + # OPTIMIZATION: 仅允许明确向下趋势 + if trend_4h == 'down': + if rsi is None or rsi > 30: + signal_strength += 2 + reasons.append("价格在均线之下") + if direction is None: + direction = 'SELL' # 多周期共振加分 if direction and trend_4h: