October 16, 2026

Why taker-side provenance matters when building real-time crypto indicators?

featured image

A spike in buying volume looks like a strong market signal.

… But what if half of those trades were classified using estimates rather than information reported directly by the exchange?

That distinction can change how much confidence you place in the signal.

Real-time crypto indicators often rely on trade direction to measure buying pressure, selling pressure, volume imbalance, and short-term momentum. Yet not every exchange reports which side initiated a trade.

For developers building order-flow indicators, knowing where that trade-direction information came from is just as important as knowing the price and volume.

This is where taker-side provenance becomes important.

Every executed trade has two participants: a buyer and a seller. But only one side typically takes liquidity from the order book.

That participant is called the taker or aggressor.

  • BUY: The buyer initiated the trade by taking available selling liquidity.
  • SELL: The seller initiated the trade by taking available buying liquidity.

This distinction matters because trade direction tells us something about market behavior that price and volume alone cannot.

Imagine Bitcoin trades worth $10 million in one minute. That number tells you how much activity occurred, but not who was driving it.

If most of that volume came from aggressive buyers, it may indicate buying pressure. If sellers initiated most trades, the same volume could reflect selling pressure.

Indicators such as volume delta, cumulative volume delta (CVD), and trade imbalance depend on this information.

The problem is that not all trade-direction labels come directly from exchanges.

Some exchanges explicitly identify the aggressor side of a trade. Others provide execution details without reporting who initiated it.

When that happens, data providers may estimate the trade direction using available market information.

But an estimated classification is not the same as an exchange-reported one.

CoinAPI addresses this by preserving the distinction in its taker_side field.

taker_side valueMeaning
BUYExchange reported an aggressive buy
SELLExchange reported an aggressive sell
BUY_ESTIMATEDCoinAPI estimated an aggressive buy
SELL_ESTIMATEDCoinAPI estimated an aggressive sell
UNKNOWNTrade direction was not reported and could not be confidently estimated

These five values provide more context than a simple binary BUY/SELL classification.

When an exchange doesn't report the aggressor side, CoinAPI may estimate it using a proprietary method based on the current market view. Its documentation references an extension of the approach described in Lee and Ready's 1991 research on inferring trade direction.

These estimates can make additional trades usable for directional analysis, but they remain estimates.

That's the purpose of taker-side provenance: preserving whether a classification was reported, inferred, or unavailable.

Consider two crypto exchanges showing similar buying pressure.

On the first exchange, nearly every trade direction is reported directly. On the second, a large proportion is estimated.

A dashboard might display identical buy-volume percentages for both.

But the underlying information is different.

Without provenance, developers have no way to distinguish between those two situations.

This becomes particularly important for indicators used in automated trading, execution analysis, and market microstructure research.

Volume delta measures the difference between aggressive buying and aggressive selling over a given period.

Cumulative volume delta adds those differences over time to show how aggressive order flow develops.

These indicators are only as reliable as the trade-direction classifications supporting them.

A useful approach is to calculate separate components:

MetricCalculation
Reported buy volumeSum of size where taker_side = BUY
Reported sell volumeSum of size where taker_side = SELL
Estimated buy volumeSum of size where taker_side = BUY_ESTIMATED
Estimated sell volumeSum of size where taker_side = SELL_ESTIMATED
Unknown volumeSum of size where taker_side = UNKNOWN

From there, developers can calculate reported-only delta and a combined delta that includes estimated classifications.

The final dashboard may still display one CVD line. But retaining the separate components makes the indicator easier to evaluate and debug.

Imagine Bitcoin breaks above a resistance level while aggressive buying volume increases sharply.

That could support a breakout signal.

But suppose most of the apparent buying pressure comes from estimated trade directions. The signal might still be useful, but its directional evidence is less direct than if the exchange had reported those classifications.

For automated strategies, this difference may affect whether a signal is considered strong enough to trigger an action.

The same principle applies to short-term momentum, liquidity-taking pressure, and order-flow imbalance indicators.

Provenance provides additional context for interpreting the signal rather than treating every classification as equally certain.

It can be tempting to ignore trades labeled UNKNOWN or assign them to whichever direction seems more likely.

But doing so can distort directional indicators.

An UNKNOWN classification means the exchange did not report the aggressor side and CoinAPI could not confidently estimate it.

A better approach is to track that volume separately.

Consider two one-minute trading windows:

MetricWindow AWindow B
Total volume100 BTC100 BTC
Reported-direction volume90 BTC30 BTC
Estimated-direction volume8 BTC50 BTC
Unknown-direction volume2 BTC20 BTC
Classified-volume ratio98%80%

Both windows contain the same total trading volume.

But their directional data differs considerably.

Window A has substantially more exchange-reported information, while Window B relies heavily on estimates and contains more unclassified volume.

A trading system could use these ratios as signal-quality inputs, reducing confidence when directional coverage is weak.

There is no universal threshold. The appropriate treatment depends on the market, strategy, and historical performance.

CoinAPI provides normalized trade records containing the fields developers need to build directional indicators.

A simplified trade record looks like this:

1{
2  "symbol_id": "BINANCE_SPOT_BTC_USDT",
3  "time_exchange": "2025-08-21T11:44:01.7830000Z",
4  "time_coinapi": "2025-08-21T11:44:01.9224866Z",
5  "taker_side": "BUY",
6  "price": 113095.16,
7  "size": 0.0084
8}

Four fields are particularly important:

  • price identifies the executed price.
  • size provides the traded amount in the base asset.
  • time_exchange identifies when the exchange reported the execution.
  • taker_side identifies the reported, estimated, or unknown aggressor side.

The symbol_id also matters because order-flow indicators are usually calculated for a particular exchange and instrument.

For example, BINANCE_SPOT_BTC_USDT represents a different market from COINBASE_SPOT_BTC_USD.

Combining them into one indicator requires intentional normalization and aggregation, particularly when quote currencies, liquidity, timestamps, and taker-side coverage differ.

Different data delivery methods support different parts of an indicator workflow.

Delivery MethodBest Use
WebSocketContinuously updating indicators from streaming trades
REST APIRecent trade queries, historical validation, and debugging
Flat FilesLarge historical backtests and model training

For continuously updating indicators, CoinAPI WebSocket is the appropriate choice.

Trade messages include price, size, timestamps, symbol identifiers, and taker_side, allowing developers to update volume-based indicators as messages arrive.

REST endpoints support historical and latest-trade retrieval. The latest-trades endpoints return records in descending time order and may lag execution by around one minute, so they should not be confused with a live streaming feed.

For long historical workloads, CoinAPI Flat Files provide trade datasets suited to large-scale analysis without repeatedly paginating through REST results.

Taker-side provenance is one part of reliable indicator construction. Timing is another.

CoinAPI trade records distinguish between two timestamps:

  • time_exchange represents the timestamp reported by the exchange.
  • time_coinapi represents when CoinAPI first received the trade.

For market-time indicators, developers will typically group trades using time_exchange. Meanwhile, time_coinapi can help monitor ingestion timing, freshness, and delayed messages.

These timestamps should not be treated as interchangeable.

For example, a delayed trade might arrive after an indicator has already calculated its one-second volume bucket.

Without a consistent approach to timing and late-arriving data, the same underlying trades could produce different results in live processing and historical replay.

WebSocket sequence numbers also require care. They are scoped to the connection and relevant stream context, rather than serving as permanent global trade identifiers.

One common mistake is developing an indicator using historical data with one set of classification rules, then deploying it with another.

Suppose a strategy is backtested using both reported and estimated taker sides.

In production, the developer decides to use only exchange-reported classifications.

The indicator now measures a different subset of trades, potentially changing its behavior.

The opposite can happen too.

A strategy calibrated on reported-only data may behave differently when estimated classifications are added to its live inputs.

For more consistent results, developers should preserve the original taker_side values and use the same classification rules in both backtesting and production.

It's also worth comparing indicator behavior across exchanges, symbols, and historical periods.

Taker-side availability can vary between venues and instruments. Changes in the proportion of reported, estimated, and unknown volume can affect an indicator even when the underlying trading activity looks similar.

A strong backtest should therefore examine not just whether buying pressure predicted price movements, but how much of that measured buying pressure was directly reported by the exchange.

Reliable indicator pipelines don't need to be unnecessarily complicated. A few design choices can preserve important information.

  1. Keep all five taker-side values. Don't convert reported and estimated classifications into the same binary field during ingestion.
  2. Track reported and estimated volume separately. Combine them only when the indicator's logic calls for it.
  3. Measure unknown volume. Use classified-volume and reported-volume ratios to assess directional coverage.
  4. Keep timestamps consistent. Define how trades enter time buckets and how delayed messages are handled.
  5. Validate each market independently. Don't assume the same direction-classification quality across exchanges.
  6. Match backtesting and production rules. Use comparable classification and aggregation logic in both environments.

These decisions make indicators easier to audit, compare, and maintain as market conditions and available data change.

CoinAPI provides trade data with taker_side values that distinguish exchange-reported classifications, estimated classifications, and unknown direction.

Developers can use WebSocket feeds for live indicators, REST for historical analysis, and Flat Files for larger backtesting workloads.

Build indicators that measure not just market pressure, but the quality of the data behind it.

Explore CoinAPI Market Data API to access normalized crypto trade data across exchanges and start building with CoinAPI.

Recent Articles