This commit is contained in:
薇薇安 2026-02-01 20:45:18 +08:00
parent cb8b393550
commit 0a0bcd941b
11 changed files with 1324 additions and 48 deletions

View File

@ -0,0 +1,57 @@
# 入场思路记录entry_context
## 目的
把「入场原因 + 经历的思路/过程」写入每笔订单,便于事后综合分析策略执行效果:
不仅看结果(盈/亏、止盈/止损),还能看过程(当时信号强度、市场状态、过滤是否通过等),分析更准确、优化更有依据。
## 实现方式
- **数据库**`trades` 表新增字段 `entry_context`JSON可为空
- **写入时机**:自动开仓且订单成交后,在保存交易记录时一并写入。
- **内容**:由策略在开仓前构建一个字典,经 `position_manager` 传给 `Trade.create`,以 JSON 存入。
## entry_context 字段说明
每笔自动开仓订单的 `entry_context` 目前包含(示例):
| 键 | 类型 | 说明 |
|----|------|------|
| `signal_strength` | int | 信号强度 010 |
| `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` 等还原当时决策依据,判断是信号问题、过滤不足还是行情突变。
这样就能在「只看结果」之外,用「过程 + 结果」一起评估和优化策略。

View File

@ -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.1010%
**建议配置**
- `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.055%
- `TRAILING_STOP_PROTECT`: 0.0252.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.1010%
3. ✅ **动态追踪止损优化**0.20 → 0.055%激活0.10 → 0.0252.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

View File

@ -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=7AUTO_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%以内)
- 交易频率是否降低(避免过度交易)

View File

@ -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`)。
**结论**
- **需要同步到数据库吗?** 若你会在「全局配置」里改这些项并保存,则**不需要**额外同步,保存即写入数据库。
- **有实现吗?** 有:保存即写入;另提供可选脚本,用于一次性把缺省值写入数据库。

View File

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

View File

@ -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%
- ❌ 胜率被低估
**原因**
- 同步平仓时,判断逻辑错误(优先检查止损价格匹配,没有检查盈亏情况)
- 移动止损逻辑可能有问题
**修复**
- ✅ 修复同步平仓判断逻辑(优先检查盈亏情况)
- ✅ 优化移动止损逻辑
- ✅ 确保分步止盈后的剩余仓位止损使用正确的状态

View File

@ -0,0 +1,123 @@
# 策略执行分析报告 · 2026-01-30
## 一、今日整体统计(你提供)
| 指标 | 数值 |
|------|------|
| 总交易数 | 1615 笔已平仓 + 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.411.24 USDT平均约 **0.66 USDT**
- **止损单7 笔)**:单笔亏损约 0.200.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 线扫出。
- 需在“少被扫损”和“单笔亏损可控”之间平衡,建议先小步调整并观察 12 天。
### 4.5 统计与监控建议
- 按 **交易对** 统计:胜率、平均持仓时长、平均盈亏比,便于发现“问题标的”(如某币种胜率明显偏低或短损过多)。
- 按 **平仓原因** 统计:区分“第一目标止盈 / 第二目标止盈 / 止损 / 移动止损”占比,用于判断是否多数只打到第一目标、以及止损是否过频。
- 对 **持仓时长 < 1 分钟** 的订单单独标记或告警,便于排查秒损和入场质量。
---
## 五、小结
- 今日策略 **小盈、胜率尚可**,但 **盈亏比 1.91:1 未达 3:1**,且存在 **XVSUSDT 过度集中****秒损/短损** 问题。
- 优先建议:**提高盈亏比**(确认止盈目标与 ATR 用法)、**加强入场与短周期过滤**(减少秒损)、**分散标的**(冷却 + 智能补单 + 可选单币种日次数上限),再根据新数据微调止损与第一目标止盈比例。
如需,我可以根据你当前 `config.py` / 后台配置,给出一版具体的参数修改建议(含推荐数值)。

View File

@ -0,0 +1,130 @@
# 策略执行分析报告 · 2026-01-31
## 一、今日整体统计
| 指标 | 数值 |
|------|------|
| 总交易数 | 1511 笔已平仓 + 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**,多数在 7182处于超买区做多容易买在短期高点。
- **24h 涨跌幅** 做多时普遍 30%64%,说明入场时已大涨,易追高。
- **持仓时长**:多笔 02 分钟即止损,属于“秒损/短损”,入场质量差。
结论:**做多缺少“RSI 超买过滤”和“涨跌幅过大过滤”**,在 RSI>70、已大涨时仍开多单导致集中止损。
### 2.3 做空 (SELL) 表现
- DUSKUSDT / RENDERUSDTRSI 多在 1630超卖或趋势空各有 1 盈 1 亏,净为正。
- DASHUSDTRSI 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 1630 暂可接受。
**实现要点**:在 `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` 默认 falseneutral 时只生成推荐、不自动下单。
**实现要点**:与现有 `AUTO_TRADE_ALLOW_4H_NEUTRAL` 或 trend 过滤逻辑结合,把 neutral 视为“无趋势”,降低开仓频率。
### 4.4 单标的集中度与冷却
- **问题**SYNUSDT 单日多笔做多连续止损,标的和方向过于集中。
- **建议**
- 已启用同一交易对连续亏损冷却时SYNUSDT 在 2 笔止损后应进入冷却,避免同一标的连续多笔做多。
- 可检查 `SYMBOL_LOSS_COOLDOWN_ENABLED`、`SYMBOL_MAX_CONSECUTIVE_LOSSES` 是否生效;若今日仍出现 SYNUSDT 多笔连续止损,可适当**缩短冷却时间内的补单**或**单标的单日最大开仓次数**限制。
### 4.5 止损与持仓时长(次要)
- 今日多笔 02 分钟止损,主要来自**入场位置差**(追高),而非单纯止损太紧。
- 优先做完 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 上限 + 做多涨跌幅上限”的代码片段和配置项命名建议。

View File

@ -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市场可以考虑适当放宽阈值

View File

@ -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):
# 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("MACD金叉但4H趋势向下禁止逆势做多")
reasons.append(f"MACD金叉但RSI超买({rsi:.1f}),禁止追多")
else:
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):
# 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("MACD死叉但4H趋势向上禁止逆势做空")
reasons.append(f"MACD死叉但RSI超卖({rsi:.1f}),禁止追空")
else:
reasons.append(f"MACD死叉但4H趋势不明确({trend_4h}),禁止开仓")
# EMA均线系统
if ema20 and ema50:
if current_price > ema20 > ema50: # 上升趋势
if trend_4h in ('up', 'neutral', None):
# 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):
# 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之下")

View File

@ -304,13 +304,19 @@ 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):
# 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):
# OPTIMIZATION: 仅允许明确向下趋势
if trend_4h == 'down':
# OPTIMIZATION: 添加 RSI 过滤
if rsi is None or rsi > 30:
signal_strength += 3
reasons.append("MACD死叉")
if direction is None:
@ -318,13 +324,17 @@ class TradeRecommender:
if ema20 and ema50:
if current_price > ema20 > ema50:
if trend_4h in ('up', 'neutral', None):
# 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):
# OPTIMIZATION: 仅允许明确向下趋势
if trend_4h == 'down':
if rsi is None or rsi > 30:
signal_strength += 2
reasons.append("价格在均线之下")
if direction is None: