“Non-repainting” is the most abused phrase in the indicator world. Half the tools that claim it still redraw history; the other half are honest about the past but let you read live noise as a signal. And the buyers’ side is confused too — traders reject perfectly honest tools for “repainting” behavior that is actually correct, and trust dishonest ones because the backtest chart looks clean. This article sorts it out: what repainting actually is, what it isn’t, how to test any indicator yourself in five minutes, and why even a genuinely non-repainting signal is not automatically a profitable one.
What repainting actually is
An indicator repaints when something it showed you in the past changes after the fact — a signal arrow that was on the chart yesterday is gone today, a level that “held” moved to where price actually turned, a verdict that flips retroactively. The chart becomes a story edited after the ending is known. Any statistic built on such a chart is fiction, because the history you’re measuring isn’t the history you would have experienced live.
Three common mechanisms produce it:
- Intrabar evaluation. The signal condition is checked on every tick of the forming bar. It triggers, prints an arrow, then the bar keeps moving and the condition un-triggers — the arrow vanishes. Live you saw a signal; history shows none.
- Higher-timeframe lookahead. The script reads a higher-timeframe value for a bar that hasn’t closed yet on that higher timeframe. On historical bars the closed value is available — so history quietly uses information the live chart never had. In Pine Script this is the
request.security+ lookahead class of bugs; the honest pattern islookahead_offwith a one-bar offset. - Re-anchored calculations. Zigzags and swing tools that move their pivots as new extremes print — the “turning point” keeps sliding to wherever the turn actually happened.
What repainting is not
Two behaviors get falsely accused, and knowing the difference matters:
- A live, forming element updating intrabar is not repainting — as long as it’s clearly separated from committed verdicts. A developing volume profile, a session box growing while the session is open, a “forming leg” label: these describe the present, honestly marked as unfinished. The test is whether anything committed ever changes.
- Pivot confirmation delay is not repainting. A swing high becomes knowable only after N bars close below it. Every pivot-based tool on every platform has this delay; tools that “detect” pivots instantly are the ones cheating. The honest version states its delay; the dishonest one hides it by redrawing.
The five-minute test anyone can run
- Open TradingView’s Bar Replay on the chart and timeframe you actually use.
- Step forward bar by bar through a stretch where the indicator printed signals.
- Watch a signal’s birth: did it appear during the bar and survive, appear during the bar and vanish, or appear exactly at bar close?
- Note a few marks, play forward 50 bars, and check they’re all still exactly where they were born.
- Compare the replayed history against the same chart loaded fresh — they must match bit for bit.
We run this on our own releases before publishing — for the volume profile, a replay pass with 15+ intrabar updates inside a single bar produced zero changes to any committed mark or counter; everything resolved atomically on the close. That’s the standard the test should show you on any tool you rely on.
The engineering that makes it true
Behind every honest tool are a few unglamorous disciplines. Signals evaluate on confirmed bars only. Verdicts are latched — once printed, a resolution is recorded against its anchor and cannot un-happen if price trades back. Higher-timeframe context either uses the canonical non-repainting read (lookahead_off, one-bar offset) or — stricter still — avoids request.security entirely by computing senior-window reads on the chart’s own bars, as our pullback oscillator does. And forming elements are visually distinct from committed ones, so the reader never mistakes the present for the past.
Why no-repaint still isn’t enough
Here’s the part vendors skip: a signal can be perfectly honest and still useless. Non-repainting only guarantees the history you see is real — it says nothing about whether that history contains an edge. A confirmed-bar moving-average cross doesn’t repaint, and most of them still lose to costs in ranging markets.
That’s why the second discipline matters as much as the first: measure outcomes on the chart itself. How often did the prior POC retest get accepted here (measured)? How often did armed pullbacks actually resume on this chart (measured, printed on the marker)? How often does London really sweep the Asia high on this instrument (counted, with n)? Honest history is the prerequisite; measured frequencies are what make the history usable. And an honest tool will sometimes show you a coin flip — that’s information too, not a malfunction.
FAQ
My indicator’s arrow appeared and then disappeared. Repaint?
If the arrow was presented as a signal — yes, textbook. If it was explicitly a forming/provisional element, it’s honest live context. The difference is whether the tool distinguishes the two; if it doesn’t, treat everything it shows as provisional.
The same chart shows a slightly different statistic after I reload with more history. Repaint?
No — a learning statistic computed over loaded history legitimately refines as the sample grows. Historical bars and marks must not change; a measured frequency may. Honest tools mark thin samples as provisional or say “collecting”.
Is alert behavior part of this?
Very much. Alerts must be gated to fire once per closed bar. An alert that fires intrabar on a condition that can un-trigger is the repaint problem delivered to your phone.
Where can I see these principles implemented?
All five free [MQLSoftware] indicators in the indicators section follow the same rules — confirmed bars, latched verdicts, measured base rates — and each is open-source, so the claims are checkable in the code. Full guides live in the free account area.