Basics
mode: futures
timeframe: 1h
interface version: 3
1d
Settings
stoploss: -0.02
has minimal roi
Indicators
MACD
RSI
talib
Concepts
mean_reversion
Methods
populate_indicators_1d
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 | """ EchoL1StrategyV6 — Long AND short. Profits in any market direction. V4/V5 problem: long-only strategy loses in bear/sideways markets. An AI should profit regardless of direction. V6 adds short selling: Long: RSI recovery from oversold + MACD turning up + near MA50 + volume Short: RSI reversal from overbought + MACD turning down + near MA50 + volume Exit: 5% TP | 2% SL (tighter — crypto moves fast both ways) No trailing stop — let signals run to target. Expected: long signals fire in dips, short signals fire at tops. Net result: profits in bull, bear, AND sideways markets. """ from freqtrade.strategy import IStrategy, informative from pandas import DataFrame import talib.abstract as ta import pandas as pd class EchoL1StrategyV6(IStrategy): INTERFACE_VERSION = 3 timeframe = "1h" minimal_roi = {"0": 0.05} stoploss = -0.02 trailing_stop = False can_short = True @informative("1d") def populate_indicators_1d(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe["ma50"] = dataframe["close"].rolling(50).mean() dataframe["near_or_above_ma50"] = ( dataframe["close"] > dataframe["ma50"] * 0.92 ).astype(int) dataframe["near_or_below_ma50"] = ( dataframe["close"] < dataframe["ma50"] * 1.08 ).astype(int) return dataframe def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe["rsi"] = ta.RSI(dataframe["close"], timeperiod=14) dataframe["vol_ma20"] = dataframe["volume"].rolling(20).mean() _macd, _signal, _hist = ta.MACD(dataframe["close"], fastperiod=12, slowperiod=26, signalperiod=9) dataframe["macd_hist"] = pd.Series(_hist, index=dataframe.index) dataframe["macd_hist_prev"] = dataframe["macd_hist"].shift(1) dataframe["rsi_prev"] = dataframe["rsi"].shift(1) # Long conditions dataframe["rsi_was_oversold"] = (dataframe["rsi_prev"] < 40).astype(int) dataframe["rsi_recovering"] = ( (dataframe["rsi_was_oversold"] == 1) & (dataframe["rsi"] > dataframe["rsi_prev"]) ).astype(int) dataframe["macd_turning_up"] = ( dataframe["macd_hist"] > dataframe["macd_hist_prev"] ).astype(int) # Short conditions (mirror) dataframe["rsi_was_overbought"] = (dataframe["rsi_prev"] > 60).astype(int) dataframe["rsi_reversing"] = ( (dataframe["rsi_was_overbought"] == 1) & (dataframe["rsi"] < dataframe["rsi_prev"]) ).astype(int) dataframe["macd_turning_down"] = ( dataframe["macd_hist"] < dataframe["macd_hist_prev"] ).astype(int) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # Long entry dataframe.loc[ (dataframe["near_or_above_ma50_1d"] == 1) & (dataframe["rsi_recovering"] == 1) & (dataframe["rsi"] < 45) & (dataframe["macd_turning_up"] == 1) & (dataframe["volume"] > dataframe["vol_ma20"] * 1.2) & (dataframe["volume"] > 0), "enter_long", ] = 1 # Short entry (mirror logic) dataframe.loc[ (dataframe["near_or_below_ma50_1d"] == 1) & (dataframe["rsi_reversing"] == 1) & (dataframe["rsi"] > 55) & (dataframe["macd_turning_down"] == 1) & (dataframe["volume"] > dataframe["vol_ma20"] * 1.2) & (dataframe["volume"] > 0), "enter_short", ] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[:, "exit_long"] = 0 dataframe.loc[:, "exit_short"] = 0 return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 77.8s
pairs 33 pairs
timerange 20210101-20260101
mode futures
timeframe 1h
stake 100 USDT
wallet 1000 USDT
max open trades 10
fee exchange lowest tier
total profit-90.02%
final wallet100 USDT
win rate26.5%
max drawdown-90.08%
market change+442.71%
vs market-532.73%
timeframe1h
profit factor0.86
expectancy ratio-0.102
break-even fee-0.0049%
sharpe-3.091
sortino-56.613
CAGR-36.9%
calmar-1.046
avg MFE+2.83%
avg MAE-2.56%
avg profit/trade-0.21%
avg duration13h 19m
best trade+5.04%
worst trade-3.45%
win/loss streak10 / 44
positive months10/39
consistent (3-mo)10.8%
worst 3-mo-25.88%
trades4326
revision1
likely annual return-52%
range (5th–95th)-64% … -38%
chance of profit0.0%
worst-5% outcome-66%
significance (p)1.0
risk of ruin0.0%
- profit isn't statistically significant (p=1.00) — hard to tell apart from luck
- only 0% of resampled runs were profitable
- profitable in only 11% of rolling 3-month windows
- did not beat simply holding the market
- very deep drawdown (-90%)
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 |
|---|---|---|---|---|---|---|---|---|---|
| Apr 2024 | bearish choppy high vol | 16 | -1.23 | -0.79 | 3 | 13 | 18.8 | -90.08 | 9h 45m |
| Mar 2024 | bullish trending high vol | 110 | -10.32 | -0.96 | 18 | 92 | 16.4 | -88.86 | 7h 50m |
| Feb 2024 | bullish trending low vol | 53 | -3.83 | -0.74 | 10 | 43 | 18.9 | -79.49 | 21h 43m |
| Jan 2024 | bearish choppy high vol | 64 | -1.15 | -0.21 | 17 | 47 | 26.6 | -75.95 | 17h 22m |
| Dec 2023 | bullish trending low vol | 62 | -0.17 | -0.03 | 18 | 44 | 29.0 | -75.09 | 23h 11m |
| Nov 2023 | bullish trending low vol | 58 | -2.91 | -0.50 | 13 | 45 | 22.4 | -75.01 | 16h 03m |
| Oct 2023 | bullish trending low vol | 58 | -2.88 | -0.49 | 13 | 45 | 22.4 | -70.6 | 36h 37m |
| Sep 2023 | bearish choppy low vol | 39 | +0.44 | 0.09 | 12 | 27 | 30.8 | -69.66 | 45h 23m |
| Aug 2023 | bearish choppy low vol | 56 | -1.85 | -0.32 | 14 | 42 | 25.0 | -69.66 | 38h 50m |
| Jul 2023 | bullish trending low vol | 61 | -0.03 | 0.01 | 18 | 43 | 29.5 | -68.85 | 28h 09m |
| Jun 2023 | bullish trending low vol | 75 | +1.12 | 0.17 | 24 | 51 | 32.0 | -68.65 | 31h 36m |
| May 2023 | bearish choppy low vol | 42 | +1.17 | 0.27 | 14 | 28 | 33.3 | -68.79 | 40h 33m |
| Apr 2023 | bullish trending low vol | 58 | -0.09 | -0.02 | 17 | 41 | 29.3 | -70.08 | 32h 44m |
| Mar 2023 | bullish trending high vol | 99 | -3.82 | -0.37 | 24 | 75 | 24.2 | -70.79 | 14h 40m |
| Feb 2023 | bullish trending low vol | 83 | -3.30 | -0.39 | 20 | 63 | 24.1 | -66.18 | 15h 43m |
| Jan 2023 | bullish trending low vol | 73 | -0.55 | -0.04 | 21 | 52 | 28.8 | -63.46 | 22h 43m |
| Dec 2022 | bearish trending low vol | 57 | +2.30 | 0.39 | 20 | 37 | 35.1 | -63.79 | 32h 46m |
| Nov 2022 | bearish trending high vol | 107 | -4.05 | -0.37 | 26 | 81 | 24.3 | -63.58 | 15h 45m |
| Oct 2022 | bullish choppy low vol | 67 | +4.41 | 0.66 | 26 | 41 | 38.8 | -63.64 | 29h 05m |
| Sep 2022 | bearish choppy high vol | 81 | -0.64 | -0.07 | 23 | 58 | 28.4 | -66.27 | 19h 47m |
| Aug 2022 | bullish choppy high vol | 91 | -4.01 | -0.45 | 21 | 70 | 23.1 | -63.96 | 21h 20m |
| Jul 2022 | bullish trending high vol | 162 | -5.24 | -0.33 | 40 | 122 | 24.7 | -59.81 | 9h 07m |
| Jun 2022 | bearish trending high vol | 109 | +0.50 | 0.05 | 33 | 76 | 30.3 | -55.5 | 9h 09m |
| May 2022 | bearish trending high vol | 120 | +2.63 | 0.21 | 39 | 81 | 32.5 | -57.66 | 7h 22m |
| Apr 2022 | bearish choppy high vol | 130 | -1.12 | -0.08 | 37 | 93 | 28.5 | -61.2 | 15h 08m |
| Mar 2022 | bullish choppy high vol | 124 | -3.07 | -0.26 | 32 | 92 | 25.8 | -55.76 | 16h 15m |
| Feb 2022 | bearish trending high vol | 135 | +1.35 | 0.11 | 42 | 93 | 31.1 | -57.07 | 11h 03m |
| Jan 2022 | bearish trending high vol | 134 | +0.12 | 0.02 | 40 | 94 | 29.9 | -55.09 | 10h 47m |
| Dec 2021 | bearish trending high vol | 166 | -6.40 | -0.38 | 40 | 126 | 24.1 | -54.09 | 8h 37m |
| Nov 2021 | bearish trending high vol | 168 | -4.44 | -0.28 | 43 | 125 | 25.6 | -48.42 | 12h 30m |
| Oct 2021 | bullish trending high vol | 205 | -0.93 | -0.05 | 59 | 146 | 28.8 | -47.63 | 11h 37m |
| Sep 2021 | bearish trending high vol | 173 | -1.81 | -0.09 | 49 | 124 | 28.3 | -48.92 | 6h 48m |
| Aug 2021 | bullish trending high vol | 105 | -1.20 | -0.14 | 29 | 76 | 27.6 | -42.79 | 9h 42m |
| Jul 2021 | bullish trending high vol | 209 | -5.26 | -0.26 | 54 | 155 | 25.8 | -43.37 | 7h 21m |
| Jun 2021 | bearish trending high vol | 168 | +1.40 | 0.10 | 52 | 116 | 31.0 | -39.88 | 6h 08m |
| May 2021 | bearish trending high vol | 279 | -12.89 | -0.46 | 63 | 216 | 22.6 | -38.47 | 2h 54m |
| Apr 2021 | bearish choppy high vol | 217 | -12.17 | -0.58 | 46 | 171 | 21.2 | -23.19 | 4h 30m |
| Mar 2021 | bullish choppy high vol | 205 | -0.82 | -0.04 | 59 | 146 | 28.8 | -15.06 | 8h 40m |
| Feb 2021 | bullish trending high vol | 107 | -9.25 | -0.90 | 18 | 89 | 16.8 | -13.29 | 1h 46m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2024 | 243 | -16.53 | -0.70 | 48 | 195 | 19.8 | -90.08 | 13h 30m |
| 2023 | 764 | -12.87 | -0.16 | 208 | 556 | 27.2 | -75.09 | 26h 53m |
| 2022 | 1317 | -6.82 | -0.05 | 379 | 938 | 28.8 | -66.27 | 14h 40m |
| 2021 | 2002 | -53.77 | -0.27 | 512 | 1490 | 25.6 | -54.09 | 7h 12m |
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 | |
|---|---|---|---|
| 23 | review | missing_startup_candles | uses recursive indicators (MACD, RSI) but startup_candle_count is not set (default 0). Their value at a bar depends on all bars before it, so freqtrade trims no warmup and the backtest opens with unwarmed values that can't occur live. The longest lookback visible here is .rolling(20), so it needs at least that many. Set it to a few times the longest period and confirm with `freqtrade recursive-analysis` |
ran by Ron · took s
Lookahead analysis
freqtrade lookahead-analysis: detects strategies peeking at future candles.