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 | # pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement # flake8: noqa: F401 # isort: skip_file # --- Do not remove these imports --- from datetime import datetime from pandas import DataFrame from freqtrade.strategy import IStrategy, informative, IntParameter, CategoricalParameter import talib.abstract as ta from technical import qtpylib class ZaratustraV29(IStrategy): INTERFACE_VERSION = 3 timeframe = "1h" can_short = True use_exit_signal = True exit_profit_only = True position_adjustment_enable = True # ROI table: minimal_roi = { "0": 0.328, "167": 0.151, "406": 0.031, "1063": 0 } # Stoploss: stoploss = -0.308 # Trailing stop: trailing_stop = True trailing_stop_positive = 0.073 trailing_stop_positive_offset = 0.081 trailing_only_offset_is_reached = True # Max Open Trades: max_open_trades = 1 def leverage(self, pair: str, current_time: "datetime", current_rate: float, proposed_leverage: float, max_leverage: float, side: str, **kwargs) -> float: return 1 def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: # RSI: Momentum and overbought/oversold indicator dataframe['RSI'] = ta.RSI(dataframe) # ADX and DI components: measure trend strength and direction dataframe['ADX'] = ta.ADX(dataframe) dataframe['PDI'] = ta.PLUS_DI(dataframe) dataframe['MDI'] = ta.MINUS_DI(dataframe) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: if metadata['pair'] != 'BTC/USDT:USDT': return dataframe dataframe.loc[ ( (qtpylib.crossed_above(dataframe['RSI'], 70)) ), ['enter_long', 'enter_tag'] ] = (1, 'Bullish trend') dataframe.loc[ ( (qtpylib.crossed_below(dataframe['RSI'], 30)) ), ['enter_short', 'enter_tag'] ] = (1, 'Bearish trend') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (qtpylib.crossed_below(dataframe['RSI'], 70)) ), ['exit_long', 'exit_tag'] ] = (1, 'Bullish trend') dataframe.loc[ ( (qtpylib.crossed_above(dataframe['RSI'], 30)) ), ['exit_short', 'exit_tag'] ] = (1, 'Bearish trend') return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 54.2s
ℹ️ 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.31) — hard to tell apart from luck
- 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 | 5 | +0.09 | 0.20 | 4 | 1 | 80.0 | -0.0 | 121h 12m |
| Nov 2025 | bearish trending high vol | 14 | +0.68 | 0.51 | 12 | 2 | 85.7 | -0.47 | 21h 30m |
| Oct 2025 | bearish trending low vol | 13 | +0.82 | 0.58 | 10 | 3 | 76.9 | -1.27 | 215h 23m |
| Jun 2025 | bearish choppy low vol | 6 | +0.77 | 1.21 | 6 | 0 | 100.0 | -2.01 | 109h 10m |
| May 2025 | bullish trending low vol | 4 | -2.09 | -7.15 | 3 | 1 | 75.0 | -2.22 | 179h 30m |
| Apr 2025 | bullish choppy low vol | 2 | +0.21 | 1.35 | 1 | 1 | 50.0 | -0.0 | 328h 00m |
| Mar 2025 | bearish trending high vol | 3 | +0.29 | 1.04 | 3 | 0 | 100.0 | 0.0 | 47h 40m |
| Feb 2025 | bearish trending low vol | 8 | +0.69 | 0.98 | 7 | 1 | 87.5 | -0.81 | 121h 38m |
| Jan 2025 | bearish choppy low vol | 2 | -0.00 | -0.00 | 1 | 1 | 50.0 | -0.81 | 165h 00m |
| Dec 2024 | bullish trending low vol | 12 | +1.19 | 0.99 | 10 | 2 | 83.3 | -1.97 | 62h 15m |
| Nov 2024 | bullish trending low vol | 8 | -0.58 | -2.04 | 7 | 1 | 87.5 | -3.06 | 161h 45m |
| Sep 2024 | bearish choppy low vol | 7 | +0.12 | 0.30 | 5 | 2 | 71.4 | -1.52 | 80h 43m |
| Aug 2024 | bearish choppy high vol | 10 | +0.81 | 1.40 | 6 | 4 | 60.0 | -2.28 | 13h 12m |
| Jul 2024 | bearish trending low vol | 2 | +0.05 | 0.34 | 1 | 1 | 50.0 | -2.35 | 569h 00m |
| Jun 2024 | bearish choppy low vol | 1 | -0.00 | -0.00 | 0 | 1 | 0.0 | -2.35 | 547h 00m |
| May 2024 | bullish choppy high vol | 5 | +0.19 | 0.60 | 4 | 1 | 80.0 | -2.53 | 55h 36m |
| Apr 2024 | bearish choppy high vol | 12 | +0.44 | 0.55 | 10 | 2 | 83.3 | -2.95 | 39h 55m |
| Mar 2024 | bullish trending high vol | 5 | -1.28 | -5.20 | 3 | 2 | 60.0 | -3.18 | 126h 48m |
| Feb 2024 | bullish trending low vol | 5 | +0.08 | 0.30 | 2 | 3 | 40.0 | -1.8 | 180h 24m |
| Jan 2024 | bearish choppy high vol | 3 | -1.76 | -8.55 | 2 | 1 | 66.7 | -1.99 | 456h 20m |
| Nov 2023 | bullish trending low vol | 6 | +0.31 | 0.71 | 4 | 2 | 66.7 | -0.38 | 12h 30m |
| Oct 2023 | bullish trending low vol | 6 | +0.93 | 1.68 | 5 | 1 | 83.3 | -1.29 | 351h 10m |
| Jul 2023 | bullish trending low vol | 6 | +0.08 | 0.15 | 4 | 2 | 66.7 | -1.37 | 65h 30m |
| Jun 2023 | bullish trending low vol | 1 | +0.00 | 0.00 | 1 | 0 | 100.0 | -1.37 | 1694h 00m |
| Apr 2023 | bullish trending low vol | 2 | +0.27 | 1.55 | 1 | 1 | 50.0 | -1.63 | 142h 00m |
| Mar 2023 | bullish trending high vol | 14 | +1.85 | 1.52 | 10 | 4 | 71.4 | -3.42 | 21h 51m |
| Feb 2023 | bullish trending low vol | 12 | +0.69 | 0.64 | 8 | 4 | 66.7 | -4.09 | 26h 25m |
| Jan 2023 | bullish trending low vol | 6 | +0.51 | 0.99 | 3 | 3 | 50.0 | -4.58 | 315h 20m |
| Nov 2022 | bearish trending high vol | 1 | -0.00 | -0.00 | 0 | 1 | 0.0 | -4.58 | 149h 00m |
| Oct 2022 | bullish choppy low vol | 12 | +0.38 | 0.35 | 11 | 1 | 91.7 | -4.95 | 32h 55m |
| Sep 2022 | bearish choppy high vol | 11 | +1.69 | 1.67 | 10 | 1 | 90.9 | -6.58 | 40h 22m |
| Aug 2022 | bullish choppy high vol | 7 | +0.42 | 0.67 | 6 | 1 | 85.7 | -6.99 | 72h 17m |
| Jul 2022 | bullish trending high vol | 10 | +1.20 | 1.33 | 9 | 1 | 90.0 | -7.85 | 32h 12m |
| Jun 2022 | bearish trending high vol | 7 | -2.33 | -3.44 | 5 | 2 | 71.4 | -8.79 | 57h 26m |
| May 2022 | bearish trending high vol | 8 | +0.70 | 1.03 | 7 | 1 | 87.5 | -6.58 | 65h 38m |
| Apr 2022 | bearish choppy high vol | 1 | -0.00 | -0.00 | 0 | 1 | 0.0 | -6.58 | 1050h 00m |
| Mar 2022 | bullish choppy high vol | 7 | +0.77 | 1.36 | 6 | 1 | 85.7 | -7.31 | 17h 51m |
| Feb 2022 | bearish trending high vol | 10 | -1.76 | -1.44 | 8 | 2 | 80.0 | -8.59 | 45h 06m |
| Jan 2022 | bearish trending high vol | 10 | -1.07 | -2.13 | 7 | 3 | 70.0 | -6.42 | 120h 30m |
| Nov 2021 | bearish trending high vol | 4 | +0.03 | 0.15 | 2 | 2 | 50.0 | -4.63 | 144h 45m |
| Oct 2021 | bullish trending high vol | 11 | +0.45 | 0.69 | 7 | 4 | 63.6 | -5.06 | 88h 27m |
| Sep 2021 | bearish trending high vol | 2 | +0.01 | 0.05 | 1 | 1 | 50.0 | -5.06 | 14h 30m |
| Aug 2021 | bullish trending high vol | 7 | -1.89 | -3.60 | 4 | 3 | 57.1 | -5.13 | 69h 43m |
| Jul 2021 | bullish trending high vol | 3 | -2.67 | -10.04 | 2 | 1 | 66.7 | -3.34 | 267h 00m |
| Jun 2021 | bearish trending high vol | 11 | +1.06 | 1.18 | 10 | 1 | 90.9 | -1.69 | 43h 49m |
| May 2021 | bearish trending high vol | 8 | -1.75 | -3.61 | 7 | 1 | 87.5 | -2.11 | 106h 30m |
| Apr 2021 | bearish choppy high vol | 3 | +0.07 | 0.36 | 3 | 0 | 100.0 | 0.0 | 43h 20m |
| Mar 2021 | bullish choppy high vol | 18 | +0.65 | 0.62 | 12 | 6 | 66.7 | -0.0 | 15h 20m |
| Feb 2021 | bullish trending high vol | 14 | +1.66 | 1.61 | 10 | 4 | 71.4 | -0.0 | 53h 17m |
| Jan 2021 | bullish trending high vol | 11 | +1.28 | 1.43 | 11 | 0 | 100.0 | 0.0 | 14h 22m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2025 | 57 | +1.46 | 0.14 | 47 | 10 | 82.5 | -2.22 | 126h 00m |
| 2024 | 70 | -0.74 | -0.40 | 50 | 20 | 71.4 | -3.18 | 115h 30m |
| 2023 | 53 | +4.64 | 1.00 | 36 | 17 | 67.9 | -4.58 | 133h 21m |
| 2022 | 84 | -0.00 | -0.02 | 69 | 15 | 82.1 | -8.79 | 66h 21m |
| 2021 | 92 | -1.10 | -0.14 | 69 | 23 | 75.0 | -5.13 | 59h 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 · 3 thing(s) worth reviewing before trusting the numbers
| Line | Pattern | Detail | |
|---|---|---|---|
| 12 | review | missing_startup_candles | uses recursive indicators (ADX, MINUS_DI, PLUS_DI, 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. Set it to a few times the longest period and confirm with `freqtrade recursive-analysis` |
| 18 | review | unbounded_dca | position_adjustment_enable is on but max_entry_position_adjustment is unset (default -1 = unlimited), so nothing caps how many times a losing position can be added to. backtesting.py only bounds entries when that value is > -1 |
| 58 | 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 lookahead-analysis: detects strategies peeking at future candles.