Skip to content
ChartTailor
WorkServicesPricingField NotesAbout Start a build
← Field Notes

Why your VWAP doesn't match your broker's VWAP

Two VWAPs on the same symbol can read differently and both be right. The gap comes from where the line is anchored, whose volume feeds it, and which price it weights.

I used to think VWAP was the one number on the chart nobody could argue with. Volume-weighted average price. It even sounds objective, like it was handed down rather than computed. Then a trader sent me a screenshot: his VWAP and his mate’s, same symbol, same session, sitting a clear distance apart, and he wanted to know which platform was broken.

Neither was. That’s nearly always the answer. VWAP hides more decisions inside its tidy name than any other common indicator, and once you can see the decisions you stop expecting two of them to agree.

Anchoring is the whole ballgame

VWAP is a running average that starts counting from somewhere. Move the starting point and every value after it changes. Anchor it to the session open and it means one thing. Anchor it to the week, the month, the day a stock gapped on earnings, or the candle you clicked on, and it means something else entirely.

In Pine v6 the default ta.vwap resets every session for you:

//@version=6
indicator("Session VWAP", overlay = true)
plot(ta.vwap(hlc3), "VWAP", color.orange, 2)

That hlc3 is already a decision, and I’ll come back to it. The reset is the bigger one. If you want a weekly anchor you have to say so, by handing ta.vwap a condition that tells it when to start over:

//@version=6
indicator("Weekly VWAP", overlay = true)
newWeek = timeframe.change("W")
plot(ta.vwap(hlc3, newWeek), "Weekly VWAP", color.aqua, 2)

Two lines on the same chart, same formula, completely different values, both correct. So when someone’s VWAP doesn’t match, my first question isn’t “what’s wrong.” It’s “where does yours start counting?” Most disagreements end right there.

Whose volume are you weighting by?

Here’s the part forex traders hit hard. VWAP weights price by volume, and volume is not a fact the way price is a fact. There’s no single consolidated tape in FX. The “volume” your feed reports is usually tick count, or the activity on one venue, and a different broker’s feed will report a different number for the same minute. Identical prices, different weights, different average. The price agrees and the weighting doesn’t, so the lines drift apart and stay apart.

On a centralised exchange, a US stock or a futures contract, the volume is far more consistent between feeds. That’s exactly why VWAP feels solid there and slippery in FX. Same indicator, different data underneath.

Which price even goes into the average?

Back to that hlc3. It’s the typical price, the average of the high, low and close. Plenty of VWAP builds use it. Plenty use the close. Some let you pick. Small choice, and it moves the line, and two scripts that chose differently will draw two different VWAPs on identical data without either being wrong. Worth a look before you assume a bug.

Then session boundaries drag the whole thing sideways

Because anchoring so often hangs off the session or daily open, everything that makes session boundaries disagree feeds straight into VWAP. Timezone, rollover minute, daylight savings. If two feeds disagree about when “the day” starts, their daily-anchored VWAPs inherit that disagreement on top of everything else. I’ve written separately about why session levels slip an hour twice a year, and the same plumbing sits underneath a daily VWAP.

So what do I actually tell people

Stop trying to make your VWAP match a screen you don’t control. You’ll lose that game forever, because you can’t see how the other line was anchored, fed or defined. Flip the goal. Know exactly how yours works. What’s the anchor. What volume feeds it. What price it weights. Pin those three down and your VWAP becomes consistent on the data you actually trade, which is the only consistency that pays you anything. A line you understand beats a line that happens to agree with someone else’s.

The useful version

When two VWAPs disagree, do not start by assuming one is broken. VWAP is simple maths wrapped in several choices.

Check these first:

  • Anchor: session, week, month, event, or custom reset.
  • Source: close, hlc3, ohlc4, or another input.
  • Session: regular hours only or extended hours included.
  • Feed: broker data, TradingView exchange data, CFD data, futures continuous contract.
  • Timezone: exchange timezone versus the timezone used by your session string.

One mismatch in that list is enough to produce two honest but different VWAPs.

A code-level check

Make the reset condition visible before blaming the VWAP line:

newSession = timeframe.change("D")
plotshape(newSession, title="VWAP reset", style=shape.circle, location=location.bottom)

If the reset dots do not appear where your broker’s VWAP resets, the calculation can be mathematically correct and still not match. The fix is not a better formula. It is matching the contract: same data, same session, same reset.