Knowledge Base/How does Massive create aggregate bars?

How does Massive create aggregate bars?

Massive calculates aggregate bars using clear rules that determine which trades contribute to the Open, High, Low, Close, and Volume values for a given time period.

Massive calculates aggregate bars using clear rules that determine which trades contribute to the Open, High, Low, Close, and Volume values for a given time period. These rules come from the Sale Conditions defined by the CTA and UTP plans, which outline which trades are eligible to update each part of an aggregate bar.

Users sometimes notice that their own reconstructed OHLCV values—whether built from tick data or from WebSocket trades—don’t always match the aggregates returned by Massive’s Aggregates endpoint or the values published by other vendors such as Yahoo Finance or Bloomberg. This is normal. Each data provider applies eligibility rules slightly differently, and there is no single universal “source of truth” for OHLC data. Massive follows the CTA/UTP guidelines because they are the industry standard and provide consistent, reliable results.

You can learn more about trade eligibility in our blog post - Understanding Trade Eligibility.

Additionally, you can use the Conditions endpoint to see which specific sale conditions update the Open, High, Low, Close, or Volume values—this provides complete transparency into how each trade type affects aggregate construction.

Different Timespans Behave Differently

Massive supports several types of aggregate bars—per-second, per-minute, per-hour, and per-day—and each of these time intervals is created using its own process. Because of this, you may notice that certain values (like volume or high/low) don’t always match when comparing one interval to another or when rolling smaller intervals up into larger ones.

This is expected. Each timespan is designed to serve a specific purpose and follows rules that best represent that type of data.

Understanding Aggregation Logic Across Timespans in Massive

Below is an overview of how each aggregation interval is constructed and why the values differ across timeframes.

Per-Second Aggregation

Per-second aggregates are produced using a dedicated process optimized for real-time analysis and high-frequency use cases.

  • Generated independently of the minute-level pipeline
  • Designed for quick, real-time updates
  • Prioritizes accurate second-by-second snapshots

Because it uses its own process, second-level bars will not always roll up perfectly into minute-level aggregates.

Per-Minute Aggregation

Per-minute aggregates use Massive’s standard trade-eligibility rules based on CTA/UTP sale conditions.

  • Every trade is evaluated to determine whether it can update Open, High, Low, Close, or Volume
  • Provides the foundational OHLCV data used across many parts of the platform
  • Represents the most commonly used intraday interval

Minute bars also serve as the building blocks for hourly bars.

Per-Hour Aggregation (Rolled-Up Minute Bars)

Hourly candles are created by rolling up per-minute candles.

  • The hour includes only the minutes that were available and eligible
  • If a minute is missing—for example due to no eligible trades—it is not included in the hourly bar
  • Hourly candles inherit all trade-eligibility decisions made at the minute level

Because of this, the sum of hourly or minute bars may not match the daily aggregate.

This behavior is intentional and reflects the design of the intraday aggregation pipeline.

Per-Day Aggregation

Daily aggregates use their own process that is designed to represent the full trading session.

  • Applies broader eligibility rules than minute/hour intervals
  • Captures trades that may not appear in smaller intervals
  • Includes late messages, corrections, or recovery data when appropriate
  • Produces a complete record of the day’s official trading activity

As a result:

  • Daily volume will often be higher than the sum of minute or hourly bars
  • Daily highs/lows may include trades that were not eligible for intraday updates

This is normal and consistent with industry-standard practices.

Why Rebuilding Aggregates From Tick Data Can Differ

When users attempt to rebuild OHLCV values from raw tick data, they may see differences compared to Massive’s aggregates. This happens because:

  • Trades carry sale conditions that determine their eligibility
  • Some trades can update volume but not high/low
  • Some trades cannot update any part of the aggregate
  • Unique vendors interpret CTA/UTP rules slightly differently

Massive follows CTA/UTP guidance closely, which results in consistent and high-quality aggregate bars.

Key Takeaways

Each aggregation interval (second, minute, hour, day) has its own process and purpose.

Per-hour aggregates are rolled-up per-minute aggregates.

Missing minutes do not appear in hourly bars but will still appear in daily bars.

Daily aggregates often include additional eligible trades and therefore show higher volume.

Differences between Massive’s aggregates and user-reconstructed values are normal and reflect trade-eligibility rules.

There is no universal standard for OHLC data across all vendors, but Massive follows CTA/UTP guidelines.


Was this article helpful?

Modernizing Wall St.

Reimagining financial market data for the 21st century.

Schedule a demo

Talk with our market data experts

Recommended

Can't find the answer you're looking for? Contact our team.