Basics
mode: spot
timeframe: 1h
interface version: 3
Settings
stoploss: -0.1
has minimal roi
Indicators
SMA
talib
8 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 | # --- Do not remove these libs --- freqtrade backtesting --strategy SmoothScalp --timerange 20210110-20210410 from freqtrade.strategy.interface import IStrategy from typing import Dict, List from functools import reduce from pandas import DataFrame # -------------------------------- import talib.abstract as ta import freqtrade.vendor.qtpylib.indicators as qtpylib from typing import Dict, List from functools import reduce from pandas import DataFrame, DatetimeIndex, merge # -------------------------------- import talib.abstract as ta import freqtrade.vendor.qtpylib.indicators as qtpylib import numpy # noqa class hansencandlepatternV1(IStrategy): INTERFACE_VERSION = 3 """ This strategy is only an experiment using candlestick pattern to be used as buy or sell indicator. Do not use this strategy live. """ timeframe = '1h' minimal_roi = { "0": 10, } stoploss = -0.1 def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['3LINESTRIKE'] = ta.CDL3LINESTRIKE(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['EVENINGSTAR'] = ta.CDLEVENINGSTAR(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['ABANDONEDBABY'] = ta.CDLEVENINGSTAR(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['HARAMI'] = ta.CDLHARAMI(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['INVERTEDHAMMER'] = ta.CDLINVERTEDHAMMER(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['ENGULFING'] = ta.CDLENGULFING(dataframe['open'], dataframe['high'], dataframe['low'], dataframe['close']) dataframe['hclose']=(dataframe['open'] + dataframe['high'] + dataframe['low'] + dataframe['close']) / 4 dataframe['hopen']= ((dataframe['open'].shift(2) + dataframe['close'].shift(2))/ 2) dataframe['hhigh']=dataframe[['open','close','high']].max(axis=1) dataframe['hlow']=dataframe[['open','close','low']].min(axis=1) dataframe['emac'] = ta.SMA(dataframe['hclose'], timeperiod=6) dataframe['emao'] = ta.SMA(dataframe['hopen'], timeperiod=6) return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( ((dataframe['3LINESTRIKE'] < 0)|(dataframe['EVENINGSTAR'] > 0)|(dataframe['ABANDONEDBABY'] > 0)|(dataframe['HARAMI'] > 0)|(dataframe['ENGULFING'] > 0))& (dataframe['emao'] < dataframe['emac']) ), 'buy'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['emao'] > dataframe['emac']) ), 'sell'] = 1 return dataframe |
Strategy League — fixed backtest that feeds the ranking
Export report Freqtrade logsRun finished · took 47.4s
pairs 33 pairs
timerange 20210101-20260101
mode spot
timeframe 1h
stake 100 USDT
wallet 1000 USDT
max open trades 10
fee exchange lowest tier
total profit-90.49%
final wallet95 USDT
win rate33.8%
max drawdown-94.34%
market change+447.62%
vs market-538.11%
timeframe1h
profit factor0.9
expectancy ratio-0.065
sharpe-2.271
sortino-5.223
CAGR-37.5%
calmar-1.004
avg MFE+3.49%
avg MAE-2.52%
avg profit/trade-0.13%
avg duration7h 16m
best trade+58.28%
worst trade-10.18%
win/loss streak12 / 36
positive months8/21
consistent (3-mo)15.8%
worst 3-mo-49.14%
trades7105
revision1
likely annual return-74%
range (5th–95th)-84% … -59%
chance of profit0.0%
worst-5% outcome-86%
significance (p)0.995
risk of ruin0.0%
- profit isn't statistically significant (p=0.99) — hard to tell apart from luck
- only 0% of resampled runs were profitable
- profitable in only 16% of rolling 3-month windows
- did not beat simply holding the market
- very deep drawdown (-94%)
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 |
|---|---|---|---|---|---|---|---|---|---|
| Sep 2022 | bearish choppy high vol | 74 | -4.14 | -0.56 | 22 | 52 | 29.7 | -94.34 | 6h 12m |
| Aug 2022 | bullish choppy high vol | 90 | -5.42 | -0.60 | 19 | 71 | 21.1 | -91.88 | 5h 53m |
| Jul 2022 | bearish trending high vol | 85 | +0.36 | 0.04 | 29 | 56 | 34.1 | -90.4 | 6h 52m |
| Jun 2022 | bearish trending high vol | 105 | -7.06 | -0.67 | 29 | 76 | 27.6 | -89.92 | 6h 30m |
| May 2022 | bearish trending high vol | 158 | -9.48 | -0.60 | 52 | 106 | 32.9 | -86.23 | 6h 22m |
| Apr 2022 | bearish choppy high vol | 219 | -9.90 | -0.45 | 61 | 158 | 27.9 | -79.02 | 6h 35m |
| Mar 2022 | bullish choppy high vol | 308 | -8.23 | -0.27 | 87 | 221 | 28.2 | -73.57 | 7h 05m |
| Feb 2022 | bearish trending high vol | 265 | +1.53 | 0.06 | 93 | 172 | 35.1 | -70.53 | 7h 18m |
| Jan 2022 | bearish trending high vol | 317 | -16.93 | -0.53 | 88 | 229 | 27.8 | -69.22 | 7h 16m |
| Dec 2021 | bearish trending high vol | 354 | -1.64 | -0.05 | 127 | 227 | 35.9 | -64.11 | 7h 25m |
| Nov 2021 | bullish trending high vol | 452 | -20.13 | -0.45 | 126 | 326 | 27.9 | -58.08 | 7h 25m |
| Oct 2021 | bullish trending high vol | 490 | -9.52 | -0.19 | 164 | 326 | 33.5 | -46.19 | 7h 27m |
| Sep 2021 | bearish trending high vol | 460 | -14.21 | -0.31 | 161 | 299 | 35.0 | -40.43 | 7h 26m |
| Aug 2021 | bullish trending high vol | 473 | +13.34 | 0.28 | 184 | 289 | 38.9 | -41.38 | 7h 42m |
| Jul 2021 | bearish trending high vol | 499 | -27.88 | -0.56 | 142 | 357 | 28.5 | -40.12 | 6h 07m |
| Jun 2021 | bearish trending high vol | 424 | -22.15 | -0.52 | 131 | 293 | 30.9 | -30.47 | 6h 44m |
| May 2021 | bearish trending high vol | 431 | +0.89 | 0.02 | 158 | 273 | 36.7 | -13.42 | 7h 39m |
| Apr 2021 | bearish choppy high vol | 500 | +13.07 | 0.26 | 190 | 310 | 38.0 | -11.2 | 7h 46m |
| Mar 2021 | bullish choppy high vol | 469 | +8.15 | 0.17 | 181 | 288 | 38.6 | -18.52 | 7h 53m |
| Feb 2021 | bullish trending high vol | 456 | +18.05 | 0.40 | 186 | 270 | 40.8 | -14.77 | 7h 59m |
| Jan 2021 | bullish trending high vol | 476 | +10.81 | 0.23 | 171 | 305 | 35.9 | -10.59 | 7h 12m |
Yearly breakdown
| Year | Trades | Profit % | Avg % | Win | Loss | Win % | DD % | Avg dur |
|---|---|---|---|---|---|---|---|---|
| 2022 | 1621 | -59.27 | -0.36 | 480 | 1141 | 29.6 | -94.34 | 6h 52m |
| 2021 | 5484 | -31.22 | -0.06 | 1921 | 3563 | 35.0 | -64.11 | 7h 24m |
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
2 potential lookahead pattern(s) found · 2 warning(s)
| Line | Pattern | Detail | |
|---|---|---|---|
| 38 | leak | whole_series_reduction | .max() over the whole column sees future rows (use .rolling(window).max() for a causal value) |
| 39 | leak | whole_series_reduction | .min() over the whole column sees future rows (use .rolling(window).min() for a causal value) |
| 46 | realism | dead_v2_signal | writes the freqtrade v2 column 'buy' from a v3 populate_* method -- v3 reads enter_*/exit_* only, so this signal is dead code and never trades |
| 56 | realism | dead_v2_signal | writes the freqtrade v2 column 'sell' from a v3 populate_* method -- v3 reads enter_*/exit_* only, so this signal is dead code and never trades |
ran by Ron · took s
Lookahead analysis
freqtrade lookahead-analysis: detects strategies peeking at future candles.