退出信号给出原因, 加仓没加完, 禁止roi
This commit is contained in:
parent
b7ec81e280
commit
482e4ec3af
@ -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)
|
||||
time_factor = self.linear_map(trade_dur, 0, 240, 1.0, 0.7)
|
||||
|
||||
# 3. 时间调整:持仓时间越长,ROI 目标降低
|
||||
time_factor = self.linear_map(trade_dur, 0, 240, 1.0, 0.7) # 4小时后 ROI 降低到 70%
|
||||
|
||||
# 综合调整系数
|
||||
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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user