Freqtrade Strategy

Quickie

5m candlesTrend pullbackSpot, long only

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

Quickie turned $1,000 into $753 (−24.7%) 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 48.4%, deep enough that most people would have switched it off. It won 94% of its trades yet still lost money, because its few losing trades were much larger than its many small wins.

Quickie account balance compared with holding Bitcoin$0$1,000$2,000$3,000$4,000JulOctJan 2024AprJulOctJan 2025AprQuickie $753BTC hold $3,880
Account balance from $1,000 (closed trades, daily). Dashed line: $1,000 held in BTC over the same days.
Total return−24.7%$753 final balance
Max drawdown48.4%16 Mar 2024 to 7 Apr 2025
Win rate94.3%952 wins / 58 losses
Profit factor0.90Gross wins ÷ gross losses
Trades1,0101.4 per day
Average trade−0.12%after fees
Average hold2d 19hwinners 1d 21h, losers 17d 14h
Annualised (CAGR)−13.3%Sharpe -0.60 · Sortino -0.39

How Quickie trades

Quickie buys when ADX shows a strong trend (above 30), the 9-period TEMA is rising from below the middle Bollinger Band, and price is still below its 200-period SMA. It exits on an extreme trend reading (ADX above 70) with TEMA turning down.

An aggressive stepped take-profit (15% in the first 10 minutes, falling to 1% after 100) means most trades end on ROI rather than the exit signal.

Rules at a glance

Indicators
TEMA 9, Bollinger Bands, ADX, SMA 200
Take-profit (minimal ROI)
15% after 10m; 6% after 15m; 3% after 30m; 1% after 1h 40m
Stoploss
−25%
Trailing stop
Off
Exit signal
Used

Results by month

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

JFMAMJJASOND2023-81+48-83-13+77+134+1302024-102+80+93-164+54-65-87-156+26+26+216+232025-96-320+36-36+13

Results by coin

PairTradesWin rateProfit (USDT)Avg. hold
ADA/USDT10695.3%+120.722d 4h
LINK/USDT9696.9%+57.862d 0h
BTC/USDT8694.2%+24.095d 7h
BNB/USDT8496.4%+14.025d 1h
AVAX/USDT8994.4%−31.031d 19h
XRP/USDT12395.1%−46.192d 23h
SOL/USDT11093.6%−66.781d 23h
DOT/USDT8892.0%−71.562d 10h
DOGE/USDT11793.2%−110.591d 20h
ETH/USDT11191.9%−137.793d 4h

Why trades closed

Exit reasonTradesWin rateProfit (USDT)
Take-profit (ROI)952100.0%+2,107.98
Still open at end of test30.0%−54.05
Exit signal130.0%−186.83
Stoploss420.0%−2,114.36

The code

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

Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
                (dataframe['adx'] > 30) &
                (dataframe['tema'] < dataframe['bb_middleband']) &
                (dataframe['tema'] > dataframe['tema'].shift(1)) &
                (dataframe['sma_200'] > dataframe['close'])

        ),
        'enter_long'] = 1
    return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
                (dataframe['adx'] > 70) &
                (dataframe['tema'] > dataframe['bb_middleband']) &
                (dataframe['tema'] < dataframe['tema'].shift(1))
        ),
        'exit_long'] = 1
    return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    macd = ta.MACD(dataframe)
    dataframe['macd'] = macd['macd']
    dataframe['macdsignal'] = macd['macdsignal']
    dataframe['macdhist'] = macd['macdhist']

    dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
    dataframe['sma_200'] = ta.SMA(dataframe, timeperiod=200)
    dataframe['sma_50'] = ta.SMA(dataframe, timeperiod=200)

    dataframe['adx'] = ta.ADX(dataframe)

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

    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 Quickie --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.