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 | """ SOL_Breakout — Donchian Channel Breakout + ATR Volatility Filter Opposite approach to mean-reversion: buys breakouts of recent highs/lows. Uses Donchian Channels (20-period high/low) — the classic turtle trading method. ATR filter ensures we only trade when volatility is expanding (real breakout, not noise). Targets 1 trade/day. """ import talib.abstract as ta import numpy as np from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter from pandas import DataFrame class SOL_Breakout(IStrategy): INTERFACE_VERSION = 3 timeframe = "1h" can_short = True minimal_roi = { "0": 0.20, "60": 0.10, "180": 0.05, "360": 0.02, "720": 0, } stoploss = -0.18 trailing_stop = True trailing_stop_positive = 0.06 trailing_stop_positive_offset = 0.14 trailing_only_offset_is_reached = True startup_candle_count = 200 process_only_new_candles = True # Donchian Channel period donchian_period = IntParameter(10, 30, default=20, space="buy", optimize=True, load=True) # ATR multiplier for volatility expansion atr_mult = DecimalParameter(1.0, 2.5, default=1.5, space="buy", optimize=True, load=True) # EMA trend ema_period = IntParameter(30, 100, default=50, space="buy", optimize=True, load=True) # ADX for trend strength adx_min = IntParameter(18, 35, default=25, space="buy", optimize=True, load=True) # Cooldown cooldown_candles = IntParameter(6, 30, default=12, space="buy", optimize=True, load=True) # Exit exit_rsi_long = IntParameter(70, 90, default=78, space="sell", optimize=True, load=True) exit_rsi_short = IntParameter(10, 30, default=22, space="sell", optimize=True, load=True) def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # EMAs for period in [20, 30, 40, 50, 60, 80, 100]: dataframe[f"ema_{period}"] = ta.EMA(dataframe, timeperiod=period) # Donchian Channels (multiple periods for hyperopt) for period in range(10, 31): dataframe[f"dc_upper_{period}"] = dataframe["high"].rolling(period).max() dataframe[f"dc_lower_{period}"] = dataframe["low"].rolling(period).min() dataframe[f"dc_mid_{period}"] = (dataframe[f"dc_upper_{period}"] + dataframe[f"dc_lower_{period}"]) / 2 # ATR dataframe["atr"] = ta.ATR(dataframe, timeperiod=14) dataframe["atr_sma"] = dataframe["atr"].rolling(20).mean() dataframe["atr_ratio"] = dataframe["atr"] / dataframe["atr_sma"] # RSI dataframe["rsi"] = ta.RSI(dataframe, timeperiod=14) # ADX dataframe["adx"] = ta.ADX(dataframe, timeperiod=14) # Volume dataframe["vol_sma"] = dataframe["volume"].rolling(20).mean() dataframe["vol_ratio"] = dataframe["volume"] / dataframe["vol_sma"] return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dc_period = self.donchian_period.value dc_upper = f"dc_upper_{dc_period}" dc_lower = f"dc_lower_{dc_period}" ema = f"ema_{self.ema_period.value}" adx_ok = dataframe["adx"] > self.adx_min.value # Volatility expansion: ATR above average * multiplier vol_expanding = dataframe["atr_ratio"] > self.atr_mult.value # Volume confirmation vol_ok = dataframe["vol_ratio"] > 1.2 # Trend filter above_ema = dataframe["close"] > dataframe[ema] below_ema = dataframe["close"] < dataframe[ema] cooldown = self.cooldown_candles.value # LONG: breakout above Donchian upper + expanding vol + trend breakout_up = (dataframe["close"] > dataframe[dc_upper].shift(1)) & above_ema long_signal = breakout_up & vol_expanding & adx_ok & vol_ok long_cooled = long_signal & ~long_signal.shift(1).rolling(cooldown).max().fillna(0).astype(bool) dataframe.loc[long_cooled, "enter_long"] = 1 # SHORT: breakdown below Donchian lower + expanding vol + trend breakout_down = (dataframe["close"] < dataframe[dc_lower].shift(1)) & below_ema short_signal = breakout_down & vol_expanding & adx_ok & vol_ok short_cooled = short_signal & ~short_signal.shift(1).rolling(cooldown).max().fillna(0).astype(bool) dataframe.loc[short_cooled, "enter_short"] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[dataframe["rsi"] > self.exit_rsi_long.value, "exit_long"] = 1 dataframe.loc[dataframe["rsi"] < self.exit_rsi_short.value, "exit_short"] = 1 return dataframe def leverage(self, pair, current_time, current_rate, proposed_leverage, max_leverage, entry_tag, side, **kwargs): return 3.0 |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 40.6s
ℹ️ This strategy uses a trailing stop — freqtrade only
re-checks these once per 1h candle by default, not against the price movement within it.
For a more accurate read, re-run this backtest locally with --timeframe-detail 1m
(or 5m — freqtrade's own docs use 5m detail for an hourly strategy as a lighter
alternative). 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=0.55) — hard to tell apart from luck
- only 47% of resampled runs were profitable
- did not beat simply holding the market
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 |
|---|---|---|---|---|---|---|---|---|---|
| Dec 2025 | bearish trending low vol | 3 | -1.75 | -5.82 | 2 | 1 | 66.7 | -13.46 | 8h 40m |
| Nov 2025 | bearish trending high vol | 5 | +1.30 | 2.60 | 5 | 0 | 100.0 | -12.6 | 5h 36m |
| Oct 2025 | bearish trending low vol | 3 | +3.39 | 11.30 | 3 | 0 | 100.0 | -15.87 | 3h 40m |
| Sep 2025 | bullish choppy low vol | 8 | -0.12 | -0.26 | 6 | 2 | 75.0 | -16.04 | 12h 00m |
| Aug 2025 | bearish choppy low vol | 2 | +1.15 | 5.77 | 2 | 0 | 100.0 | -16.24 | 4h 30m |
| Jun 2025 | bearish choppy low vol | 1 | +0.00 | 0.01 | 1 | 0 | 100.0 | -16.95 | 12h 00m |
| May 2025 | bullish trending low vol | 3 | +0.30 | 0.99 | 2 | 1 | 66.7 | -17.13 | 10h 40m |
| Apr 2025 | bullish choppy low vol | 3 | +0.66 | 2.31 | 2 | 1 | 66.7 | -17.8 | 5h 40m |
| Mar 2025 | bearish trending high vol | 2 | -1.66 | -8.29 | 1 | 1 | 50.0 | -17.8 | 7h 00m |
| Feb 2025 | bearish trending low vol | 12 | -2.11 | -1.85 | 6 | 6 | 50.0 | -16.34 | 15h 05m |
| Jan 2025 | bearish choppy low vol | 6 | +1.01 | 0.83 | 5 | 1 | 83.3 | -14.91 | 5h 20m |
| Dec 2024 | bullish trending low vol | 15 | +14.87 | 10.16 | 11 | 4 | 73.3 | -27.62 | 1h 56m |
| Nov 2024 | bullish trending low vol | 6 | +5.20 | 8.67 | 6 | 0 | 100.0 | -31.33 | 2h 40m |
| Oct 2024 | bullish choppy low vol | 10 | -5.26 | -5.34 | 5 | 5 | 50.0 | -33.1 | 23h 42m |
| Sep 2024 | bearish choppy low vol | 1 | +0.20 | 1.99 | 1 | 0 | 100.0 | -28.45 | 6h 00m |
| Aug 2024 | bearish choppy high vol | 4 | +2.21 | 5.56 | 4 | 0 | 100.0 | -30.41 | 2h 30m |
| Jul 2024 | bearish trending low vol | 3 | +1.35 | 4.67 | 2 | 1 | 66.7 | -31.02 | 8h 40m |
| Jun 2024 | bearish choppy low vol | 19 | -7.52 | -4.06 | 13 | 6 | 68.4 | -31.77 | 16h 35m |
| May 2024 | bullish choppy high vol | 5 | +1.78 | 3.57 | 4 | 1 | 80.0 | -26.52 | 6h 00m |
| Apr 2024 | bearish choppy high vol | 7 | +1.51 | 2.16 | 6 | 1 | 85.7 | -29.64 | 11h 00m |
| Mar 2024 | bullish trending high vol | 11 | -12.23 | -11.47 | 3 | 8 | 27.3 | -29.8 | 3h 33m |
| Feb 2024 | bullish trending low vol | 5 | +3.25 | 6.52 | 5 | 0 | 100.0 | -18.33 | 4h 48m |
| Jan 2024 | bearish choppy high vol | 9 | +0.95 | 1.01 | 7 | 2 | 77.8 | -20.1 | 5h 07m |
| Dec 2023 | bullish trending low vol | 12 | +1.75 | 1.45 | 11 | 1 | 91.7 | -24.08 | 11h 50m |
| Nov 2023 | bullish trending low vol | 17 | -4.56 | -2.73 | 11 | 6 | 64.7 | -22.48 | 11h 28m |
| Oct 2023 | bullish trending low vol | 5 | +1.86 | 3.73 | 5 | 0 | 100.0 | -20.1 | 5h 12m |
| Sep 2023 | bearish choppy low vol | 5 | +1.61 | 3.22 | 4 | 1 | 80.0 | -20.64 | 10h 12m |
| Aug 2023 | bearish choppy low vol | 20 | -8.96 | -4.48 | 13 | 7 | 65.0 | -21.52 | 24h 09m |
| Jul 2023 | bullish trending low vol | 18 | -3.47 | -1.92 | 11 | 7 | 61.1 | -14.81 | 21h 03m |
| Jun 2023 | bullish trending low vol | 5 | +1.19 | 2.39 | 4 | 1 | 80.0 | -11.15 | 13h 48m |
| May 2023 | bearish choppy low vol | 12 | +1.67 | 1.39 | 9 | 3 | 75.0 | -13.07 | 31h 30m |
| Apr 2023 | bullish trending low vol | 11 | -12.27 | -11.29 | 3 | 8 | 27.3 | -13.07 | 35h 38m |
| Mar 2023 | bullish trending high vol | 1 | +0.00 | 0.00 | 1 | 0 | 100.0 | -2.22 | 78h 00m |
| Feb 2023 | bullish trending low vol | 9 | +2.58 | 2.88 | 7 | 2 | 77.8 | -3.93 | 13h 00m |
| Jan 2023 | bullish trending low vol | 7 | +4.51 | 6.45 | 7 | 0 | 100.0 | -8.32 | 2h 17m |
| Dec 2022 | bearish trending low vol | 13 | -9.60 | -7.41 | 6 | 7 | 46.2 | -8.49 | 43h 18m |
| Nov 2022 | bearish trending high vol | 26 | +10.93 | 4.23 | 21 | 5 | 80.8 | -13.26 | 5h 32m |
| Oct 2022 | bullish choppy low vol | 3 | +1.69 | 5.69 | 3 | 0 | 100.0 | -10.32 | 3h 20m |
| Sep 2022 | bearish choppy high vol | 9 | -7.05 | -7.86 | 4 | 5 | 44.4 | -10.76 | 7h 13m |
| Aug 2022 | bullish choppy high vol | 1 | +0.20 | 1.99 | 1 | 0 | 100.0 | -4.5 | 6h 00m |
| Jul 2022 | bullish trending high vol | 1 | -1.73 | -18.29 | 0 | 1 | 0.0 | -4.67 | 9h 00m |
| May 2022 | bearish trending high vol | 3 | -3.03 | -10.51 | 1 | 2 | 33.3 | -3.13 | 1h 00m |
| Apr 2022 | bearish choppy high vol | 4 | +2.50 | 6.26 | 4 | 0 | 100.0 | 0.0 | 3h 00m |
| Mar 2022 | bullish choppy high vol | 2 | +2.00 | 10.00 | 2 | 0 | 100.0 | 0.0 | 2h 00m |
| Feb 2022 | bearish trending high vol | 2 | +1.02 | 5.38 | 2 | 0 | 100.0 | 0.0 | 1h 30m |
| Jan 2022 | bearish trending high vol | 8 | +4.79 | 6.15 | 8 | 0 | 100.0 | -1.46 | 5h 15m |
| Dec 2021 | bearish trending high vol | 9 | +3.94 | 4.34 | 6 | 3 | 66.7 | -8.35 | 0h 53m |
| Nov 2021 | bearish trending high vol | 14 | -4.98 | -3.57 | 6 | 8 | 42.9 | -8.66 | 10h 17m |
| Oct 2021 | bullish trending high vol | 10 | +5.03 | 5.08 | 9 | 1 | 90.0 | -6.57 | 4h 36m |
| Sep 2021 | bearish trending high vol | 5 | -1.18 | -2.33 | 3 | 2 | 60.0 | -8.56 | 1h 24m |
| Aug 2021 | bullish trending high vol | 3 | -3.46 | -11.56 | 1 | 2 | 33.3 | -5.07 | 7h 20m |
| Jul 2021 | bullish trending high vol | 1 | -1.83 | -18.28 | 0 | 1 | 0.0 | -1.75 | 1h 00m |
| Jun 2021 | bearish trending high vol | 1 | +0.50 | 5.00 | 1 | 0 | 100.0 | 0.0 | 3h 00m |
| May 2021 | bearish trending high vol | 7 | +0.91 | 1.45 | 4 | 3 | 57.1 | -2.2 | 0h 34m |
| Apr 2021 | bearish choppy high vol | 6 | +3.26 | 5.45 | 5 | 1 | 83.3 | -3.4 | 4h 30m |
| Mar 2021 | bullish choppy high vol | 2 | -3.71 | -18.58 | 0 | 2 | 0.0 | -3.59 | 3h 00m |
| Feb 2021 | bullish trending high vol | 7 | +0.30 | 0.42 | 4 | 3 | 57.1 | -3.51 | 9h 51m |
| Jan 2021 | bullish trending high vol | 5 | +3.01 | 6.04 | 5 | 0 | 100.0 | 0.0 | 5h 36m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2025 | 48 | +2.17 | 0.31 | 35 | 13 | 72.9 | -17.8 | 9h 32m |
| 2024 | 95 | +6.31 | 0.64 | 67 | 28 | 70.5 | -33.1 | 9h 00m |
| 2023 | 122 | -14.09 | -1.17 | 86 | 36 | 70.5 | -24.08 | 19h 04m |
| 2022 | 72 | +1.72 | 0.24 | 52 | 20 | 72.2 | -13.26 | 11h 57m |
| 2021 | 70 | +1.79 | 0.27 | 44 | 26 | 62.9 | -8.66 | 5h 13m |
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-bias patterns detected
ran by Ron · took s
Lookahead analysis
freqtrade lookahead-analysis: detects strategies peeking at future candles.