AwesomeMacd
Tested 1 Jun 2023 – 30 May 2025
Rank 4 of 27 by return
AwesomeMacd turned $1,000 into $1,878 (+87.8%) over 729 days, while holding Bitcoin returned +288.1% and an equal mix of the ten coins +194.8%. Its worst drawdown was 23.9%, a substantial dip to sit through. It lost more trades than it won (31% win rate) but its winners were large enough for a profit factor of 1.23.
How AwesomeMacd trades
AwesomeMacd enters on the 1-hour chart when the Awesome Oscillator flips from negative to positive while the MACD line is already above zero. It exits when both turn negative again. A 10% take-profit caps each trade.
ADX is calculated but never used in the rules. The strategy relies on two momentum readings agreeing, so it trades often and wins on fewer than a third of trades.
Rules at a glance
- Indicators
- MACD, Awesome Oscillator, ADX
- Take-profit (minimal ROI)
- 10% 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 |
|---|---|---|---|---|
| SOL/USDT | 110 | 41.8% | +347.45 | 1d 22h |
| DOT/USDT | 85 | 31.8% | +130.61 | 2d 3h |
| LINK/USDT | 100 | 36.0% | +108.48 | 2d 3h |
| BTC/USDT | 115 | 29.6% | +104.35 | 2d 21h |
| DOGE/USDT | 91 | 31.9% | +89.88 | 1d 23h |
| BNB/USDT | 121 | 28.1% | +83.90 | 2d 6h |
| AVAX/USDT | 83 | 31.3% | +77.60 | 1d 21h |
| ADA/USDT | 92 | 29.3% | +29.06 | 1d 19h |
| XRP/USDT | 95 | 30.5% | −22.74 | 1d 21h |
| ETH/USDT | 114 | 24.6% | −70.11 | 2d 2h |
Why trades closed
| Exit reason | Trades | Win rate | Profit (USDT) |
|---|---|---|---|
| Take-profit (ROI) | 213 | 100.0% | +4,263.78 |
| Stoploss | 5 | 0.0% | −251.60 |
| Exit signal | 788 | 13.1% | −3,133.68 |
The code
AwesomeMacd comes from the community freqtrade-strategies repository (GPL-3.0). These are the parts that decide when it trades; the full file is 67 lines.
Entry rules
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['macd'] > 0) & (dataframe['ao'] > 0) & (dataframe['ao'].shift() < 0) ), 'enter_long'] = 1 return dataframe
Exit rules
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe.loc[ ( (dataframe['macd'] < 0) & (dataframe['ao'] < 0) & (dataframe['ao'].shift() > 0) ), 'exit_long'] = 1 return dataframe
Indicators
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: dataframe['adx'] = ta.ADX(dataframe, timeperiod=14) dataframe['ao'] = qtpylib.awesome_oscillator(dataframe) macd = ta.MACD(dataframe) dataframe['macd'] = macd['macd'] dataframe['macdsignal'] = macd['macdsignal'] dataframe['macdhist'] = macd['macdhist'] 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 AwesomeMacd --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.