Strategy003
Tested 1 Jun 2023 – 30 May 2025
Rank 18 of 27 by return
Strategy003 turned $1,000 into $610 (−39.0%) 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 51.6%, deep enough that most people would have switched it off. It won 92% of its trades yet still lost money, because its few losing trades were much larger than its many small wins.
How Strategy003 trades
Strategy003 stacks several oversold filters: RSI under 28, Fisher RSI under -0.94, MFI under 16 and price below its SMA, while the larger trend is up (EMA 50 above EMA 100) or a short EMA cross has just happened. It shares Strategy002's SAR exit.
Very strict entries again mean a small sample of trades. Check the per-pair table before drawing conclusions.
Rules at a glance
- Indicators
- RSI, Fisher RSI, MFI, Fast Stochastic, EMA 5 / 10 / 50 / 100
- Take-profit (minimal ROI)
- 5% from entry; 4% after 20m; 3% after 30m; 1% after 1h 0m
- Stoploss
- −10%
- 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 |
|---|---|---|---|---|
| ETH/USDT | 130 | 96.2% | +29.30 | 20h 54m |
| BTC/USDT | 95 | 94.7% | +17.06 | 1d 2h |
| SOL/USDT | 87 | 93.1% | +8.86 | 12h 28m |
| BNB/USDT | 121 | 95.0% | −13.21 | 22h 47m |
| AVAX/USDT | 122 | 91.8% | −23.41 | 14h 9m |
| XRP/USDT | 104 | 93.3% | −26.80 | 18h 32m |
| DOGE/USDT | 91 | 90.1% | −52.74 | 17h 35m |
| ADA/USDT | 109 | 89.9% | −75.22 | 16h 54m |
| LINK/USDT | 88 | 88.6% | −85.04 | 17h 56m |
| DOT/USDT | 102 | 85.3% | −169.10 | 1d 1h |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 465 | 100.0% | +1,047.10 |
| Exit signal | 500 | 100.0% | +257.05 |
| Still open at end of test | 1 | 0.0% | −4.12 |
| Stoploss | 83 | 0.0% | −1,690.33 |
The code
Strategy003 comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 153 lines.
Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['rsi'] < 28) & (dataframe['rsi'] > 0) & (dataframe['close'] < dataframe['sma']) & (dataframe['fisher_rsi'] < -0.94) & (dataframe['mfi'] < 16.0) & ( (dataframe['ema50'] > dataframe['ema100']) | (qtpylib.crossed_above(dataframe['ema5'], dataframe['ema10'])) ) & (dataframe['fastd'] > dataframe['fastk']) & (dataframe['fastd'] > 0) ), 'enter_long'] = 1 return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['sar'] > dataframe['close']) & (dataframe['fisher_rsi'] > 0.3) ), 'exit_long'] = 1 return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # MFI dataframe['mfi'] = ta.MFI(dataframe) # Stoch fast stoch_fast = ta.STOCHF(dataframe) dataframe['fastd'] = stoch_fast['fastd'] dataframe['fastk'] = stoch_fast['fastk'] # RSI dataframe['rsi'] = ta.RSI(dataframe) # Inverse Fisher transform on RSI, values [-1.0, 1.0] (https://goo.gl/2JGGoy) rsi = 0.1 * (dataframe['rsi'] - 50) dataframe['fisher_rsi'] = (numpy.exp(2 * rsi) - 1) / (numpy.exp(2 * rsi) + 1) # Bollinger bands bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2) dataframe['bb_lowerband'] = bollinger['lower'] # EMA - Exponential Moving Average dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5) dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10) dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50) dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100) # SAR Parabol dataframe['sar'] = ta.SAR(dataframe) # SMA - Simple Moving Average dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) 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 Strategy003 --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.