有交易了,但是多

This commit is contained in:
zhangkun9038@dingtalk.com 2025-08-30 11:48:39 +08:00
parent 489c91f887
commit f65dda12b4

View File

@ -26,8 +26,8 @@ class FreqaiPrimer(IStrategy):
bb_length = 20
bb_std = 2.0
rsi_length = 14
rsi_overbought = 70
rsi_oversold = 40 # 放宽超卖阈值到 40
rsi_overbought = 65 # 收紧超买阈值到 65
rsi_oversold = 30 # 收紧超卖阈值到 30
def informative_pairs(self):
pairs = self.dp.current_whitelist()
@ -43,7 +43,7 @@ class FreqaiPrimer(IStrategy):
# 成交量过滤
dataframe['volume_ma'] = dataframe['volume'].rolling(20).mean()
# 计算 ATR 用于动态止损
# 计算 ATR 用于动态止损和退出
dataframe['atr'] = ta.atr(dataframe['high'], dataframe['low'], dataframe['close'], length=14)
# 获取 15m 数据
@ -87,26 +87,26 @@ class FreqaiPrimer(IStrategy):
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 做多条件(进一步放宽
# 做多条件(收紧条件以减少交易量
conditions = [
(dataframe['close'] <= dataframe['bb_lower_3m'] * 1.05), # 价格接近 3m 布林带下轨(允许 5% 偏差)
(dataframe['rsi_3m'] < self.rsi_oversold), # 3m RSI 超卖 (< 40)
(dataframe['rsi_15m'] < self.rsi_oversold), # 15m RSI 超卖 (< 40)
(dataframe['volume'] > dataframe['volume_ma']) # 成交量高于均量
(dataframe['close'] <= dataframe['bb_lower_3m']), # 严格要求价格低于 3m 布林带下轨
(dataframe['rsi_3m'] < self.rsi_oversold), # 3m RSI < 30
(dataframe['rsi_15m'] < self.rsi_oversold), # 15m RSI < 30
(dataframe['close'] <= dataframe['bb_lower_15m']), # 价格低于 15m 布林带下轨
(dataframe['bullish_engulfing']), # 强制要求看涨吞没
(dataframe['volume'] > dataframe['volume_ma'] * 1.2) # 成交量高于均量的 1.2 倍
]
# 看涨吞没或极低 RSI可选
conditions.append(dataframe['bullish_engulfing'] | (dataframe['rsi_3m'] < self.rsi_oversold - 10)) # RSI < 30 替代看涨吞没
# 应用条件
dataframe.loc[conditions[0] & conditions[1] & conditions[2] & conditions[3] & conditions[4], 'enter_long'] = 1
dataframe.loc[conditions[0] & conditions[1] & conditions[2] & conditions[3] & conditions[4] & conditions[5], 'enter_long'] = 1
# 调试:检查每个条件的触发情况
print(f"Pair: {metadata['pair']}, Entry condition checks:")
print(f" - Close <= bb_lower_3m * 1.05: {(dataframe['close'] <= dataframe['bb_lower_3m'] * 1.05).sum()} candles")
print(f" - Close <= bb_lower_3m: {(dataframe['close'] <= dataframe['bb_lower_3m']).sum()} candles")
print(f" - RSI_3m < {self.rsi_oversold}: {(dataframe['rsi_3m'] < self.rsi_oversold).sum()} candles")
print(f" - RSI_15m < {self.rsi_oversold}: {(dataframe['rsi_15m'] < self.rsi_oversold).sum()} candles")
print(f" - Volume > Volume_MA: {(dataframe['volume'] > dataframe['volume_ma']).sum()} candles")
print(f" - Bullish Engulfing or RSI_3m < {self.rsi_oversold - 10}: {(dataframe['bullish_engulfing'] | (dataframe['rsi_3m'] < self.rsi_oversold - 10)).sum()} candles")
print(f" - Close <= bb_lower_15m: {(dataframe['close'] <= dataframe['bb_lower_15m']).sum()} candles")
print(f" - Bullish Engulfing: {(dataframe['bullish_engulfing']).sum()} candles")
print(f" - Volume > Volume_MA * 1.2: {(dataframe['volume'] > dataframe['volume_ma'] * 1.2).sum()} candles")
if dataframe['enter_long'].sum() > 0:
print(f"Entry signals found at:")
print(dataframe[dataframe['enter_long'] == 1][['date', 'close', 'rsi_3m', 'rsi_15m', 'bullish_engulfing']])
@ -116,11 +116,12 @@ class FreqaiPrimer(IStrategy):
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# 做多退出
# 做多退出(添加 ATR 动态退出)
dataframe.loc[
(
(dataframe['close'] >= dataframe['bb_upper_3m']) |
(dataframe['rsi_3m'] > self.rsi_overbought)
(dataframe['rsi_3m'] > self.rsi_overbought) |
(dataframe['close'] > dataframe['open'] + dataframe['atr'] * 2) # 获利 2 倍 ATR
),
'exit_long'] = 1
return dataframe