The Mega Backtrader Strategy Pack includes 500+ Python strategies, standardized runners, CSV metrics, charts, and dashboards. Get it here: Mega Backtrader Strategy Pack.
Simple rules can outperform more elaborate systems.
VolatilityAdjustedMomentum combines a seven-day and 30-day
moving-average crossover with a one-ATR trailing threshold and 95%
position sizing.
On ETH-USD daily candles from August 4, 2024 through August 4, 2026, the strategy returned 84.42% while buy-and-hold lost 30.15%. It completed 13 trades, won eight, and finished flat.
The result was sustained across the test: strategy equity was ahead on 85.3% of days after day 30. It also beat ETH in 69.1% of 126-day windows and 90.4% of 252-day windows.
| Result | Value |
|---|---|
| Strategy return | 84.42% |
| ETH buy-and-hold return | -30.15% |
| Excess return | 114.58% |
| Final portfolio value | $18,442.24 |
| Sharpe ratio | 1.36 |
| Maximum drawdown | 14.33% |
| Closed / open trades | 13 / 0 |
| Win rate | 61.54% |
| Cumulative days ahead after day 30 | 85.3% |
| 126-day rolling windows ahead | 69.1% |
The trend signal is a conventional moving-average crossover:
self.short_ma = bt.indicators.SimpleMovingAverage(
self.data.close,
period=self.params.short_ma_period,
)
self.long_ma = bt.indicators.SimpleMovingAverage(
self.data.close,
period=self.params.long_ma_period,
)
self.atr = bt.indicators.AverageTrueRange(
self.data,
period=self.params.atr_period,
)A bullish cross opens a long; a bearish cross opens a short. The position uses 95% of current account value:
position_size = int(
(account_value * self.params.size_pct)
/ self.data.close[0]
)
if self.short_ma[0] > self.long_ma[0] \
and self.short_ma[-1] <= self.long_ma[-1]:
self.order = self.buy(size=position_size)The strategy does not exit merely because the averages cross back. It tracks the best close after entry and maintains a stop one current ATR away:
self.trailing_stop_price = max(
self.trailing_stop_price,
self.data.close[0] - stop_distance,
)
if self.data.close[0] <= self.trailing_stop_price:
self.order = self.close()Because ATR is recalculated every bar, the effective trailing distance adapts to changing market volatility.
| Setting | Value |
|---|---|
| Asset and benchmark | ETH-USD |
| Period | 2 years |
| Interval | 1 day |
| Starting cash | $10,000.00 |
| Commission | 0.10% |
| Short / long SMA | 7 / 30 |
| ATR period | 14 days |
| Trailing distance | 1 × ATR |
| Position allocation | 95% |
| Strategy file | VolatilityAdjustedMomentum.py |
The equity curve remained above the benchmark for most of the period and finished with an excess return above 114 percentage points.
Maximum drawdown was 14.33%, producing a 1.36 Sharpe ratio despite aggressive 95% allocation.
The strategy won 56.4% of 63-day windows, 69.1% of 126-day windows, and 90.4% of 252-day windows. Median 126-day excess return was 22.32%.
The return distribution shows the daily risk produced by a near-fully invested long-and-short system.
This is the cleanest result in the group: familiar indicators, 13 closed trades, a 61.54% win rate, strong Sharpe, controlled drawdown, and long-horizon rolling dominance. Its simplicity makes it especially suitable for parameter sensitivity and out-of-sample testing.
Explore the full package: Mega Backtrader Strategy Pack.
This article is for research and educational use only. Backtests are not financial advice and do not guarantee future performance. Validate leverage, sizing, costs, execution, and out-of-sample behavior before trading.