全新的策略
This commit is contained in:
parent
9e61e3c2e3
commit
489c91f887
@ -4,7 +4,6 @@ warnings.filterwarnings("ignore", category=UserWarning, module="pandas_ta")
|
||||
from freqtrade.strategy import IStrategy
|
||||
from pandas import DataFrame
|
||||
import pandas_ta as ta
|
||||
from freqtrade.exchange import timeframe_to_minutes
|
||||
|
||||
class FreqaiPrimer(IStrategy):
|
||||
# 策略参数
|
||||
@ -16,7 +15,7 @@ class FreqaiPrimer(IStrategy):
|
||||
}
|
||||
|
||||
stoploss = -0.015 # 初始止损 -1.5%
|
||||
trailing_stop = True # 启用追踪止损
|
||||
trailing_stop = True
|
||||
trailing_stop_positive = 0.008 # 价格上涨 0.8% 后开始追踪
|
||||
trailing_stop_positive_offset = 0.01 # 追踪止损偏移量 1%
|
||||
|
||||
@ -24,14 +23,13 @@ class FreqaiPrimer(IStrategy):
|
||||
can_short = False # 禁用做空
|
||||
|
||||
# 自定义指标参数
|
||||
bb_length = 20 # 布林带周期
|
||||
bb_std = 2.0 # 布林带标准差
|
||||
rsi_length = 14 # RSI 周期
|
||||
rsi_overbought = 70 # RSI 超买阈值
|
||||
rsi_oversold = 30 # RSI 超卖阈值
|
||||
bb_length = 20
|
||||
bb_std = 2.0
|
||||
rsi_length = 14
|
||||
rsi_overbought = 70
|
||||
rsi_oversold = 40 # 放宽超卖阈值到 40
|
||||
|
||||
def informative_pairs(self):
|
||||
# 定义辅助时间框架
|
||||
pairs = self.dp.current_whitelist()
|
||||
return [(pair, '15m') for pair in pairs] + [(pair, '1h') for pair in pairs]
|
||||
|
||||
@ -82,20 +80,39 @@ class FreqaiPrimer(IStrategy):
|
||||
(dataframe['open'] < dataframe['close'].shift(1))
|
||||
)
|
||||
|
||||
# 调试:打印指标值(最后 5 行)
|
||||
print(f"Pair: {metadata['pair']}, Last 5 rows:")
|
||||
print(dataframe[['date', 'close', 'bb_lower_3m', 'rsi_3m', 'rsi_15m', 'rsi_1h', 'bullish_engulfing', 'volume', 'volume_ma']].tail(5))
|
||||
|
||||
return dataframe
|
||||
|
||||
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
# 做多条件
|
||||
dataframe.loc[
|
||||
(
|
||||
(dataframe['close'] <= dataframe['bb_lower_3m']) &
|
||||
(dataframe['rsi_3m'] < self.rsi_oversold) &
|
||||
(dataframe['rsi_15m'] < self.rsi_oversold) &
|
||||
(dataframe['close'] <= dataframe['bb_lower_1h']) &
|
||||
(dataframe['bullish_engulfing']) &
|
||||
(dataframe['volume'] > dataframe['volume_ma'])
|
||||
),
|
||||
'enter_long'] = 1
|
||||
# 做多条件(进一步放宽)
|
||||
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']) # 成交量高于均量
|
||||
]
|
||||
# 看涨吞没或极低 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
|
||||
|
||||
# 调试:检查每个条件的触发情况
|
||||
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" - 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")
|
||||
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']])
|
||||
else:
|
||||
print("No entry signals generated.")
|
||||
|
||||
return dataframe
|
||||
|
||||
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user