Basics
mode: spot
timeframe: 1d
interface version: 3
Settings
stoploss: -0.2
has minimal roi
process only new candles
startup candle count: 400
hyperopt
hyperopt params: 12
Indicators
ADX
ATR
EMA
Linear_Regression
SMA
WMA
talib
1 related strategy (⧉ 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 286 287 288 | import math from typing import Tuple import numpy as np import pandas as pd import talib.abstract as ta from pandas import DataFrame, Series from freqtrade.strategy import CategoricalParameter, DecimalParameter, IntParameter, IStrategy class KivancSupertrendedMovingAverages1D(IStrategy): """ Single production strategy for this repository. The system ports Kivanc Ozbilgic's SuperTrended Moving Averages logic into a long-horizon Freqtrade strategy for daily crypto data. The class keeps the canonical entry logic and the production 1D defaults. Alternate validated risk packs live under user_data/profiles and are applied temporarily by the research scripts during 4H validation runs. Short-side signals are calculated for research, but spot production remains long-only until a futures configuration is introduced. """ INTERFACE_VERSION = 3 timeframe = "1d" can_short = False # Risk layer defaults for the production 1D profile. minimal_roi = {"0": 1.0} stoploss = -0.20 trailing_stop = False use_exit_signal = True exit_profit_only = False process_only_new_candles = True startup_candle_count = 400 plot_config = { "main_plot": { "st_ma": {"color": "orange"}, "st_up": {"color": "green"}, "st_dn": {"color": "red"}, "regime_ema": {"color": "blue"}, }, "subplots": { "Signals": { "buy_signal": {"color": "green"}, "sell_signal": {"color": "red"}, "st_trend": {"color": "blue"}, "research_short_signal": {"color": "purple"}, }, "Trend": { "adx": {"color": "black"}, "regime_slope_pct": {"color": "brown"}, } }, } ma_type = CategoricalParameter( ["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"], default="EMA", space="buy", optimize=True, ) ma_length = IntParameter(20, 300, default=100, space="buy", optimize=True) atr_period = IntParameter(7, 30, default=10, space="buy", optimize=True) atr_multiplier = DecimalParameter(0.1, 5.0, default=0.5, decimals=1, space="buy", optimize=True) use_builtin_atr = CategoricalParameter([True, False], default=True, space="buy", optimize=True) t3_volume_factor = DecimalParameter(0.1, 1.0, default=0.7, decimals=1, space="buy", optimize=True) use_regime_filter = CategoricalParameter([True, False], default=False, space="buy", optimize=True) regime_ema_length = IntParameter(100, 300, default=200, space="buy", optimize=True) regime_slope_lookback = IntParameter(3, 30, default=10, space="buy", optimize=True) regime_slope_min = DecimalParameter(0.0, 0.1, default=0.0, decimals=3, space="buy", optimize=True) use_adx_filter = CategoricalParameter([True, False], default=False, space="buy", optimize=True) adx_threshold = IntParameter(10, 40, default=20, space="buy", optimize=True) @staticmethod def _wma(src: Series, length: int) -> Series: period = max(1, int(length)) return pd.Series(ta.WMA(src, timeperiod=period), index=src.index) @staticmethod def _wwma(src: Series, length: int) -> Series: period = max(1, int(length)) alpha = 1.0 / period out = np.zeros(len(src), dtype=float) out[0] = float(src.iloc[0]) for i in range(1, len(src)): value = float(src.iloc[i]) out[i] = alpha * value + (1 - alpha) * out[i - 1] return pd.Series(out, index=src.index) @staticmethod def _var_ma(src: Series, length: int) -> Series: period = max(1, int(length)) valpha = 2.0 / (period + 1.0) diff = src.diff() vud1 = diff.where(diff > 0, 0.0) vdd1 = (-diff).where(diff < 0, 0.0) vud = vud1.rolling(window=9, min_periods=1).sum() vdd = vdd1.rolling(window=9, min_periods=1).sum() denom = (vud + vdd).replace(0, np.nan) vcmo = ((vud - vdd) / denom).fillna(0.0) out = np.zeros(len(src), dtype=float) out[0] = float(src.iloc[0]) for i in range(1, len(src)): k = valpha * abs(float(vcmo.iloc[i])) out[i] = k * float(src.iloc[i]) + (1.0 - k) * out[i - 1] return pd.Series(out, index=src.index) @staticmethod def _zlema(src: Series, length: int) -> Series: period = max(1, int(length)) lag = period // 2 if period % 2 == 0 else (period - 1) // 2 ema_data = src + src - src.shift(lag) return pd.Series(ta.EMA(ema_data, timeperiod=period), index=src.index) @staticmethod def _tsf(src: Series, length: int) -> Series: period = max(2, int(length)) lrc = pd.Series(ta.LINEARREG(src, timeperiod=period), index=src.index) lrc1 = lrc.shift(1) lrs = lrc - lrc1 return lrc + lrs @staticmethod def _t3(src: Series, length: int, volume_factor: float) -> Series: period = max(1, int(length)) b = float(max(0.0, min(1.0, volume_factor))) b2 = b * b b3 = b2 * b e1 = pd.Series(ta.EMA(src, timeperiod=period), index=src.index) e2 = pd.Series(ta.EMA(e1, timeperiod=period), index=src.index) e3 = pd.Series(ta.EMA(e2, timeperiod=period), index=src.index) e4 = pd.Series(ta.EMA(e3, timeperiod=period), index=src.index) e5 = pd.Series(ta.EMA(e4, timeperiod=period), index=src.index) e6 = pd.Series(ta.EMA(e5, timeperiod=period), index=src.index) c1 = -b3 c2 = 3 * b2 + 3 * b3 c3 = -6 * b2 - 3 * b - 3 * b3 c4 = 1 + 3 * b + b3 + 3 * b2 return c1 * e6 + c2 * e5 + c3 * e4 + c4 * e3 def _get_ma(self, src: Series) -> Series: length = int(self.ma_length.value) ma_type = str(self.ma_type.value) ema = pd.Series(ta.EMA(src, timeperiod=length), index=src.index) dema = 2 * ema - pd.Series(ta.EMA(ema, timeperiod=length), index=src.index) if ma_type == "SMA": return pd.Series(ta.SMA(src, timeperiod=length), index=src.index) if ma_type == "EMA": return ema if ma_type == "WMA": return self._wma(src, length) if ma_type == "DEMA": return dema if ma_type == "TMA": return pd.Series( ta.SMA( pd.Series(ta.SMA(src, timeperiod=math.ceil(length / 2.0)), index=src.index), timeperiod=math.floor(length / 2.0) + 1, ), index=src.index, ) if ma_type == "VAR": return self._var_ma(src, length) if ma_type == "WWMA": return self._wwma(src, length) if ma_type == "ZLEMA": return self._zlema(src, length) if ma_type == "TSF": return self._tsf(src, length) if ma_type == "HULL": half_len = max(1, int(length / 2)) sqrt_len = max(1, int(round(math.sqrt(length)))) hma_input = 2 * self._wma(src, half_len) - self._wma(src, length) return self._wma(hma_input, sqrt_len) if ma_type == "TILL": return self._t3(src, length, float(self.t3_volume_factor.value)) return ema def _supertrended_ma(self, dataframe: DataFrame, ma: Series) -> Tuple[Series, Series, Series, Series, Series]: close = dataframe["close"] period = int(self.atr_period.value) multiplier = float(self.atr_multiplier.value) tr = pd.Series(ta.TRANGE(dataframe), index=dataframe.index) atr_sma = tr.rolling(window=period, min_periods=1).mean() atr_builtin = pd.Series(ta.ATR(dataframe, timeperiod=period), index=dataframe.index) atr = atr_builtin if bool(self.use_builtin_atr.value) else atr_sma atr = atr.fillna(atr_sma).bfill() up = (ma - multiplier * atr).astype(float).copy() dn = (ma + multiplier * atr).astype(float).copy() trend = np.ones(len(dataframe), dtype=int) for i in range(1, len(dataframe)): prev_up = float(up.iloc[i - 1]) prev_dn = float(dn.iloc[i - 1]) prev_close = float(close.iloc[i - 1]) if prev_close > prev_up: up.iloc[i] = max(float(up.iloc[i]), prev_up) if prev_close < prev_dn: dn.iloc[i] = min(float(dn.iloc[i]), prev_dn) if trend[i - 1] == -1 and float(close.iloc[i]) > prev_dn: trend[i] = 1 elif trend[i - 1] == 1 and float(close.iloc[i]) < prev_up: trend[i] = -1 else: trend[i] = trend[i - 1] trend_s = pd.Series(trend, index=dataframe.index) buy_signal = (trend_s == 1) & (trend_s.shift(1) == -1) sell_signal = (trend_s == -1) & (trend_s.shift(1) == 1) return trend_s, up, dn, buy_signal, sell_signal def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: ma = self._get_ma(dataframe["close"]) trend, up, dn, buy_signal, sell_signal = self._supertrended_ma(dataframe, ma) regime_ema = pd.Series( ta.EMA(dataframe["close"], timeperiod=int(self.regime_ema_length.value)), index=dataframe.index, ) regime_slope = regime_ema.pct_change(int(self.regime_slope_lookback.value)).fillna(0.0) adx = pd.Series(ta.ADX(dataframe, timeperiod=14), index=dataframe.index).fillna(0.0) slope_min = float(self.regime_slope_min.value) bull_regime = (dataframe["close"] > regime_ema) & (regime_slope > slope_min) bear_regime = (dataframe["close"] < regime_ema) & (regime_slope < -slope_min) trend_strength_ok = adx > int(self.adx_threshold.value) dataframe["st_ma"] = ma dataframe["st_up"] = up dataframe["st_dn"] = dn dataframe["st_trend"] = trend dataframe["regime_ema"] = regime_ema dataframe["regime_slope_pct"] = regime_slope * 100.0 dataframe["adx"] = adx dataframe["bull_regime"] = bull_regime.astype(int) dataframe["bear_regime"] = bear_regime.astype(int) dataframe["trend_strength_ok"] = trend_strength_ok.astype(int) dataframe["buy_signal"] = buy_signal.astype(int) dataframe["sell_signal"] = sell_signal.astype(int) dataframe["research_short_signal"] = 0 return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: condition = (dataframe["buy_signal"] == 1) & (dataframe["volume"] > 0) if bool(self.use_regime_filter.value): condition &= dataframe["bull_regime"] == 1 if bool(self.use_adx_filter.value): condition &= dataframe["trend_strength_ok"] == 1 dataframe.loc[condition, "enter_long"] = 1 dataframe.loc[condition, "enter_tag"] = "ST_MA_BUY" short_condition = (dataframe["sell_signal"] == 1) & (dataframe["volume"] > 0) if bool(self.use_regime_filter.value): short_condition &= dataframe["bear_regime"] == 1 if bool(self.use_adx_filter.value): short_condition &= dataframe["trend_strength_ok"] == 1 dataframe.loc[short_condition, "research_short_signal"] = 1 if self.can_short: dataframe.loc[short_condition, "enter_short"] = 1 dataframe.loc[short_condition, "enter_tag"] = "ST_MA_SHORT" return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: condition = (dataframe["sell_signal"] == 1) & (dataframe["volume"] > 0) dataframe.loc[condition, "exit_long"] = 1 dataframe.loc[condition, "exit_tag"] = "ST_MA_SELL" if self.can_short: short_exit = (dataframe["buy_signal"] == 1) & (dataframe["volume"] > 0) dataframe.loc[short_exit, "exit_short"] = 1 dataframe.loc[short_exit, "exit_tag"] = "ST_MA_COVER" return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 16.2s
pairs 33 pairs
timerange 20210101-20260101
mode spot
timeframe 1d
stake 100 USDT
wallet 1000 USDT
max open trades 10
fee exchange lowest tier
total profit+72.83%
final wallet1728 USDT
win rate23.2%
max drawdown-44.06%
market change+403.38%
vs market-330.55%
timeframe1d
profit factor1.29
expectancy ratio0.224
sharpe0.243
sortino1.419
CAGR+11.6%
calmar1.73
avg MFE+27.10%
avg MAE-13.43%
avg profit/trade2.34%
avg duration636h 16m
best trade+100.02%
worst trade-20.16%
win/loss streak8 / 21
positive months21/53
consistent (3-mo)41.2%
worst 3-mo-29.60%
trades311
revision1
likely annual return+11%
range (5th–95th)-4% … +30%
chance of profit88.1%
worst-5% outcome-8%
significance (p)0.1044
risk of ruin0.0%
- profit isn't statistically significant (p=0.10) — hard to tell apart from luck
- did not beat simply holding the market
- 88% of resampled runs stayed profitable
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 |
|---|---|---|---|---|---|---|---|---|---|
| Jan 2026 | bullish trending low vol | 1 | +0.75 | 7.49 | 1 | 0 | 100.0 | -8.75 | 936h 00m |
| Nov 2025 | bearish trending high vol | 6 | -9.70 | -16.16 | 0 | 6 | 0.0 | -9.14 | 144h 00m |
| Oct 2025 | bearish trending low vol | 15 | +4.55 | 3.06 | 4 | 11 | 26.7 | -6.89 | 1003h 12m |
| Sep 2025 | bullish choppy low vol | 8 | +3.73 | 4.66 | 4 | 4 | 50.0 | -8.83 | 1107h 00m |
| Aug 2025 | bullish choppy low vol | 2 | +11.58 | 57.88 | 2 | 0 | 100.0 | -9.23 | 2268h 00m |
| Jul 2025 | bullish choppy low vol | 2 | -2.43 | -12.14 | 0 | 2 | 0.0 | -14.51 | 276h 00m |
| Jun 2025 | bearish choppy low vol | 9 | -4.09 | -4.55 | 2 | 7 | 22.2 | -13.42 | 610h 40m |
| May 2025 | bullish trending low vol | 3 | -2.51 | -8.37 | 0 | 3 | 0.0 | -11.06 | 400h 00m |
| Apr 2025 | bullish choppy low vol | 1 | -0.44 | -4.38 | 0 | 1 | 0.0 | -9.74 | 168h 00m |
| Mar 2025 | bearish trending high vol | 6 | -8.66 | -14.43 | 0 | 6 | 0.0 | -9.5 | 128h 00m |
| Feb 2025 | bearish trending low vol | 6 | +1.82 | 3.08 | 2 | 4 | 33.3 | -6.3 | 1096h 00m |
| Jan 2025 | bearish choppy low vol | 15 | -11.16 | -7.44 | 2 | 13 | 13.3 | -5.89 | 342h 24m |
| Dec 2024 | bullish trending low vol | 6 | +51.52 | 85.82 | 6 | 0 | 100.0 | -10.5 | 1332h 00m |
| Nov 2024 | bullish trending low vol | 6 | +8.84 | 14.74 | 2 | 4 | 33.3 | -23.86 | 724h 00m |
| Oct 2024 | bullish choppy low vol | 9 | +4.43 | 4.92 | 1 | 8 | 11.1 | -21.9 | 338h 40m |
| Sep 2024 | bearish choppy low vol | 2 | -1.76 | -8.82 | 0 | 2 | 0.0 | -24.58 | 396h 00m |
| Aug 2024 | bearish choppy high vol | 15 | -15.29 | -10.20 | 1 | 14 | 6.7 | -23.51 | 257h 36m |
| Jul 2024 | bearish trending low vol | 8 | -7.03 | -8.78 | 0 | 8 | 0.0 | -14.26 | 279h 00m |
| Jun 2024 | bearish choppy low vol | 9 | -7.28 | -8.08 | 2 | 7 | 22.2 | -10.0 | 640h 00m |
| May 2024 | bullish choppy high vol | 3 | -2.28 | -7.59 | 0 | 3 | 0.0 | -5.6 | 296h 00m |
| Apr 2024 | bearish choppy high vol | 12 | -6.98 | -5.81 | 3 | 9 | 25.0 | -4.22 | 780h 00m |
| Mar 2024 | bullish trending high vol | 4 | +34.46 | 86.15 | 4 | 0 | 100.0 | 0.0 | 2490h 00m |
| Feb 2024 | bullish trending low vol | 2 | +19.99 | 100.00 | 2 | 0 | 100.0 | -12.09 | 1872h 00m |
| Jan 2024 | bearish choppy high vol | 7 | +1.01 | 1.44 | 2 | 5 | 28.6 | -23.44 | 1196h 34m |
| Nov 2023 | bullish trending low vol | 5 | +29.62 | 59.21 | 4 | 1 | 80.0 | -34.39 | 940h 48m |
| Oct 2023 | bullish trending low vol | 2 | -1.88 | -9.38 | 0 | 2 | 0.0 | -41.67 | 204h 00m |
| Sep 2023 | bearish choppy low vol | 6 | -4.98 | -8.29 | 0 | 6 | 0.0 | -40.3 | 336h 00m |
| Aug 2023 | bearish choppy low vol | 9 | -7.31 | -8.11 | 1 | 8 | 11.1 | -36.68 | 898h 40m |
| Jul 2023 | bullish trending low vol | 3 | +7.44 | 24.76 | 1 | 2 | 33.3 | -31.36 | 656h 00m |
| Jun 2023 | bullish trending low vol | 9 | +7.72 | 8.57 | 3 | 6 | 33.3 | -44.06 | 605h 20m |
| May 2023 | bearish choppy low vol | 2 | -0.90 | -4.52 | 0 | 2 | 0.0 | -42.39 | 840h 00m |
| Apr 2023 | bullish trending low vol | 5 | -5.08 | -10.17 | 0 | 5 | 0.0 | -41.73 | 748h 48m |
| Mar 2023 | bullish trending high vol | 11 | +2.75 | 2.50 | 6 | 5 | 54.5 | -39.7 | 1162h 55m |
| Dec 2022 | bearish trending low vol | 2 | -1.83 | -9.16 | 0 | 2 | 0.0 | -40.03 | 312h 00m |
| Nov 2022 | bearish trending high vol | 10 | -15.25 | -15.25 | 0 | 10 | 0.0 | -38.7 | 328h 48m |
| Oct 2022 | bullish choppy low vol | 8 | +3.94 | 4.92 | 1 | 7 | 12.5 | -34.88 | 219h 00m |
| Sep 2022 | bearish choppy high vol | 3 | -0.23 | -0.77 | 1 | 2 | 33.3 | -31.13 | 552h 00m |
| Aug 2022 | bullish choppy high vol | 14 | -14.82 | -10.58 | 0 | 14 | 0.0 | -30.3 | 234h 51m |
| Jul 2022 | bearish trending high vol | 1 | -1.34 | -13.35 | 0 | 1 | 0.0 | -19.51 | 24h 00m |
| Jun 2022 | bearish trending high vol | 1 | -1.00 | -9.96 | 0 | 1 | 0.0 | -18.54 | 1032h 00m |
| Apr 2022 | bearish choppy high vol | 13 | -11.68 | -9.00 | 1 | 12 | 7.7 | -17.81 | 374h 46m |
| Mar 2022 | bullish choppy high vol | 2 | -2.47 | -12.37 | 0 | 2 | 0.0 | -9.31 | 84h 00m |
| Feb 2022 | bearish trending high vol | 4 | -6.07 | -15.18 | 0 | 4 | 0.0 | -7.51 | 114h 00m |
| Jan 2022 | bearish trending high vol | 6 | +7.86 | 13.10 | 2 | 4 | 33.3 | -6.54 | 696h 00m |
| Dec 2021 | bearish trending high vol | 7 | -2.88 | -4.11 | 3 | 4 | 42.9 | -8.38 | 754h 17m |
| Nov 2021 | bullish trending high vol | 8 | -6.11 | -7.65 | 0 | 8 | 0.0 | -5.98 | 711h 00m |
| Oct 2021 | bullish trending high vol | 1 | -1.13 | -11.32 | 0 | 1 | 0.0 | -1.49 | 504h 00m |
| Sep 2021 | bearish trending high vol | 11 | +7.03 | 6.37 | 5 | 6 | 45.5 | -3.21 | 846h 33m |
| Aug 2021 | bullish trending high vol | 2 | +8.72 | 43.53 | 1 | 1 | 50.0 | -1.0 | 492h 00m |
| Jul 2021 | bearish trending high vol | 2 | -2.66 | -13.27 | 0 | 2 | 0.0 | -6.52 | 252h 00m |
| Jun 2021 | bearish trending high vol | 3 | -5.69 | -18.98 | 0 | 3 | 0.0 | -4.45 | 240h 00m |
| Feb 2021 | bullish trending high vol | 3 | +17.99 | 59.95 | 2 | 1 | 66.7 | -1.83 | 624h 00m |
| Jan 2021 | bullish trending high vol | 1 | +10.01 | 100.00 | 1 | 0 | 100.0 | 0.0 | 336h 00m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2026 | 1 | +0.75 | 7.49 | 1 | 0 | 100.0 | -8.75 | 936h 00m |
| 2025 | 73 | -17.31 | -2.36 | 16 | 57 | 21.9 | -14.51 | 673h 58m |
| 2024 | 83 | +79.63 | 9.59 | 23 | 60 | 27.7 | -24.58 | 727h 14m |
| 2023 | 52 | +27.38 | 5.26 | 15 | 37 | 28.8 | -44.06 | 785h 32m |
| 2022 | 64 | -42.89 | -6.70 | 5 | 59 | 7.8 | -40.03 | 333h 22m |
| 2021 | 38 | +25.28 | 6.64 | 12 | 26 | 31.6 | -8.38 | 663h 10m |
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 | |
|---|---|---|---|
| 275 | review | short_without_can_short | writes enter_short, exit_short but can_short isn't True, so freqtrade never opens a short (it also requires futures/margin mode). Worse, freqtrade only takes a long when `not any([exit_long, enter_short])`, so every row you mark enter_short SUPPRESSES that candle's long entry and opens nothing in its place. |
| 265 | 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.