diff --git a/freqtrade/templates/freqaiprimer.py b/freqtrade/templates/freqaiprimer.py index daec4301..066e9ad0 100644 --- a/freqtrade/templates/freqaiprimer.py +++ b/freqtrade/templates/freqaiprimer.py @@ -151,6 +151,7 @@ class FreqaiPrimer(IStrategy): }, "data_split_parameters": { "test_size": 0.2, + "random_state": 42, "shuffle": False, }, "model_training_parameters": { @@ -1458,42 +1459,71 @@ class FreqaiPrimer(IStrategy): rate: float, time_in_force: str, exit_reason: str, current_time: datetime, **kwargs) -> bool: adjusted_rate = rate * (1 + 0.0025) - logger.info(f"[{pair}] 退出交易,原因:{exit_reason}, 原始利润:{trade.calc_profit_ratio(rate):.2%},"f"调整后卖出价:{adjusted_rate:.6f}") + + # 增强exit tag显示,包含更多信息 + trade_profit = trade.calc_profit_ratio(rate) + hold_duration = (current_time - trade.open_date_utc).total_seconds() / 3600 # 小时 + + # 为不同exit原因添加详细tag + detailed_exit_reason = f"{exit_reason}_profit{trade_profit:.1%}_hold{hold_duration:.1f}h" + + logger.info(f"[{pair}] 退出交易,原因:{detailed_exit_reason}, 原始利润:{trade_profit:.2%}, 调整后卖出价:{adjusted_rate:.6f}") + + # 将详细信息添加到trade对象,便于UI显示 + if hasattr(trade, 'exit_reason_detailed'): + trade.exit_reason_detailed = detailed_exit_reason + return True def custom_roi(self, trade: Trade, current_profit: float, current_time: datetime, trade_dur: int, current_rate: float = None, min_stake: float | None = None, max_stake: float | None = None) -> dict: """ - 动态调整 ROI 表格,基于 FreqAI 预测的 &-price_value_divergence 和 RSI。 - - 负的 divergence(预测上涨)或低 RSI 时提高 ROI。 - - 正的 divergence(预测下跌)或高 RSI 时降低 ROI。 - - 长时间持仓降低 ROI 目标。 + 动态调整 ROI 表格,考虑加仓状态和盈亏状况。 + - 加仓未完成时完全禁用ROI机制(返回极高值) + - 亏损状态下使用固定保守ROI + - 盈利状态下才启用动态调整 """ pair = trade.pair logger.info(f"[{pair}] 计算自定义 ROI,当前盈利: {current_profit:.2%}, 持仓时间: {trade_dur} 分钟") - # 获取最新数据 - dataframe = self.dp.get_pair_dataframe(pair=pair, timeframe=self.timeframe) - dataframe = self.populate_indicators(dataframe, {'pair': pair}) # 计算指标 + # 检查加仓次数是否用完 + filled_entries = trade.select_filled_orders(trade.entry_side) + add_count = len(filled_entries) - 1 # 减去首笔入场 + + if add_count < MAX_ENTRY_POSITION_ADJUSTMENT: + # 加仓未完成,完全禁用ROI机制 + disabled_roi = { + 0: 1.0, # 极高值,确保不会触发 + 999999: 1.0 + } + logger.info(f"[{pair}] 加仓次数 {add_count}/{MAX_ENTRY_POSITION_ADJUSTMENT} 未完成,禁用ROI机制") + return disabled_roi + + # 加仓完成后才考虑ROI + if current_profit < 0: + # 亏损状态下使用保守ROI + conservative_roi = { + 0: 0.08, + 60: 0.05, + 180: 0.03, + 360: 0.01 + } + logger.info(f"[{pair}] 加仓完成但亏损 {current_profit:.2%},使用保守ROI: {conservative_roi}") + return conservative_roi + + # 盈利状态下启用动态调整 + dataframe = self.dp.get_pair_dataframe(pair=pair, timeframe=self.timeframe) + dataframe = self.populate_indicators(dataframe, {'pair': pair}) - # 获取 FreqAI 预测和 RSI divergence = dataframe["&-price_value_divergence"].iloc[-1] if "&-price_value_divergence" in dataframe else 0 rsi = dataframe["rsi"].iloc[-1] if "rsi" in dataframe else 50 - # 计算调整系数 - # 1. Divergence 调整:负值(预测上涨)-> 提高 ROI,正值(预测下跌)-> 降低 ROI divergence_factor = self.linear_map(divergence, -0.1, 0.1, 1.2, 0.8) - - # 2. RSI 调整:低 RSI(超卖)-> 提高 ROI,高 RSI(超买)-> 降低 ROI rsi_factor = self.linear_map(rsi, 30, 70, 1.2, 0.8) - - # 3. 时间调整:持仓时间越长,ROI 目标降低 - time_factor = self.linear_map(trade_dur, 0, 240, 1.0, 0.7) # 4小时后 ROI 降低到 70% + time_factor = self.linear_map(trade_dur, 0, 240, 1.0, 0.7) - # 综合调整系数 roi_factor = divergence_factor * rsi_factor * time_factor - # 默认 ROI 表格 base_roi = { 0: 0.06, 30: 0.04, @@ -1501,12 +1531,9 @@ class FreqaiPrimer(IStrategy): 270: 0.002 } - # 动态调整 ROI,限制在 0% 到 20% 之间 dynamic_roi = {time: min(max(roi * roi_factor, 0.0), 0.2) for time, roi in base_roi.items()} - logger.info(f"[{pair}] Divergence: {divergence:.4f}, RSI: {rsi:.2f}, 持仓时间: {trade_dur} 分钟, " - f"调整系数: divergence={divergence_factor:.2f}, rsi={rsi_factor:.2f}, time={time_factor:.2f}, " - f"总系数={roi_factor:.2f}, 动态 ROI 表格: {dynamic_roi}") + logger.info(f"[{pair}] 加仓完成且盈利,动态ROI: {dynamic_roi}") return dynamic_roi def custom_entry_price(self, pair: str, trade: Trade | None, current_time: datetime, proposed_rate: float,