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 | # 组合策略 - 多指标确认 # 结合 Supertrend + RSI + ADX + 成交量 # 只有多个指标同时确认才入场 from freqtrade.strategy import IStrategy, IntParameter, DecimalParameter from pandas import DataFrame import pandas as pd import talib.abstract as ta import numpy as np from functools import reduce class CombinedStrategy(IStrategy): INTERFACE_VERSION = 3 # Supertrend 参数 atr_period = IntParameter(10, 30, default=14, space="buy", optimize=True) atr_multiplier = DecimalParameter(2.0, 4.0, default=3.0, space="buy", optimize=True) # RSI 参数 rsi_period = IntParameter(10, 20, default=14, space="buy", optimize=True) rsi_lower = IntParameter(25, 40, default=35, space="buy", optimize=True) rsi_upper = IntParameter(60, 75, default=65, space="sell", optimize=True) # ADX 参数 adx_threshold = IntParameter(20, 35, default=25, space="buy", optimize=True) minimal_roi = {"0": 0.08} stoploss = -0.05 timeframe = '15m' trailing_stop = True trailing_stop_positive = 0.03 trailing_stop_positive_offset = 0.04 trailing_only_offset_is_reached = True startup_candle_count = 200 order_types = { 'entry': 'limit', 'exit': 'limit', 'stoploss': 'market', 'stoploss_on_exchange': False } def supertrend(self, dataframe, period=14, multiplier=3): df = dataframe.copy() hl2 = (df['high'] + df['low']) / 2 atr = ta.ATR(df, timeperiod=period) upperband = hl2 + (multiplier * atr) lowerband = hl2 - (multiplier * atr) supertrend = [0] * len(df) direction = [1] * len(df) for i in range(1, len(df)): if df['close'].iloc[i] > upperband.iloc[i-1]: direction[i] = 1 elif df['close'].iloc[i] < lowerband.iloc[i-1]: direction[i] = -1 else: direction[i] = direction[i-1] if direction[i] == 1: supertrend[i] = lowerband.iloc[i] else: supertrend[i] = upperband.iloc[i] return pd.Series(supertrend, index=df.index), pd.Series(direction, index=df.index) def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # Supertrend dataframe['supertrend'], dataframe['st_dir'] = self.supertrend( dataframe, period=self.atr_period.value, multiplier=self.atr_multiplier.value ) # RSI dataframe['rsi'] = ta.RSI(dataframe, timeperiod=self.rsi_period.value) # ADX dataframe['adx'] = ta.ADX(dataframe, timeperiod=14) # EMA dataframe['ema_50'] = ta.EMA(dataframe, timeperiod=50) dataframe['ema_200'] = ta.EMA(dataframe, timeperiod=200) # 成交量 dataframe['volume_ma'] = dataframe['volume'].rolling(20).mean() return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[:, 'enter_long'] = 0 conditions = [ # 1. Supertrend 看涨 dataframe['st_dir'] == 1, # 2. RSI 不超买 dataframe['rsi'] < self.rsi_upper.value, # 3. ADX 显示趋势 dataframe['adx'] > self.adx_threshold.value, # 4. 成交量确认 dataframe['volume'] > dataframe['volume_ma'] * 1.1, # 5. 价格在 EMA50 之上 dataframe['close'] > dataframe['ema_50'], ] if conditions: dataframe.loc[reduce(lambda x, y: x & y, conditions), 'enter_long'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[:, 'exit_long'] = 0 conditions = [ # Supertrend 转空 OR RSI 超买 (dataframe['st_dir'] == -1) | (dataframe['rsi'] > 75), ] 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 411.3s
ℹ️ 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 →
- profit isn't statistically significant (p=1.00) — hard to tell apart from luck
- only 0% of resampled runs were profitable
- profitable in only 0% of rolling 3-month windows
- did not beat simply holding the market
- very deep drawdown (-91%)
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 2021 | bearish trending high vol | 14 | -2.79 | -2.00 | 5 | 9 | 35.7 | -91.02 | 11h 20m |
| Nov 2021 | bullish trending high vol | 33 | -1.19 | -0.36 | 17 | 16 | 51.5 | -89.52 | 18h 14m |
| Oct 2021 | bullish trending high vol | 36 | -1.31 | -0.36 | 20 | 16 | 55.6 | -87.43 | 19h 17m |
| Sep 2021 | bearish trending high vol | 73 | -3.78 | -0.52 | 39 | 34 | 53.4 | -86.49 | 8h 44m |
| Aug 2021 | bullish trending high vol | 86 | +0.06 | 0.01 | 51 | 35 | 59.3 | -83.11 | 12h 25m |
| Jul 2021 | bearish trending high vol | 50 | -0.80 | -0.16 | 29 | 21 | 58.0 | -83.97 | 15h 02m |
| Jun 2021 | bearish trending high vol | 84 | -5.92 | -0.71 | 45 | 39 | 53.6 | -83.24 | 10h 28m |
| May 2021 | bearish trending high vol | 174 | -11.56 | -0.67 | 92 | 82 | 52.9 | -78.47 | 6h 23m |
| Apr 2021 | bearish choppy high vol | 248 | -3.40 | -0.14 | 149 | 99 | 60.1 | -68.99 | 8h 04m |
| Mar 2021 | bullish choppy high vol | 187 | -7.03 | -0.38 | 102 | 85 | 54.5 | -65.14 | 12h 42m |
| Feb 2021 | bullish trending high vol | 473 | -29.78 | -0.63 | 248 | 225 | 52.4 | -57.84 | 5h 52m |
| Jan 2021 | bullish trending high vol | 628 | -22.53 | -0.36 | 356 | 272 | 56.7 | -33.74 | 6h 09m |
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 | |
|---|---|---|---|
| 36 | review | startup_candles_too_small | startup_candle_count is 200, but EMA(timeperiod=200) needing 3x warmup needs at least 600 candles -- so the first 400+ 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 lookahead-analysis: detects strategies peeking at future candles.