The volume profile indicator turns a rolling window of bars into a horizontal histogram. Rows show where trade concentrated during that window. Three lines mark the point of control and the value area edges. It suits traders who plan around acceptance levels.
This build ships as volume-profile-indicator-forexmt4systems.ex4 for MT4 and volume-profile-indicator-forexmt4systems.ex5 for MT5; the screenshots below come from EURUSD H1.
| Platforms | MT4 (.ex4) + MT5 (.ex5) |
|---|---|
| Chart window | Main price chart |
| Plots | 1: VP(dummy) |
| Alerts | popup, push notification, email, sound |
| Inputs | 18 |
What the Volume Profile Indicator draws on the chart
No plot buffer paints anything here. The single declared buffer, VP(dummy), stays hidden on purpose. Everything you see comes from chart objects the code creates and refreshes.
The histogram stacks rectangles anchored to the newest bar. Each rectangle covers one price row. Its length tracks the tick volume in that row against the busiest row. ColRow paints ordinary rows. ColValueArea paints rows inside the value area, and ColPOC paints the busiest one.
Three horizontal lines carry the reference levels. ShowPOC draws the point of control through the middle of the busiest row. ShowValueArea draws VAH above and VAL below the value area block.
- VP(dummy): hidden buffer

How the Volume Profile Indicator calculates its values
Splitting the window into rows
The window comes first. LookbackBars sets how many bars feed the profile. The code scans them for the highest high and the lowest low. Dividing that range by Rows gives the height of one price row.
Each bar spreads its tick volume across the rows its range touches. The share a row receives matches the slice of the bar that overlaps it. A wide bar spreads thin and a narrow bar concentrates. Bars with no range drop their whole volume into the row holding the close.
Point of control and value area
The busiest row wins. After the loop the code adds every row total. It keeps the index with the largest figure as the point of control. That price sits at the midpoint of the row.
From there the value area grows outward. ValueAreaPercent sets the share of total volume to cover. The code repeatedly takes the heavier of the two neighbouring rows. It stops once the running total clears that target. VAH lands at the top edge of the highest row taken. VAL lands at the bottom edge of the lowest.
When the profile rebuilds
Rebuilds happen on new bars. The code stores the time of the last build. When a fresh bar opens it deletes the old objects and redraws the set. That keeps the profile rolling with the window rather than pinned to a session.
How to read the signals
The longest row marks where the market spent most effort. Traders familiar with market profile read that level as a magnet. Moves away from it often stall or come back.
VAH and VAL frame the accepted range for the window. A close outside those lines says the auction moved on. Repeated rejections at one of them say the range still holds.
Row shape matters as much as row length. A single tall cluster points to balance. Two clusters with a thin gap between them show a market that moved through quickly.
Alert channels in this build: popup, push notification, email and sound, one message per closed bar.
The build watches the last closed bar for a cross of the point of control. It can raise a popup, a push notification, an email or a sound. One message goes out per closed bar.
Every Volume Profile Indicator input
Core settings
| Setting | What it does | Default |
|---|---|---|
LookbackBars |
Bars in rolling profile window. Bars in the rolling window. Shorten it for intraday work. | 300 |
Rows |
Price rows (histogram resolution). Resolution of the histogram. More of them sharpen the point of control. | 40 |
ValueAreaPercent |
Value Area coverage (% of volume). Share of total volume the value area covers, as a percentage. The shipped setting follows the usual seventy percent convention. | 70.0 |
FillRectangles |
Fill row bars (outline is more reliable). Switch between solid and outline rows. Outline draws reliably, which is why it ships off. | off |
Display settings
| Setting | What it does | Default |
|---|---|---|
MaxWidthBars |
Max horizontal length of a row (bars). Longest a row may stretch, counted in bars. Trim it when rows cover the candles. | 60 |
ShowPOC |
Draw Point of Control line. Toggle for the point of control line. Turn it off for the histogram alone. | on |
ShowValueArea |
Draw VAH / VAL lines. Toggle for the VAH and VAL lines. Leave it on when you trade range edges. | on |
ColRow |
Normal row bar. | steel blue |
ColValueArea |
Value-Area row bar. | medium sea green |
ColPOC |
Point-of-Control row bar. | gold |
ColPOCLine |
POC reference line. | gold |
ColVALine |
VAH/VAL reference lines. | orange red |
Alert settings
| Setting | What it does | Default |
|---|---|---|
EnableAlerts |
(see inputs panel) | on |
EnablePopup |
(see inputs panel) | on |
EnablePushNotify |
(see inputs panel) | off |
EnableEmail |
(see inputs panel) | off |
EnableSound |
(see inputs panel) | off |
SoundFile |
(see inputs panel) | alert.wav |

Settings that fit your chart
Tick volume drives every row. Instruments with a healthy tick count read best. EURUSD on H1 gives a stable profile across a few days. Lower charts like M5 refresh faster but swing the point of control around. H4 and D1 profiles behave more like a weekly map. Broker tick counts differ, so two feeds can rank the same rows differently.
When the Volume Profile Indicator fails
Tick volume stands in for real traded volume. Spot forex feeds count price updates rather than contracts. Two brokers can hand the same window different row weights.
The window rolls with the chart. A profile over the last few hundred bars ignores where a session started. It will not line up with the session profiles other traders quote.
Row height and range interact badly around gaps. One runaway bar stretches the high to low span. Every row grows taller, and detail inside the busy area flattens out.
Objects cost chart time. A large row count on a long window creates hundreds of rectangles. Slow terminals redraw them visibly on each new bar.
Copy volume-profile-indicator-forexmt4systems.ex4 into MQL4/Indicators and volume-profile-indicator-forexmt4systems.ex5 into MQL5/Indicators, then restart the terminal and drag the Volume Profile Indicator onto a chart. The step-by-step guide with screenshots is at how to install MT4 and MT5 indicators.
Download the Volume Profile Indicator for MT4 and MT5
The zip volume-profile-indicator-forexmt4systems.zip holds volume-profile-indicator-forexmt4systems.ex4, volume-profile-indicator-forexmt4systems.ex5 and a short README, compiled files only. Enter your email below and the download link arrives in your inbox.
Download this indicator free
Enter your email and the file is yours. You also get the full MT4 and MT5 library.
FAQ
How does ValueAreaPercent decide where VAH and VAL sit?
It sets the share of window volume the value area must hold. The code starts at the point of control. It then adds whichever neighbouring row carries more volume. That loop runs until the running total clears the share. VAH lands at the top of the highest row taken, VAL at the bottom of the lowest.
Why does the volume histogram grow leftward from the newest bars?
Each row anchors its right edge at the newest bar. It stretches back by a share of MaxWidthBars. The busiest row uses the full length, and quieter rows scale down. Drawing that way keeps the profile beside live price instead of covering the candles.
Does Rows change which price the point of control reports?
Yes. It sets how finely the window range gets cut. The point of control reports the midpoint of whichever slice holds the most volume. A coarse setting lumps nearby prices together and shifts that midpoint. Compare two settings on the same window before you trust a level.
Can LookbackBars cover a whole trading session?
It can, as long as you match bars to minutes yourself. On H1 a window of twenty four bars covers a day. A few hundred bars reach back about two weeks. Set the number deliberately, because the code carries no session logic of its own.
Are results guaranteed?
No. Trading involves risk. Results are not guaranteed; past performance is not indicative of future results. Use the Volume Profile Indicator as one input. Always backtest before trading live.
Category: this is part of our Volume collection. Browse more Volume for MetaTrader, or explore every MT4 indicator and MT5 indicator on the site.
External references
- Learn more about the underlying method in Nium on Wikipedia.
- For wider market background, see Put Call Ratio at StockCharts ChartSchool.
