Timeframe
5m
Direction
Long Only
Stoploss
-5.0%
Trailing Stop
Yes
ROI
0m: 5.0%, 30m: 3.0%, 60m: 2.0%, 120m: 1.0%
Interface Version
3
Startup Candles
N/A
Indicators
5
freqtrade/freqtrade-strategies
Strategy 003 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies
"""
Multi-indicator Binance strategy for FreqTrade.
Uses RSI, EMA crossover, MACD, and Bollinger Bands.
"""
from freqtrade.strategy import IStrategy, DecimalParameter, IntParameter
from pandas import DataFrame
import talib.abstract as ta
class BinanceMultiStrategy(IStrategy):
INTERFACE_VERSION = 3
# ROI - Take profit at these levels
minimal_roi = {
"0": 0.05, # 5% immediately
"30": 0.03, # 3% after 30 min
"60": 0.02, # 2% after 1 hour
"120": 0.01, # 1% after 2 hours
}
stoploss = -0.05 # 5% stoploss
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive_offset = 0.02
trailing_only_offset_is_reached = True
timeframe = "5m"
process_only_new_candles = True
startup_candle_count: int = 200
# Hyperopt parameters
buy_rsi = IntParameter(20, 40, default=30, space="buy")
sell_rsi = IntParameter(60, 80, default=70, space="sell")
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# RSI
dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14)
# EMAs
dataframe["ema_9"] = ta.EMA(dataframe, timeperiod=9)
dataframe["ema_21"] = ta.EMA(dataframe, timeperiod=21)
dataframe["ema_50"] = ta.EMA(dataframe, timeperiod=50)
dataframe["ema_200"] = ta.EMA(dataframe, timeperiod=200)
# MACD
macd = ta.MACD(dataframe)
dataframe["macd"] = macd["macd"]
dataframe["macd_signal"] = macd["macdsignal"]
dataframe["macd_hist"] = macd["macdhist"]
# Bollinger Bands
bb = ta.BBANDS(dataframe, timeperiod=20)
dataframe["bb_upper"] = bb["upperband"]
dataframe["bb_middle"] = bb["middleband"]
dataframe["bb_lower"] = bb["lowerband"]
# Volume SMA
dataframe["volume_sma_20"] = ta.SMA(dataframe["volume"], timeperiod=20)
return dataframe
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
# RSI oversold
(dataframe["rsi"] < self.buy_rsi.value) &
# EMA crossover (9 crosses above 21)
(dataframe["ema_9"] > dataframe["ema_21"]) &
# Price above 200 EMA (uptrend)
(dataframe["close"] > dataframe["ema_200"]) &
# MACD bullish
(dataframe["macd"] > dataframe["macd_signal"]) &
# Price near lower Bollinger Band
(dataframe["close"] < dataframe["bb_middle"]) &
# Volume confirmation
(dataframe["volume"] > dataframe["volume_sma_20"]) &
(dataframe["volume"] > 0)
),
"enter_long"] = 1
return dataframe
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe.loc[
(
# RSI overbought
(dataframe["rsi"] > self.sell_rsi.value) &
# Price near upper Bollinger Band
(dataframe["close"] > dataframe["bb_upper"] * 0.99) &
# MACD bearish crossover
(dataframe["macd"] < dataframe["macd_signal"]) &
(dataframe["volume"] > 0)
),
"exit_long"] = 1
return dataframe