退出信号给出原因, 加仓没加完, 禁止roi

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-22 21:30:16 +08:00
parent b7ec81e280
commit 482e4ec3af

View File

@ -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,