ADXMomentum
Tested 1 Jun 2023 – 30 May 2025
Rank 8 of 27 by return
ADXMomentum turned $1,000 into $1,325 (+32.5%) over 729 days, while holding Bitcoin returned +288.1% and an equal mix of the ten coins +194.8%. Its worst drawdown was 28.9%, a substantial dip to sit through. It won 86% of trades with small targets; a profit factor of 1.06 shows how thin that edge is.
How ADXMomentum trades
ADXMomentum waits for a trend that is both strong and pointing up. It enters when ADX is above 25, 14-period momentum is positive and the +DI line sits above both 25 and the -DI line. The mirror image of that condition (momentum turning negative while -DI takes over) closes the trade.
The 1% take-profit at minute zero does most of the work: about 86% of trades close through ROI long before the trend-based exit fires, which explains the very high win rate. Losing trades are mostly closed by the exit signal; the wide 25% stoploss was rarely reached.
Rules at a glance
- Indicators
- ADX, +DI / -DI, Momentum
- Take-profit (minimal ROI)
- 1% from entry
- Stoploss
- −25%
- Trailing stop
- Off
- Exit signal
- Used
Results by month
Profit or loss in USDT for trades closed in each month.
Results by coin
| Pair | Trades | Win rate | Profit (USDT) | Avg. hold |
|---|---|---|---|---|
| LINK/USDT | 321 | 91.3% | +152.38 | 9h 5m |
| SOL/USDT | 455 | 89.7% | +103.03 | 12h 33m |
| ADA/USDT | 383 | 88.0% | +76.03 | 9h 50m |
| XRP/USDT | 352 | 86.1% | +57.56 | 10h 30m |
| AVAX/USDT | 361 | 89.8% | +56.68 | 9h 21m |
| DOGE/USDT | 406 | 88.2% | +29.65 | 9h 6m |
| BTC/USDT | 338 | 76.6% | −2.67 | 20h 6m |
| BNB/USDT | 261 | 80.5% | −10.15 | 19h 6m |
| ETH/USDT | 333 | 79.6% | −55.89 | 17h 57m |
| DOT/USDT | 215 | 83.7% | −81.95 | 13h 25m |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 2937 | 100.0% | +5,879.17 |
| Still open at end of test | 1 | 0.0% | −4.40 |
| Stoploss | 2 | 0.0% | −100.69 |
| Exit signal | 485 | 0.0% | −5,449.42 |
The code
ADXMomentum comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 69 lines.
Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['adx'] > 25) & (dataframe['mom'] > 0) & (dataframe['plus_di'] > 25) & (dataframe['plus_di'] > dataframe['minus_di']) ), 'enter_long'] = 1 return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['adx'] > 25) & (dataframe['mom'] < 0) & (dataframe['minus_di'] > 25) & (dataframe['plus_di'] < dataframe['minus_di']) ), 'exit_long'] = 1 return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['adx'] = ta.ADX(dataframe, timeperiod=14) dataframe['plus_di'] = ta.PLUS_DI(dataframe, timeperiod=25) dataframe['minus_di'] = ta.MINUS_DI(dataframe, timeperiod=25) dataframe['sar'] = ta.SAR(dataframe) dataframe['mom'] = ta.MOM(dataframe, timeperiod=14) return dataframe
Reproduce this test
With freqtrade installed (see our Docker guide), download the data and run the same backtest:
freqtrade download-data --exchange binance --pairs ADA/USDT AVAX/USDT BNB/USDT BTC/USDT DOGE/USDT DOT/USDT ETH/USDT LINK/USDT SOL/USDT XRP/USDT --timeframes 1h --timerange 20230501-20250530
freqtrade backtesting --strategy ADXMomentum --timeframe 1h \
--timerange 20230601-20250530 --dry-run-wallet 1000 --stake-amount 200 --max-open-trades 5 --fee 0.001
Results can differ slightly with a different data source or freqtrade version. See how we test.