Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 269 additions & 0 deletions ICT_STRATEGY_FIX_GUIDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
# ICT 策略 v1.1.0 修复说明和测试指南

## 🔧 修复内容总结

### 问题诊断
初始回测结果显示:
- ✗ 9笔交易全部亏损 (Win% = 0%)
- ✗ 持仓时间为 0:00:00(立即止损)
- ✗ 所有交易被 trailing_stop_loss 触发
- ✗ 总亏损 -9.737 USDT (-0.97%)

### 根本原因
1. **Custom Stoploss 计算错误** - ATR 倍数太小,止损太紧
2. **Trailing Stop 过于激进** - 在盈利2%时就启动,导致快速止损
3. **入场条件太宽松** - 产生大量假信号
4. **流动性水平计算不准确** - PDH/PDL 使用 rolling 方法不精确

---

## ✅ v1.1.0 修复详情

### 1. Custom Stoploss 修复
```python
# 修复前
atr_multiplier = 1.5
stop_distance = (atr * 1.5) / trade.open_rate
return -stop_distance

# 修复后
atr_multiplier = 2.0 # 增加到2.0,提供更多空间
stop_percentage = (atr * atr_multiplier) / trade.open_rate
return -min(stop_percentage, 0.05) # 添加5%上限
# 新增:错误处理和回退逻辑
```

**改进**:
- ✓ ATR 倍数从 1.5x 增加到 2.0x
- ✓ 添加了 5% 止损上限
- ✓ 添加异常处理和回退机制
- ✓ 验证 ATR 数据有效性

### 2. Trailing Stop 优化
```python
# 修复前
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.02 # 2%触发

# 修复后
trailing_stop = False # 暂时禁用以调试
trailing_stop_positive_offset = 0.03 # 提高到3%
```

**改进**:
- ✓ 暂时禁用 trailing_stop 以排除干扰
- ✓ 触发偏移量从 2% 提高到 3%

### 3. 流动性水平计算改进
```python
# 修复前
dataframe['pdh'] = dataframe['high'].shift(288).rolling(window=288).max()

# 修复后
dataframe['date_only'] = dataframe['date'].dt.date
daily_high = dataframe.groupby('date_only')['high'].transform('max')
dataframe['pdh'] = daily_high.shift(288).ffill()
```

**改进**:
- ✓ 使用 date grouping 而非 rolling window
- ✓ 更准确的日线高低点识别
- ✓ 改进的前向填充逻辑

### 4. 入场条件增强

#### 做多条件(Long Entry)
```python
# 新增严格过滤器
- Session Filter: 仅 London 或 NY AM 时段
- Sweep Type: 要求 PDL_sweep 或 PWL_sweep(强信号)
- Trend Alignment: 价格必须 > EMA20
- RSI Range: 30 < RSI < 65(避免极端区域)
- Data Validation: 检查 PDL 和 Asian_Low 非空
```

#### 做空条件(Short Entry)
```python
# 新增严格过滤器
- Session Filter: 仅 London 或 NY AM 时段
- Sweep Type: 要求 PDH_sweep 或 PWH_sweep(强信号)
- Trend Alignment: 价格必须 < EMA20
- RSI Range: 35 < RSI < 70(避免极端区域)
- Data Validation: 检查 PDH 和 Asian_High 非空
```

---

## 🧪 测试指南

### 步骤 1: 下载最新策略
```bash
cd ~/freqtrade-ft/user_data/strategies
# 如果已有旧版本,备份
mv ICT_TimeBasedLiquidityStrategy.py ICT_TimeBasedLiquidityStrategy.py.backup

# 从仓库拉取最新版本
# (假设你的 Docker 容器可以访问 Git 仓库)
```

或者直接从 GitHub 下载:
```bash
wget https://raw.githubusercontent.com/peterpeter228/NostalgiaForInfinity/claude/freqtrade-strategy-creation-014JLd8mjvcXFzM5byZGjvKa/ICT_TimeBasedLiquidityStrategy.py
```

### 步骤 2: 验证策略版本
```bash
docker compose run --rm freqtrade list-strategies
# 应该看到: ICT_TimeBasedLiquidityStrategy v1.1.0
```

### 步骤 3: 运行回测(相同参数)
```bash
docker compose run --rm freqtrade backtesting \
--config user_data/config.json \
--strategy ICT_TimeBasedLiquidityStrategy \
--timeframe 5m \
--timerange 20241001-
```

### 步骤 4: 对比结果

#### 期望改进:
| 指标 | v1.0.0(之前) | v1.1.0(期望) |
|------|----------------|----------------|
| **交易数量** | 9 | 减少(2-5)|
| **胜率 Win%** | 0% | 提升(>30%)|
| **平均持仓时间** | 0:00:00 | 增加(>1h)|
| **退出原因** | trailing_stop_loss | stoploss/roi/exit_signal |
| **总盈利** | -0.97% | 改善(目标 >0%)|

### 步骤 5: 详细分析
```bash
# 查看详细交易记录
docker compose run --rm freqtrade backtesting \
--config user_data/config.json \
--strategy ICT_TimeBasedLiquidityStrategy \
--timeframe 5m \
--timerange 20241001- \
--export trades
```

查看导出的交易文件:
```bash
cat user_data/backtest_results/backtest-result-*.json | jq '.["ICT_TimeBasedLiquidityStrategy"]'
```

---

## 🔍 调试技巧

### 如果仍然没有交易信号:
```python
# 在策略文件中临时添加调试日志(populate_entry_trend 函数)
log.warning(f"Sweep check: bullish={dataframe['bullish_sweep'].sum()}, bearish={dataframe['bearish_sweep'].sum()}")
log.warning(f"FVG check: bullish={dataframe['bullish_fvg'].sum()}, bearish={dataframe['bearish_fvg'].sum()}")
log.warning(f"Session: london={dataframe['is_london_session'].sum()}, ny_am={dataframe['is_ny_am_session'].sum()}")
```

### 检查时区设置:
```python
# 验证纽约时间转换是否正确
# 在 identify_sessions() 函数后添加:
log.info(f"Sample times - UTC: {dataframe['date'].iloc[0]}, NY Hour: {dataframe['hour_ny'].iloc[0]}")
```

### 宽松模式(用于测试):
如果需要验证策略是否能产生信号,可以临时放宽条件:
```python
# 临时修改入场条件(仅用于测试)
dataframe.loc[
(
(dataframe['bullish_sweep'] == 1) &
# 注释掉部分过滤器来测试
# (dataframe['bullish_bias'] == 1) &
(dataframe['volume'] > 0)
),
['enter_long', 'enter_tag']
] = (1, 'ict_test_mode')
```

---

## 📊 预期结果分析

### 如果交易数量减少到 0-1:
**原因**:条件过于严格
**解决方案**:
1. 检查时区设置是否正确
2. 验证 PDH/PDL 计算是否有值
3. 临时放宽 RSI 限制或 Session 限制

### 如果仍然立即止损:
**原因**:ATR 值可能异常
**解决方案**:
1. 检查 ATR 计算:`dataframe['atr'].describe()`
2. 增加 ATR 倍数到 3.0 或 4.0
3. 使用固定止损 `-0.03` (3%) 而非动态 ATR

### 如果交易数量合理但亏损:
**原因**:策略逻辑可能需要进一步调整
**解决方案**:
1. 分析哪些 Sweep 类型表现最好
2. 调整 FVG 确认窗口
3. 优化止盈目标(minimal_roi)

---

## 🚀 下一步行动

### 1. 立即测试
```bash
# 运行修复后的回测
docker compose run --rm freqtrade backtesting \
--config user_data/config.json \
--strategy ICT_TimeBasedLiquidityStrategy \
--timeframe 5m \
--timerange 20241001-
```

### 2. 如果结果改善
- 扩大回测范围:`--timerange 20240101-`
- 测试更多交易对
- 启用模拟交易

### 3. 如果结果仍不理想
- 反馈具体的回测结果
- 我将进一步调整参数
- 可能需要重新审视 ICT 概念的实现

---

## 📋 版本对比

| 功能 | v1.0.0 | v1.1.0 |
|------|--------|--------|
| ATR 倍数 | 1.5x | 2.0x |
| Trailing Stop | 启用 | 禁用 |
| Session Filter | 无 | London/NY AM |
| Trend Filter | 无 | EMA20 |
| RSI 范围 | 30-70 | 30-65 (long), 35-70 (short) |
| Sweep 类型要求 | 任意 | PDL/PWL 或 PDH/PWH |
| 数据验证 | 无 | notna() 检查 |

---

## 💬 反馈需求

请运行回测后,提供以下信息:
1. **交易数量**:新的交易数量是多少?
2. **胜率**:Win% 是否改善?
3. **持仓时间**:平均持仓时间是否增加?
4. **退出原因**:主要退出原因是什么?
5. **完整输出**:粘贴完整的回测结果

这将帮助我进一步优化策略!

---

**祝测试顺利!** 🎯
Loading