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 | from pandas import DataFrame import talib.abstract as ta import numpy as np from freqtrade.strategy import IStrategy class FactorStrategy(IStrategy): INTERFACE_VERSION = 3 timeframe = '15m' can_short = True stoploss = -0.03 trailing_stop = True trailing_stop_positive = 0.003 trailing_stop_positive_offset = 0.018 trailing_only_offset_is_reached = True minimal_roi = {"0": 0.05, "480": 0.03, "1440": 0.02, "2880": 0} max_open_trades = 3 startup_candle_count = 500 process_only_new_candles = True use_exit_signal = False def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10) dataframe['ema30'] = ta.EMA(dataframe, timeperiod=30) dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100) dataframe['ema200'] = ta.EMA(dataframe, timeperiod=200) # 15m: 192 candles = 48h = 2-day slope (same as 1h shift(48)) dataframe['ema200_slope'] = ( (dataframe['ema200'] - dataframe['ema200'].shift(192)) / dataframe['ema200'].shift(192) * 100 ) macd = ta.MACD(dataframe, fastperiod=12, slowperiod=26, signalperiod=9) dataframe['macd'] = macd['macd'] dataframe['macd_signal'] = macd['macdsignal'] dataframe['momentum'] = ( ta.ROC(dataframe, timeperiod=1) * 0.1 + ta.ROC(dataframe, timeperiod=3) * 0.2 + ta.ROC(dataframe, timeperiod=6) * 0.4 + ta.ROC(dataframe, timeperiod=12) * 0.3 ) dataframe['adx'] = ta.ADX(dataframe, timeperiod=14) dataframe['vr'] = dataframe['volume'] / ta.SMA(dataframe['volume'], timeperiod=20) vwap = (dataframe['close'] * dataframe['volume']).rolling(20).sum() / dataframe['volume'].rolling(20).sum() dataframe['vd'] = (dataframe['close'] - vwap) / vwap * 100 dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ((dataframe['ema200_slope'] < 2.0) & (dataframe['ema10'] < dataframe['ema30']) & (dataframe['ema30'] < dataframe['ema100']) & (dataframe['macd'] < dataframe['macd_signal']) & (dataframe['macd'] < 0) & (dataframe['momentum'] < -0.2) & (dataframe['adx'] > 25) & (dataframe['vr'] > 1.2) & (dataframe['vd'] < 3) & (dataframe['rsi'].between(30, 70)) & (dataframe['volume'] > 0)), ['enter_short', 'enter_tag'] ] = (1, 'fs') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 271.9s
ℹ️ This strategy uses a trailing stop — freqtrade only
re-checks these once per 15m 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 →
- statistically significant edge (p=0.00)
- 100% of resampled runs stayed profitable
- profitable across 88% of rolling 3-month windows
- comfortably beat buy-and-hold
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 |
|---|---|---|---|---|---|---|---|---|---|
| Jan 2026 | bullish trending low vol | 6 | -0.38 | -0.63 | 2 | 4 | 33.3 | -1.98 | 13h 05m |
| Dec 2025 | bearish trending low vol | 290 | -3.59 | -0.13 | 172 | 118 | 59.3 | -2.49 | 12h 37m |
| Nov 2025 | bearish trending high vol | 468 | +4.11 | 0.09 | 280 | 188 | 59.8 | -2.84 | 5h 48m |
| Oct 2025 | bearish trending low vol | 395 | +12.96 | 0.33 | 253 | 142 | 64.1 | -2.53 | 6h 52m |
| Sep 2025 | bullish choppy low vol | 244 | -2.30 | -0.10 | 149 | 95 | 61.1 | -2.43 | 16h 52m |
| Aug 2025 | bearish choppy low vol | 262 | +0.42 | 0.02 | 164 | 98 | 62.6 | -1.8 | 9h 59m |
| Jul 2025 | bullish choppy low vol | 283 | +2.80 | 0.10 | 180 | 103 | 63.6 | -2.53 | 8h 11m |
| Jun 2025 | bearish choppy low vol | 288 | +9.54 | 0.34 | 191 | 97 | 66.3 | -1.57 | 12h 49m |
| May 2025 | bullish trending low vol | 371 | +11.18 | 0.30 | 251 | 120 | 67.7 | -2.24 | 9h 58m |
| Apr 2025 | bullish choppy low vol | 331 | -4.13 | -0.12 | 194 | 137 | 58.6 | -2.14 | 8h 08m |
| Mar 2025 | bearish trending high vol | 411 | +7.57 | 0.18 | 268 | 143 | 65.2 | -2.24 | 7h 13m |
| Feb 2025 | bearish trending low vol | 658 | +52.01 | 0.80 | 483 | 175 | 73.4 | -1.5 | 3h 46m |
| Jan 2025 | bearish choppy low vol | 384 | +9.44 | 0.24 | 255 | 129 | 66.4 | -2.23 | 6h 42m |
| Dec 2024 | bullish trending low vol | 607 | +20.54 | 0.33 | 413 | 194 | 68.0 | -2.83 | 4h 21m |
| Nov 2024 | bullish trending low vol | 304 | -4.03 | -0.14 | 180 | 124 | 59.2 | -2.23 | 7h 20m |
| Oct 2024 | bullish choppy low vol | 304 | +2.62 | 0.10 | 193 | 111 | 63.5 | -2.4 | 15h 34m |
| Sep 2024 | bearish choppy low vol | 307 | -0.33 | -0.02 | 189 | 118 | 61.6 | -2.71 | 12h 18m |
| Aug 2024 | bearish choppy high vol | 460 | +7.95 | 0.18 | 297 | 163 | 64.6 | -2.74 | 7h 04m |
| Jul 2024 | bearish trending low vol | 403 | +25.09 | 0.65 | 288 | 115 | 71.5 | -1.81 | 8h 25m |
| Jun 2024 | bearish choppy low vol | 425 | +23.11 | 0.55 | 293 | 132 | 68.9 | -1.84 | 12h 06m |
| May 2024 | bullish choppy high vol | 283 | -1.73 | -0.07 | 172 | 111 | 60.8 | -1.34 | 12h 23m |
| Apr 2024 | bearish choppy high vol | 493 | +25.58 | 0.53 | 346 | 147 | 70.2 | -2.06 | 7h 00m |
| Mar 2024 | bullish trending high vol | 502 | +9.58 | 0.19 | 318 | 184 | 63.3 | -3.58 | 4h 41m |
| Feb 2024 | bullish trending low vol | 208 | -7.03 | -0.36 | 111 | 97 | 53.4 | -2.79 | 15h 57m |
| Jan 2024 | bearish choppy high vol | 466 | +11.21 | 0.25 | 305 | 161 | 65.5 | -3.86 | 8h 30m |
| Dec 2023 | bullish trending low vol | 351 | -7.31 | -0.21 | 194 | 157 | 55.3 | -4.05 | 9h 39m |
| Nov 2023 | bullish trending low vol | 342 | -2.13 | -0.07 | 201 | 141 | 58.8 | -3.05 | 9h 07m |
| Oct 2023 | bullish trending low vol | 205 | +3.25 | 0.15 | 126 | 79 | 61.5 | -2.34 | 21h 04m |
| Sep 2023 | bearish choppy low vol | 220 | -1.74 | -0.08 | 135 | 85 | 61.4 | -2.09 | 23h 42m |
| Aug 2023 | bearish choppy low vol | 380 | +25.26 | 0.67 | 271 | 109 | 71.3 | -1.22 | 14h 49m |
| Jul 2023 | bullish trending low vol | 275 | +7.20 | 0.26 | 176 | 99 | 64.0 | -1.45 | 18h 34m |
| Jun 2023 | bullish trending low vol | 333 | +13.48 | 0.41 | 223 | 110 | 67.0 | -1.32 | 11h 49m |
| May 2023 | bearish choppy low vol | 298 | +17.90 | 0.61 | 215 | 83 | 72.1 | -1.62 | 18h 15m |
| Apr 2023 | bullish trending low vol | 256 | +3.84 | 0.15 | 161 | 95 | 62.9 | -1.82 | 15h 00m |
| Mar 2023 | bullish trending high vol | 318 | +15.54 | 0.50 | 223 | 95 | 70.1 | -1.18 | 10h 45m |
| Feb 2023 | bullish trending low vol | 350 | +16.93 | 0.49 | 245 | 105 | 70.0 | -3.88 | 10h 32m |
| Jan 2023 | bullish trending low vol | 206 | -12.64 | -0.62 | 97 | 109 | 47.1 | -4.66 | 11h 39m |
| Dec 2022 | bearish trending low vol | 301 | +12.10 | 0.40 | 202 | 99 | 67.1 | -3.14 | 17h 59m |
| Nov 2022 | bearish trending high vol | 627 | +23.76 | 0.39 | 412 | 215 | 65.7 | -4.63 | 4h 41m |
| Oct 2022 | bullish choppy low vol | 296 | +9.91 | 0.34 | 193 | 103 | 65.2 | -6.1 | 15h 53m |
| Sep 2022 | bearish choppy high vol | 283 | -15.55 | -0.55 | 139 | 144 | 49.1 | -5.98 | 10h 37m |
| Aug 2022 | bullish choppy high vol | 335 | +0.91 | 0.03 | 203 | 132 | 60.6 | -4.77 | 8h 26m |
| Jul 2022 | bullish trending high vol | 189 | -2.57 | -0.13 | 110 | 79 | 58.2 | -2.87 | 8h 29m |
| Jun 2022 | bearish trending high vol | 547 | +27.76 | 0.52 | 375 | 172 | 68.6 | -3.31 | 3h 39m |
| May 2022 | bearish trending high vol | 677 | +12.37 | 0.17 | 428 | 249 | 63.2 | -4.35 | 2h 38m |
| Apr 2022 | bearish choppy high vol | 448 | +36.76 | 0.85 | 340 | 108 | 75.9 | -4.44 | 7h 41m |
| Mar 2022 | bullish choppy high vol | 196 | -5.05 | -0.26 | 107 | 89 | 54.6 | -4.89 | 10h 09m |
| Feb 2022 | bearish trending high vol | 293 | +8.30 | 0.29 | 190 | 103 | 64.8 | -4.85 | 6h 20m |
| Jan 2022 | bearish trending high vol | 578 | +27.22 | 0.48 | 396 | 182 | 68.5 | -3.48 | 4h 18m |
| Dec 2021 | bearish trending high vol | 531 | +13.11 | 0.26 | 344 | 187 | 64.8 | -3.62 | 4h 14m |
| Nov 2021 | bearish trending high vol | 411 | +14.70 | 0.36 | 268 | 143 | 65.2 | -5.81 | 5h 57m |
| Oct 2021 | bullish trending high vol | 275 | -3.38 | -0.13 | 156 | 119 | 56.7 | -5.34 | 7h 31m |
| Sep 2021 | bearish trending high vol | 454 | +6.74 | 0.15 | 279 | 175 | 61.5 | -7.29 | 3h 27m |
| Aug 2021 | bullish trending high vol | 261 | -6.48 | -0.26 | 145 | 116 | 55.6 | -6.37 | 5h 58m |
| Jul 2021 | bullish trending high vol | 319 | +6.36 | 0.19 | 205 | 114 | 64.3 | -6.1 | 6h 22m |
| Jun 2021 | bearish trending high vol | 591 | +22.37 | 0.39 | 401 | 190 | 67.9 | -4.37 | 2h 08m |
| May 2021 | bearish trending high vol | 1164 | +54.35 | 0.48 | 788 | 376 | 67.7 | -8.76 | 0h 51m |
| Apr 2021 | bearish choppy high vol | 505 | +8.82 | 0.20 | 311 | 194 | 61.6 | -9.06 | 2h 09m |
| Mar 2021 | bullish choppy high vol | 344 | +0.01 | -0.02 | 200 | 144 | 58.1 | -7.53 | 5h 13m |
| Feb 2021 | bullish trending high vol | 684 | +26.76 | 0.41 | 456 | 228 | 66.7 | -7.75 | 0h 58m |
| Jan 2021 | bullish trending high vol | 484 | +15.00 | 0.33 | 309 | 175 | 63.8 | -7.8 | 2h 08m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2026 | 6 | -0.38 | -0.63 | 2 | 4 | 33.3 | -1.98 | 13h 05m |
| 2025 | 4385 | +100.01 | 0.23 | 2840 | 1545 | 64.8 | -2.84 | 8h 16m |
| 2024 | 4762 | +112.56 | 0.24 | 3105 | 1657 | 65.2 | -3.86 | 8h 46m |
| 2023 | 3534 | +79.58 | 0.23 | 2267 | 1267 | 64.1 | -4.66 | 14h 00m |
| 2022 | 4770 | +135.92 | 0.29 | 3095 | 1675 | 64.9 | -6.1 | 7h 08m |
| 2021 | 6023 | +158.36 | 0.27 | 3862 | 2161 | 64.1 | -9.06 | 3h 07m |
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 · 2 thing(s) worth reviewing before trusting the numbers
| Line | Pattern | Detail | |
|---|---|---|---|
| 42 | review | ta_period_one | 'ROC' is called with timeperiod=1 -- a one-candle period returns the raw, unsmoothed value. In dry/live that value is still changing while the candle forms, but a backtest only ever sees it fully closed, so a signal built on it can look confirmed here and repaint live. Use a real period (>=2) or, if a raw value is really what's wanted, reference the column directly instead of a period-1 TA call |
| 21 | review | startup_candles_too_small | startup_candle_count is 500, but EMA(timeperiod=200) needing 3x warmup needs at least 600 candles -- so the first 100+ candles of every backtest use an indicator that hasn't warmed up. Recursive indicators (EMA/RSI/ADX/ATR) want several times their period, not exactly it |
ran by Ron · took s
Lookahead analysis
Freqtrade logsno lookahead bias detected
20 signal(s) analysed · 0 biased entries · 0 biased exits
ran by Ron · took 65.7s