EMA Crossover Strategy: Entry Rules and a Backtesting Checklist
Test a 9/21 EMA crossover with explicit confirmation, entry, stop and exit rules. Includes a worked example and checks for hindsight bias.
An EMA crossover occurs when a faster exponential moving average crosses a slower one. It is a measurable chart event. Turning that event into a strategy also requires entry timing, exits, position sizing, costs and a rule for repeated signals. To read a whole group of EMAs instead of one pair, see the Guppy Multiple Moving Average guide.
Here is a plain 9/21 EMA exercise you can test. Those periods are illustrative choices, not optimized settings or a claim of profitability.
What the two lines tell you
An EMA weights recent observations more heavily than older ones. A shorter EMA generally responds more quickly, so it can cross a longer EMA as recent price behavior changes. Both still use historical prices and can lag a move. TradingView's EMA reference describes the calculation and limitations.
On a five-minute chart, a length of nine means nine bars, not nine days. Record the price source, timeframe and initialization method when comparing indicators across platforms. Feed enough earlier bars for the chosen calculation to settle, and keep the warm-up policy consistent.
Define a crossover without hindsight
For a long signal at the end of bar t:
fast EMA[t] > slow EMA[t]
and
fast EMA[t−1] ≤ slow EMA[t−1]
For a short signal, reverse the inequalities. Requiring a completed bar avoids treating a temporary intrabar cross as a confirmed signal.
If you inspect an old chart and buy at the low of the signal candle, you have given yourself a price the closing signal could not yet authorize. In the exercise below, entry happens at the next available bar's open.
A complete ruleset to test
| Component | Rule for this exercise |
|---|---|
| Market | One chosen instrument for the whole test |
| Chart | Five-minute regular candles |
| Averages | 9 EMA and 21 EMA, both using closing prices |
| Signal | Completed-bar crossover as defined above |
| Entry | Next bar's open; one open position at a time |
| Initial stop | Lowest low of the preceding five completed bars for a long; highest high for a short |
| Profit exit | 2R from the actual assumed entry |
| Other exit | Opposite completed crossover, executed at the next bar's open |
| Session exit | A fixed time chosen before testing |
| Invalid entry | Skip if the opening price leaves the stop on the wrong side |
The initial stop includes the signal candle but no future bar. If both an opposite signal and a target occur, use the earliest event the available data can establish. If the intrabar sequence cannot be established, apply a predetermined conservative rule and mark the row.
The general backtesting guide covers choosing a date range and reserving unseen data. Use its recordkeeping approach before adding filters to this exercise.
One hypothetical trade
Suppose a confirmed long cross appears, the next opening price is 100.00, and the lowest low of the five-bar stop window is 99.50. Initial price risk is 0.50, so a 2R target is 101.00.
If the next open had been 100.20 instead, price risk would be 0.70 and the target 101.60. The stop did not change, but the entry did. Keeping the original 101.00 target while calling it 2R would mislabel the result.
These abstract prices are for arithmetic. Tick size, multiplier and permitted order increments come from the instrument you actually test.
Record the trades that look uninteresting
Crossovers often cluster when averages run close together. A historical screenshot makes it tempting to keep the long trend and ignore the alternating losses before it.
Log every eligible cross under the same rules. Record an explicit reason for each skip: a position was already open, the signal arrived outside the chosen window, or the opening price invalidated the stop. “The market looked choppy” only belongs on that list if you defined and froze a measurable chop filter before testing.
Useful fields include signal time, entry time, direction, stop distance, exit reason, gross R, net R and whether the entry was valid. The trading journal guide provides a compact template.
Compare a filter fairly
After completing a baseline, you might test a slower trend filter or a minimum separation between the EMAs. Treat it as a second experiment.
Keep the baseline results. State the new filter precisely. Test it on development data, then examine unchanged rules on dates you have not used to choose the filter. Report how many trades the filter removed as well as what happened to expectancy and drawdown.
Testing dozens of EMA pairs and reporting only the best one understates how many chances you gave yourself to find a flattering result. Preserve a short experiment log, including the versions you rejected. Use the backtesting cost worksheet to keep execution assumptions comparable across versions.
What to check in the final result
- Does average net R remain positive under your documented cost assumptions?
- Is the result carried by one exceptional trend?
- Do losses cluster into drawdowns you can describe from the actual trade sequence?
- Does the untouched sample behave similarly, or does it expose a rule chosen for the earlier period?
- Can another person reproduce the signal and entry from your instructions?
The win-rate and risk-reward explanation helps interpret a method that can lose frequently while occasionally catching larger moves. A particular win rate does not validate a crossover strategy.
Practice the timing before increasing the sample
Use a charting tool that can display the two EMAs with the correct historical inputs. In TestMax, indicator availability depends on the current feature set and plan; Pro includes Pine-based capabilities, with documented compatibility limits. Check the Pine guide before relying on a particular script.
Start a TestMax replay session on an eligible instrument and identify ten confirmed crossovers. Record when the cross became known and the next possible entry. That exercise will reveal timing mistakes before they spread through a larger backtest. See current plans for instrument and feature access.