A Simple ES Trading Strategy and What the Backtest Actually Shows
Buy ES when the 60-minute close crosses above its 50-bar average, sell when it crosses back. It made money over eight years. The drawdown, the costs and the 40-bar neighbour tell a different story.
By Soren Huang · Published · updated · Editorial policy
Contents
Here's a simple ES trading strategy: on 60-minute bars, buy when the close crosses above its 50-bar simple moving average, and sell when it crosses back below. On 2026-10-28 we ran it in AlphaPrime (Valynox) on eight years of ES data, 1 contract, conservative costs. It made money. Barely, and the backtest report shows why that's not the headline.
What exactly is the rule?
One parameter. Nothing else to tune.
| Part | Setting |
|---|---|
| Market and bars | ES, 60-min |
| Direction | Long only, 1 contract |
| Entry | Close crosses above SMA(50) |
| Exit | Close crosses below SMA(50) |
| Costs | $33.50 commission per side (includes 2.5 extra ticks) plus 1 tick of slippage |
| Data | 2018-09-02 to 2026-10-14 |
I wanted a time-of-day filter too, something like "no new entries in the first hour". The quick backtester these numbers came from (run on 2026-10-28) only takes indicator and price conditions, so the session filter isn't in it. That's a real gap. Keep it in mind when you read the results.
Why bother backtesting a rule this simple?
Because you can read every trade. With one parameter, there's nowhere for a lucky fit to hide, and you can test every neighbour by hand in a few minutes.
I'd rather read a backtest of a one-parameter rule that barely makes money than one with eight parameters that makes a lot. The second one usually tells you more about the optimizer than about ES.
A simple rule is also the baseline. If a strategy generator hands you something with five conditions, it should beat this one after the same costs, or it isn't worth the extra moving parts.
What did the backtest show?
Source: AlphaPrime hosted backtest (ap_backtest connector), run 2026-10-28
| Number | SMA(50) rule |
|---|---|
| Net profit (closed trades) | $28,599 |
| Max drawdown | $36,343 |
| Trades | 1,453 (about 180 per year) |
| Win rate | 22.5% |
| Profit factor | 1.04 |
| Average trade | $19.68 |
| Time in market | 57% |
From the monthly equity of the same run: -$26,545 at the end of March 2020; +$10,294 at the end of September 2022, then another +$18,305 to 2026-10-14; a peak of $51,830.50 in October 2025, with $23,231.50 given back since. With SMA(50) above SMA(200) as an extra entry condition: 860 trades, net -$12,170, max drawdown $32,142.
Positive. Also not something I'd trade as is.
Which backtest numbers fool people?
Net profit without the drawdown next to it. By March 2020, eighteen months in, the equity curve was down $26,545. Most people would have switched it off right there, which means the profit after that is profit almost nobody would have collected.
Low costs. Commission alone, at $33.50 a side, comes to about $97k over the whole run. That's more than three times the net profit. Gross profit was $802k against a gross loss of $774k, so net profit is under 4% of gross profit. Shave the cost model by a tick and this rule suddenly looks great. That's exactly why I don't shave it.
Too few trades. Not the problem here, at about 180 a year. But my rule of thumb: under 100 trades in total, I don't read the net profit line at all. One outlier day can carry the whole number.
The parameter you happened to pick. This one surprised me. Same rule, same costs, ten bars either way:
Source: AlphaPrime hosted backtest (ap_backtest connector), run 2026-10-28
| Average | Net profit | Max drawdown | Profit factor |
|---|---|---|---|
| SMA(40) | −$42,610 | $63,197 | 0.95 |
| SMA(50) | $28,599 | $36,343 | 1.04 |
| SMA(60) | $74,543 | $32,257 | 1.11 |
That's not a plateau. It's a slope. The tempting move is to switch to 60 and call it done. I wouldn't, at least not before checking 70 and 80, and that's exactly how a quiet optimization starts.
And one I expected to help: only take entries when SMA(50) is above SMA(200). It cut trades to 860 and turned the result into a $12,170 loss. Adding a filter to fix a backtest usually just removes trades, good ones included.
The performance report puts net profit, drawdown, trade count and average trade on one screen for exactly this reason, and the Trades tab shows the cost of each trade. Reading one without the others is how a 1.04 profit factor looks like a strategy.
What happens on a held-out split like the 2026-10-15 run?
On our home page we published a held-out test run on 2026-10-15 with an RTX 3060 Ti, factory settings, conservative costs and 1 contract, on ES 2014-01 to 2026-09 with the data from 2022-10 held out. The held-out bars were not in the database during generation or walk-forward.
That run was about selection: of the strategies that passed walk-forward, 91% were profitable on held-out ES data, versus 53% of those that failed. Both held-out periods were rising markets (ES about +116%, TAIEX futures about +29%), so look at the gap between the two groups, not the share alone.
Cut our simple rule at the same date and read it off the monthly equity curve (open trades included). Its data starts in 2018-09, so it isn't the same history. Up to the end of 2022-09: +$10,294. From 2022-10 to 2026-10-14: another +$18,305. The "unseen" half looks better than the first half.
Which sounds great. Until you remember ES more than doubled in that stretch and this is a long-only trend rule. The curve peaked at $51,830.50 in 2025-10 and gave back $23,231.50 since. A held-out window in a bull market mostly tells you a long rule was long.
The next step would be a Monte Carlo backtest on the trade list, to see how bad the drawdown gets when the same trades come in a different order. You can try that reshuffle on this rule's trade list with the free Monte Carlo simulator, which takes a pasted list of trade results and reports max drawdown.
What I'd do with this rule next
Run the short side with the same costs before believing anything about the long side. If the short side loses about what the long side makes, there's no edge, just the market going up.
Then add the time-of-day filter I couldn't test here and watch two things: the trade count and the profit per trade. If the filter mostly removes trades and leaves the profit per trade where it was, it's the SMA(200) story again, just slower. If profit per trade jumps, the opening hour really was where this rule bled.
After that, run the 40, 50, 60, 70 and 80 bar versions on the short side as well. A rule that only works long, at one average length, in one bull market, is a description of 2023 to 2025.
And the question I haven't settled: is an edge this thin worth trading at all, or is that just the cost model being off by one tick?
Frequently asked questions
Is a moving average crossover a good ES trading strategy?
On its own, on ES 60-minute bars with realistic costs, it was close to break-even in our test, and moving the average from 50 to 40 bars turned it into a loss while 60 bars nearly tripled the profit. It's a useful baseline, not a finished strategy.
Why use such high trading costs?
Because cheap cost assumptions flatter fast strategies the most. If a rule only works with one tick less slippage than you'll actually get, it doesn't work.
How many trades should a backtest have?
I don't read net profit on fewer than 100 trades in total. Below that, one or two outlier days decide the result.

