264 lines
7.3 KiB
Markdown
264 lines
7.3 KiB
Markdown
# ATR策略实现文档
|
||
|
||
## 一、概述
|
||
|
||
基于ATR(平均真实波幅)的动态止损止盈策略,根据市场波动自动调整止损止盈距离,避免被正常波动触发止损,同时保持合理的盈亏比。
|
||
|
||
## 二、核心原理
|
||
|
||
### 2.1 ATR指标
|
||
|
||
ATR(Average True Range)是衡量市场波动性的技术指标,计算公式:
|
||
|
||
```
|
||
True Range (TR) = max(
|
||
High - Low,
|
||
|High - Previous Close|,
|
||
|Low - Previous Close|
|
||
)
|
||
|
||
ATR = Average(TR over N periods)
|
||
```
|
||
|
||
ATR值越大,市场波动越大;ATR值越小,市场波动越小。
|
||
|
||
### 2.2 ATR策略逻辑
|
||
|
||
**止损计算**:
|
||
- 止损距离 = ATR × ATR止损倍数(默认1.8倍)
|
||
- 止损价格 = 入场价 ± 止损距离(做多减,做空加)
|
||
|
||
**止盈计算**:
|
||
- 方法1(优先):止盈距离 = 止损距离 × 盈亏比(默认3.0)
|
||
- 方法2(备选):止盈距离 = ATR × ATR止盈倍数(默认3.0倍)
|
||
|
||
**优势**:
|
||
- 市场平静时,ATR小,止损紧,保护利润
|
||
- 市场波动大时,ATR大,止损宽,避免被正常波动触发
|
||
- 始终保持在"正常波动"之外
|
||
|
||
## 三、实现架构
|
||
|
||
### 3.1 核心模块
|
||
|
||
#### `trading_system/atr_strategy.py`
|
||
ATR策略核心类,提供以下功能:
|
||
- `calculate_stop_loss()`: 计算基于ATR的止损价格
|
||
- `calculate_take_profit()`: 计算基于ATR的止盈价格
|
||
- `calculate_atr_levels()`: 计算完整的ATR止损止盈方案
|
||
- `calculate_atr_from_klines()`: 从K线数据计算ATR
|
||
|
||
#### `trading_system/indicators.py`
|
||
技术指标计算模块,增强功能:
|
||
- `calculate_atr()`: 计算ATR绝对值
|
||
- `calculate_atr_percent()`: 计算ATR百分比(新增)
|
||
|
||
#### `trading_system/risk_manager.py`
|
||
风险管理模块,集成ATR策略:
|
||
- 在`get_stop_loss_price()`中优先使用ATR止损
|
||
- 在`get_take_profit_price()`中优先使用ATR止盈
|
||
- 支持止损距离传递,用于盈亏比计算
|
||
|
||
### 3.2 数据流
|
||
|
||
```
|
||
K线数据 → 计算ATR → ATR策略类 → 计算止损止盈 → RiskManager → 最终价格
|
||
```
|
||
|
||
## 四、配置参数
|
||
|
||
### 4.1 基础配置
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `USE_ATR_STOP_LOSS` | `True` | 是否启用ATR动态止损 |
|
||
| `ATR_STOP_LOSS_MULTIPLIER` | `1.8` | ATR止损倍数(1.5-2倍) |
|
||
| `ATR_TAKE_PROFIT_MULTIPLIER` | `3.0` | ATR止盈倍数(3倍ATR) |
|
||
| `RISK_REWARD_RATIO` | `3.0` | 盈亏比(止损距离的倍数) |
|
||
| `ATR_PERIOD` | `14` | ATR计算周期 |
|
||
|
||
### 4.2 高级配置(可选)
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
|------|--------|------|
|
||
| `USE_DYNAMIC_ATR_MULTIPLIER` | `False` | 是否根据波动率动态调整ATR倍数 |
|
||
| `ATR_MULTIPLIER_MIN` | `1.5` | 动态ATR倍数最小值 |
|
||
| `ATR_MULTIPLIER_MAX` | `2.5` | 动态ATR倍数最大值 |
|
||
|
||
### 4.3 配置建议
|
||
|
||
**保守策略**:
|
||
- `ATR_STOP_LOSS_MULTIPLIER`: 1.5
|
||
- `RISK_REWARD_RATIO`: 2.5
|
||
|
||
**平衡策略**(推荐):
|
||
- `ATR_STOP_LOSS_MULTIPLIER`: 1.8
|
||
- `RISK_REWARD_RATIO`: 3.0
|
||
|
||
**激进策略**:
|
||
- `ATR_STOP_LOSS_MULTIPLIER`: 2.0
|
||
- `RISK_REWARD_RATIO`: 3.5
|
||
|
||
## 五、使用示例
|
||
|
||
### 5.1 基本使用
|
||
|
||
```python
|
||
from trading_system.atr_strategy import ATRStrategy
|
||
|
||
# 初始化ATR策略
|
||
atr_strategy = ATRStrategy()
|
||
|
||
# 计算止损
|
||
stop_loss_price, stop_distance, details = atr_strategy.calculate_stop_loss(
|
||
entry_price=50000.0,
|
||
side='BUY',
|
||
atr=1500.0, # ATR绝对值
|
||
atr_percent=0.03 # 或ATR百分比(3%)
|
||
)
|
||
|
||
# 计算止盈(基于止损距离和盈亏比)
|
||
take_profit_price, take_profit_distance, tp_details = atr_strategy.calculate_take_profit(
|
||
entry_price=50000.0,
|
||
side='BUY',
|
||
stop_distance=stop_distance, # 使用止损距离
|
||
use_risk_reward_ratio=True
|
||
)
|
||
```
|
||
|
||
### 5.2 从K线计算ATR
|
||
|
||
```python
|
||
from trading_system.atr_strategy import ATRStrategy
|
||
|
||
# 从K线数据计算ATR
|
||
atr, atr_percent, current_price = ATRStrategy.calculate_atr_from_klines(
|
||
klines=klines_data,
|
||
period=14
|
||
)
|
||
|
||
# 使用ATR计算止损止盈
|
||
result = atr_strategy.calculate_atr_levels(
|
||
entry_price=current_price,
|
||
side='BUY',
|
||
atr=atr,
|
||
atr_percent=atr_percent
|
||
)
|
||
```
|
||
|
||
### 5.3 在RiskManager中使用
|
||
|
||
```python
|
||
# RiskManager会自动使用ATR策略(如果启用)
|
||
stop_loss_price = risk_manager.get_stop_loss_price(
|
||
entry_price=50000.0,
|
||
side='BUY',
|
||
quantity=0.1,
|
||
leverage=10,
|
||
atr=1500.0 # 传递ATR值
|
||
)
|
||
|
||
# 计算止盈时,传递止损距离用于盈亏比计算
|
||
take_profit_price = risk_manager.get_take_profit_price(
|
||
entry_price=50000.0,
|
||
side='BUY',
|
||
quantity=0.1,
|
||
leverage=10,
|
||
atr=1500.0,
|
||
stop_distance=2700.0 # 止损距离(用于盈亏比计算)
|
||
)
|
||
```
|
||
|
||
## 六、计算示例
|
||
|
||
### 6.1 示例场景
|
||
|
||
假设:
|
||
- 入场价:50000 USDT
|
||
- ATR:1500 USDT(3%)
|
||
- ATR止损倍数:1.8
|
||
- 盈亏比:3.0
|
||
|
||
**止损计算**:
|
||
```
|
||
止损距离 = 1500 × 1.8 = 2700 USDT
|
||
止损百分比 = 3% × 1.8 = 5.4%
|
||
止损价(做多)= 50000 - 2700 = 47300 USDT
|
||
```
|
||
|
||
**止盈计算**(基于盈亏比):
|
||
```
|
||
止盈距离 = 2700 × 3.0 = 8100 USDT
|
||
止盈百分比 = 5.4% × 3.0 = 16.2%
|
||
止盈价(做多)= 50000 + 8100 = 58100 USDT
|
||
```
|
||
|
||
### 6.2 不同市场波动情况
|
||
|
||
**低波动市场**(ATR = 1%):
|
||
- 止损距离:1.8%
|
||
- 止盈距离:5.4%
|
||
- 止损更紧,保护利润
|
||
|
||
**高波动市场**(ATR = 5%):
|
||
- 止损距离:9%
|
||
- 止盈距离:27%
|
||
- 止损更宽,避免被正常波动触发
|
||
|
||
## 七、策略优势
|
||
|
||
### 7.1 自适应市场波动
|
||
- 市场平静时,止损自动收紧
|
||
- 市场波动大时,止损自动放宽
|
||
- 始终保持在正常波动范围之外
|
||
|
||
### 7.2 保持合理盈亏比
|
||
- 基于止损距离计算止盈,确保盈亏比一致
|
||
- 默认3:1盈亏比,长期盈利概率高
|
||
|
||
### 7.3 减少假信号
|
||
- 避免被正常市场波动触发止损
|
||
- 提高交易胜率和盈利能力
|
||
|
||
## 八、回退机制
|
||
|
||
如果ATR不可用或计算失败,系统会自动回退到:
|
||
1. 基于保证金的固定百分比止损
|
||
2. 基于价格百分比的最小保护
|
||
3. 技术分析止损(如果可用)
|
||
|
||
系统会从所有候选价格中选择最宽松的(做多取最大,做空取最小),确保止损不会过紧。
|
||
|
||
## 九、动态调整(可选)
|
||
|
||
如果启用`USE_DYNAMIC_ATR_MULTIPLIER`,系统会根据市场波动率动态调整ATR倍数:
|
||
|
||
- 波动率低(1-2%):使用最小倍数(1.5)
|
||
- 波动率中(3-5%):使用中等倍数(1.8-2.0)
|
||
- 波动率高(6-10%):使用最大倍数(2.5)
|
||
|
||
这样可以进一步优化止损距离,在低波动时更紧,高波动时更宽。
|
||
|
||
## 十、注意事项
|
||
|
||
1. **ATR计算需要足够的历史数据**:至少需要`ATR_PERIOD + 1`根K线
|
||
2. **ATR值会随市场变化**:建议定期更新ATR值
|
||
3. **不同周期ATR不同**:建议使用与交易周期一致的K线数据计算ATR
|
||
4. **极端市场情况**:在极端波动时,ATR可能无法及时反映,需要结合其他指标
|
||
|
||
## 十一、相关文件
|
||
|
||
- `trading_system/atr_strategy.py`: ATR策略核心实现
|
||
- `trading_system/indicators.py`: ATR计算函数
|
||
- `trading_system/risk_manager.py`: 风险管理集成
|
||
- `trading_system/config.py`: 配置参数
|
||
- `backend/config_manager.py`: 配置管理器
|
||
- `ATR.md`: ATR策略需求文档
|
||
|
||
## 十二、未来优化方向
|
||
|
||
1. **多周期ATR**:结合不同周期的ATR值
|
||
2. **ATR趋势**:考虑ATR的变化趋势,预测未来波动
|
||
3. **ATR百分比分位数**:使用ATR的历史分位数判断当前波动水平
|
||
4. **自适应盈亏比**:根据市场状态动态调整盈亏比
|