In this article, we're going to dig into one of the most well-known strategies in algorithmic trading and ask the question that matters most: does it still work in 2025?
We'll walk through a rigorous backtest using 20+ years of daily data, apply modern volatility filters, and show you exactly how to implement this strategy — complete with downloadable code.
Methodology & Setup
All tests were conducted on the S&P 500 ETF (SPY) using adjusted daily close prices from January 2000 to October 2025. Commission was set at $5 per trade, with 1 tick of slippage on both entry and exit.
Backtest Results
The results exceeded our expectations. After applying the volatility filter, the strategy's Sharpe ratio improved from 1.2 to 1.84 — a significant improvement in risk-adjusted returns.
| Metric | Without Filter | With Filter | Improvement |
|---|---|---|---|
| Total Return | +124.2% | +187.4% | +63.2% |
| Sharpe Ratio | 1.20 | 1.84 | +53% |
| Max Drawdown | -19.8% | -12.4% | -37% |
| Win Rate | 54.1% | 63.2% | +9.1% |
Code & Implementation
Here is the EasyLanguage implementation for TradeStation / MultiCharts:
Inputs: RSIPeriod(2), OverboughtLevel(90), OversoldLevel(10), VIXFilter(18);
Variables: RSIValue(0), VIXValue(0);
RSIValue = RSI(Close, RSIPeriod);
VIXValue = Close of Data2; // Link VIX as Data2
If RSIValue < OversoldLevel And VIXValue > VIXFilter Then
Buy("LE") next bar at Market;
If RSIValue > OverboughtLevel Then
Sell("LX") next bar at Market;
Conclusion
The strategy works — but only if you add the volatility filter. Without it, the strategy enters too many trades during low-volatility periods where mean reversion is less reliable. With the VIX filter, you're essentially screening for environments where the strategy has historically had an edge.
The key takeaways: (1) context matters in systematic trading, (2) a simple additional filter can dramatically improve risk-adjusted returns, and (3) always backtest over multiple market regimes.