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 | # --- Do not remove these libs --- from freqtrade.strategy import IStrategy, merge_informative_pair from typing import Dict, List from functools import reduce from pandas import DataFrame # -------------------------------- import talib.abstract as ta from datetime import datetime, timedelta from freqtrade.persistence import Trade # thanks tirail for original SMAOffset sharing # added trend detection and stoploss class SMAOffsetV2(IStrategy): minimal_roi = { "0": 1, } stoploss = -0.20 timeframe = '5m' informative_timeframe = '1h' use_exit_signal = True exit_profit_only = False process_only_new_candles = True use_custom_stoploss = True startup_candle_count = 200 def custom_stoploss(self, pair: str, trade: 'Trade', current_time: datetime, current_rate: float, current_profit: float, **kwargs) -> float: if current_time - timedelta(minutes=40) > trade.open_date_utc and current_profit < -0.1: return -0.01 return -0.99 def informative_pairs(self): pairs = self.dp.current_whitelist() informative_pairs = [(pair, self.informative_timeframe) for pair in pairs] return informative_pairs @staticmethod def get_informative_indicators(dataframe: DataFrame, metadata: dict): dataframe['ema_fast'] = ta.EMA(dataframe, timeperiod=20) dataframe['ema_slow'] = ta.EMA(dataframe, timeperiod=25) dataframe['go_long'] = ( (dataframe['ema_fast'] > dataframe['ema_slow']) ).astype('int') * 2 return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: if not self.dp: return dataframe informative = self.dp.get_pair_dataframe(pair=metadata['pair'], timeframe=self.informative_timeframe) informative = self.get_informative_indicators(informative.copy(), metadata) dataframe = merge_informative_pair(dataframe, informative, self.timeframe, self.informative_timeframe, ffill=True) # don't overwrite the base dataframe's HLCV information skip_columns = [(s + "_" + self.informative_timeframe) for s in ['date', 'open', 'high', 'low', 'close', 'volume']] dataframe.rename( columns=lambda s: s.replace("_{}".format(self.informative_timeframe), "") if (not s in skip_columns) else s, inplace=True) # --------------------------------------------------------------------------------- sma_offset = (1 - 0.04) sma_offset_pos = (1 + 0.012) base_nb_candles = 20 dataframe['sma_30_offset'] = ta.SMA(dataframe, timeperiod=base_nb_candles) * sma_offset dataframe['sma_30_offset_pos'] = ta.SMA(dataframe, timeperiod=base_nb_candles) * sma_offset_pos return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['go_long'] > 0) & (dataframe['close'] < dataframe['sma_30_offset']) & (dataframe['volume'] > 0) ), 'buy'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( ( (dataframe['go_long'] == 0) | (dataframe['close'] > dataframe['sma_30_offset_pos']) ) & (dataframe['volume'] > 0) ), 'sell'] = 1 return dataframe plot_config = { 'main_plot': { 'sma_30_offset': {'color': 'orange'}, 'sma_30_offset_pos': {'color': 'orange'}, 'ema_fast': {'color': 'blue'}, 'ema_slow': {'color': 'green'}, }, } |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 294.0s
ℹ️ This strategy uses custom_stoploss() — 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 →
- did not beat simply holding the market
- statistically significant edge (p=0.00)
- 100% of resampled runs stayed profitable
- profitable across 81% of rolling 3-month windows
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 | 12 | -1.58 | -1.32 | 2 | 10 | 16.7 | -1.23 | 1h 13m |
| Nov 2025 | bearish trending high vol | 38 | +2.96 | 0.78 | 25 | 13 | 65.8 | -0.84 | 1h 57m |
| Oct 2025 | bearish trending low vol | 30 | -2.19 | -0.73 | 17 | 13 | 56.7 | -3.12 | 1h 42m |
| Sep 2025 | bullish choppy low vol | 4 | -0.07 | -0.17 | 2 | 2 | 50.0 | -0.09 | 4h 25m |
| Aug 2025 | bullish choppy low vol | 14 | +2.86 | 2.04 | 14 | 0 | 100.0 | -0.04 | 1h 05m |
| Jul 2025 | bullish choppy low vol | 4 | +0.88 | 2.20 | 3 | 1 | 75.0 | -0.24 | 3h 49m |
| Jun 2025 | bearish choppy low vol | 5 | +0.46 | 0.92 | 3 | 2 | 60.0 | -0.5 | 1h 52m |
| May 2025 | bullish trending low vol | 20 | +2.52 | 1.26 | 17 | 3 | 85.0 | -1.14 | 1h 59m |
| Apr 2025 | bullish choppy low vol | 6 | -0.26 | -0.42 | 4 | 2 | 66.7 | -1.31 | 1h 50m |
| Mar 2025 | bearish trending high vol | 19 | -2.45 | -1.29 | 9 | 10 | 47.4 | -1.51 | 3h 53m |
| Feb 2025 | bearish trending low vol | 23 | -0.48 | -0.21 | 10 | 13 | 43.5 | -0.62 | 2h 07m |
| Jan 2025 | bearish choppy low vol | 30 | +0.40 | 0.13 | 14 | 16 | 46.7 | -0.9 | 1h 54m |
| Dec 2024 | bullish trending low vol | 47 | +1.42 | 0.30 | 32 | 15 | 68.1 | -0.56 | 1h 56m |
| Nov 2024 | bullish trending low vol | 88 | +12.47 | 1.42 | 63 | 25 | 71.6 | -0.65 | 2h 43m |
| Oct 2024 | bullish choppy low vol | 14 | +2.57 | 1.84 | 12 | 2 | 85.7 | -0.08 | 1h 07m |
| Sep 2024 | bearish choppy low vol | 3 | +1.03 | 3.42 | 3 | 0 | 100.0 | 0.0 | 1h 02m |
| Aug 2024 | bearish choppy high vol | 7 | +0.51 | 0.73 | 5 | 2 | 71.4 | -0.07 | 2h 17m |
| Jul 2024 | bearish trending low vol | 7 | +1.42 | 2.03 | 6 | 1 | 85.7 | -0.16 | 4h 09m |
| Jun 2024 | bearish choppy low vol | 14 | +4.97 | 3.55 | 14 | 0 | 100.0 | -1.47 | 1h 32m |
| Apr 2024 | bearish choppy high vol | 22 | -0.63 | -0.29 | 15 | 7 | 68.2 | -1.78 | 1h 48m |
| Mar 2024 | bullish trending high vol | 51 | -0.05 | -0.01 | 29 | 22 | 56.9 | -1.58 | 1h 47m |
| Feb 2024 | bullish trending low vol | 18 | +5.06 | 2.81 | 16 | 2 | 88.9 | -0.06 | 4h 43m |
| Jan 2024 | bearish choppy high vol | 30 | +1.99 | 0.66 | 20 | 10 | 66.7 | -0.67 | 1h 40m |
| Dec 2023 | bullish trending low vol | 52 | +13.48 | 2.59 | 41 | 11 | 78.8 | -0.16 | 2h 01m |
| Nov 2023 | bullish trending low vol | 31 | +2.08 | 0.67 | 20 | 11 | 64.5 | -0.33 | 2h 54m |
| Oct 2023 | bullish trending low vol | 10 | +2.87 | 2.87 | 9 | 1 | 90.0 | -0.0 | 9h 16m |
| Sep 2023 | bearish choppy low vol | 4 | +0.27 | 0.68 | 3 | 1 | 75.0 | -0.05 | 2h 29m |
| Aug 2023 | bearish choppy low vol | 12 | +1.68 | 1.40 | 10 | 2 | 83.3 | -0.43 | 1h 37m |
| Jul 2023 | bullish trending low vol | 18 | +1.78 | 0.99 | 12 | 6 | 66.7 | -0.33 | 4h 01m |
| Jun 2023 | bullish trending low vol | 28 | +1.52 | 0.54 | 16 | 12 | 57.1 | -0.26 | 1h 56m |
| May 2023 | bearish choppy low vol | 10 | +2.92 | 2.92 | 10 | 0 | 100.0 | -0.19 | 1h 22m |
| Apr 2023 | bullish trending low vol | 24 | +0.63 | 0.26 | 13 | 11 | 54.2 | -0.48 | 1h 43m |
| Mar 2023 | bullish trending high vol | 29 | -1.29 | -0.44 | 14 | 15 | 48.3 | -0.76 | 1h 29m |
| Feb 2023 | bullish trending low vol | 18 | +2.51 | 1.40 | 12 | 6 | 66.7 | -0.11 | 2h 31m |
| Jan 2023 | bullish trending low vol | 51 | +7.73 | 1.52 | 40 | 11 | 78.4 | -2.66 | 3h 09m |
| Dec 2022 | bearish trending low vol | 2 | +0.32 | 1.58 | 2 | 0 | 100.0 | -2.9 | 1h 05m |
| Nov 2022 | bearish trending high vol | 44 | -1.53 | -0.35 | 21 | 23 | 47.7 | -3.27 | 1h 55m |
| Oct 2022 | bullish choppy low vol | 7 | +0.78 | 1.12 | 5 | 2 | 71.4 | -2.77 | 2h 14m |
| Sep 2022 | bearish choppy high vol | 25 | -6.78 | -2.71 | 3 | 22 | 12.0 | -2.74 | 2h 54m |
| Aug 2022 | bullish choppy high vol | 13 | -0.29 | -0.23 | 6 | 7 | 46.2 | -0.37 | 2h 08m |
| Jul 2022 | bearish trending high vol | 29 | +3.65 | 1.26 | 22 | 7 | 75.9 | -1.31 | 1h 41m |
| Jun 2022 | bearish trending high vol | 35 | +0.09 | 0.03 | 18 | 17 | 51.4 | -1.92 | 1h 59m |
| May 2022 | bearish trending high vol | 51 | -1.86 | -0.37 | 24 | 27 | 47.1 | -1.97 | 2h 10m |
| Apr 2022 | bearish choppy high vol | 4 | -0.71 | -1.77 | 2 | 2 | 50.0 | -0.67 | 2h 48m |
| Mar 2022 | bullish choppy high vol | 22 | +4.68 | 2.13 | 18 | 4 | 81.8 | -2.23 | 2h 19m |
| Feb 2022 | bearish trending high vol | 27 | +3.86 | 1.43 | 19 | 8 | 70.4 | -3.51 | 1h 15m |
| Jan 2022 | bearish trending high vol | 29 | -1.87 | -0.65 | 10 | 19 | 34.5 | -3.47 | 1h 42m |
| Dec 2021 | bearish trending high vol | 11 | -0.81 | -0.75 | 8 | 3 | 72.7 | -3.7 | 1h 54m |
| Nov 2021 | bullish trending high vol | 28 | -3.95 | -1.41 | 10 | 18 | 35.7 | -2.57 | 2h 13m |
| Oct 2021 | bullish trending high vol | 23 | +1.47 | 0.64 | 17 | 6 | 73.9 | -1.58 | 2h 49m |
| Sep 2021 | bearish trending high vol | 87 | +10.99 | 1.27 | 58 | 29 | 66.7 | -1.74 | 2h 12m |
| Aug 2021 | bullish trending high vol | 57 | +10.58 | 1.86 | 49 | 8 | 86.0 | -2.27 | 2h 01m |
| Jul 2021 | bearish trending high vol | 34 | -4.88 | -1.44 | 14 | 20 | 41.2 | -2.32 | 3h 38m |
| Jun 2021 | bearish trending high vol | 47 | +1.73 | 0.37 | 28 | 19 | 59.6 | -0.89 | 1h 50m |
| May 2021 | bearish trending high vol | 235 | +18.14 | 0.77 | 151 | 84 | 64.3 | -2.03 | 1h 58m |
| Apr 2021 | bearish choppy high vol | 186 | +33.11 | 1.78 | 141 | 45 | 75.8 | -0.88 | 1h 37m |
| Mar 2021 | bullish choppy high vol | 79 | +12.20 | 1.55 | 62 | 17 | 78.5 | -0.4 | 2h 47m |
| Feb 2021 | bullish trending high vol | 250 | +37.02 | 1.48 | 196 | 54 | 78.4 | -2.68 | 1h 53m |
| Jan 2021 | bullish trending high vol | 311 | +61.50 | 1.98 | 245 | 66 | 78.8 | -6.31 | 1h 36m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2025 | 205 | +3.05 | 0.15 | 120 | 85 | 58.5 | -3.12 | 2h 05m |
| 2024 | 301 | +30.76 | 1.02 | 215 | 86 | 71.4 | -1.78 | 2h 16m |
| 2023 | 287 | +36.18 | 1.26 | 200 | 87 | 69.7 | -2.66 | 2h 36m |
| 2022 | 288 | +0.34 | 0.01 | 150 | 138 | 52.1 | -3.51 | 2h 00m |
| 2021 | 1348 | +177.10 | 1.31 | 979 | 369 | 72.6 | -6.31 | 1h 56m |
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, but 2 backtest-realism warning(s) — results may not reflect real trading
| Line | Pattern | Detail | |
|---|---|---|---|
| 88 | realism | dead_v2_signal | writes the freqtrade v2 column 'buy' from a v3 populate_* method -- v3 reads enter_*/exit_* only, so this signal is dead code and never trades |
| 100 | realism | dead_v2_signal | writes the freqtrade v2 column 'sell' from a v3 populate_* method -- v3 reads enter_*/exit_* only, so this signal is dead code and never trades |
ran by Ron · took s
Lookahead analysis
freqtrade lookahead-analysis: detects strategies peeking at future candles.