Article contents

Evidence and scope

Exchange documentation establishes field meanings; order-flow research provides context. None of these sources verifies profitability for the proposed absorption or divergence detectors.

Data and marketsA venue-specific trade feed with reliable aggressor classification. Synchronized depth can add context; OHLCV alone cannot reconstruct true trade delta.
Research timeframesA 30-second measurement window and one-minute confirmation bars are examples. Test the actual feed granularity and latency available to the implementation.
Volume reaches 120 while delta is−80; an absorption candidate still requires a later price reclaim before a long entry.Open full-size illustration
Synthetic delta and total volume by window. The main axis is buy-taker minus sell-taker volume, not price; excursion and reclaim labels refer to the numerical example.

Practical workflow

Workflow for Absorption and CVD divergence: aggressive flow with limited price progress
The full steps appear below. At each stage, missing data or failed conditions require a recorded rejection reason.
  1. Check the feedVerify aggressor side, units and clocks.
  2. Measure separate hypothesesCompute absorption or CVD divergence without merging them.
  3. Wait for price confirmationReclaim must follow availability of the required features.
  4. Model fill and protectionUse executable quotes, spread and the event extreme.
  5. Validate out of sampleCompare with price-only behavior and latency stress.

Two different observations

Every transaction has a buyer and seller. Delta assigns a sign according to the aggressive side taking liquidity: buy-taker volume minus sell-taker volume. CVD accumulates delta from a defined reset point. Bybit’s public-trade S field denotes taker side [1]; a field with the same name in a liquidation feed can mean something else.

A bullish absorption hypothesis describes substantial aggressive selling met with limited downward progress. CVD may make a much lower low in that situation. Bullish CVD divergence instead requires a lower price low accompanied by a higher CVD value at that price low. The conditions are not interchangeable and can contradict each other.

Repeatedly replenished bids add an observation about displayed liquidity, not an identity. A disappearing quote can reflect either cancellation or execution [2]. Use absorption proxy and list the measurements rather than asserting that one institution is defending price.

Separate detectors for absorption and divergence

A proposed bullish absorption proxy operates near previously known support S. Over W=30 seconds, sell volume must exceed the past same-time 95th percentile, sell/(buy+sell) must be at least 0.70, and the downward midprice excursion from the window start must be no more than 0.15 of the preceding one-minute ATR. Require sufficient total volume and an uninterrupted feed. These thresholds are research proposals.

After the proxy, wait up to K=3 completed one-minute bars for a close above S+buffer. Enter only at a quote available after that close; place protection below the complete event minimum minus buffer. The bearish version reverses the flow and price directions.

For divergence, use two price pivot lows with left=right=2. After the second is confirmed, require P2<P1−buffer and CVD(time_P2)>CVD(time_P1)+delta_min. Compare CVD at the two price-pivot timestamps, not two independently chosen attractive CVD lows. Both points must belong to the same reset window. The second pivot becomes usable only after its two right-hand bars.

The absorption window and reclaim window also need a join rule. Store the original support, event start and minimum when arming the candidate. Do not repeatedly move the starting point to the latest heavy-selling window until a favorable rebound eventually appears.

An unclassified trade or feed gap leaves subsequent CVD incomplete even when both endpoints contain numbers. Mark the cumulative segment unavailable until a new reset or a successful reconstruction from recovered data. Compare pivots only when classified flow is complete throughout their interval. An unknown offset before both pivots can cancel mathematically, but that requires a shared offset and complete increments; this conservative baseline still requires a valid segment.

on_trade(tr):
  if tr.id in seen_ids: return
  if tr.taker_side not in {BUY,SELL} or not valid_size_and_feed(tr):
    mark_window_and_cumulative_segment_unavailable_until_reset_or_rebuild(); return
  seen_ids.add(tr.id)
  signed_size = (+1 if tr.taker_side == BUY else -1)*normalized_size(tr)
  delta_bucket += signed_size
  CVD += signed_size
on_window_close(t):
  if not full_window_and_prior_baseline_available(t): return
  absorption = near_frozen_support and total_size>=configured_minimum
  absorption &= sell_share>=0.7 and sell_size>past_p95
  absorption &= downward_excursion<=0.15*ATR_before_window
  if absorption and no_active_event:
    arm_reclaim_candidate(known_at=window_data_ready_at,expiry=fixed_deadline)
on_price_pivot_confirmation(p2,t):
  p1 = previous_confirmed_price_low(p2)
  if p1 is None or not same_cvd_reset(p1,p2): return
  if missing_cvd_at_either_pivot(p1,p2): return
  if not complete_classified_flow_between(p1.occurred_at,p2.occurred_at): return
  if not cumulative_segment_valid(p1,p2): return
  divergence = p2.price<p1.price-buffer and cvd_at(p2)>cvd_at(p1)+dmin
  if divergence and no_active_event:
    arm_candidate(known_at=received_confirmation_time(t))
# Unclassified trades never default to SELL; overlapping windows do not reset TTL.

Clocks, classification and volume units

Keep event time, receive time, trade IDs and connection state. A candle-color or uptick approximation is a different estimator; name it accordingly. In particular, it cannot reliably distinguish heavy selling from a price series that remains almost unchanged. Do not count raw trades and their aggregate representation twice.

Normalize size to a fixed unit. Coin-based and notional-based CVD can behave differently when price changes substantially. Inverse contracts require their own quantity specification rather than a universal size-times-price conversion. Percentile baselines must exclude the current measurement window.

CVD describes completed aggressive flow. OFI research motivates considering quote events as well [3], but adding L2 does not identify an iceberg owner. A bid-replenishment statistic may be useful near S, while batching and hidden liquidity make it incomplete. Preserve that distinction in the feature name and evidence statement.

Synthetic absorption winner and divergence loss

Let S=100, prior ATR=2 and buffer=0.10. In 30 seconds, buy volume is 20 and sell volume 100, giving delta−80 and sell share 83.3%. The historical sell percentile is 70. Midprice falls from 100.10 to a minimum 99.85, an excursion of 0.25, below the 0.30 limit. This qualifies as an absorption proxy even though CVD is falling sharply.

The next bar closes 100.20. A buy at 100.25, stop 99.75 and target 101.25 has risk 0.50 and reward 1.00, or 2R before costs. If the available quote is already 100.60, reward to that fixed target falls to 0.65 while risk rises to 0.85. A predeclared minimum reward/risk rule may reject the entry; the backtest cannot retain the unavailable 100.25 fill.

For a separate divergence failure, price lows are 100 and 99.50 with CVD−500 and−420 in one session. After confirmation and reclaim, a buy fills 100.15 with stop 99.40. Price continues lower and protection fills 99.35, losing 0.80. Divergence did not prevent passive bids from disappearing or a new selling wave from arriving.

Price confirmation and execution still matter

The same proxy can persist through many windows while price continues lower. Group overlapping windows into an event and specify one entry or a finite re-entry policy. Cancel on expiry, stale data, excessive spread or a predetermined further break before confirmation.

A passive limit intended to improve entry is different from buying after reclaim. Low fill probability and adverse selection can consume the apparent advantage of a better price. Replay must check the liquidity available when the order reaches the market, not only a historical last-trade touch.

Fixed-R, a known VWAP target and a structural target are separate exits. A morning trade cannot use the session’s final VWAP. Include fees, slippage and funding if a contract is held across its charging time.

Measure how much rebound occurs while waiting for pivot confirmation. A visually compelling divergence can be economically late. Report candidates whose target was already reached before the signal as missed opportunities rather than treating the earlier rebound as profit available to the confirmed strategy.

Measure the incremental value of delta

Use price-only reclaim at the same references, times and volatility as a control. Compare absorption-only, divergence-only and their combination. Adding conditions does not necessarily improve returns. Report candidates that confirm and fill, not just the win rate of the final selected trades.

Stress additional latency, for example 100–500ms where relevant to the intended system, and analyze disconnected intervals separately. Those delays are proposed tests, not universal assumptions. If one spread eliminates the result, describe that fragility.

Evaluate venues independently to distinguish local flow from a transferable signal. CVD reset, pivot delay, overlapping events and percentile estimation can change results more than the chart’s appearance. Version the preprocessing and keep insufficient-data flags visible.

Unit scenarios should include zero-volume windows, missing aggressor side, duplicate trade IDs, a reset between pivots and delayed trades arriving after a window closes. These cases test the economic interpretation of the feature, not merely whether an arithmetic sum runs without errors.

Common pitfalls

Merging the mechanisms

Absorption can coincide with a new CVD low; requiring divergence may exclude the intended phenomenon.

Treating one venue as the whole market

Another venue can have different or opposing aggressive flow.

Calling every quote reduction selling

Displayed size can disappear through cancellation; trade data is needed for aggressive delta.

Checklist before using this method

Check each item after verifying it on your data. Progress is saved in this browser; it does not certify a profitable strategy.

0/7 items

Frequently asked questions

Is high volume plus a long wick enough to prove absorption?

It is only a weaker OHLCV proxy. This definition requires classified aggressive flow and a measurement of price progress.

Can CVD divergence trigger an immediate trade?

It is a feature rather than a complete trading system. This article waits for a causal price trigger and specifies entry separately.

Research sources

Each source supports the definition or evidence described beside it. The pseudocode, synthetic examples and proposed parameters require separate validation.

  1. Public TradeBybit. Read taker side, trade time and ID fields; data documentation rather than a strategy. Checked: .
  2. OrderbookBybit. Read displayed-size, snapshot/delta and public-book limitations. Checked: .
  3. The price impact of order book eventsCont, Kukanov and Stoikov. Read flow and quote research; it does not test these absorption/CVD detectors. Checked: .

Related methods

Risk note

This content supports education and research design, not financial advice. Backtest is historical simulation, does not guarantee future performance and does not place real trades. Methods in this library are not automatically features available in the app. See methodology and learning center.

Validate rules before risking real capital

Check app support, data and individual simulated trades; advanced detectors may require a separate implementation.

Download Backtest on the App Store