Basics
mode: futures
timeframe: 1d
interface version: 3
Settings
stoploss: -0.99
has minimal roi
dca
process only new candles
startup candle count: 220
Indicators
ADX
EMA
talib
Concepts
dca
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 | """CalendarFuturesStrategy — Calendar Shield with FUTURES short capability. Adapted from BtcCalendarShieldStrategy (the strongest deployed pattern). KEY CHANGES vs spot version: 1. can_short = True (enables short positions) 2. trading_mode = "futures" + margin_mode = "isolated" 3. populate_entry_trend: ALSO fills enter_short when BEAR + cycle_bias very negative 4. populate_exit_trend: ALSO fills exit_short when regime flips back 5. Symmetric sizing: BASE_LONG=0.85, BASE_SHORT=0.50 (shorts more conservative because unlimited upside risk on the underlying) 6. Anomaly circuit breaker exits BOTH directions LEVERAGE: 1x (no leverage). User gains short capability but no liquidation risk beyond underlying drawdown. HYPOTHESIS: In bear/sideways windows where the spot version returns 0% (sits in cash), the futures version can SHORT and convert those zero windows into positive PnL. Example: BTC dropped ~65% in 2022. A 1x short during BEAR-confirmed periods could capture a meaningful portion of that decline. COIN: this is a generic template — the COIN constant filters anomaly_flags and should be set per-deployment (BTC, ETH, BNB, etc.) """ from __future__ import annotations from pathlib import Path import numpy as np import pandas as pd import talib.abstract as ta from freqtrade.persistence import Trade from freqtrade.strategy import IStrategy def _load_aux(name: str): candidates = [ Path("/freqtrade/user_data/data") / name, Path(__file__).resolve().parents[1] / "data" / name, Path(__file__).resolve().parents[2] / "user_data" / "data" / name, ] for p in candidates: if p.exists(): try: df = pd.read_feather(p) if "date" in df.columns: df["date"] = pd.to_datetime(df["date"], utc=True) df = df.set_index("date").sort_index() return df except Exception: continue return pd.DataFrame() _HALVING = _load_aux("halving_cycle.feather") _ANOMALY = _load_aux("anomaly_flags.feather") # Per-deployment customization (set via env var or subclass) import os COIN = os.environ.get("CAL_FUT_COIN", "BTC") N_CONFIRM = 3 BASE_LONG = 0.85 # Same as spot Calendar Shield BASE_SHORT = 0.50 # More conservative — shorts have unlimited risk SIGMOID_K = 4.0 SHORT_THRESHOLD = -0.30 # cycle_bias must be < this to enable shorts PHASE_SHIFTS = { "ACCUMULATION": 0.20, "EARLY_BULL": 0.10, "PARABOLIC": -0.15, "DISTRIBUTION": -0.40, "BEAR": -0.60, "REACCUMULATION": -0.05, } CALENDAR_TILTS = { "is_october": 0.15, "is_july": 0.05, "is_wednesday": 0.05, "is_monday": 0.05, "is_end_of_month": 0.05, } TILT_CLAMP = 0.30 def _sigmoid(x, k=SIGMOID_K, c=0.0): return 1.0 / (1.0 + np.exp(-k * (x - c))) class CalendarFuturesStrategy(IStrategy): INTERFACE_VERSION: int = 3 timeframe: str = "1d" can_short: bool = True process_only_new_candles: bool = True minimal_roi: dict = {"0": 10.0} stoploss: float = -0.99 use_custom_stoploss: bool = False position_adjustment_enable: bool = True max_entry_position_adjustment: int = 5000 use_exit_signal: bool = True exit_profit_only: bool = False startup_candle_count: int = 220 # Futures-specific trading_mode = "futures" margin_mode = "isolated" order_types = {"entry": "limit", "exit": "limit", "stoploss": "limit", "stoploss_on_exchange": False} def leverage(self, pair, current_time, current_rate, proposed_leverage, max_leverage, entry_tag, side, **kwargs): """Always 1x — no actual leverage, just short capability.""" return 1.0 def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame: df = dataframe.copy() df["ema200"] = ta.EMA(df, timeperiod=200) df["adx"] = ta.ADX(df, timeperiod=14) df["ret_30d"] = df["close"].pct_change(30) # Regime detection (same as spot) bull = (df["close"] > df["ema200"]) & (df["ret_30d"] > 0.05) & (df["adx"] > 20) bear = (df["close"] < df["ema200"]) & (df["ret_30d"] < -0.10) rcode = pd.Series(0.0, index=df.index) rcode[bull] = 1.0 rcode[bear] = -1.0 rmin = rcode.rolling(N_CONFIRM, min_periods=N_CONFIRM).min() rmax = rcode.rolling(N_CONFIRM, min_periods=N_CONFIRM).max() stable = rmin == rmax df["regime_confirmed_code"] = rcode.where(stable, other=pd.NA).ffill().fillna(0) df["regime_confirmed"] = df["regime_confirmed_code"].map({1.0: "BULL", -1.0: "BEAR", 0.0: "NEUTRAL"}) # Halving cycle (BTC) or zero baseline (other coins) df["cycle_bias"] = 0.0 df["cycle_phase"] = "NEUTRAL" if not _HALVING.empty: d = pd.to_datetime(df["date"], utc=True).dt.normalize() df["cycle_bias"] = d.map(_HALVING["cycle_bias"]).ffill().fillna(0.0) df["cycle_phase"] = d.map(_HALVING["phase"]).ffill().fillna("NEUTRAL") # Anomaly per-coin df["anomaly"] = 0 if not _ANOMALY.empty: coin_anom = _ANOMALY[_ANOMALY["coin"] == COIN][["is_anomaly"]] \ if "coin" in _ANOMALY.columns else _ANOMALY d = pd.to_datetime(df["date"], utc=True).dt.normalize() df["anomaly"] = d.map(coin_anom["is_anomaly"]).fillna(0).astype(int) # Calendar tilts (same as spot) d_idx = pd.to_datetime(df["date"], utc=True) is_oct = (d_idx.dt.month == 10).astype(float) is_jul = (d_idx.dt.month == 7).astype(float) is_wed = (d_idx.dt.day_name() == "Wednesday").astype(float) is_mon = (d_idx.dt.day_name() == "Monday").astype(float) is_eom = (d_idx.dt.day >= 26).astype(float) tilt = ( is_oct * CALENDAR_TILTS["is_october"] + is_jul * CALENDAR_TILTS["is_july"] + is_wed * CALENDAR_TILTS["is_wednesday"] + is_mon * CALENDAR_TILTS["is_monday"] + is_eom * CALENDAR_TILTS["is_end_of_month"] ).clip(-TILT_CLAMP, TILT_CLAMP) df["calendar_tilt"] = tilt.values # LONG sizing shifts = df["cycle_phase"].map(PHASE_SHIFTS).fillna(0.0).astype(float) adjusted_bias_long = df["cycle_bias"].astype(float) + shifts + df["calendar_tilt"] long_mult = _sigmoid(adjusted_bias_long.values, k=SIGMOID_K, c=0.0) df["ai_target_long"] = (BASE_LONG * long_mult).clip(0.0, BASE_LONG) df.loc[df["anomaly"] == 1, "ai_target_long"] = 0.0 df.loc[df["regime_confirmed"] == "BEAR", "ai_target_long"] = 0.0 # SHORT sizing — symmetric but inverted, only when cycle_bias very negative adjusted_bias_short = -df["cycle_bias"].astype(float) - shifts - df["calendar_tilt"] short_mult = _sigmoid(adjusted_bias_short.values, k=SIGMOID_K, c=0.0) df["ai_target_short"] = (BASE_SHORT * short_mult).clip(0.0, BASE_SHORT) df.loc[df["anomaly"] == 1, "ai_target_short"] = 0.0 df.loc[df["regime_confirmed"] == "BULL", "ai_target_short"] = 0.0 # Only enable shorts when cycle_bias is meaningfully negative df.loc[df["cycle_bias"] > SHORT_THRESHOLD, "ai_target_short"] = 0.0 return df def populate_entry_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame: df = dataframe ready = df["ema200"].notna() # LONG entry: BULL regime + ai_target_long meaningful enter_long = ready & (df["regime_confirmed"] == "BULL") & (df["ai_target_long"] > 0.15) df.loc[enter_long, "enter_long"] = 1 df.loc[enter_long, "enter_tag"] = "calendar_fut:long" # SHORT entry: BEAR regime + cycle_bias very negative + ai_target_short meaningful enter_short = ready & (df["regime_confirmed"] == "BEAR") & (df["ai_target_short"] > 0.15) df.loc[enter_short, "enter_short"] = 1 df.loc[enter_short, "enter_tag"] = "calendar_fut:short" return df def populate_exit_trend(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame: df = dataframe # Exit LONG: regime no longer BULL, anomaly, or target collapsed exit_long = ( (df["regime_confirmed"] != "BULL") | (df["anomaly"] == 1) | (df["ai_target_long"] < 0.20) ) df.loc[exit_long, "exit_long"] = 1 df.loc[exit_long, "exit_tag"] = "calendar_fut:long_exit" # Exit SHORT: regime no longer BEAR, anomaly, or target collapsed exit_short = ( (df["regime_confirmed"] != "BEAR") | (df["anomaly"] == 1) | (df["ai_target_short"] < 0.10) ) df.loc[exit_short, "exit_short"] = 1 df.loc[exit_short, "exit_tag"] = "calendar_fut:short_exit" return df def custom_stake_amount(self, pair, current_time, current_rate, proposed_stake, min_stake, max_stake, leverage, entry_tag, side, **kwargs): df, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) if df is None or df.empty: return float(proposed_stake) last = df.iloc[-1] if side == "long": target = float(last["ai_target_long"]) else: target = float(last["ai_target_short"]) if max_stake and max_stake > 0: return float(max_stake) * max(target, 0.0) return float(proposed_stake) def adjust_trade_position(self, trade, current_time, current_rate, current_profit, min_stake, max_stake, current_entry_rate, current_exit_rate, current_entry_profit, current_exit_profit, **kwargs): """Rebalance position toward ai_target as cycle_bias evolves. Same drift-based logic as spot Calendar Shield: buy more if undersized, sell some if oversized. Works for both long and short. """ df, _ = self.dp.get_analyzed_dataframe(pair=trade.pair, timeframe=self.timeframe) if df is None or df.empty: return None last = df.iloc[-1] if trade.is_short: target = float(last["ai_target_short"]) else: target = float(last["ai_target_long"]) if target <= 0.10: return None qty = float(trade.amount or 0) value = qty * float(current_rate) usdt_free = float(self.wallets.get_free(trade.stake_currency) or 0.0) total = value + usdt_free if total <= 0: return None target_value = target * total drift = value - target_value # Undersized: add to position if drift < -0.05 * total and usdt_free > 1: buy = min(-drift, usdt_free * 0.99) if max_stake and max_stake > 0: buy = min(buy, max_stake) if min_stake and buy < min_stake: return None return float(buy) # Oversized: reduce if drift > 0.10 * total: sell = min(drift, value * 0.99) if min_stake and sell < min_stake: return None return -float(sell) return None __all__ = ["CalendarFuturesStrategy"] |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 27.0s
pairs 33 pairs
timerange 20210101-20260101
mode futures
timeframe 1d
stake 100 USDT
wallet 1000 USDT
max open trades 10
fee exchange lowest tier
total profit+85.82%
final wallet1858 USDT
win rate40.6%
max drawdown-73.32%
market change+399.34%
vs market-313.52%
timeframe1d
profit factor1.08
expectancy ratio0.046
break-even fee0.0081%
sharpe0.073
sortino0.123
CAGR+13.2%
calmar1.225
avg MFE+19.50%
avg MAE-18.71%
avg profit/trade-0.59%
avg duration529h 12m
best trade+51.77%
worst trade-47.24%
win/loss streak7 / 31
DCA orders24 max / 4.42 avg
max stake exposure3009.41 USDT (30.09x base)
positive months19/54
consistent (3-mo)46.2%
worst 3-mo-146.24%
trades342
revision1
likely annual return+12%
range (5th–95th)-16% … +55%
chance of profit72.8%
worst-5% outcome-23%
significance (p)0.3738
risk of ruin0.0%
- profit isn't statistically significant (p=0.37) — hard to tell apart from luck
- did not beat simply holding the market
- very deep drawdown (-73%)
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 | 1 | -0.95 | -1.08 | 0 | 1 | 0.0 | -58.84 | 408h 00m |
| Nov 2025 | bearish trending high vol | 3 | -38.11 | -13.87 | 1 | 2 | 33.3 | -58.63 | 864h 00m |
| Oct 2025 | bearish trending low vol | 6 | -43.87 | -9.46 | 1 | 5 | 16.7 | -50.19 | 336h 00m |
| Sep 2025 | bullish choppy low vol | 9 | -14.71 | -3.37 | 3 | 6 | 33.3 | -40.47 | 520h 00m |
| Aug 2025 | bearish choppy low vol | 14 | +45.77 | 3.86 | 9 | 5 | 64.3 | -45.03 | 656h 34m |
| Jun 2025 | bearish choppy low vol | 11 | -0.55 | -2.27 | 4 | 7 | 36.4 | -48.57 | 652h 22m |
| May 2025 | bullish trending low vol | 1 | +7.02 | 7.74 | 1 | 0 | 100.0 | -47.23 | 744h 00m |
| Mar 2025 | bearish trending high vol | 1 | -20.17 | -15.20 | 0 | 1 | 0.0 | -48.78 | 120h 00m |
| Feb 2025 | bearish trending low vol | 3 | -48.78 | -10.93 | 0 | 3 | 0.0 | -44.32 | 288h 00m |
| Jan 2025 | bearish choppy low vol | 11 | +49.19 | 4.35 | 6 | 5 | 54.5 | -46.32 | 442h 55m |
| Dec 2024 | bullish trending low vol | 13 | +106.78 | 8.02 | 11 | 2 | 84.6 | -67.8 | 777h 14m |
| Nov 2024 | bullish trending low vol | 5 | -1.15 | -3.07 | 1 | 4 | 20.0 | -68.12 | 388h 48m |
| Oct 2024 | bullish choppy low vol | 12 | -12.62 | -3.82 | 2 | 10 | 16.7 | -67.85 | 288h 00m |
| Sep 2024 | bearish choppy low vol | 2 | -1.12 | -0.31 | 1 | 1 | 50.0 | -65.16 | 324h 00m |
| Aug 2024 | bearish choppy high vol | 9 | -37.23 | -7.54 | 1 | 8 | 11.1 | -64.76 | 264h 00m |
| Jul 2024 | bearish trending low vol | 4 | -7.24 | -5.68 | 1 | 3 | 25.0 | -56.51 | 204h 00m |
| Jun 2024 | bearish choppy low vol | 8 | -19.42 | -4.57 | 1 | 7 | 12.5 | -54.91 | 390h 00m |
| May 2024 | bullish choppy high vol | 4 | +3.58 | 1.12 | 3 | 1 | 75.0 | -51.58 | 186h 00m |
| Apr 2024 | bearish choppy high vol | 16 | -10.32 | -1.95 | 6 | 10 | 37.5 | -52.55 | 597h 00m |
| Mar 2024 | bullish trending high vol | 11 | +22.58 | 1.56 | 7 | 4 | 63.6 | -50.04 | 466h 55m |
| Feb 2024 | bullish trending low vol | 2 | -3.82 | -4.02 | 0 | 2 | 0.0 | -54.12 | 408h 00m |
| Jan 2024 | bearish choppy high vol | 20 | +68.99 | 5.78 | 9 | 11 | 45.0 | -67.98 | 724h 48m |
| Dec 2023 | bullish trending low vol | 6 | +20.57 | 8.23 | 6 | 0 | 100.0 | -72.79 | 1144h 00m |
| Nov 2023 | bullish trending low vol | 2 | -0.78 | -2.56 | 0 | 2 | 0.0 | -73.11 | 264h 00m |
| Oct 2023 | bullish trending low vol | 6 | -1.07 | -1.15 | 2 | 4 | 33.3 | -73.32 | 252h 00m |
| Aug 2023 | bearish choppy low vol | 16 | -7.59 | -1.88 | 3 | 13 | 18.8 | -72.7 | 495h 00m |
| Jul 2023 | bullish trending low vol | 4 | -4.84 | -5.45 | 1 | 3 | 25.0 | -71.18 | 330h 00m |
| Jun 2023 | bullish trending low vol | 2 | -4.76 | -3.47 | 0 | 2 | 0.0 | -69.95 | 396h 00m |
| May 2023 | bearish choppy low vol | 4 | +3.24 | -0.58 | 2 | 2 | 50.0 | -70.27 | 570h 00m |
| Apr 2023 | bullish trending low vol | 6 | -0.49 | -2.45 | 2 | 4 | 33.3 | -70.37 | 500h 00m |
| Mar 2023 | bullish trending high vol | 8 | +9.76 | -1.58 | 3 | 5 | 37.5 | -72.42 | 669h 00m |
| Feb 2023 | bullish trending low vol | 12 | -6.44 | -2.42 | 3 | 9 | 25.0 | -71.67 | 458h 00m |
| Jan 2023 | bullish trending low vol | 1 | -2.67 | -7.48 | 0 | 1 | 0.0 | -70.24 | 120h 00m |
| Dec 2022 | bearish trending low vol | 2 | -15.96 | -10.84 | 0 | 2 | 0.0 | -69.64 | 396h 00m |
| Nov 2022 | bearish trending high vol | 2 | -9.15 | -6.38 | 0 | 2 | 0.0 | -66.11 | 360h 00m |
| Oct 2022 | bullish choppy low vol | 1 | -6.04 | -6.06 | 0 | 1 | 0.0 | -64.08 | 456h 00m |
| Sep 2022 | bearish choppy high vol | 2 | -9.75 | -5.57 | 0 | 2 | 0.0 | -62.74 | 84h 00m |
| Aug 2022 | bullish choppy high vol | 1 | -23.87 | -23.47 | 0 | 1 | 0.0 | -60.58 | 720h 00m |
| Jun 2022 | bearish trending high vol | 2 | -21.27 | -9.40 | 0 | 2 | 0.0 | -55.3 | 480h 00m |
| Apr 2022 | bearish choppy high vol | 10 | -66.85 | -8.17 | 0 | 10 | 0.0 | -50.59 | 278h 24m |
| Feb 2022 | bearish trending high vol | 1 | -21.32 | -11.26 | 0 | 1 | 0.0 | -35.78 | 840h 00m |
| Jan 2022 | bearish trending high vol | 3 | -57.17 | -14.53 | 0 | 3 | 0.0 | -31.06 | 368h 00m |
| Dec 2021 | bearish trending high vol | 2 | -67.75 | -19.21 | 0 | 2 | 0.0 | -18.39 | 372h 00m |
| Nov 2021 | bearish trending high vol | 15 | +7.30 | -1.31 | 7 | 8 | 46.7 | -6.4 | 464h 00m |
| Oct 2021 | bullish trending high vol | 6 | +61.92 | 5.36 | 4 | 2 | 66.7 | -4.13 | 668h 00m |
| Sep 2021 | bearish trending high vol | 14 | +50.39 | 2.93 | 10 | 4 | 71.4 | -7.02 | 632h 34m |
| Aug 2021 | bullish trending high vol | 3 | +15.18 | 2.36 | 1 | 2 | 33.3 | -6.45 | 280h 00m |
| Jul 2021 | bullish trending high vol | 2 | -35.85 | -9.99 | 1 | 1 | 50.0 | -10.94 | 192h 00m |
| Jun 2021 | bearish trending high vol | 2 | +61.46 | 15.38 | 2 | 0 | 100.0 | 0.0 | 1044h 00m |
| May 2021 | bearish trending high vol | 17 | +90.57 | -0.75 | 8 | 9 | 47.1 | -38.16 | 615h 32m |
| Apr 2021 | bearish choppy high vol | 2 | -15.72 | -14.36 | 0 | 2 | 0.0 | -10.39 | 324h 00m |
| Mar 2021 | bullish choppy high vol | 15 | +84.21 | 10.06 | 10 | 5 | 66.7 | -2.78 | 817h 36m |
| Feb 2021 | bullish trending high vol | 3 | +12.05 | 11.39 | 3 | 0 | 100.0 | 0.0 | 720h 00m |
| Jan 2021 | bullish trending high vol | 4 | +4.67 | 4.81 | 3 | 1 | 75.0 | -0.07 | 492h 00m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2025 | 60 | -65.16 | -1.55 | 25 | 35 | 41.7 | -58.84 | 544h 24m |
| 2024 | 106 | +109.01 | 0.13 | 43 | 63 | 40.6 | -68.12 | 501h 58m |
| 2023 | 67 | +4.93 | -1.31 | 22 | 45 | 32.8 | -73.32 | 525h 08m |
| 2022 | 24 | -231.38 | -9.60 | 0 | 24 | 0.0 | -69.64 | 356h 00m |
| 2021 | 85 | +268.43 | 2.30 | 49 | 36 | 57.6 | -38.16 | 604h 31m |
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 | |
|---|---|---|---|
| 104 | review | startup_candles_too_small | startup_candle_count is 220, but EMA(timeperiod=200) needing 3x warmup needs at least 600 candles -- so the first 380+ 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 |
| 194 | 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.