💬 Forum

BinanceMultiStrategy

surendrad24/ZwaAP-FreqTrade-Strategies/strategies/BinanceMultiStrategy.py · first seen 2026-07-16 · repo updated 2026-04-18 · ⬇ 1 download

Basics mode: spot timeframe: 5m interface version: 3
Settings stoploss: -0.05 has minimal roi trailing process only new candles startup candle count: 200 hyperopt hyperopt params: 2
Indicators Bollinger_Bands EMA MACD RSI SMA talib
Concepts mean_reversion trailing
15 related strategies ( identical code, similar name)

Each tile is a different kind of check — from an instant code lint to full sandboxed backtests and forward tests on recent data. Not sure what a check actually proves? See the FAQ →

Source

Download Raw
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""
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