--- original_strategy.py +++ modified_strategy.py @@ -297,6 +297,9 @@ class FreqaiPrimer(IStrategy): dataframe["bb_lowerband"] = lowerband dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14) dataframe["volume_mean_20"] = dataframe["volume"].rolling(20).mean() dataframe["volume_std_20"] = dataframe["volume"].rolling(20).std() dataframe["volume_z_score"] = (dataframe["volume"] - dataframe["volume_mean_20"]) / dataframe["volume_std_20"] + # 计算15分钟ATR和3分钟EMA10、EMA20 + dataframe_15m = self.dp.get_pair_dataframe(pair=pair, timeframe="15m") + cuyuan + dataframe_15m['atr15m'] = ta.ATR(dataframe_15m, timeperiod=14) + dataframe['atr15m'] = dataframe_15m['atr15m'].reindex(dataframe.index, method="ffill") + dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10) + dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20) @@ -390,8 +390,11 @@ class FreqaiPrimer(IStrategy): conditions = [] if "&-price_value_divergence" in dataframe.columns: cond1 = (dataframe["&-price_value_divergence"] > self.sell_threshold * 1.025) - cond2 = (dataframe["rsi"] > 75) + rsi_threshold = 70 if trend_score > 50 else 65 # 动态RSI阈值 + cond2 = (dataframe["rsi"] > rsi_threshold) + cond3 = (dataframe['ema10'] < dataframe['ema20']) # 短期均线交叉 sell_condition = cond1 | cond2 conditions.append(sell_condition) @@ -442,6 +442,13 @@ class FreqaiPrimer(IStrategy): initial_stake_amount = trade.stake_amount / 3 logger.debug(f"{pair} 首次入场金额: {initial_stake_amount:.2f}, 当前持仓金额: {trade.stake_amount:.2f}, " f"加仓次数: {trade.nr_of_successful_entries - 1}") + # 分批出场:短期涨幅触发 + short_term_return = (current_rate - dataframe['close'].shift(3).iloc[-1]) / dataframe['close'].shift(3).iloc[-1] + if short_term_return >= 0.03: # 3%涨幅 + reduce_amount = -0.5 * trade.stake_amount # 卖出50%仓位 + logger.info(f"{pair} 短期涨幅 {short_term_return*100:.2f}%,卖出50%仓位 {abs(reduce_amount):.2f}") + return (reduce_amount, f"Short-term gain {short_term_return*100:.2f}%") + # 加仓逻辑 max_entry_adjustments = self.MAX_ENTRY_POSITION_ADJUSTMENT.value @@ -484,12 +484,11 @@ class FreqaiPrimer(IStrategy): # 追踪止损逻辑 trailing_stop_start = self.TRAILING_STOP_START.value trailing_stop_distance = self.TRAILING_STOP_DISTANCE.value - # 使用 Sigmoid 映射调整追踪止损参数 - sigmoid = 1 / (1 + np.exp(-0.1 * (trend_score - 50))) - trailing_factor = 0.8 + (1.2 - 0.8) * sigmoid # 牛市(100) -> 1.2, 熊市(0) -> 0.8 - distance_factor = 0.7 + (1.5 - 0.7) * sigmoid # 牛市(100) -> 1.5, 熊市(0) -> 0.7 - trailing_stop_start *= trailing_factor - trailing_stop_distance *= distance_factor + # 使用15分钟ATR动态调整止损距离 + atr15m = dataframe['atr15m'].iloc[-1] + trailing_stop_distance = min(max(2 * atr15m / current_rate, 0.01), 0.05) # 2倍ATR,限制在0.01-0.05 + if trend_score > 50: # 强趋势时放宽止损 + trailing_stop_distance *= 1.2 + trailing_stop_price = max_rate * (1 - trailing_stop_distance) if profit_ratio >= trailing_stop_start and not self.trailing_stop_enabled: self.trailing_stop_enabled = True trade.adjust_min_max_rates(current_rate, current_rate) logger.info(f"{pair} 价格上涨超过 {trailing_stop_start*100:.1f}%,启动追踪止损") return None