ClucMay72018
Tested 1 Jun 2023 – 30 May 2025
Rank 13 of 27 by return
ClucMay72018 turned $1,000 into $874 (−12.6%) over 729 days, while holding Bitcoin returned +288.1% and an equal mix of the ten coins +194.8%. Its worst drawdown was 26.3%, a substantial dip to sit through. It won 79% of its trades yet still lost money, because its few losing trades were much larger than its many small wins.
How ClucMay72018 trades
ClucMay72018 buys when price closes more than 1.5% below the lower Bollinger Band while trading under its 50-period EMA, and volume is not abnormally high. It sells as soon as price recovers above the middle band, or at a 1% take-profit.
One of the best-known community strategies. Small, frequent targets with a 5% stoploss make it a high-win-rate, low-payoff system: a handful of stopouts can erase many small wins.
Rules at a glance
- Indicators
- Bollinger Bands 20/2, EMA 50, Volume filter
- Take-profit (minimal ROI)
- 1% from entry
- Stoploss
- −5%
- 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 |
|---|---|---|---|---|
| SOL/USDT | 53 | 84.9% | +20.28 | 9m |
| BTC/USDT | 11 | 81.8% | +6.85 | 10m |
| XRP/USDT | 73 | 83.6% | +3.91 | 13m |
| ADA/USDT | 65 | 83.1% | −5.96 | 5m |
| BNB/USDT | 26 | 80.8% | −9.88 | 7m |
| AVAX/USDT | 61 | 77.0% | −11.18 | 11m |
| DOGE/USDT | 78 | 76.9% | −21.46 | 15m |
| ETH/USDT | 30 | 73.3% | −31.00 | 12m |
| DOT/USDT | 59 | 74.6% | −33.77 | 9m |
| LINK/USDT | 61 | 73.8% | −43.89 | 14m |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 399 | 100.0% | +798.56 |
| Exit signal | 33 | 27.3% | −42.96 |
| Stoploss | 85 | 0.0% | −881.71 |
The code
ClucMay72018 comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 84 lines.
Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['close'] < dataframe['ema100']) & (dataframe['close'] < 0.985 * dataframe['bb_lowerband']) & (dataframe['volume'] < (dataframe['volume'].rolling(window=30).mean().shift(1) * 20)) ), 'enter_long'] = 1 return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['close'] > dataframe['bb_middleband']) ), 'exit_long'] = 1 return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['rsi'] = ta.RSI(dataframe, timeperiod=5) rsiframe = DataFrame(dataframe['rsi']).rename(columns={'rsi': 'close'}) dataframe['emarsi'] = ta.EMA(rsiframe, timeperiod=5) macd = ta.MACD(dataframe) dataframe['macd'] = macd['macd'] dataframe['adx'] = ta.ADX(dataframe) bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) dataframe['bb_lowerband'] = bollinger['lower'] dataframe['bb_middleband'] = bollinger['mid'] dataframe['bb_upperband'] = bollinger['upper'] dataframe['ema100'] = ta.EMA(dataframe, timeperiod=50) 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 ClucMay72018 --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.