diff --git a/freqtrade/templates/OKXRegressionStrategy.py b/freqtrade/templates/OKXRegressionStrategy.py index 39b0357f..d64d6300 100644 --- a/freqtrade/templates/OKXRegressionStrategy.py +++ b/freqtrade/templates/OKXRegressionStrategy.py @@ -318,28 +318,80 @@ class OKXRegressionStrategy(IStrategy): :param multiplier: ATR乘数 :return: 更新后的DataFrame """ + # 获取交易对信息 + pair = metadata.get('pair', 'unknown') + + # 设置默认的止损倍数 + stop_loss_multiplier = 2.0 + + # 根据交易对调整止损倍数(示例:BTC/USDT 更稳定,止损倍数较低) + if pair == "BTC/USDT": + stop_loss_multiplier = 1.5 + elif pair == "DOGE/USDT": + stop_loss_multiplier = 2.5 + elif pair == "SOL/USDT": + stop_loss_multiplier = 2.0 + elif pair == "XRP/USDT": + stop_loss_multiplier = 2.0 + + # 计算止损线 dataframe['entry_price'] = dataframe['open'].where(dataframe['enter_long'] == 1).ffill() - dataframe['stop_loss_line'] = dataframe['entry_price'] - dataframe[atr_col] * multiplier + dataframe['stop_loss_line'] = dataframe['entry_price'] - dataframe[atr_col] * stop_loss_multiplier + # 应用止损逻辑 dataframe.loc[ (dataframe['close'] < dataframe['stop_loss_line']), 'exit_long' ] = 1 + return dataframe + + def _dynamic_take_profit(self, dataframe: DataFrame, metadata: dict, atr_col: str = 'ATR_14', multiplier: float = 2.0) -> DataFrame: + """ + 封装动态止盈逻辑,基于入场价和ATR计算止盈线 + :param dataframe: 原始DataFrame + :param metadata: 策略元数据 + :param atr_col: 使用的ATR列名 + :param multiplier: ATR乘数 + :return: 更新后的DataFrame + """ + # 获取交易对信息 + pair = metadata.get('pair', 'unknown') + + # 设置默认的止盈倍数 + take_profit_multiplier = 2.0 + + # 根据交易对调整止盈倍数(示例:BTC/USDT 更稳定,止盈倍数较高) + if pair == "BTC/USDT": + take_profit_multiplier = 3.0 + elif pair == "DOGE/USDT": + take_profit_multiplier = 1.5 + elif pair == "SOL/USDT": + take_profit_multiplier = 2.0 + elif pair == "XRP/USDT": + take_profit_multiplier = 2.0 + + # 计算止盈线 + dataframe['entry_price'] = dataframe['open'].where(dataframe['enter_long'] == 1).ffill() + dataframe['take_profit_line'] = dataframe['entry_price'] + dataframe[atr_col] * take_profit_multiplier + + # 应用止盈逻辑 + dataframe.loc[ + (dataframe['close'] > dataframe['take_profit_line']), + 'exit_long' + ] = 1 + return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: Dict) -> DataFrame: # 确保 ATR 列存在 if 'ATR_14' not in dataframe.columns: dataframe['ATR_14'] = 0.0 - # 计算动态止损线 - dataframe['stop_loss_line'] = dataframe['entry_price'] - (dataframe['ATR_14'] * 2) + # 应用动态止损和止盈逻辑 + dataframe = self._dynamic_stop_loss(dataframe, metadata) + dataframe = self._dynamic_take_profit(dataframe, metadata) - # 发送止损信息 - self.dp.send_msg(f"ATR: {dataframe['ATR_14'].iloc[-1]:.5f}, Stop Loss Line: {dataframe['stop_loss_line'].iloc[-1]:.5f}") - - # 应用动态止损逻辑 - return self._dynamic_stop_loss(dataframe, metadata) + return dataframe def custom_stake_amount(self, pair: str, current_time: 'datetime', current_rate: float, proposed_stake: float, min_stake: float, max_stake: float,