添加ema26和ema52交叉策略,今年可以,还需要再看看细节
This commit is contained in:
@@ -102,32 +102,28 @@ class ChanLun_EMA_Align(IStrategy):
|
||||
time15 = 15
|
||||
time30 = 30
|
||||
time60 = 60
|
||||
chan = ChanLun()
|
||||
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
dataframe = self.add_indicators(dataframe)
|
||||
dataframe_5m = resample_to_interval(dataframe, self.get_ticker_indicator() * self.time5)
|
||||
dataframe_5m = self.add_indicators(dataframe_5m)
|
||||
dataframe_30m = resample_to_interval(dataframe, self.get_ticker_indicator() * self.time30)
|
||||
dataframe_30m = self.add_indicators(dataframe_30m)
|
||||
dataframe_30m['ema_state'] = self.chan.get_ema_state(dataframe_30m)
|
||||
dataframe_30m['state'] = self.chan.get_klu_state(dataframe_30m)
|
||||
#print(dataframe_5m.iloc[-1])
|
||||
dataframe = resampled_merge(dataframe, dataframe_5m)
|
||||
dataframe = resampled_merge(dataframe, dataframe_30m)
|
||||
return dataframe
|
||||
def add_indicators(self, dataframe):
|
||||
dataframe['ema24'] = ta.EMA(dataframe, timeperiod=24)
|
||||
dataframe['dir24'] = dataframe['close'] - dataframe['ema24']
|
||||
dataframe['ema52'] = ta.EMA(dataframe, timeperiod=52)
|
||||
dataframe['dir52'] = dataframe['close'] - dataframe['ema52']
|
||||
dataframe['ema104'] = ta.EMA(dataframe, timeperiod=104)
|
||||
dataframe['dir104'] = dataframe['close'] - dataframe['ema104']
|
||||
dataframe['ema156'] = ta.EMA(dataframe, timeperiod=156)
|
||||
dataframe['dir156'] = dataframe['close'] - dataframe['ema156']
|
||||
dataframe['dir52_156'] = dataframe['ema52'] - dataframe['ema156']
|
||||
dataframe['dir52_104'] = dataframe['ema52'] - dataframe['ema104']
|
||||
dataframe['ema52_price'] = dataframe['close'] - dataframe['ema52']
|
||||
dataframe['ema156_price'] = dataframe['close'] - dataframe['ema156']
|
||||
dataframe_macd = ta.MACD(dataframe, fast=12, slow=26, signal=9)
|
||||
dataframe['macdsignal'] = dataframe_macd['macdsignal']
|
||||
dataframe['macd'] = dataframe_macd['macd']
|
||||
dataframe['macdhist'] = dataframe_macd['macdhist']
|
||||
dataframe['ema_align'] = (
|
||||
((dataframe['ema24'] > dataframe['ema52']) & (dataframe['ema52'] > dataframe['ema104'])) |
|
||||
((dataframe['ema24'] < dataframe['ema52']) & (dataframe['ema52'] < dataframe['ema104']))
|
||||
)
|
||||
dataframe['ema_dir'] = dataframe['ema52'] - dataframe['ema156']
|
||||
return dataframe
|
||||
def custom_entry_price(self, pair: str, trade: Trade | None, current_time: datetime, proposed_rate: float,
|
||||
entry_tag: str | None, side: str, **kwargs) -> float:
|
||||
@@ -165,32 +161,29 @@ class ChanLun_EMA_Align(IStrategy):
|
||||
return None
|
||||
|
||||
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
resample_5m_align = 'resample_{}_ema_align'.format(self.get_ticker_indicator() * self.time5)
|
||||
# 使用高周期的 dir52_156 方向作为多空判定依据
|
||||
resample_5m_dir = 'resample_{}_dir52_104'.format(self.get_ticker_indicator() * self.time5)
|
||||
resample_5m_signal = 'resample_{}_macdsignal'.format(self.get_ticker_indicator() * self.time5)
|
||||
resample_30m_dir = 'resample_{}_ema_dir'.format(self.get_ticker_indicator() * self.time30)
|
||||
resample_30m_price = 'resample_{}_ema52_price'.format(self.get_ticker_indicator() * self.time30)
|
||||
resample_30m_signal = 'resample_{}_macdsignal'.format(self.get_ticker_indicator() * self.time30)
|
||||
resample_30m_state = 'resample_{}_state'.format(self.get_ticker_indicator() * self.time30)
|
||||
resample_30m_ema_state = 'resample_{}_ema_state'.format(self.get_ticker_indicator() * self.time30)
|
||||
dataframe.loc[
|
||||
(dataframe[resample_5m_align]) &
|
||||
(dataframe[resample_5m_dir] > 0) &
|
||||
(dataframe[resample_5m_signal] > 0),
|
||||
(dataframe[resample_30m_dir].shift(self.time30*2) > 0) &
|
||||
(dataframe[resample_30m_ema_state].shift(self.time30) == "2") &
|
||||
(dataframe[resample_30m_ema_state].shift(self.time30*2) == "1"),
|
||||
['enter_long', 'enter_tag']] = (1, 'long_signal_chan')
|
||||
dataframe.loc[
|
||||
(dataframe[resample_5m_align]) &
|
||||
(dataframe[resample_5m_dir] < 0) &
|
||||
(dataframe[resample_5m_signal] < 0),
|
||||
(dataframe[resample_30m_dir].shift(self.time30*2) < 0) &
|
||||
(dataframe[resample_30m_ema_state].shift(self.time30) == "-2") &
|
||||
(dataframe[resample_30m_ema_state].shift(self.time30*2) == "-1"),
|
||||
['enter_short', 'enter_tag']] = (1, 'short_signal_chan')
|
||||
return dataframe
|
||||
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
|
||||
state = 'resample_{}_state'.format(self.get_ticker_indicator() * self.time30)
|
||||
dataframe.loc[
|
||||
(dataframe['dir156'] < 0) &
|
||||
(dataframe['dir52_156'] < 0) &
|
||||
(dataframe['macdhist'] < 0),
|
||||
(dataframe[state].shift(self.time30) == "10"),
|
||||
['exit_long', 'exit_tag']] = (1, 'long_exit_signal_chan')
|
||||
dataframe.loc[
|
||||
(dataframe['macd'] > 0) &
|
||||
(dataframe['dir156'] > 0) &
|
||||
(dataframe['dir52_156'] > 0) &
|
||||
(dataframe['macdhist'] > 0),
|
||||
(dataframe[state].shift(self.time30) == "-10"),
|
||||
['exit_short', 'exit_tag']] = (1, 'short_exit_signal_chan')
|
||||
return dataframe
|
||||
def leverage(self, pair: str, current_time: datetime, current_rate: float,
|
||||
|
||||
Reference in New Issue
Block a user