趋势策略

This commit is contained in:
2025-10-19 21:52:08 +08:00
parent 6fc10484d2
commit f2f577c07f

View File

@@ -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:
"""