diff --git a/freqtrade/templates/OKXRegressionStrategy.py b/freqtrade/templates/OKXRegressionStrategy.py index 160d0fab..24cfa8be 100644 --- a/freqtrade/templates/OKXRegressionStrategy.py +++ b/freqtrade/templates/OKXRegressionStrategy.py @@ -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'] ) # 应用回调止损逻辑