趋势策略
This commit is contained in:
@@ -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:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user