15 related strategies (⧉ identical code, ≈ similar name)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | # --- Do not remove these libs --- from freqtrade.strategy import IStrategy from freqtrade.strategy import CategoricalParameter, IntParameter from functools import reduce from pandas import DataFrame # -------------------------------- import talib.abstract as ta import freqtrade.vendor.qtpylib.indicators as qtpylib import numpy # noqa class Strategy005(IStrategy): """ Strategy 005 author@: Gerald Lonlas github@: https://github.com/freqtrade/freqtrade-strategies How to use it? > python3 ./freqtrade/main.py -s Strategy005 """ INTERFACE_VERSION = 3 # Minimal ROI designed for the strategy. # This attribute will be overridden if the config file contains "minimal_roi" minimal_roi = { "1440": 0.01, "80": 0.02, "40": 0.03, "20": 0.04, "0": 0.05 } # Optimal stoploss designed for the strategy # This attribute will be overridden if the config file contains "stoploss" stoploss = -0.10 # Optimal timeframe for the strategy timeframe = '5m' # trailing stoploss trailing_stop = False trailing_stop_positive = 0.01 trailing_stop_positive_offset = 0.02 # run "populate_indicators" only for new candle process_only_new_candles = True # Experimental settings (configuration will overide these if set) use_exit_signal = True exit_profit_only = True ignore_roi_if_entry_signal = False # Optional order type mapping order_types = { 'entry': 'limit', 'exit': 'limit', 'stoploss': 'market', 'stoploss_on_exchange': False } buy_volumeAVG = IntParameter(low=50, high=300, default=70, space='buy', optimize=True) buy_rsi = IntParameter(low=1, high=100, default=30, space='buy', optimize=True) buy_fastd = IntParameter(low=1, high=100, default=30, space='buy', optimize=True) buy_fishRsiNorma = IntParameter(low=1, high=100, default=30, space='buy', optimize=True) sell_rsi = IntParameter(low=1, high=100, default=70, space='sell', optimize=True) sell_minusDI = IntParameter(low=1, high=100, default=50, space='sell', optimize=True) sell_fishRsiNorma = IntParameter(low=1, high=100, default=50, space='sell', optimize=True) sell_trigger = CategoricalParameter(["rsi-macd-minusdi", "sar-fisherRsi"], default=30, space='sell', optimize=True) # Buy hyperspace params: buy_params = { "buy_fastd": 1, "buy_fishRsiNorma": 5, "buy_rsi": 26, "buy_volumeAVG": 150, } # Sell hyperspace params: sell_params = { "sell_fishRsiNorma": 30, "sell_minusDI": 4, "sell_rsi": 74, "sell_trigger": "rsi-macd-minusdi", } def informative_pairs(self): """ Define additional, informative pair/interval combinations to be cached from the exchange. These pair/interval combinations are non-tradeable, unless they are part of the whitelist as well. For more information, please consult the documentation :return: List of tuples in the format (pair, interval) Sample: return [("ETH/USDT", "5m"), ("BTC/USDT", "15m"), ] """ return [] def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Adds several different TA indicators to the given DataFrame Performance Note: For the best performance be frugal on the number of indicators you are using. Let uncomment only the indicator you are using in your strategies or your hyperopt configuration, otherwise you will waste your memory and CPU usage. """ # MACD macd = ta.MACD(dataframe) dataframe['macd'] = macd['macd'] dataframe['macdsignal'] = macd['macdsignal'] # Minus Directional Indicator / Movement dataframe['minus_di'] = ta.MINUS_DI(dataframe) # 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) # Inverse Fisher transform on RSI normalized, value [0.0, 100.0] (https://goo.gl/2JGGoy) dataframe['fisher_rsi_norma'] = 50 * (dataframe['fisher_rsi'] + 1) # Stoch fast stoch_fast = ta.STOCHF(dataframe) dataframe['fastd'] = stoch_fast['fastd'] dataframe['fastk'] = stoch_fast['fastk'] # Overlap Studies # ------------------------------------ # SAR Parabol dataframe['sar'] = ta.SAR(dataframe) # SMA - Simple Moving Average dataframe['sma'] = ta.SMA(dataframe, timeperiod=40) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Based on TA indicators, populates the buy signal for the given dataframe :param dataframe: DataFrame :return: DataFrame with buy column """ dataframe.loc[ # Prod ( (dataframe['close'] > 0.00000200) & (dataframe['volume'] > dataframe['volume'].rolling(self.buy_volumeAVG.value).mean() * 4) & (dataframe['close'] < dataframe['sma']) & (dataframe['fastd'] > dataframe['fastk']) & (dataframe['rsi'] > self.buy_rsi.value) & (dataframe['fastd'] > self.buy_fastd.value) & (dataframe['fisher_rsi_norma'] < self.buy_fishRsiNorma.value) ), 'enter_long'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: """ Based on TA indicators, populates the sell signal for the given dataframe :param dataframe: DataFrame :return: DataFrame with buy column """ conditions = [] if self.sell_trigger.value == 'rsi-macd-minusdi': conditions.append(qtpylib.crossed_above(dataframe['rsi'], self.sell_rsi.value)) conditions.append(dataframe['macd'] < 0) conditions.append(dataframe['minus_di'] > self.sell_minusDI.value) if self.sell_trigger.value == 'sar-fisherRsi': conditions.append(dataframe['sar'] > dataframe['close']) conditions.append(dataframe['fisher_rsi'] > self.sell_fishRsiNorma.value) if conditions: dataframe.loc[reduce(lambda x, y: x & y, conditions), 'exit_long'] = 1 return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 326.9s
ℹ️ This strategy uses a trailing stop — freqtrade only
re-checks these once per 5m candle by default, not against the price movement within it.
For a more accurate read, re-run this backtest locally with --timeframe-detail 1m. Freqle doesn't do this for every check here: multiplying every
League/sweep backtest by a finer detail timeframe is more compute than the sandbox can sustain
across every indexed strategy. why this matters →
- profit isn't statistically significant (p=1.00) — hard to tell apart from luck
- only 0% of resampled runs were profitable
- profitable in only 26% of rolling 3-month windows
- did not beat simply holding the market
- very deep drawdown (-94%)
Resampling the trade sequence 2,000× shows the spread of results this edge could plausibly produce — separating a dependable strategy from one that got lucky once.
Loading charts…
Monthly breakdown
| Month | Regime | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|---|
| Aug 2024 | bearish choppy high vol | 6 | -3.66 | -6.10 | 2 | 4 | 33.3 | -93.66 | 21h 12m |
| Jul 2024 | bearish trending low vol | 21 | -1.31 | -0.62 | 17 | 4 | 81.0 | -91.81 | 30h 05m |
| Jun 2024 | bearish choppy low vol | 13 | +0.86 | 0.66 | 12 | 1 | 92.3 | -91.22 | 65h 44m |
| May 2024 | bullish choppy high vol | 11 | +0.68 | 0.62 | 10 | 1 | 90.9 | -91.2 | 45h 32m |
| Apr 2024 | bearish choppy high vol | 27 | -5.84 | -2.16 | 18 | 9 | 66.7 | -91.47 | 24h 40m |
| Mar 2024 | bullish trending high vol | 15 | +0.56 | 0.38 | 13 | 2 | 86.7 | -87.83 | 41h 07m |
| Feb 2024 | bullish trending low vol | 19 | +2.13 | 1.12 | 18 | 1 | 94.7 | -89.13 | 32h 35m |
| Jan 2024 | bearish choppy high vol | 18 | -4.10 | -2.28 | 12 | 6 | 66.7 | -89.2 | 42h 03m |
| Dec 2023 | bullish trending low vol | 15 | +1.09 | 0.72 | 14 | 1 | 93.3 | -87.09 | 44h 15m |
| Nov 2023 | bullish trending low vol | 21 | -0.15 | -0.07 | 18 | 3 | 85.7 | -88.09 | 27h 38m |
| Oct 2023 | bullish trending low vol | 21 | +1.19 | 0.57 | 19 | 2 | 90.5 | -89.04 | 42h 50m |
| Sep 2023 | bearish choppy low vol | 10 | +0.39 | 0.39 | 9 | 1 | 90.0 | -88.82 | 48h 24m |
| Aug 2023 | bearish choppy low vol | 12 | -5.19 | -4.32 | 6 | 6 | 50.0 | -88.13 | 101h 01m |
| Jul 2023 | bullish trending low vol | 20 | -0.34 | -0.17 | 17 | 3 | 85.0 | -85.08 | 62h 44m |
| Jun 2023 | bullish trending low vol | 31 | -5.93 | -1.91 | 22 | 9 | 71.0 | -85.03 | 44h 36m |
| May 2023 | bearish choppy low vol | 14 | -3.06 | -2.19 | 10 | 4 | 71.4 | -80.88 | 108h 26m |
| Apr 2023 | bullish trending low vol | 33 | -0.12 | -0.04 | 29 | 4 | 87.9 | -79.35 | 66h 31m |
| Mar 2023 | bullish trending high vol | 54 | -4.19 | -0.78 | 43 | 11 | 79.6 | -79.22 | 38h 06m |
| Feb 2023 | bullish trending low vol | 44 | +0.35 | 0.08 | 38 | 6 | 86.4 | -76.29 | 32h 59m |
| Jan 2023 | bullish trending low vol | 64 | +10.52 | 1.64 | 64 | 0 | 100.0 | -82.65 | 22h 51m |
| Dec 2022 | bearish trending low vol | 24 | -4.70 | -1.96 | 17 | 7 | 70.8 | -82.78 | 57h 53m |
| Nov 2022 | bearish trending high vol | 67 | -7.62 | -1.14 | 50 | 17 | 74.6 | -80.99 | 21h 25m |
| Oct 2022 | bullish choppy low vol | 45 | -1.00 | -0.22 | 38 | 7 | 84.4 | -76.31 | 42h 01m |
| Sep 2022 | bearish choppy high vol | 67 | +3.25 | 0.48 | 60 | 7 | 89.6 | -76.65 | 27h 27m |
| Aug 2022 | bullish choppy high vol | 80 | -6.78 | -0.85 | 63 | 17 | 78.8 | -76.35 | 27h 25m |
| Jul 2022 | bearish trending high vol | 82 | +7.94 | 0.97 | 76 | 6 | 92.7 | -76.58 | 20h 47m |
| Jun 2022 | bearish trending high vol | 105 | -12.97 | -1.23 | 76 | 29 | 72.4 | -78.69 | 16h 47m |
| May 2022 | bearish trending high vol | 120 | -6.50 | -0.54 | 95 | 25 | 79.2 | -73.6 | 17h 54m |
| Apr 2022 | bearish choppy high vol | 103 | -17.34 | -1.69 | 74 | 29 | 71.8 | -63.44 | 35h 06m |
| Mar 2022 | bullish choppy high vol | 102 | +6.71 | 0.66 | 93 | 9 | 91.2 | -59.97 | 26h 54m |
| Feb 2022 | bearish trending high vol | 144 | -5.62 | -0.39 | 118 | 26 | 81.9 | -58.88 | 19h 32m |
| Jan 2022 | bearish trending high vol | 171 | -25.29 | -1.48 | 123 | 48 | 71.9 | -57.03 | 21h 35m |
| Dec 2021 | bearish trending high vol | 216 | -18.49 | -0.86 | 167 | 49 | 77.3 | -36.72 | 18h 42m |
| Nov 2021 | bullish trending high vol | 202 | -4.48 | -0.22 | 168 | 34 | 83.2 | -24.71 | 19h 34m |
| Oct 2021 | bullish trending high vol | 169 | +5.80 | 0.34 | 148 | 21 | 87.6 | -23.56 | 24h 11m |
| Sep 2021 | bearish trending high vol | 230 | -7.52 | -0.33 | 183 | 47 | 79.6 | -24.57 | 13h 31m |
| Aug 2021 | bullish trending high vol | 208 | +21.81 | 1.05 | 193 | 15 | 92.8 | -33.14 | 14h 15m |
| Jul 2021 | bearish trending high vol | 210 | -4.35 | -0.21 | 174 | 36 | 82.9 | -43.57 | 20h 12m |
| Jun 2021 | bearish trending high vol | 226 | -24.26 | -1.07 | 168 | 58 | 74.3 | -35.05 | 12h 19m |
| May 2021 | bearish trending high vol | 253 | -11.77 | -0.47 | 195 | 58 | 77.1 | -16.9 | 6h 38m |
| Apr 2021 | bearish choppy high vol | 168 | +1.76 | 0.11 | 140 | 28 | 83.3 | -10.27 | 9h 20m |
| Mar 2021 | bullish choppy high vol | 193 | +12.56 | 0.65 | 172 | 21 | 89.1 | -7.55 | 13h 47m |
| Feb 2021 | bullish trending high vol | 195 | +3.03 | 0.15 | 159 | 36 | 81.5 | -10.45 | 5h 38m |
| Jan 2021 | bullish trending high vol | 242 | +21.26 | 0.88 | 214 | 28 | 88.4 | -6.28 | 6h 24m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2024 | 130 | -10.68 | -0.82 | 102 | 28 | 78.5 | -93.66 | 36h 43m |
| 2023 | 339 | -5.44 | -0.16 | 289 | 50 | 85.3 | -89.04 | 44h 43m |
| 2022 | 1110 | -69.92 | -0.63 | 883 | 227 | 79.5 | -82.78 | 24h 32m |
| 2021 | 2512 | -4.65 | -0.02 | 2081 | 431 | 82.8 | -43.57 | 13h 26m |
Trade charts — best 2 and worst 2 performing pairs (full OHLC candles are expensive to render for every pair)
Backtests — over a market period
Backtest this strategy over a chosen crypto-cycle period. These don't affect the League ranking, and need that period's candle data downloaded.
Log in or sign up to run backtests.
| Period | Range | Total % | Win % | Max DD | Trades | |
|---|---|---|---|---|---|---|
| 2020 · DeFi Summer & Pre-Halving Rally | 20200101-20210101 | not run | ||||
| 2021 · Institutional Bull Market | 20210101-20220101 | not run | ||||
| 2022 · Post-Bull Crash & Macro Tightening | 20220101-20230101 | not run | ||||
| 2023–2024 · Recovery & ETF Anticipation | 20230101-20250101 | not run | ||||
| 2025–2026 · Current Cycle | 20250101-20260101 | not run | ||||
Walk forward
Out-of-sample backtest on recent data · 33 pairs · 20260101-20260701.
Backtest trust check
no lookahead patterns · 1 thing(s) worth reviewing before trusting the numbers
| Line | Pattern | Detail | |
|---|---|---|---|
| 14 | review | missing_startup_candles | uses recursive indicators (MACD, MINUS_DI, RSI, SAR) but startup_candle_count is not set (default 0). Their value at a bar depends on all bars before it, so freqtrade trims no warmup and the backtest opens with unwarmed values that can't occur live. The longest lookback visible here is SMA(timeperiod=40), so it needs at least that many. Set it to a few times the longest period and confirm with `freqtrade recursive-analysis` |
ran by Ron · took s
Lookahead analysis
freqtrade lookahead-analysis: detects strategies peeking at future candles.