Point of Control Trading: What Actually Sets the Levels
What the point of control and value area high and low are, how a point of control trading strategy reads them, and the three settings that move both.
The point of control is one price: the row of a volume profile that holds more volume than any other row over the period you chose. Value area high and value area low are the top and bottom of the band around it that holds a chosen share of that volume, 70% by default.
Whether your levels match anyone else's depends on what they are built from: how many rows the profile is cut into, which lower timeframe the platform loads, and, on a forex chart, what the word "volume" means. All three are published, and all three change the answer.
What is the point of control?
One price, not a zone. TradingView's own help page defines it as "The price level for the time period with the highest traded volume". powertrading.group says: "The Volume Point of Control is the price level where the most volume traded during a given period. That's it. One price, the highest volume node on the distribution".
theforexgeek.com opens by calling the point of control the "fair value" area, which swaps a single price for a range. The phrase does exist on TradingView's page, but it is attached to something else: TradingView uses it for high volume nodes, the clusters where "This heavy activity suggests a fair value area". A node covers a region of prices, where the point of control is a single row, so the two cannot be the same thing.
What are value area high and low?
They are the highest and lowest price rows included in the value area, which TradingView defines as "The range of price levels in which the specified percentage of all volume was traded during the time period. Typically, this percentage is set to 70%, however, it is up to the trader's discretion."
The value area is built outward from the point of control, so it is usually lopsided rather than centred on it. And 70% is a target, not a guarantee: depending on which rule your platform follows, the band can hold noticeably less than 70% or noticeably more.
How are the point of control and value area calculated?
TradingView publishes the full walk. Paraphrased from its steps:
- Add up the total volume in the profile.
- Multiply it by the chosen percentage, 70% by default, to get the target volume.
- Start at the point of control, include it, and subtract its volume from the target.
- Look at the next row above the value area and the next row below it.
- Take the larger of the two. If it fits inside what is left of the target volume, add it and push the boundary on that side outward: the value area high when the row came from above, the value area low when it came from below. If the row would take you past the target, stop there and the value area is complete.
- Tie-breaks. If the two candidate rows hold equal volume, take the row closer to the point of control, and if they are equally far away, take the row above it.
GoCharting's own documentation for the same indicator gives a different stopping rule: "Once the total volume of your Value Area matches or slightly surpasses the number found in step 2, the Value Area has been determined". One rule stops before the row that would overshoot the target. The other stops on or just past it. GoCharting's step list also adds rows in pairs rather than one at a time, although its wording there contradicts itself.
The two stopping rules give different levels on the same data.
Why is the value area not centred on the point of control, and why does it hold less than 70%?
Because the walk refuses a row that would overshoot, and because volume is rarely symmetrical around the heaviest row.
This six-row illustrative profile uses 1-point rows. The numbers are made up, chosen so the arithmetic is readable, and they are not market data.
| Price row | Volume |
|---|---|
| 105 | 12 |
| 104 | 58 |
| 103 | 60 |
| 102 | 55 |
| 101 (point of control) | 70 |
| 100 | 30 |
Total volume is 285, so a 70% target is 199.5.
Start at 101 with 70. Above is 102 with 55, below is 100 with 30, so 102 goes in and the running total is 125. Next, 103 with 60 beats 100 with 30, so 103 goes in and the total is 185. Next up is 104 with 58, and 185 plus 58 is 243, which overshoots 199.5. The walk stops.
The value area runs from 101 to 103 and holds 185 of 285, which is 64.9%, not 70%. The value area low sits exactly on the point of control, and the band reaches two rows up and none down.
Run the same rows under GoCharting's stopping rule and 104 gets added instead of refused: the value area runs 101 to 104 and holds 243 of 285, which is 85.3%. The bars, the volume and the point of control are the same, and the value area high is one row apart, with about twenty percentage points of difference in what the band contains.
futureshive.com found the same lopsidedness in its own worked example: "Notice the value area is not centred on the POC: it reaches one point above and three below, because more volume traded under the POC than over it", and "TradingView stops before a row that would overshoot the target, so its value area can hold slightly less than 70%". Its example lands on exactly 70,000 of 100,000 contracts and gives "Result: POC 5,825, VAH 5,826, VAL 5,822".
One more case breaks the word "area". Take four rows holding 5, 80, 10 and 5. The point of control holds 80% of the profile on its own, so the target is met before a second row can be added. Value area high, value area low and point of control are then all the same price, and the band is a single line.
Why does my point of control sit at a different price than someone else's?
Because the row count is a setting, and regrouping the same volume into different rows moves the heaviest row.
TradingView says so in its first paragraph: the indicators "take into account user-defined parameters such as number of rows and time period". The six-row profile shows the effect.
On 1-point rows, the heaviest row is 101, holding 70.
Group the same volume into 2-point rows starting at 100 and you get 100 to 101 holding 100, 102 to 103 holding 115, and 104 to 105 holding 70. The heaviest row is now the one covering 102 and 103, and the price that won on the finer view is not even inside it.
Shift that same 2-point grid down by one, so rows start at 99, and you get 99 to 100 holding 30, 101 to 102 holding 125, and 103 to 104 holding 118. The heaviest row covers 101 again.
Three row settings on one set of bars give three different answers. futureshive.com says the same thing about real instruments: "1-tick rows on ES give finer levels than 1-point rows".
Profiles are not built from the bars you are looking at. TradingView says that "Volume profile indicators are calculated using data from lower timeframes for the same symbol", and its example is loading every 1-minute bar inside a daily session. Which lower timeframe gets used "varies depending on the specific indicator". Two charts with the same row count can still disagree if they resolved the intrabar data differently.
Does the point of control work on forex?
It computes, and on a forex chart it is not counting traded volume.
TradingView states the input per market: "Trade volume for stocks", "Tick volume for indices, forex, and crypto CFDs. It indicates the number of price updates", and base or quote volume for crypto. So on their forex charts the histogram is not stacking contracts or lots. It is stacking how many times the price was updated at each level.
On an input like that, a forex point of control is the price that received the most quote updates during the period. A quiet hour on a jumpy feed can outrank a busy hour on a calm one, and two brokers with different tick rates will not agree. alchemymarkets.com says the same, "Volume Profile is less accurate on CFDs or FX pairs with tick volume only", and quantcrawler.com has a table row reading "Forex (tick volume only)".
TradingView also splits each row into up and down volume by its own rule: "if close >= open, we take it as an up volume, if close < open, it's down volume". A whole intrabar's volume is signed by where it closed against its own open. The convention does not record who bought and who sold.
What is VPVR, and why do my levels move when I scroll?
Because that variant recomputes from whatever is on your screen. tradingsim.com describes it, writing that the data "may be plotted based on the period visible on the available screen space. This version of the Volume Profile Indicator is called the Volume Profile for Visible Range (VPVR)".
A visible range profile is not a level you can write down and come back to, because zooming gives you a different profile. If you want a level that holds still, use a fixed range or a session profile and note which session it covers.
What breaks a profile?
Non-standard chart types. TradingView names six: Heikin Ashi, Renko, line break, Kagi, point and figure, and range. On those, "the data on the chart will not represent actual prices, and the volume data will also be distorted".
Its own worked case: a single daily candle closing above its open can become several Renko bricks, and "the daily volume for that candle will be divided by N and the resulting value will be given to every brick in the sequence". The volume is spread evenly across bricks that never traded evenly.
TradingView's help page closes by saying "there is little to no debate about volume profile's usefulness" and that "The data that is provided by volume profile is indisputable". That sits on the page that just said the forex input is a count of price updates and that six chart types distort it. The construction is well documented, and the inputs are the part to check.
How would I test a point of control rule on my own history?
Carefully, and with the settings pinned before the first trade.
crosstrade.io names the limit: "You need intrabar or tick-level data to build accurate profiles, which is harder in Pine than in NinjaScript".
A procedure that produces something you can read later:
- Fix the row count, the value area percentage and the session boundary first, and write them down. Changing any of them mid-test means your early trades and your late trades used different levels.
- Record which side of the point of control the period opened on, before you know what happened next.
- Log every occurrence, not the ones you liked. Count them.
- Note what the levels were built from. On our charts that is Dukascopy's indicative volume summed over each bar, and your note should say so.
ChartLabs has two profiles built in, both in the Indicators menu under Standard, under the Volume heading. Session Volume Profile draws one profile per day for the last 10 days by default, and its day starts at the symbol's session open, with New York midnight and UTC midnight as the other choices. Visible Range Volume Profile covers the bars on screen, so it moves when you scroll, as described above. Both default to Row Size 24, which is the number of rows the profile's high-to-low range is cut into, not a price step per row, and a 70% value area. Our value area follows TradingView's walk: it stops before a row that would overshoot, so it can hold less than 70% and never more. Up volume means the bar closed at or above its open. Both are built from the bars on your chart rather than from a lower timeframe, with each bar's volume spread evenly over its high-low range, and our lowest interval is cleaned 1-minute candles from Dukascopy, so the intrabar resolution a fine-grained profile wants is not something you can get here. On forex, as on every market we carry, the volume is Dukascopy's indicative volume summed over each bar, a relative measure of activity rather than exchange volume, so the caveat from the forex section above applies here too: the profile is not stacking contracts.
On volume: the chart's legend always shows the volume of the bar under your cursor, and a Volume indicator can be added from the Indicators menu, where it opens in its own pane under price. It is off until you add it. That is a volume figure per bar, which is enough to see where activity clustered in time, and it is not a profile by price.
In the app you replay the chart bar by bar and take the trades by hand, which is the part a profile cannot do for you. Every trade keeps a snapshot of your chart as it was when you entered, you can tag trades and filter the analytics by those tags, and notes and the CSV export give you somewhere to record the row setting you used.
Where each platform stands
Each row is what that tool's own documentation says, except where the cell names another source. On the ChartLabs row, the volume both profiles stack is Dukascopy's indicative volume summed over each bar, which is a relative measure of activity and not exchange volume.
| Tool | What its own documentation says |
|---|---|
| TradingView | Six profile variants, built from lower timeframe data, row count user-set, 70% value area by default, tick volume on forex and index and crypto CFDs, distortion warning on six chart types |
| GoCharting | Same levels, but its own value-area steps stop once the total "matches or slightly surpasses" the target, and its row height depends on whether the profile is built from candle data or tick data |
| thinkorswim | A VolumeProfile study whose inputs include time per profile, show point of control, show value area, value area percent and a price per row height mode |
| NinjaTrader | Named by crosstrade.io as where systematic work tends to go, "NT8's native volumetric bars or a dedicated backtesting platform" |
| ChartLabs | Session Volume Profile and Visible Range Volume Profile: Row Size 24 as a row count, a 70% value area that stops before overshooting, built from the chart's own bars, with Dukascopy's indicative volume summed over each bar. Cleaned 1-minute candles from Dukascopy and above, manual bar-by-bar replay, automatic chart snapshots, tags, notes and CSV export |
Drawing the profile is the quick part. Finding out what a level did on your own history takes replay and a log.
One next step
Pick your row count and your session boundary, write them down, then step through the chart and count what actually happened at the level. Start the free trial and test it on cleaned data from Dukascopy.
More on the pieces this rests on: what clean historical data means and why it changes results, how to backtest a forex strategy, and a step by step beginner's walkthrough.
Related Topics
Related
Backtesting Accuracy: How Slippage and Data Quality Matter
Why backtest results and live results drift apart, and what actually closes the gap: clean tick data, honest spread assumptions, and commission and slippage modelled directly on every trade you log.
Forex Backtesting: Test Your Strategy on Real Data
A practical guide to backtesting forex strategies: why session dynamics, spread variation, and pair-specific behavior change your results, what clean historical data actually means, and a five-step process for testing a strategy before you risk real capital.
Backtesting a Trading Strategy: A Beginner's Guide
What backtesting is, why it matters, and how to run one step by step: defining your rules, choosing clean historical data, stepping through the chart trade by trade, logging results, and reading the metrics that tell you whether your strategy has a real edge.