ZaratustraV20
♡
Basics
mode: futures
timeframe: 5m
interface version: 3
Settings
stoploss: -0.99
has minimal roi
Indicators
ADX
SMA
talib
technical
Methods
leverage
plot_config
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 | # pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement # flake8: noqa: F401 # isort: skip_file # --- Do not remove these imports --- from freqtrade.constants import Config from freqtrade.persistence import Trade from freqtrade.strategy import IStrategy, informative, IntParameter, DecimalParameter from freqtrade.optimize.space import Categorical, Dimension, Integer, SKDecimal from datetime import datetime, timedelta from pandas import DataFrame from typing import Dict, List, Optional, Union, Tuple import talib.abstract as ta from technical import qtpylib class ZaratustraV20(IStrategy): # Parameters INTERFACE_VERSION = 3 timeframe = '5m' can_short = True # ROI table: minimal_roi = {} # Stoploss: stoploss = -0.99 # Max Open Trades: max_open_trades = -1 @property def plot_config(self): plot_config = {} plot_config['main_plot'] = {} plot_config['subplots'] = { 'DI' : { 'DX' : {'color' : 'yellow'}, 'ADX': {'color' : 'orange'}, 'PDI': {'color' : 'green'}, 'MDI': {'color' : 'red'}, }, } return plot_config def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['DX'] = ta.SMA(ta.DX(dataframe) * dataframe['volume'] ) / ta.SMA(dataframe['volume']) dataframe['ADX'] = ta.SMA(ta.ADX(dataframe) * dataframe['volume'] ) / ta.SMA(dataframe['volume']) dataframe['PDI'] = ta.SMA(ta.PLUS_DI(dataframe) * dataframe['volume'] ) / ta.SMA(dataframe['volume']) dataframe['MDI'] = ta.SMA(ta.MINUS_DI(dataframe) * dataframe['volume'] ) / ta.SMA(dataframe['volume']) dataframe['DDI'] = abs(dataframe['PDI'] - dataframe['MDI']) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # Positive trend (dataframe['PDI'] > dataframe['MDI']) & # ADX between PDI and MDI (dataframe['ADX'] > dataframe['MDI']) & (dataframe['ADX'] < dataframe['PDI']) & # Main event! (qtpylib.crossed_above(dataframe['DX'], dataframe['ADX'])) ), ['enter_long', 'enter_tag'] ] = (1, 'Long DI enter') dataframe.loc[ ( # Negative trend (dataframe['MDI'] > dataframe['PDI']) & # ADX between PDI and MDI (dataframe['ADX'] > dataframe['PDI']) & (dataframe['ADX'] < dataframe['MDI']) & # Main event! (qtpylib.crossed_above(dataframe['DX'], dataframe['ADX'])) ), ['enter_short', 'enter_tag'] ] = (1, 'Short DI enter') return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( # End of the event! (qtpylib.crossed_below(dataframe['DX'], dataframe['ADX'])) | # Bad moments for trading... (dataframe['DX'] <= dataframe['MDI']) | (dataframe['DX'] <= dataframe['PDI']) | # Trend reversion... (dataframe['DX'] <= dataframe['DX'].shift(1)) ), ['exit_long', 'exit_tag'] ] = (1, 'Long DI exit') dataframe.loc[ ( # End of the event! (qtpylib.crossed_below(dataframe['DX'], dataframe['ADX'])) | # Bad moments for trading... (dataframe['DX'] <= dataframe['MDI']) | (dataframe['DX'] <= dataframe['PDI']) | # Trend reversion... (dataframe['DX'] <= dataframe['DX'].shift(1)) ), ['exit_long', 'exit_tag'] ] = (1, 'Long DI exit') return dataframe def leverage(self, pair: str, current_time: "datetime", current_rate: float, proposed_leverage: float, max_leverage: float, side: str, **kwargs,) -> float: return 10 |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 280.3s
pairs 33 pairs
timerange 20210101-20260101
mode futures
timeframe 5m
stake 100 USDT
wallet 1000 USDT
max open trades 10
fee exchange lowest tier
total profit-96.51%
final wallet35 USDT
win rate0.0%
max drawdown-96.19%
market change+447.44%
vs market-543.95%
timeframe5m
profit factor0.0
expectancy ratio-1.0
sharpe-1.589
sortino-1.589
CAGR-48.9%
calmar-1.046
avg leverage10.0x
avg MFE+4.35%
avg MAE-9.38%
avg profit/trade-87.88%
avg duration72h 14m
best trade-72.01%
worst trade-97.11%
positive months0/1
trades11
revision1
Loading charts…
Monthly breakdown
| Month | Regime | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|---|
| Jan 2021 | bullish trending high vol | 11 | -96.51 | -87.88 | 0 | 11 | 0.0 | -96.19 | 72h 14m |
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 · 2 thing(s) worth reviewing before trusting the numbers
| Line | Pattern | Detail | |
|---|---|---|---|
| 17 | review | missing_startup_candles | uses recursive indicators (ADX, DX, MINUS_DI, PLUS_DI) 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` |
| 56 | 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.