What does repainting mean in TradingView?
Every chart has one open bar: the candle that is still forming. Its high, low and close change with every trade until it closes. An indicator that reads it will move with price, which is normal. RSI, a moving average and VWAP all wiggle on the live candle, then freeze once it closes.
Repainting becomes a problem when the change survives into history. Say you trade a 5-minute chart. At 10:07 price dips to $99.40, a sell arrow prints, and you sell at $99.50. By the 10:10 close price is back at $100.20 and the arrow is gone. Your trade happened, but the chart no longer shows any reason for it. Scroll back a week and you only see the arrows that survived the close, never the ones that flickered and vanished.
The second form is quieter. Some tools draw a signal on a past bar after the fact: the arrow sits right at the low but appeared several bars later, and history can't show the difference.
Why do indicators repaint?
Almost all repainting comes from one of three causes. Watch the second one closely if you combine timeframes, as in multi-timeframe analysis, because a higher-timeframe value can look settled while it is still changing.
- Signals calculated on the open bar. On historical bars, a script runs once per bar, on the final open, high, low and close. On the live bar it runs on every price update. A condition can be true at 10:07 and false at 10:10, so live you see signals that history never shows.
- Higher-timeframe data taken too early. Many indicators pull 1-hour or daily values onto a 5-minute chart. If the script uses lookahead, a 10:05 bar on history can see the 1-hour close that wasn't known until 11:00. If it reads the still-open higher-timeframe bar, the value drifts all hour live, while history only shows the finished number.
- Pivots, zigzags and fractals. A swing low is only confirmed once a set number of bars to its right have closed above it. With five bars on each side, that is 25 minutes on a 5-minute chart. Many tools then draw the mark back on the low itself, and zigzag lines keep redrawing their last leg until a new swing confirms.
Why repainting backtests look perfect and live results don't
A backtest only sees the final version of history. If an indicator rewrites its past, the backtest grades a version you could never have traded.
Take a hypothetical tool that marks every swing low on a 5-minute chart. History shows a buy arrow at the exact low, $48.00, with a stop just below at $47.80. Live, that low only confirms five bars later, when price is already at $49.10. Entering there with the stop still under the low means risking $1.30 instead of $0.20 on the same move. The chart shows a different strategy from the one you can trade.
Future leaks are worse. An indicator that sees the hourly close in advance will look clever on every past bar, and that edge disappears the moment the future stops being available. If an indicator's history shows arrows at nearly every top and bottom, treat that as a warning sign.
How to tell if an indicator repaints: four tests
You don't need the source code, and invite-only or protected scripts hide it anyway. Test the behavior instead, ideally during the regular US session, when price moves enough to trigger signals.
- Watch it live on a 1-minute chart. Note every signal that appears mid-bar and whether it is still there after the close. Also watch for marks that show up on bars that have already closed.
- Compare screenshots before and after. Take a screenshot, wait 20 to 30 bars, then reload the chart so the script recalculates the bars it saw live as history. Compare the two images bar by bar. Any signal that moved, vanished or appeared on an older bar is repainting.
- Use Bar Replay. Start a few days back and step forward one bar at a time, writing down each signal and the bar it first appeared on. Then exit replay and look at the same bars on the normal chart. If a mark lands on a bar behind the replay point, or the normal chart shows signals your replay never produced, the indicator repaints. On the free Basic plan, replay is limited to daily and higher charts, so check TradingView's plan page for intraday access.
- Set an alert and check where it fired. Create an alert on the indicator's signal and let it run for a session. The alerts log is a record of what happened live. Afterward, check that every alert lines up with a signal on the same bar. Alerts with no matching signal, or signals with no alert, point to repainting. For this test choose Once Per Bar, which fires as soon as the condition is met; for trading, Once Per Bar Close waits for the candle to close.
What non-repainting honestly means
A non-repainting indicator makes one promise: once a signal is confirmed, it never moves, changes or disappears. The history you scroll through matches what you would have seen live, bar for bar. The open bar can still update, but nothing changes once it closes.
The price of that promise is timing. Signals wait for the candle to close, so you act on the next bar, a little later than a flickering tool would suggest. Pivot-based tools always confirm late, because a swing can't be known until bars form after it. That delay is lag, and lag is honest. It only becomes repainting when the mark is drawn back in time without telling you.
Two small caveats. Data providers occasionally correct a bad print, and indicators with a long memory can shift slightly depending on how much history your chart loads; neither is a design flaw. And treat non-repainting in a script description as a claim to test with the steps above. Most built-in TradingView tools, like RSI, EMA and VWAP, stay fixed once a bar closes, which is one reason they make a solid base. See the indicators worth starting with.
A short note for Pine Script authors
If you write your own scripts, a few habits remove most repainting:
- Gate signals with barstate.isconfirmed so they only fire on the bar's final update. It is always true on historical bars, so history and live follow the same rule.
- Pull higher-timeframe values with request.security(syminfo.tickerid, "60", close[1], lookahead = barmerge.lookahead_on). The [1] offset and lookahead on work as a pair and return the last closed higher-timeframe bar on both history and live. Lookahead on without the offset leaks future data, and the default (lookahead off, no offset) reads the unclosed bar live.
- Plot pivots on the bar where they confirm, or make a backward offset an opt-in input so users know what they are looking at.
- Fire alerts at bar close, with alert.freq_once_per_bar_close in alert() calls.
How UpTickFlow handles repainting
UpTickFlow is our own invite-only indicator, so weigh what we say accordingly. Its signals are calculated on closed bars only, and the higher-timeframe values it reads come from closed higher-timeframe bars. Once a signal appears, it doesn't move or vanish. Entry is planned at the next bar's open, the first price you could actually get.
That design makes some things arrive late on purpose. Support and resistance zones are built from swing pivots, and RSI divergences are confirmed on the swing, so both show up some bars after the turn. That is the same honest lag described above. The built-in results table, off by default, simulates the signals shown on your chart, entering at the next bar's open with 1 tick of slippage per side.
You can run every test in this guide on it yourself. If you want to try, adding an invite-only script takes a couple of minutes, and the plan is on the pricing page. Trading carries real risk, and no indicator, repainting or not, removes it.