Time Price Opportunity (TPO) indicator
With the Time Price Opportunity (TPO) indicator, also known as "Market Profile," you can analyze market activity by price level as it develops over time. It provides you with a unique perspective on market dynamics, price distribution, and price targets to help predict future market behavior.
On TradingView, you can also access TPO as a chart type. But here, we'll focus closely on the indicator, as it is the basis for both of these technical analysis tools.
CONTENTS:
- What is the TPO indicator
- TPO calculation principles
- How to read TPO
- Single prints
- Poor high and poor low
- Splitting and merging profiles
- Indicator settings
What is the TPO indicator
J. Peter Steidlmayer formulated the concept of Time Price Opportunity at the Chicago Board of Trade (CBOT) in the 1980s. TPO Profiles gained prominence in futures and commodities markets and are now widely used across all sectors.
The Time Price Opportunity visualizes blocks of time spent at each of the profile's price levels and the sequence of level traversals within the profile's period.
It helps to identify significant prices and market patterns that may be not so obvious while inspecting raw price data.

TPO calculation principles
The indicator displays the TPO Profile to the left of each period and an optional volume profile to the right.
TPO profile
You can specify the number of days, weeks, or months the profile's period will cover.
Then, the indicator will divide the period into equal blocks of time based on the user-specified block size (5-, 10-, 15-, 30 minutes, and 1-, 2-, or 4 hours).
Each successive time block corresponds to an alphabet letter. The sequence starts with uppercase letters from A to Z. If more time blocks are needed, the indicator will use lowercase letters from a to z. The indicator repeats this sequence if the period contains enough time blocks to exhaust all the available letters.
The indicator creates price levels (rows) for each period based on its specified row size. It can calculate the row size automatically, or you can manually define the number of ticks per row.
The profile displays a block at a price level for every time segment in which prices traversed it.
For example, a leading "A" block in a row means the market price reached that level during the first time block.
TPO value area (VA)
The value area is the price range that contains a significant concentration of TPO blocks over a period. It suggests the price range where market participants showed the most interest. Traders often use it to identify potential support and resistance levels.
The indicator uses the following algorithm to determine the value area of a TPO profile:
- Determines the total number of blocks in the profile
- Calculates the target number of blocks in the VA using this formula:
VA Target = total blocks × value area percent / 100
- Start the VA block counter at the row with the highest number of blocks (point of control — POC). The POC is the first row added to the VA
- Counts the blocks in the row above the highest VA row
- Counts the blocks in the row below the lowest VA row
- Determines the row with the highest block count from steps four and five and adds its count to the VA block count. That row becomes part of the VA. If both rows have an identical block count, add the row closest to the POC. If both rows have identical block counts, adds the highest row
- Repeats steps four-six until the total number of VA blocks reaches the target calculated in step two
- Uses the highest and lowest levels in the VA as the value area high (VAH) and value area low (VAL)
Row size
When the "Row Size" input uses the "Auto" option, the indicator calculates the row size based on the latest 300 bars as of the rightmost visible bar. It first divides the difference between the highest high and lowest low across those bars by the symbol's minimum tick value:
MinTickRange = (HighValue – LowValue) / MinimumTick
Then, it divides this value by 80, i.e., the number of rows that must fit on the chart:
RowTicks = MinTickRange / RowsRequired
Finally, it rounds the result to calculate the final ticks per row value:
TicksPerRow = round(RowTicks / Increment) × Increment
The increment it rounds to depends on the scale of the calculated value:
If 1 <= RowTicks <= 100, Increment = 5 If 100 <= RowTicks <= 1,000, Increment = 50 If 1,000 <= RowTicks <= 10,000, Increment = 500 If 10,000 <= RowTicks <= 100,000, Increment = 5,000 etc...
The indicator recalculates the row size when adding it to a chart, resetting its settings, or changing the symbol or timeframe.
Volume profile
The optional volume profile uses the data from the "Block size" timeframe for its calculations. Comparing the volume profile to the TPO Profile can help corroborate the significance of price levels.
How to read TPO
Balance and imbalance
One can postulate that a market is always in a state of either balance or imbalance. A state of balance in this context means an instrument has an approximately equal number of buyers and sellers. In such a case, the supply and demand for the instrument roughly align, and prices concentrate around a fair price value.
If the number of buyers exceeds the number of sellers or vice versa, one can consider the market imbalanced. When in a state of imbalance, the market price starts a directional movement in search of a new fair value. Prices may rise when buyers outweigh sellers, and prices may fall when sellers outweigh buyers. In either scenario, the directional movement may persist until the number of buyers and sellers equalizes, resulting in a balanced state at a new fair price.
Initial balance range (IBR)
The initial balance range is the range of prices visited during the first time blocks in the profile's period. Markets may experience elevated trading activity during the beginning parts of a session.
You can use IBR to identify initial significant levels, which can serve as a reference point when evaluating further price movements. The TPO indicator displays the IBR as a vertical line at the left of the period's starting point. You can enable the IBR line and the number of time blocks in its calculation from the "Style" tab of the script's settings.
TPO midpoint
The TPO midpoint refers to the median price value between the lowest and highest prices within a Time Price Opportunity profile, calculated using the following formula:
TPO Midpoint = (Highest TPO Price + Lowest TPO Price) / 2
Support and resistance levels
Support and resistance levels are key price regions where the market historically experienced concentrated buying (support) or selling (resistance) activity. You can use such levels as reference points for identifying potential price reversal or continuation areas. In TPO analysis, such levels can include the point of control, value area high, and value area low, among other significant price levels.
The point of control is the level at which the market price spent the most time in the profile's period. It indicates the value where trading activity had the highest concentration, offering insights into market equilibrium and consensus.
You can consider the POC a potential reference for future price movements, as the market price might gravitate toward areas with a higher concentration of historical activity. Repeated price interaction with a POC level across subsequent profiles enhances its analytical significance as a support or resistance level.
The value area high and value area low signify the upper and lower boundaries of the price region where most of the market activity occurred throughout the profile's period. VAH and VAL can serve as potential support and resistance levels over subsequent periods.
Distributions
Another interpretation approach for TPO is to consider what path you choose, whether you're an active trader or a long-term investor.
For short-term/daily trading, you may want to have a closer look at the value area and conduct your trades within this range.
For long-term strategies, don't limit yourself to this area. You can seek more advantageous prices for trades outside the value area, below the VAL for buyers and above the VAH for sellers.
When long-term traders dominate the market volume, an asset's price may make more significant upward or downward movements, depending on the concentration of buyers and sellers.
This interpretation can help grasp some common range development patterns, or distributions, in TPO Profiles. Let's move on to a few of them.
Normal day distribution

A normal day distribution occurs when most of the period's price range (about 85%) lies within the initial balance range, implying that activity outside the IBR is insignificant or nonexistent.
You might perceive the market as balanced in such a case since most of the period's trading activity occurred within the value area (the fair price area).
This pattern suggests that the main market drivers during the period are short-term traders, and the influence of long-term traders is minimal.
Normal variation day distribution

A normal variation day occurs when longer-term traders are more active. The price range extends beyond the initial balance range, which short-term traders are less likely to hold. The range extension beyond the IBR can be anywhere from a few ticks to double the IBR's size.
Trend day distribution

A trend day occurs when the longer-term traders push the price range successively further, forming a range extension that is more than double the size of the IBR, and the market closes with a price near the extension's extremity. This distribution suggests long-term traders maintain a heavier influence over the direction as the market searches for a new fair price.
Neutral day distribution

A neutral day occurs when traders temporarily extend the price range beyond the IBR. The market price then reverses, and a similar pattern may appear at the opposite end of the IBR. This distribution suggests uncertainty in the market. It generally occurs when the market tests for continuation or changes in underlying trends.
Single prints
Single prints are non-extreme levels that contain only one TPO block. The market price traversed them only once in the profile's period. Consider these levels as indicators of potential market interest or imbalance. As such, single prints might attract future trading activity since buying or selling was potentially limited or unexpected around those values.
Moreover, you can monitor them as potential levels that price might revisit and as possible areas of support or resistance. Enable the "Single prints" option in the "Style" tab of the indicator's settings to highlight single prints on the chart.

! Note: The indicator will highlight the first single print established in the event of consecutive occurrences.

Poor high and poor low
Poor highs and lows are extreme levels with more than one TPO block. In TPO analysis, these levels signify where directional movement halts without clear rejection, revealing flat, narrow tops or bottoms on the chart. This pattern suggests the market might have yet to fully explore prices beyond the profile's high/low, potentially leaving room for further extended movement.
Poor highs and lows lack the characteristic tapering indicative of a strong reversal. They pique the interest of market participants seeking further range exploration. Although they are not necessarily strong support/resistance points, these levels can indicate where the market's momentum paused, offering unique insights for trading strategies.

Splitting and merging profiles
Users can split or merge individual profiles displayed on the chart to inspect activity across specific regions on the chart with different levels of detail. To use this functionality, right-click a displayed profile and select the appropriate option at the bottom of the contextual menu.
The "Split profile at this letter" option will split a selected profile spanning two or more time blocks into two separate profiles at the TPO block.

The "Merge with previous profile" option will combine the selected profile with the previous profile displayed on the chart. This option is only available if the selected profile is not the first on the chart.

The "Reset all merges and splits" option reverts all profile split and merge actions.

! Note: Splits and merges also reset when changing the "Period" or the "Block size" values in the indicator's inputs.
Indicator settings

Inputs
Period: The number of days, weeks, or months that each profile covers. The default is one day
Block size: The size of the time blocks that divide the profile's period. Smaller block sizes produce more granular results. The possible values are 5-, 10-, 15-, 30 minutes, and 1-, 2-, and 4 hours. The default block size is 30 minutes. This value affects the calculation of the TPO and volume profiles
Row size: The mode used to determine the size of the profile's rows. In the default setting ("Auto"), the indicator displays its calculated row size in the "Ticks per row" field. In manual mode, the user specifies the number of ticks per row
Tick per row: The number of ticks in each profile row, which affects the number of rows each profile will contain. Users can only enter a value into this field if the "Row size" mode is manual. If the value is too small, the indicator will raise an error
Value area percentage: The percentage of total TPO blocks used in the Value Area calculation. The default value is 70
Style

Gradient colors: These are the colors used for the TPO blocks' color gradients. The first two colors define the range for the A-Z blocks. The last two colors specify the color range for a-z blocks
Blocks: Toggle the display of colored TPO blocks. This setting has no effect if "Letters" are enabled but cannot show on the chart due to a lack of space
Letters: Toggle the display of TPO letters. When enabled, the indicator only shows letters if the chart has sufficient space. Otherwise, it will show colored blocks instead
Opacity outside VA: Set the opacity value for levels outside the Value Area boundaries
Expand blocks: Enable for the indicator to display the distribution of TPO blocks across successive intervals in the period rather than consolidating them at the left of the period. This feature can help you understand the calculation of the profile's constituent blocks and provide additional insight into the flow of price activity over time
POC: Toggle the POC label and row highlight, and the dropdown determines whether the indicator extends the row highlights past each profile's period until price intersects the level again. When POC display is enabled, the indicator colors the POC row and label using the chart's foreground color
Poor high: Toggle the "Poor high" label and line. In this dropdown you can determine whether the indicator extends the line past the profile's period until price intersects it
Poor low: Toggle the "Poor low" label and line. In this dropdown you can determine whether the indicator extends the line past the profile's period until price intersects it
Single prints: Here, highlight whether the indicator extends the highlight past the profile's period until price intersects it
VAH: Toggle the "Value area high" label and line
VAL: Toggle the "Value area low" label and line
TPO midpoint: Toggle the visibility of the profile's median price label
Open: Toggle the visibility of the profile's opening price label
Close: Toggle the visibility of the profile's closing price label
Initial balance range (IBR): Toggles the display of vertical lines to the left of the profile, and the text field defines the number of blocks in the IBR calculation
Volume profile

Show volume profile: Toggle the display of the volume profile to the right of the TPO profile
Values: Toggle labels that display volume values at each row and the period's total volume below the profile. The color selector specifies the color of the labels. The indicator only shows these labels when the chart has sufficient space
VAH: Toggle the volume profile's value area high line and specify the color and line style
VAL: Toggle the volume profile's value area low line, and specifies the color and line style
POC: Toggle the volume profile's point of control line, and specifies the color and line style
Volume: Determines the color of levels outside the value area
Value area: Determines the color of levels inside the value area
Placement: Determines whether the volume profile aligns to the left or right
TPO in a nutshell
The Time Price Opportunity (TPO) indicator visualizes market activity by showing time spent at different price levels using alphabetical blocks. It displays TPO profiles that reveal market balance and imbalance states, helping you identify significant price levels, support and resistance zones, and distribution patterns.
Key components include the value area (70% of trading activity), point of control (highest activity level), and initial balance range (early session price range). The indicator supports various distribution patterns (normal day, trend day, neutral day) and highlights single prints and poor highs/lows as potential future interest areas.
You can customize time periods, block sizes, and visual elements while optionally displaying volume profiles for additional confirmation of price significance.
Also read: