Timeframe
5m
Direction
Long Only
Stoploss
-7.0%
Trailing Stop
Yes
ROI
0m: 4.5%, 60m: 3.0%, 180m: 1.5%, 360m: 0.0%
Interface Version
3
Startup Candles
200
Indicators
3
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
from freqtrade.strategy import IStrategy, merge_informative_pair
from pandas import DataFrame
import talib.abstract as ta
import freqtrade.vendor.qtpylib.indicators as qtpylib
class EMA_RSIStrategy(IStrategy):
INTERFACE_VERSION = 3
timeframe = '5m'
startup_candle_count = 200
minimal_roi = {
"0": 0.045,
"60": 0.03,
"180": 0.015,
"360": 0
}
stoploss = -0.07
trailing_stop = True
trailing_stop_positive = 0.012
trailing_stop_positive_offset = 0.035
trailing_only_offset_is_reached = True
def informative_pairs(self):
whitelist = []
if self.dp:
whitelist = self.dp.current_whitelist()
if not whitelist:
whitelist = self.config.get('exchange', {}).get('pair_whitelist', [])
return [(pair, '1h') for pair in whitelist]
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe['ema_20'] = ta.EMA(dataframe, timeperiod=20)
dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50)
dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200)
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
dataframe['adx'] = ta.ADX(dataframe, timeperiod=14)
dataframe['volume_mean'] = dataframe['volume'].rolling(window=20).mean()
if self.dp:
informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe='1h')
informative['ema_50'] = ta.EMA(informative, timeperiod=50)
informative['ema_200'] = ta.EMA(informative, timeperiod=200)
dataframe = merge_informative_pair(dataframe, informative, self.timeframe, '1h', ffill=True)
if 'ema_50_1h' not in dataframe:
dataframe['ema_50_1h'] = dataframe['ema_50']
if 'ema_200_1h' not in dataframe:
dataframe['ema_200_1h'] = dataframe['ema_200']
dataframe['ema_50_1h'] = dataframe['ema_50_1h'].fillna(dataframe['ema_50'])
dataframe['ema_200_1h'] = dataframe['ema_200_1h'].fillna(dataframe['ema_200'])
dataframe['trend_1h'] = dataframe['ema_50_1h'] >= (dataframe['ema_200_1h'] * 0.995)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe['trend_1h']) &
(dataframe['ema_20'] > dataframe['ema_50']) &
(dataframe['close'] > dataframe['ema_50']) &
(dataframe['rsi'] > 40) &
(dataframe['rsi'] < 70) &
(dataframe['adx'] > 18) &
(dataframe['volume'] > dataframe['volume_mean'] * 0.8)
),
'enter_long'] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(~dataframe['trend_1h']) |
(dataframe['ema_20'] < dataframe['ema_50']) |
(dataframe['rsi'] < 35) |
(dataframe['close'] < dataframe['ema_50'])
) &
(dataframe['volume'] > 0),
'exit_long'] = 1
return dataframe