A definitive, testable list of which TradingView indicators repaint and which don't: ZigZag, Williams Fractals, pivot points, Ichimoku's Chikou Span, and mis-written request.security calls on one side; moving averages, RSI, MACD, ATR, Bollinger Bands and Supertrend (on confirmed bars) on the other. Includes the three distinct mechanisms of repainting and the correct non-repainting higher-timeframe pattern in Pine v6. Educational material only, not financial advice — a non-repainting indicator is not thereby a profitable one, and trading carries a real risk of loss.
The indicators that repaint are: ZigZag, Williams Fractals, anything built on ta.pivothigh/ta.pivotlow, Ichimoku's Chikou Span, any script that pulls higher-timeframe data through request.security without confirming it, and any signal evaluated on the live, unconfirmed bar. The indicators that do not repaint — once the bar closes — are the standard price-following family: SMA, EMA, RSI, MACD, Stochastic, ATR, Bollinger Bands, Keltner Channels, Donchian Channels, Supertrend, OBV, and session-anchored VWAP.
That is the short answer, and it comes with one crucial qualifier: every indicator fluctuates on the currently forming bar, because its inputs — close, high, low — are still changing. That live-bar movement is not what "repainting" properly means. The problem cases are indicators whose historical output differs from what they actually showed in real time: values that get redrawn, markers that appear in the past, or signals that quietly used data which did not yet exist.
Why it matters is simple and brutal: a repainting indicator produces backtests and chart histories that describe signals nobody could have traded. The chart shows a perfect swing low marked at the low; in real time, that marker did not exist until bars later — or never fired at all. Forum threads and script pages advertise "non-repainting" versions of everything, usually without defining the term, which is why a precise taxonomy beats a vibe.
The rest of this article gives that taxonomy — three distinct mechanisms — then the full list on each side, the single biggest hidden repainter (request.security done wrong, with the fix), and how to verify any indicator yourself. Everything here is educational; none of it is financial advice.
"Repainting" is one word for three different mechanisms, and they deserve different levels of alarm.
1. Live-bar fluctuation (universal, benign if understood). On the forming bar, every indicator recalculates tick by tick: RSI wobbles, a moving-average cross appears and disappears, Supertrend flips back and forth. When the bar closes, the value fixes and never changes again. This is not a defect — it is how bars work — but it becomes a defect the moment you act on it: an alert or plotshape evaluated intrabar can fire on a condition that no longer holds at the close. The fix is one clause: gate signals with and barstate.isconfirmed.
2. Lookback repainting (redrawing or backdating history). Some indicators place output on past bars once the future confirms it. A ZigZag's final leg keeps extending as price makes new extremes; a pivot marker appears several bars after the pivot, drawn at the pivot. The chart history ends up showing information at timestamps where it was not yet knowable. Backtests over such output are structurally flattered.
3. Lookahead repainting (future data leaks). The worst class: the indicator's historical values were computed using data from after the bar in question. The canonical sources are request.security with barmerge.lookahead_on and no offset — which hands historical bars the final value of a higher-timeframe bar that was still forming — and constructions like the Chikou Span that displace present data into the past. On historical data this looks clairvoyant; live, the clairvoyance evaporates.
Mechanism 1 is manageable with discipline. Mechanisms 2 and 3 mean the chart history is not what you would have seen — which is exactly what a repaint check must catch.
ZigZag. The flagship lookback repainter. Its most recent leg is provisional by construction: as price extends, the last swing point moves. Historical swings look surgically precise because they were redrawn after the fact. Any strategy "entering at ZigZag turns" is entering at points that did not exist in real time.
Williams Fractals. A fractal high needs two lower highs after it, so the marker confirms two bars late — and is then drawn on the historical bar. Once printed it never moves, so this is backdating rather than redrawing, but the chart still shows arrows at bars where no arrow existed at the time.
Pivot-point indicators (`ta.pivothigh` / `ta.pivotlow`). Same mechanism, generalised: a pivot with right = n confirms only after n further bars, then appears n bars in the past. The larger the confirmation window, the more prophetic the history looks.
Ichimoku's Chikou Span. The current close plotted 26 bars back. Read at its plotted location, it is information from 26 bars in that bar's future. The rest of Ichimoku (Tenkan, Kijun, cloud) is ordinary and fixed at close — the Chikou is the leak.
Higher-timeframe values via bare `request.security`. Covered in depth below; the single most common cause of "my backtest didn't match live."
Any live-bar-evaluated signal. An ungated alert, plotshape, or strategy running calc_on_every_tick = true acts on unconfirmed values — self-inflicted mechanism-1 repainting.
Signals on synthetic chart types. Strategy signals on Heikin Ashi or Renko charts use synthetic prices you cannot trade at; Renko bricks can additionally be redrawn on some data configurations. Not classical repainting, but the same disease: history that misstates what was executable.
The standard price-following indicators do not repaint: once a bar is confirmed, their value for that bar is final and will render identically forever. This list includes SMA, EMA, WMA and other moving averages; RSI; MACD; Stochastic; CCI; ATR; Bollinger Bands; Keltner Channels; Donchian Channels; Supertrend; OBV; and session-anchored VWAP. They are pure functions of current and past confirmed prices — no future reference, no historical reassignment.
Three honest qualifiers, because "non-repainting" gets oversold too.
First, all of them fluctuate on the live bar (mechanism 1). A Supertrend flip or MACD cross on the forming bar can unwind before the close. "Doesn't repaint" means "final at confirmation," not "stable intrabar." Signals still need the barstate.isconfirmed gate.
Second, a non-repainting indicator becomes repainting the moment it is used wrongly. RSI does not repaint; RSI requested from a 4-hour feed without confirmation does. Supertrend does not repaint; a strategy acting on its live-bar flips effectively does. The repaint property belongs to the whole pipeline — indicator, timeframe plumbing, signal gating — not to the formula alone.
Third, non-repainting is a floor, not a merit. It means your backtest at least describes signals that actually existed. It says nothing about whether those signals carry an edge after costs — most don't, and no honest test can promise otherwise.
A note on VWAP, since it appears on repaint lists erroneously: standard session VWAP anchors at the session open and accumulates forward; historical values are fixed. What people sometimes observe is the anchor resetting each session, which is by design. (Rolling or manually re-anchored variants are a different construction and should be checked individually.)
Most repainting in user scripts is not in the indicator at all — it is in how a higher-timeframe value is fetched. There are two failure modes.
Failure 1 — using the forming HTF bar. A bare call returns the higher-timeframe bar as it currently stands. On live charts, that value mutates until the HTF bar closes; on historical charts, it shows the final value throughout. History and live disagree — the definition of repainting.
Failure 2 — lookahead. barmerge.lookahead_on without an offset serves historical bars the closing value of an HTF bar that had not yet closed: a literal future leak that makes backtests look clairvoyant.
// ❌ Wrong — repaints: the forming HTF bar mutates until it closes
htfRsiBad = request.security(syminfo.tickerid, "240", ta.rsi(close, 14))
// ❌ Worse — lookahead: historical bars see the HTF close before it existed
htfRsiWorse = request.security(syminfo.tickerid, "240", ta.rsi(close, 14),
lookahead = barmerge.lookahead_on)The fix is one pattern: request the last confirmed HTF value, by offsetting the expression one bar back and keeping lookahead off.
//@version=6
// Educational only — validate before trading; not financial advice.
indicator("Non-repainting HTF RSI")
rsiRaw = ta.rsi(close, 14)
// [1] + lookahead_off = last CONFIRMED higher-timeframe value only
htfRsi = request.security(syminfo.tickerid, "240", rsiRaw[1],
lookahead = barmerge.lookahead_off)
plot(htfRsi, "HTF RSI (confirmed)")The cost is honesty itself: your chart-timeframe bars see the HTF value with up to one HTF bar of delay — which is exactly the information a live trader would have had. If removing the delay makes the strategy stop working, the strategy was trading on the leak, not on an edge.
You do not need to trust any list — including this one. Repainting is empirically checkable, and every method below is something you can run today.
Bar Replay. Step TradingView's replay mode through history bar by bar and watch the indicator paint in real time. If markers appear in the past, the last leg keeps moving, or a signal that existed mid-replay is gone afterwards, you have lookback repainting. This is the single most convincing demonstration for pivot- and ZigZag-style tools.
The screenshot test. Screenshot the live chart with the indicator's current signals; return after 20–50 bars and compare against the same region rendered as history. Any signal present in the screenshot but absent later (or vice versa) is a repaint. Crude, slow, and irrefutable.
Alert-log reconciliation. Set an alert on the signal condition and let it run. Then compare the alert log's timestamps against where the chart now shows signals. A repainting indicator produces alerts with no matching chart marker and chart markers with no matching alert.
Static analysis. Read the source for the known mechanisms: ta.pivothigh/ta.pivotlow and offset-into-the-past plots (lookback), request.security without [1] and lookahead_off (HTF/lookahead), signals not gated on barstate.isconfirmed (live-bar). This is precisely what ForexCodes' free Repaint Checker automates — paste a Pine script and it flags each mechanism with the line that causes it, before you burn weeks replay-testing.
One closing calibration: repainting is a correctness property, and fixing it is table stakes, not a strategy. A fully non-repainting script can still be overfitted, cost-blind, and unprofitable. Verify the mechanics, then subject the performance claims to the same scepticism. Educational only; not financial advice — trading carries a real risk of loss.
Educational only — not financial advice. Trading involves substantial risk of loss.