Roundup: Honest backtests for scalping EAs, costs, tick data, look-ahead and repainting
Posted: Thu Oct 15, 2026 4:10 pm
Roundup: Honest backtests for scalping EAs, costs, tick data, look-ahead and repainting
The algo board has a run of threads on why backtests lie, each covering one cause. Read together they make a decent pre-flight checklist for any scalping EA test, so here's the combined version.
Costs first
The "backtests without spreads are fiction" thread does the maths that matters. A strategy trading 10 times a day for 1.5 pips gross, with 1.2 pips of spread plus commission, nets 0.3 pips a trade. A small error in the cost assumption flips that from a profit to a loss. A reply suggests logging the spread at each live entry for a few weeks so the test uses your real average cost, not a guess.
The EURUSD M1 honesty thread lists the minimum: session-aware variable spread, slippage scenarios rather than zero, rejecting trades when spread exceeds your live cap, and out-of-sample and walk-forward testing on top.
Slippage assumptions
The slippage distributions thread compares three options. Fixed, like 0.2 pips on every fill, is simple and unrealistic. Random from a distribution is better. Empirical, sampled from your own live fills by time and order type, is the most realistic if you have the data. Stops slip more than market entries, and news minutes much more, so one number for everything flatters stop-heavy strategies.
Tick data vs bar data
Two threads cover this. The every-tick vs real-ticks thread explains the MT5 tester modes: "Every tick" generates synthetic ticks from M1 bars, so the price path inside each minute is invented, while "Every tick based on real ticks" replays the broker's recorded ticks with their actual spreads. For scalping EAs that can change results completely. A reply in the M1 honesty thread calls real ticks the least-guesswork option for the spread side.
The tick vs bar thread adds the bar ambiguity problem: if a candle's range contains both your stop and target, bar data can't tell you which came first. A reply suggests turning on a worst-case setting where available. Another notes news minutes are where the two data types disagree most, because real ticks show gaps and frozen quotes that bars smooth over. And if the tester reports low modelling quality, don't argue with it.
Look-ahead bias
The look-ahead thread gives the classic example: using the day's high or low in a rule for an intraday entry. At 10am you don't know the final high. The replies add a sneakier one: using the close of a higher timeframe candle to filter a lower timeframe entry while that candle is still forming. For manual testing, bar replay is the closest thing to not knowing what comes next.
Repainting in multi-timeframe filters
The MTF repainting thread is that sneakier case in practice. An M15 moving average filter on an M5 EA made the backtest much better, because the EA was reading the current, unfinished M15 bar. The fix is reading from the last closed bar, and a reply extends that to anything from a higher timeframe: highs, lows and candle direction too. Another checks the tester actually has complete higher timeframe history for the test dates.
The line from that thread worth pinning above any optimisation run: if one simple filter transforms a backtest, suspect a bug before you believe in an edge.
Where people differ
Mostly on how far to go. Real ticks plus empirical slippage is the gold standard, but it needs data many people don't have. The minimum everyone agrees on is variable spread and a slippage assumption above zero.
What's the biggest gap you've seen between an EA's backtest and its first month live, and what turned out to cause it?
Threads this pulls from
The algo board has a run of threads on why backtests lie, each covering one cause. Read together they make a decent pre-flight checklist for any scalping EA test, so here's the combined version.
Costs first
The "backtests without spreads are fiction" thread does the maths that matters. A strategy trading 10 times a day for 1.5 pips gross, with 1.2 pips of spread plus commission, nets 0.3 pips a trade. A small error in the cost assumption flips that from a profit to a loss. A reply suggests logging the spread at each live entry for a few weeks so the test uses your real average cost, not a guess.
The EURUSD M1 honesty thread lists the minimum: session-aware variable spread, slippage scenarios rather than zero, rejecting trades when spread exceeds your live cap, and out-of-sample and walk-forward testing on top.
Slippage assumptions
The slippage distributions thread compares three options. Fixed, like 0.2 pips on every fill, is simple and unrealistic. Random from a distribution is better. Empirical, sampled from your own live fills by time and order type, is the most realistic if you have the data. Stops slip more than market entries, and news minutes much more, so one number for everything flatters stop-heavy strategies.
Tick data vs bar data
Two threads cover this. The every-tick vs real-ticks thread explains the MT5 tester modes: "Every tick" generates synthetic ticks from M1 bars, so the price path inside each minute is invented, while "Every tick based on real ticks" replays the broker's recorded ticks with their actual spreads. For scalping EAs that can change results completely. A reply in the M1 honesty thread calls real ticks the least-guesswork option for the spread side.
The tick vs bar thread adds the bar ambiguity problem: if a candle's range contains both your stop and target, bar data can't tell you which came first. A reply suggests turning on a worst-case setting where available. Another notes news minutes are where the two data types disagree most, because real ticks show gaps and frozen quotes that bars smooth over. And if the tester reports low modelling quality, don't argue with it.
Look-ahead bias
The look-ahead thread gives the classic example: using the day's high or low in a rule for an intraday entry. At 10am you don't know the final high. The replies add a sneakier one: using the close of a higher timeframe candle to filter a lower timeframe entry while that candle is still forming. For manual testing, bar replay is the closest thing to not knowing what comes next.
Repainting in multi-timeframe filters
The MTF repainting thread is that sneakier case in practice. An M15 moving average filter on an M5 EA made the backtest much better, because the EA was reading the current, unfinished M15 bar. The fix is reading from the last closed bar, and a reply extends that to anything from a higher timeframe: highs, lows and candle direction too. Another checks the tester actually has complete higher timeframe history for the test dates.
The line from that thread worth pinning above any optimisation run: if one simple filter transforms a backtest, suspect a bug before you believe in an edge.
Where people differ
Mostly on how far to go. Real ticks plus empirical slippage is the gold standard, but it needs data many people don't have. The minimum everyone agrees on is variable spread and a slippage assumption above zero.
What's the biggest gap you've seen between an EA's backtest and its first month live, and what turned out to cause it?
Threads this pulls from
- Backtests Without Spreads Are Fiction
- Backtest honesty for EURUSD M1: modeling spread and slippage
- Every-Tick vs Real-Ticks in MT5 Tester for Scalping EAs
- Tick Data Versus Bar Data: Why the Same Test Gives Different Results
- Look-Ahead Bias: When a Test Quietly Peeks at the Future
- Multi timeframe filter in my EA and the repainting bug that fooled my backtest
- Slippage Distributions for Backtests: Fixed, Random or Empirical