Renko and Range Bars in Backtests: Why the Results Often Look Too Smooth
Renko and range bars are popular with day traders because they filter out noise: a new bar doesn't form after a set time, only after a set price movement. That same property is what makes a Renko backtest treacherous - results on these charts often look considerably smoother than they ever would live.
What sets Renko and range bars apart from time bars
With Renko, a new building block - a brick - forms once price has travelled a fixed distance beyond the last brick. With range bars, a bar closes once its span between high and low reaches a fixed size. In both cases time plays no part in how bars form: one bar can take seconds or hours. For reading the chart that's the advantage - for any logic that quietly assumes bars of equal length, it's a source of error.
Why Renko backtests look too good
- Synthetic prices: depending on the implementation, a brick's open doesn't correspond to an actually traded price but is derived from the grid. A backtest entering there trades at a price that never existed
- Missing intrabar moves: if the chart is built from bar data instead of ticks, everything in between is lost - pullbacks that would have triggered a stop simply aren't visible
- Entry on the next bar: if the trade is placed at the open of the following brick, the entry after a reversal can easily sit a full brick away from the signal - often much closer in the backtest
- Stops checked per bar only: a stop that's only evaluated when a bar completes can fill in the backtest at a point the live market had long since passed
The underrated point: where the first brick sits
In some implementations, the position of every brick depends on when the data starts loading: the first price sets the grid and everything else builds on it. Two charts of the same instrument with different start dates then show different bricks - and therefore different signals. For a bot that's serious. A backtest is only reproducible if the grid is firmly anchored, for example to round multiples of the brick size, rather than to whatever the first data point happened to be.
A Renko or range bar strategy that holds up live?
Describe the chart type and your rules - the feasibility check and quote are free and non-binding.
Request a projectIndicators on Renko and range charts
A fourteen-bar moving average always covers the same span of time on a time chart. On Renko or range bars, the same setting can cover ten minutes one moment and half a day the next. That isn't a flaw, but it needs to be understood. It becomes a problem when a rule actually means a time - the last hour, say, or the session open - yet is implemented as a number of bars. Conditions like that belong on timestamps, not on bar counts. And just as with time bars: the last brick is only complete once the next one begins, and signals on it are evaluated only after that.
How to test more realistically
- Build the chart from tick data in the backtest rather than from bars, where the platform and the available data allow it
- Check entries and stops against prices that actually traded, not against brick open or close values
- Anchor the grid firmly so the same data always produces the same bricks
- Then reconcile the results trade by trade against the backtest in a forward test
For why signals should only be evaluated on closed bars, see the article on repainting.
For how the comparison between backtest and live trading works in practice, see the article on forward testing a trading bot.
Frequently Asked Questions
Are Renko charts unsuitable for automated strategies?
No. Plenty of strategies run on Renko or range bars. What's unsuitable is a backtest that ignores the quirks of the chart type. Accounting for synthetic prices and missing intrabar moves makes reliable testing possible on these charts too.
What's the difference between Renko and range bars?
Renko bricks form after a fixed move beyond the last brick and reduce price action to equally sized blocks. Range bars close after a fixed span between high and low and still display both of those values.
Why does my Renko chart show different bricks after reloading?
Because in some implementations the first loaded price determines the grid. A different start time shifts the grid and with it every single brick. Anchoring the grid firmly fixes this.
Can an existing Renko indicator be made more realistic?
Usually yes: evaluate only closed bricks, anchor the grid firmly, and execute against real prices rather than brick values. Some signals then appear later, but they match what's actually possible live.
Renko and range bars are good tools for making movement visible. But a backtest on them is only as honest as the prices it trades at - and on these chart types, the drawn prices drift from the traded ones more easily than anywhere else.
Have an idea for ATAS?
Tell us about your project - you'll get a free, non-binding quote within 24-48 hours.
Request a Free Quote