From f2f577c07f390a220c5fcba0cd145d0ef9fd8eac Mon Sep 17 00:00:00 2001 From: aszerW Date: Sun, 19 Oct 2025 21:52:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=8B=E5=8A=BF=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategies/SimpleRSIStrategy_Fixed.py | 86 +++++++++++-------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/user_data/strategies/SimpleRSIStrategy_Fixed.py b/user_data/strategies/SimpleRSIStrategy_Fixed.py index 8d1e5d3..3fe0075 100644 --- a/user_data/strategies/SimpleRSIStrategy_Fixed.py +++ b/user_data/strategies/SimpleRSIStrategy_Fixed.py @@ -44,7 +44,7 @@ class SimpleRSIStrategyFixed(IStrategy): "0": 100 } - timeframe = '1d' + timeframe = '1h' # 策略参数 rsi_period_short = 6 @@ -61,44 +61,60 @@ class SimpleRSIStrategyFixed(IStrategy): """ 添加技术指标到数据框 """ - try: - # RSI 指标 (6, 12) 及位移 - dataframe['rsi_6'] = ta.RSI(dataframe['close'], timeperiod=6) - dataframe['rsi_12'] = ta.RSI(dataframe['close'], timeperiod=12) - for i in range(1, 6): - dataframe[f'rsi_6_shift{i}'] = dataframe['rsi_6'].shift(i) - dataframe[f'rsi_12_shift{i}'] = dataframe['rsi_12'].shift(i) + df = dataframe.copy() + + # 将date设置为索引用于resample + df['date'] = df['date'].dt.tz_convert('Asia/Shanghai') + df = df.set_index('date') + df_resample = df.resample('24h', label='right').agg({ + 'open': 'first', + 'high': 'max', + 'low': 'min', + 'close': 'last', + 'volume': 'sum' + }) - # EMA 指标 (10, 20, 30) 及位移 - dataframe['ema_10'] = ta.EMA(dataframe['close'], timeperiod=10) - dataframe['ema_20'] = ta.EMA(dataframe['close'], timeperiod=20) - dataframe['ema_30'] = ta.EMA(dataframe['close'], timeperiod=30) - for i in range(1, 6): - dataframe[f'ema_10_shift{i}'] = dataframe['ema_10'].shift(i) - dataframe[f'ema_20_shift{i}'] = dataframe['ema_20'].shift(i) - dataframe[f'ema_30_shift{i}'] = dataframe['ema_30'].shift(i) + # RSI 指标 (6, 12) 及位移 + df_resample['rsi_6'] = ta.RSI(df_resample['close'], timeperiod=6) + df_resample['rsi_12'] = ta.RSI(df_resample['close'], timeperiod=12) + for i in range(1, 6): + df_resample[f'rsi_6_shift{i}'] = df_resample['rsi_6'].shift(i) + df_resample[f'rsi_12_shift{i}'] = df_resample['rsi_12'].shift(i) - # 方便条件判断的差值与比率(带除零保护) - dataframe['ema_10_20_diff'] = dataframe['ema_10'] - dataframe['ema_20'] - dataframe['ema_10_20_ratio'] = np.where( - dataframe['ema_20'] != 0, - dataframe['ema_10_20_diff'] / dataframe['ema_20'], - 0 + # EMA 指标 (10, 20, 30) 及位移 + df_resample['ema_10'] = ta.EMA(df_resample['close'], timeperiod=10) + df_resample['ema_20'] = ta.EMA(df_resample['close'], timeperiod=20) + df_resample['ema_30'] = ta.EMA(df_resample['close'], timeperiod=30) + for i in range(1, 6): + df_resample[f'ema_10_shift{i}'] = df_resample['ema_10'].shift(i) + df_resample[f'ema_20_shift{i}'] = df_resample['ema_20'].shift(i) + df_resample[f'ema_30_shift{i}'] = df_resample['ema_30'].shift(i) + + # 方便条件判断的差值与比率(带除零保护) + df_resample['ema_10_20_diff'] = df_resample['ema_10'] - df_resample['ema_20'] + df_resample['ema_10_20_ratio'] = np.where( + df_resample['ema_20'] != 0, + df_resample['ema_10_20_diff'] / df_resample['ema_20'], + 0 + ) + for i in range(1, 6): + df_resample[f'ema_10_20_diff_shift{i}'] = df_resample['ema_10_20_diff'].shift(i) + df_resample[f'ema_10_20_ratio_shift{i}'] = np.where( + df_resample[f'ema_20_shift{i}'] != 0, + df_resample[f'ema_10_20_diff_shift{i}'] / df_resample[f'ema_20_shift{i}'], + 0 ) - for i in range(1, 6): - dataframe[f'ema_10_20_diff_shift{i}'] = dataframe['ema_10_20_diff'].shift(i) - dataframe[f'ema_10_20_ratio_shift{i}'] = np.where( - dataframe[f'ema_20_shift{i}'] != 0, - dataframe[f'ema_10_20_diff_shift{i}'] / dataframe[f'ema_20_shift{i}'], - 0 - ) - dataframe.to_csv("rsi_eth2.csv", index=False, encoding='utf-8-sig') - logger.debug(f"Indicators populated successfully for {metadata.get('pair', 'unknown')}") - return dataframe + + df_resample = df_resample.drop(columns=['open', 'high', 'low', 'close', 'volume']) + df_resample.index = df_resample.index.tz_convert('UTC') + dataframe = dataframe.join(df_resample, + on='date', + how='left').ffill() + dataframe.to_csv("rsi_eth2.csv", index=False, encoding='utf-8-sig') + logger.debug(f"Indicators populated successfully for {metadata.get('pair', 'unknown')}") + return dataframe + - except Exception as e: - logger.error(f"Error populating indicators: {e}") - return dataframe def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: Dict) -> pd.DataFrame: """