1 related strategy (⧉ 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 | from pandas import DataFrame import talib.abstract as ta from freqtrade.strategy import IStrategy # Clean: no class-level leverage, just config-level futures_leverage class X1(IStrategy): """15m EMA+MACD dual, aggressive exposure""" INTERFACE_VERSION = 3; timeframe = '15m'; can_short = True stoploss = -0.025; trailing_stop = True trailing_stop_positive = 0.005; trailing_stop_positive_offset = 0.020 trailing_only_offset_is_reached = True minimal_roi = {"0": 0.08, "480": 0.05, "1440": 0.03, "4320": 0} max_open_trades = 12 startup_candle_count = 200 process_only_new_candles = True; use_exit_signal = False def populate_indicators(self,d,m): d['e10']=ta.EMA(d,10);d['e30']=ta.EMA(d,30) md=ta.MACD(d);d['md']=md['macd'];d['ms']=md['macdsignal'] d['mom']=ta.ROC(d,3);d['vr']=d['volume']/ta.SMA(d['volume'],20) d['adx']=ta.ADX(d,14) return d def populate_entry_trend(self,d,m): d.loc[((d['e10']>d['e30'])&(d['md']>d['ms'])&(d['mom']>0.1)&(d['adx']>18)&(d['vr']>1.0)&(d['volume']>0)),['enter_long','enter_tag']]=(1,'L') d.loc[((d['e10']<d['e30'])&(d['md']<d['ms'])&(d['mom']<-0.1)&(d['adx']>18)&(d['vr']>1.0)&(d['volume']>0)),['enter_short','enter_tag']]=(1,'S') return d def populate_exit_trend(self,d,m):return d # 30m version class X2(IStrategy): """30m EMA+MACD dual, wider stops""" INTERFACE_VERSION = 3; timeframe = '30m'; can_short = True stoploss = -0.03; trailing_stop = True trailing_stop_positive = 0.008; trailing_stop_positive_offset = 0.025 trailing_only_offset_is_reached = True minimal_roi = {"0": 0.10, "240": 0.06, "720": 0.04, "1440": 0} max_open_trades = 8 startup_candle_count = 80 process_only_new_candles = True; use_exit_signal = False def populate_indicators(self,d,m): d['e10']=ta.EMA(d,10);d['e30']=ta.EMA(d,30);d['e100']=ta.EMA(d,100) d['slope']=(d['e100']-d['e100'].shift(48))/d['e100'].shift(48)*100 md=ta.MACD(d);d['md']=md['macd'];d['ms']=md['macdsignal'] d['mom']=ta.ROC(d,1)*0.2+ta.ROC(d,3)*0.3+ta.ROC(d,6)*0.5 d['adx']=ta.ADX(d,14);d['vr']=d['volume']/ta.SMA(d['volume'],20) return d def populate_entry_trend(self,d,m): d.loc[((d['slope']>-2)&(d['e10']>d['e30'])&(d['md']>d['ms'])&(d['mom']>0.15)&(d['adx']>20)&(d['vr']>1.1)&(d['volume']>0)),['enter_long','enter_tag']]=(1,'L') d.loc[((d['slope']<2)&(d['e10']<d['e30'])&(d['md']<d['ms'])&(d['mom']<-0.15)&(d['adx']>20)&(d['vr']>1.1)&(d['volume']>0)),['enter_short','enter_tag']]=(1,'S') return d def populate_exit_trend(self,d,m):return d |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 452.5s
ℹ️ This strategy uses a trailing stop — freqtrade only
re-checks these once per 30m 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 98% 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 | 10 | -0.09 | -0.09 | 2 | 8 | 20.0 | -0.6 | 21h 51m |
| Dec 2025 | bearish trending low vol | 781 | +17.10 | 0.22 | 491 | 290 | 62.9 | -1.42 | 9h 00m |
| Nov 2025 | bearish trending high vol | 1211 | +10.27 | 0.09 | 687 | 524 | 56.7 | -1.46 | 5h 19m |
| Oct 2025 | bearish trending low vol | 1017 | +56.35 | 0.56 | 621 | 396 | 61.1 | -0.83 | 6h 36m |
| Sep 2025 | bullish choppy low vol | 513 | +8.21 | 0.17 | 306 | 207 | 59.6 | -1.56 | 14h 05m |
| Aug 2025 | bearish choppy low vol | 815 | +15.76 | 0.19 | 497 | 318 | 61.0 | -0.99 | 8h 13m |
| Jul 2025 | bullish choppy low vol | 1010 | +28.10 | 0.28 | 638 | 372 | 63.2 | -0.88 | 7h 06m |
| Jun 2025 | bearish choppy low vol | 754 | +28.26 | 0.38 | 488 | 266 | 64.7 | -1.14 | 9h 01m |
| May 2025 | bullish trending low vol | 998 | +18.67 | 0.19 | 611 | 387 | 61.2 | -2.38 | 7h 01m |
| Apr 2025 | bullish choppy low vol | 1059 | -0.08 | -0.00 | 603 | 456 | 56.9 | -3.03 | 6h 18m |
| Mar 2025 | bearish trending high vol | 1294 | +19.35 | 0.15 | 777 | 517 | 60.0 | -3.19 | 5h 03m |
| Feb 2025 | bearish trending low vol | 1570 | +70.39 | 0.46 | 975 | 595 | 62.1 | -3.46 | 3h 33m |
| Jan 2025 | bearish choppy low vol | 1347 | +14.40 | 0.11 | 805 | 542 | 59.8 | -2.3 | 4h 51m |
| Dec 2024 | bullish trending low vol | 2078 | +27.91 | 0.13 | 1157 | 921 | 55.7 | -3.55 | 2h 54m |
| Nov 2024 | bullish trending low vol | 1982 | +17.80 | 0.09 | 1130 | 852 | 57.0 | -2.62 | 3h 04m |
| Oct 2024 | bullish choppy low vol | 632 | +11.63 | 0.19 | 387 | 245 | 61.2 | -1.15 | 11h 36m |
| Sep 2024 | bearish choppy low vol | 580 | +12.54 | 0.20 | 356 | 224 | 61.4 | -2.35 | 12h 16m |
| Aug 2024 | bearish choppy high vol | 1162 | +45.12 | 0.39 | 716 | 446 | 61.6 | -3.58 | 5h 41m |
| Jul 2024 | bearish trending low vol | 950 | +63.20 | 0.68 | 676 | 274 | 71.2 | -0.84 | 7h 31m |
| Jun 2024 | bearish choppy low vol | 609 | +37.18 | 0.62 | 383 | 226 | 62.9 | -4.79 | 11h 36m |
| May 2024 | bullish choppy high vol | 687 | -0.66 | -0.01 | 394 | 293 | 57.4 | -5.29 | 10h 11m |
| Apr 2024 | bearish choppy high vol | 1239 | +46.97 | 0.38 | 708 | 531 | 57.1 | -6.21 | 5h 21m |
| Mar 2024 | bullish trending high vol | 1698 | +11.65 | 0.06 | 955 | 743 | 56.2 | -2.8 | 3h 30m |
| Feb 2024 | bullish trending low vol | 656 | +5.67 | 0.09 | 382 | 274 | 58.2 | -1.07 | 10h 25m |
| Jan 2024 | bearish choppy high vol | 1126 | +38.98 | 0.35 | 698 | 428 | 62.0 | -1.5 | 6h 01m |
| Dec 2023 | bullish trending low vol | 1082 | +7.59 | 0.08 | 612 | 470 | 56.6 | -1.57 | 6h 47m |
| Nov 2023 | bullish trending low vol | 1032 | +11.77 | 0.12 | 601 | 431 | 58.2 | -2.58 | 6h 29m |
| Oct 2023 | bullish trending low vol | 615 | +9.69 | 0.16 | 365 | 250 | 59.3 | -1.56 | 11h 57m |
| Sep 2023 | bearish choppy low vol | 313 | +3.49 | 0.12 | 186 | 127 | 59.4 | -1.34 | 22h 04m |
| Aug 2023 | bearish choppy low vol | 520 | +30.28 | 0.59 | 324 | 196 | 62.3 | -1.37 | 14h 20m |
| Jul 2023 | bullish trending low vol | 627 | +16.04 | 0.26 | 381 | 246 | 60.8 | -2.39 | 11h 15m |
| Jun 2023 | bullish trending low vol | 864 | +34.95 | 0.41 | 527 | 337 | 61.0 | -2.8 | 8h 07m |
| May 2023 | bearish choppy low vol | 365 | -0.36 | -0.01 | 211 | 154 | 57.8 | -2.78 | 20h 02m |
| Apr 2023 | bullish trending low vol | 566 | -2.46 | -0.04 | 314 | 252 | 55.5 | -1.77 | 12h 15m |
| Mar 2023 | bullish trending high vol | 1098 | +43.71 | 0.40 | 714 | 384 | 65.0 | -4.17 | 6h 07m |
| Feb 2023 | bullish trending low vol | 802 | +3.02 | 0.04 | 452 | 350 | 56.4 | -5.89 | 8h 03m |
| Jan 2023 | bullish trending low vol | 1043 | +12.78 | 0.13 | 588 | 455 | 56.4 | -5.82 | 6h 46m |
| Dec 2022 | bearish trending low vol | 473 | +18.22 | 0.39 | 300 | 173 | 63.4 | -6.3 | 15h 01m |
| Nov 2022 | bearish trending high vol | 1484 | -5.36 | -0.04 | 779 | 705 | 52.5 | -6.68 | 4h 12m |
| Oct 2022 | bullish choppy low vol | 564 | +12.83 | 0.23 | 342 | 222 | 60.6 | -5.78 | 12h 49m |
| Sep 2022 | bearish choppy high vol | 890 | -6.67 | -0.07 | 474 | 416 | 53.3 | -5.12 | 7h 39m |
| Aug 2022 | bullish choppy high vol | 974 | +7.03 | 0.07 | 549 | 425 | 56.4 | -4.96 | 7h 03m |
| Jul 2022 | bullish trending high vol | 1312 | +3.09 | 0.03 | 738 | 574 | 56.2 | -8.2 | 4h 47m |
| Jun 2022 | bearish trending high vol | 1911 | +31.22 | 0.17 | 1113 | 798 | 58.2 | -13.7 | 2h 42m |
| May 2022 | bearish trending high vol | 1940 | -16.60 | -0.09 | 1035 | 905 | 53.4 | -15.32 | 2h 37m |
| Apr 2022 | bearish choppy high vol | 907 | +25.99 | 0.30 | 556 | 351 | 61.3 | -6.08 | 7h 27m |
| Mar 2022 | bullish choppy high vol | 918 | -8.27 | -0.09 | 497 | 421 | 54.1 | -4.96 | 7h 17m |
| Feb 2022 | bearish trending high vol | 1251 | +46.46 | 0.38 | 802 | 449 | 64.1 | -5.49 | 4h 35m |
| Jan 2022 | bearish trending high vol | 1502 | +24.38 | 0.16 | 879 | 623 | 58.5 | -6.45 | 3h 46m |
| Dec 2021 | bearish trending high vol | 1509 | +35.90 | 0.25 | 874 | 635 | 57.9 | -8.22 | 4h 13m |
| Nov 2021 | bearish trending high vol | 1238 | +33.69 | 0.28 | 720 | 518 | 58.2 | -11.02 | 5h 12m |
| Oct 2021 | bullish trending high vol | 1236 | -3.26 | -0.01 | 664 | 572 | 53.7 | -16.27 | 5h 22m |
| Sep 2021 | bearish trending high vol | 1825 | +18.85 | 0.10 | 1019 | 806 | 55.8 | -15.62 | 3h 02m |
| Aug 2021 | bullish trending high vol | 1579 | -4.39 | -0.03 | 858 | 721 | 54.3 | -11.78 | 3h 58m |
| Jul 2021 | bullish trending high vol | 1325 | +7.38 | 0.06 | 759 | 566 | 57.3 | -8.06 | 4h 34m |
| Jun 2021 | bearish trending high vol | 2181 | +24.96 | 0.12 | 1278 | 903 | 58.6 | -19.21 | 2h 12m |
| May 2021 | bearish trending high vol | 3803 | +38.69 | 0.11 | 2109 | 1694 | 55.5 | -27.6 | 0h 56m |
| Apr 2021 | bearish choppy high vol | 2247 | +22.23 | 0.10 | 1200 | 1047 | 53.4 | -45.67 | 1h 43m |
| Mar 2021 | bullish choppy high vol | 1197 | -17.53 | -0.15 | 622 | 575 | 52.0 | -44.31 | 3h 27m |
| Feb 2021 | bullish trending high vol | 2924 | +6.40 | 0.03 | 1541 | 1383 | 52.7 | -32.35 | 1h 09m |
| Jan 2021 | bullish trending high vol | 2837 | -24.68 | -0.09 | 1433 | 1404 | 50.5 | -36.92 | 1h 19m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2026 | 10 | -0.09 | -0.09 | 2 | 8 | 20.0 | -0.6 | 21h 51m |
| 2025 | 12369 | +286.78 | 0.24 | 7499 | 4870 | 60.6 | -3.46 | 6h 30m |
| 2024 | 13399 | +317.99 | 0.24 | 7942 | 5457 | 59.3 | -6.21 | 6h 01m |
| 2023 | 8927 | +170.50 | 0.20 | 5275 | 3652 | 59.1 | -5.89 | 9h 26m |
| 2022 | 14126 | +132.32 | 0.10 | 8064 | 6062 | 57.1 | -15.32 | 5h 21m |
| 2021 | 23901 | +138.24 | 0.06 | 13077 | 10824 | 54.7 | -45.67 | 2h 32m |
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 | |
|---|---|---|---|
| 43 | 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 |
| 23 | review | enter_tag_overwrite | enter_tag/exit_tag is written by 4 separate assignments -- they share one column and run in source order, so a row matching more than one condition keeps only the LAST tag. Per-tag statistics won't mean what they appear to |
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 187.1s