Freqtrade Strategy

Simple

5m candlesMomentum breakoutSpot, long only

Tested 1 Jun 2023 – 30 May 2025
Rank 12 of 27 by return

Simple turned $1,000 into $906 (−9.4%) over 729 days, while holding Bitcoin returned +288.1% and an equal mix of the ten coins +194.8%. Its worst drawdown was a severe 53.4%, deep enough that most people would have switched it off. It won 86% of its trades yet still lost money, because its few losing trades were much larger than its many small wins.

Simple account balance compared with holding Bitcoin$0$1,000$2,000$3,000$4,000JulOctJan 2024AprJulOctJan 2025AprSimple $906BTC hold $3,880
Account balance from $1,000 (closed trades, daily). Dashed line: $1,000 held in BTC over the same days.
Total return−9.4%$906 final balance
Max drawdown53.4%14 Mar 2024 to 7 Apr 2025
Win rate86.4%2,634 wins / 416 losses
Profit factor0.98Gross wins ÷ gross losses
Trades3,0504.2 per day
Average trade−0.02%after fees
Average hold1d 1hwinners 13h 9m, losers 4d 4h
Annualised (CAGR)−4.8%Sharpe -0.35 · Sortino -0.18

How Simple trades

Simple buys strength rather than weakness: MACD positive and above its signal, the upper Bollinger Band expanding and a fast RSI above 70. It sells when RSI passes 80, or at a 1% take-profit.

Buying when RSI is already above 70 means entering after a move has started. The tiny 1% target against a 25% stoploss is a poor payoff ratio.

Rules at a glance

Indicators
MACD, RSI 7, Bollinger Bands 12/2
Take-profit (minimal ROI)
1% from entry
Stoploss
−25%
Trailing stop
Off
Exit signal
Used

Results by month

Profit or loss in USDT for trades closed in each month.

JFMAMJJASOND2023-11+19-95-33+114+67+1622024-65+178+21-259+47-148+22-70-12-103+380-2122025+46-171-66-12+106

Results by coin

PairTradesWin rateProfit (USDT)Avg. hold
BTC/USDT30884.1%+131.581d 13h
SOL/USDT39991.5%+108.3719h 5m
ETH/USDT36184.5%+96.941d 3h
LINK/USDT25188.8%+63.3818h 42m
ADA/USDT32488.0%−6.9922h 47m
BNB/USDT27679.0%−20.201d 12h
DOT/USDT24385.6%−49.1219h 38m
XRP/USDT31884.9%−74.261d 2h
DOGE/USDT29090.0%−75.4621h 53m
AVAX/USDT28085.7%−268.1522h 13m

Why trades closed

Exit reasonTradesWin rateProfit (USDT)
Take-profit (ROI)2566100.0%+5,137.21
Still open at end of test40.0%−40.50
Stoploss300.0%−1,510.13
Exit signal45015.1%−3,680.49

The code

Simple comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 76 lines.

Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
            (
                    (dataframe['macd'] > 0)  # over 0
                    & (dataframe['macd'] > dataframe['macdsignal'])  # over signal
                    & (dataframe['bb_upperband'] > dataframe['bb_upperband'].shift(1))  # pointed up
                    & (dataframe['rsi'] > 70)  # optional filter, need to investigate
            )
        ),
        'enter_long'] = 1
    return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # different strategy used for sell points, due to be able to duplicate it to 100%
    dataframe.loc[
        (
            (dataframe['rsi'] > 80)
        ),
        'exit_long'] = 1
    return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # MACD
    macd = ta.MACD(dataframe)
    dataframe['macd'] = macd['macd']
    dataframe['macdsignal'] = macd['macdsignal']
    dataframe['macdhist'] = macd['macdhist']

    # RSI
    dataframe['rsi'] = ta.RSI(dataframe, timeperiod=7)

    # required for graphing
    bollinger = qtpylib.bollinger_bands(dataframe['close'], window=12, stds=2)
    dataframe['bb_lowerband'] = bollinger['lower']
    dataframe['bb_upperband'] = bollinger['upper']
    dataframe['bb_middleband'] = bollinger['mid']

    return dataframe

Reproduce this test

With freqtrade installed (see our Docker guide), download the data and run the same backtest:

freqtrade download-data --exchange binance --pairs ADA/USDT AVAX/USDT BNB/USDT BTC/USDT DOGE/USDT DOT/USDT ETH/USDT LINK/USDT SOL/USDT XRP/USDT --timeframes 5m --timerange 20230501-20250530
freqtrade backtesting --strategy Simple --timeframe 5m \
  --timerange 20230601-20250530 --dry-run-wallet 1000 --stake-amount 200 --max-open-trades 5 --fee 0.001

Results can differ slightly with a different data source or freqtrade version. See how we test.