Timeframe
15m
Direction
Long Only
Stoploss
-6.0%
Trailing Stop
Yes
ROI
0m: 4.0%, 60m: 2.0%, 180m: 1.0%, 360m: 0.5%
Interface Version
3
Startup Candles
N/A
Indicators
3
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
"""Mean-reversion strategy: RSI oversold bounces at lower Bollinger Band."""
from freqtrade.strategy import IStrategy, IntParameter
from pandas import DataFrame
import talib.abstract as ta
class RsiBbStrategy(IStrategy):
INTERFACE_VERSION = 3
minimal_roi = {
"0": 0.04,
"60": 0.02,
"180": 0.01,
"360": 0.005,
}
stoploss = -0.06
trailing_stop = True
trailing_stop_positive = 0.015
trailing_stop_positive_offset = 0.025
trailing_only_offset_is_reached = True
timeframe = "15m"
process_only_new_candles = True
startup_candle_count: int = 100
buy_rsi = IntParameter(15, 35, default=25, space="buy")
sell_rsi = IntParameter(65, 85, default=75, space="sell")
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
bb = ta.BBANDS(dataframe, timeperiod=20, nbdevup=2.0, nbdevdn=2.0)
dataframe["bb_upper"] = bb["upperband"]
dataframe["bb_middle"] = bb["middleband"]
dataframe["bb_lower"] = bb["lowerband"]
dataframe["bb_width"] = (dataframe["bb_upper"] - dataframe["bb_lower"]) / dataframe["bb_middle"]
dataframe["volume_sma"] = ta.SMA(dataframe["volume"], timeperiod=20)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe["rsi"] < self.buy_rsi.value) &
(dataframe["close"] < dataframe["bb_lower"]) &
(dataframe["bb_width"] > 0.02) &
(dataframe["volume"] > dataframe["volume_sma"] * 0.8) &
(dataframe["volume"] > 0)
),
"enter_long"] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
(dataframe["rsi"] > self.sell_rsi.value) &
(dataframe["close"] > dataframe["bb_upper"]) &
(dataframe["volume"] > 0)
),
"exit_long"] = 1
return dataframe