ATR回调止损

This commit is contained in:
zhangkun9038@dingtalk.com 2025-05-04 21:35:09 +08:00
parent ae443aa5f1
commit bd1e0cf271

View File

@ -583,21 +583,41 @@ class OKXRegressionStrategy(IStrategy):
except Exception as e:
logger.error(f"FreqAI fit 失败:{str(e)}")
raise
def _callback_stop_loss(self, dataframe: DataFrame, metadata: dict, callback_percent: float = 0.015) -> DataFrame:
def _callback_stop_loss(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
回调止损逻辑当价格从近期高点回撤超过指定百分比
并结合 RSI 或布林带信号同时考虑高时间框架趋势
动态回调止损逻辑基于ATR调整回撤阈值并结合RSI和布林带过滤信号
"""
pair = metadata.get('pair', 'unknown')
# 计算滚动最高价(过去 N 根K线内的最高点
# 设置默认参数
atr_col = 'ATR_14'
rolling_high_period = 20
rsi_overbought = 70
# 设置不同币种的回调乘数
callback_multipliers = {
"BTC/USDT": 1.5,
"ETH/USDT": 1.8,
"OKB/USDT": 2.0,
"TON/USDT": 2.2,
}
callback_multiplier = callback_multipliers.get(pair, 2.0)
# 确保ATR列存在
if atr_col not in dataframe.columns:
dataframe[atr_col] = ta.ATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=14)
# 计算动态回调百分比基于ATR
dataframe['callback_threshold'] = dataframe[atr_col] * callback_multiplier
# 计算滚动最高价
dataframe['rolling_high'] = dataframe['close'].rolling(window=rolling_high_period).max()
# 计算当前价格相对于最近高点的回撤比例
# 计算当前价格相对于最近高点的回撤比例使用ATR标准化
dataframe['callback_ratio'] = (dataframe['close'] - dataframe['rolling_high']) / dataframe['rolling_high']
dataframe['callback_condition_atr'] = (dataframe['close'] - dataframe['rolling_high']) <= -dataframe['callback_threshold']
# 获取 RSI 和布林带信息
rsi_overbought = 70
# 获取RSI和布林带信息
dataframe['in_overbought'] = dataframe['rsi'] > rsi_overbought
dataframe['below_bb_upper'] = dataframe['close'] < dataframe['bb_upper']
@ -605,14 +625,28 @@ class OKXRegressionStrategy(IStrategy):
dataframe['trend_up'] = dataframe['close'] > dataframe['trend_1h']
dataframe['trend_down'] = dataframe['close'] < dataframe['trend_1h']
# 回调止损条件:
# 1. 当前价格回撤超过设定的百分比
# 2. RSI 处于超买状态 OR 价格跌破布林带上轨
# 3. 当前处于下降趋势(高时间框架确认)
# 综合回调止损条件
callback_condition = (
(dataframe['callback_ratio'] <= -callback_percent) &
dataframe['callback_condition_atr'] &
((dataframe['in_overbought'] | (~dataframe['below_bb_upper']))) &
(dataframe['trend_down'])
dataframe['trend_down']
)
# 应用回调止损逻辑
dataframe.loc[callback_condition, 'exit_long'] = 1
return dataframe
dataframe['below_bb_upper'] = dataframe['close'] < dataframe['bb_upper']
# 获取高时间框架趋势1小时均线
dataframe['trend_up'] = dataframe['close'] > dataframe['trend_1h']
dataframe['trend_down'] = dataframe['close'] < dataframe['trend_1h']
# 综合回调止损条件
callback_condition = (
dataframe['callback_condition_atr'] &
((dataframe['in_overbought'] | (~dataframe['below_bb_upper']))) &
dataframe['trend_down']
)
# 应用回调止损逻辑