Quickie
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.
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.
Results by coin
| Pair | Trades | Win rate | Profit (USDT) | Avg. hold |
|---|---|---|---|---|
| ADA/USDT | 106 | 95.3% | +120.72 | 2d 4h |
| LINK/USDT | 96 | 96.9% | +57.86 | 2d 0h |
| BTC/USDT | 86 | 94.2% | +24.09 | 5d 7h |
| BNB/USDT | 84 | 96.4% | +14.02 | 5d 1h |
| AVAX/USDT | 89 | 94.4% | −31.03 | 1d 19h |
| XRP/USDT | 123 | 95.1% | −46.19 | 2d 23h |
| SOL/USDT | 110 | 93.6% | −66.78 | 1d 23h |
| DOT/USDT | 88 | 92.0% | −71.56 | 2d 10h |
| DOGE/USDT | 117 | 93.2% | −110.59 | 1d 20h |
| ETH/USDT | 111 | 91.9% | −137.79 | 3d 4h |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 952 | 100.0% | +2,107.98 |
| Still open at end of test | 3 | 0.0% | −54.05 |
| Exit signal | 13 | 0.0% | −186.83 |
| Stoploss | 42 | 0.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.