Version 1.1.0 · NinjaTrader 8 Context first. Pressure second. Execution last. Trade less. Trade better. Trade with clarity.

© 2026 TTW Trading Systems PTE. LTD. · Flow.42 Analytics · All rights reserved.


About this guide

This guide explains what Flow.42 AbsorptionMap shows on your chart, the ideas behind it, and every setting you can change. It is written for traders, not programmers. You do not need to know anything about the internals to use the tool well.

AbsorptionMap is a context and visualization tool. It highlights price areas where aggressive buying or selling was absorbed instead of moving price. It is not an automated trade signal and does not tell you when to buy or sell. Use it as one input in your own process.


1. What AbsorptionMap does

AbsorptionMap finds and marks the price levels where aggressive market participation was absorbed by hidden counter-flow: the moments where buyers pushed and pushed but price did not move up, or where sellers hammered down without making new lows.

It reads the market in three layers:

An optional DOM Defense layer reads the live order book (Level 2 / Market Depth) and checks whether the absorbing side is also visible as unusually heavy resting liquidity defending the level.

AbsorptionMap is not a standalone entry trigger. It shows where a level was likely defended, where a turn may be forming, and where price respect is meaningful.


2. What you see on the chart

AbsorptionMap can draw five things:

1. Diamond markers sit at the absorption price level. The shape and fill show how mature and how strong the read is:

2. Cluster background tint colors the underlying zone in a faded absorption color so the level stays anchored on the chart as price moves away.

3. Compact ABS / DOM label beside the diamond shows the absorbed aggression (ABS) and, when present, the DOM defense (DOM) at a glance.

4. DOM Defense label appears above the zone when the order book defended the level with significantly above-average liquidity.

5. Hover tooltip appears when your mouse approaches a marker. It shows the stage, the bullish or bearish context, the absorption level and zone bounds, the absorbed aggression in contracts, and the Peak Signal Score.

Color logic

The color follows the side of the absorbed aggressor, not the side of the expected move, the same convention Volume Profile and footprint tools use. The directional read follows automatically: absorbed buyers means a bearish context, absorbed sellers means a bullish context.


3. Core concepts

3.1 What is absorption?

Picture the market as a giant auction with two sides at every price: buyers offering to lift, sellers offering to hit.

Most of the time, when one side gets aggressive, price moves. Aggressive buyers eat the offers and price ticks up. Aggressive sellers eat the bids and price ticks down. Normal behavior.

But sometimes the aggressive side pushes and pushes, and price refuses to move. Think of a child trying to push open a heavy door. He pushes once, twice, three times, and the door does not move, because someone on the other side is holding it shut.

That someone is the absorbing party:

AbsorptionMap's job is to spot these moments before the turn becomes obvious, by combining three signs: an imbalance footprint (aggressive volume stacked on one side), a failure to break (price did not move beyond the zone after the push), and optional DOM defense (the resting book is heavier than normal on the absorbing side). When all three line up, you get a high-confidence marker. When only some line up, you get an earlier, less certain read, which is why AbsorptionMap uses progressive stages.

3.2 Imbalances: the building blocks

For every completed bar, AbsorptionMap compares buy volume against sell volume diagonally between adjacent price levels.

A bid imbalance is buy-side dominance: buy volume at a price is overwhelmingly larger than the sell volume one level below. An ask imbalance is the mirror: sell volume at a price overwhelmingly larger than the buy volume one level above.

What counts as "overwhelmingly" is set by Imbalance Ratio (default 3.0: one side must be at least three times the diagonal other side).

Single imbalances are noisy. Index futures produce dozens per bar. They only become useful when they cluster.

3.3 Clusters: the absorption zones

A cluster is a group of imbalances that are close in price (within Cluster Price Tolerance ticks), happen within a short window (within Cluster Window (Bars)), and together meet a minimum count (Min Imbalances in Cluster) and total volume (Min Cluster Volume).

A cluster represents sustained one-sided pressure at one zone: the "child pushing the door" moment. The question that follows is whether the door held (absorption) or opened (continuation).

Each cluster keeps a stable identity as it is re-evaluated bar to bar, so a level can be tracked over time without losing its history.

3.4 The progressive stages

AbsorptionMap does not wait for full confirmation before showing anything. It reveals a level as it develops, so you can watch it form in real time.

Stages only move forward, never backward. Once a marker is confirmed, its details freeze so the visual does not flicker on later ticks. Live Warning is the only stage that intentionally stays live and keeps refining until it either promotes or expires. A separate hidden "disconfirmed" outcome covers levels where price clearly broke through. Those are not drawn at all.

3.5 Strong vs. weak absorption

Two thresholds, both measured in points, set the strength tier:

A strong absorption is the textbook "wall held plus bounce." A weak absorption is "wall held, price flat," useful as zone context but less actionable for entries.

Important for non-index instruments: in NinjaTrader, one point equals one full price unit. For ES that is 4 ticks; for CL it is 100 ticks. The default thresholds (2.0 / 3.0 points) are tuned for ES. CL needs far smaller values. Start from the CL template, see Section 8.

3.6 DOM Defense

DOM Defense reads the live order book and asks: is the absorbing side showing unusually heavy resting liquidity right now?

The tool learns a rolling baseline of normal order-book liquidity over DOM Baseline Seconds (default 300 = five minutes). When current liquidity on the relevant side exceeds that baseline by DOM Defense Multiplier (default 2.5×), and stays there for DOM Persistence Samples consecutive snapshots, the zone is flagged as DOM-defended.

DOM defense raises the Peak Signal Score, can be required before a Candidate is allowed (when Require DOM Defense For Candidate is on), and triggers its own DOM Defense label above the zone.

DOM defense is session-gated by design, even when the rest of the indicator runs around the clock. If you want DOM markers outside your configured session windows, turn on Ignore Session Filter.

3.7 Peak Signal Score

Every absorption read carries a score from 0 to 100 that reflects how much corroborating evidence is present. The score rises with: DOM defense on the absorbing side, a small opposing response right after the cluster, how much of the zone price reclaimed, a failed break in the original direction, and the size of the absorbed aggressive volume.

The Peak Signal Score is the highest score the read ever reached. It is sticky: it never decreases. You can filter the visible markers by it using Min Signal Score To Show: set it to 50 to hide the noisiest Live Warnings while keeping every Candidate and above.


4. Adaptive Scaling (optional)

Volume is not constant through the day. The open is loud, lunch is quiet, the close picks up again. A fixed Min Volume that is right at the open will be far too strict at lunch, and a value that is right at lunch will be far too loose at the open.

Adaptive Scaling solves this by scaling Min Volume and Min Cluster Volume automatically across the typical intraday volume curve. The values you set act as anchors for the most active phase of the session; during quieter phases the effective thresholds drop toward their floors. Load at least five days of chart history so the curve is well formed.

If you prefer a fixed, predictable threshold, leave Adaptive Scaling off (the default).


5. Sessions and automation outputs

The session filter limits when absorption reads can occur. Two windows can be configured: a Pre-Market window and an RTH (Regular Trading Hours) window.

How the rules combine:

For 24/5 instruments like CL, either turn on Ignore Session Filter or set a long RTH window that covers your trading hours.

Time format. Session times accept several formats (15:00, 3:00 PM, 15:00:00) and are read in your system's local time zone. If a value cannot be read, a warning appears in the NinjaTrader Output window at chart load.

The factory-default session times are generic placeholders in your local time. Always set them to match the instrument and time zone you actually trade. The templates described in Section 8 carry example windows in Central European Time.

Automation outputs

AbsorptionMap publishes three outputs that BloodHound and similar automation tools can read. The output names carry the BloodHound prefix for historical reasons; any tool that can bind to an indicator plot reads them the same way:

Output Value
BloodHound Absorption Long Signal +1 on a long read
BloodHound Absorption Short Signal −1 on a short read
BloodHound Absorption Signal +1 or −1, both directions in one output

The outputs are plotted transparently, so they never draw anything on your chart.

Read the direction carefully. The output gives you the trade direction, not the side of the book the imbalance sat on. Absorbed selling produces a Long output, because the sellers failed to move price. Absorbed buying produces a Short output, because the buyers failed. This is the reverse of what the raw bid and ask wording suggests, and it is also the reverse of the VolImbalance outputs, where a bid imbalance is bullish. If you build an automation template that uses both indicators, wire each one by its own output name and do not assume the two match.

Only confirmed reads fire. A provisional read can still fall away, so it never produces an output. This is deliberate. A signal that disappears afterwards is worse in a backtest than a signal that arrives late.

Expect a delay. The output appears Wait Bars bars after the cluster formed, five by default. That is the time AbsorptionMap needs in order to see whether price moved away from the zone or not.

After a reload. Confirmed reads that come back from the persistent marker cache are written onto their own bars again, so the outputs look the same after a chart reload as they did live.

History needs Tick Replay. AbsorptionMap reads trades, not bars. On historical bars the trades are only available when Tick Replay is on for the Data Series (right-click the chart, Data Series, Tick Replay). With it on, the loaded history is evaluated like a live session and the outputs are filled on every historical bar. With it off, historical bars carry no footprints, so no new reads can form on them: the only history you see are the confirmed reads that come back from the persistent marker cache, and the outputs carry exactly those. If Tick Replay is off and the cache holds nothing for the loaded history, AbsorptionMap shows one hint box on the chart and writes one line to the Control Center Log. The box is shared with VolImbalance on the same chart, so it appears once per chart. Nothing is ever written to the NinjaScript Output window.

The whole history is readable. The outputs keep their values on every loaded bar (the look-back is unlimited since the September 2026 build), so an automation tool can read a bar from earlier in the session or from a previous day, and a NinjaScript can index far back without an error.

Further values are published for other Flow.42 modules. They carry no plot and cannot be selected in BloodHound or any similar tool.


6. Practical use

Conservative entry context: only show fully formed reads. Turn off Show Provisional Marker, turn off Show Weak Absorption, set Min Signal Score To Show to 60, and turn on Require DOM Defense For Candidate. You will see fewer markers, but the ones you see are higher-quality turn levels.

Real-time scalping awareness: see reads as early as possible, accepting that some will not pan out. Turn on Show Provisional Marker, turn on Show Weak Absorption, set Min Signal Score To Show to 0, and lower Live Warning Score (for example to 30). You will see Live Warning rings fire early. Use them as alerts to watch, not as entries.

Volume-Profile / footprint companion: only highlight zones with serious absorbed volume. Raise Min Absorbed Aggression to an instrument-appropriate value, raise Min Cluster Volume, and set Min Signal Score To Show to 50. This filters micro-clusters and shows only the macro absorption walls.

Multi-instrument routine: start from the chart template for the instrument, see Section 8. The most instrument-sensitive settings are Min Volume, Min Cluster Volume, and the threshold points; tune those first.


7. Full parameter reference

Every user-facing setting is listed below, grouped by the sections you see in the NinjaTrader properties panel. "Default" is the value the indicator ships with.

01 Imbalance Filter

Setting Default What it does
Min Volume 50 Lowest trade volume needed at a price level before an imbalance can be used.
Max Volume -1 Highest trade volume allowed at a price level. Use -1 for no upper limit.
Imbalance Ratio 3.0 How many times larger one side's volume must be versus the diagonal other side to count as an imbalance. 3.0 means at least three to one. Range 1.0 to 10.0.
Zero Opposing = Extreme Imbalance On Treats zero diagonal opposite volume as an extreme imbalance, so detection still works at price extremes where one side never printed.

01a Adaptive Scaling

Setting Default What it does
Adaptive Scaling Off Scales Min Volume and Min Cluster Volume automatically with the typical intraday volume curve. Your set values anchor the most active phase. Load at least five days of history.
Min Volume Floor 25 Lower bound for the scaled Min Volume. Recommended about 50% of Min Volume.
Min Cluster Volume Floor 300 Lower bound for the scaled Min Cluster Volume. Recommended about 75% of Min Cluster Volume.
Use Day Factor Off Also adapts thresholds to the pace of the current day versus a typical day. Helps on quiet days and half sessions. Never raises thresholds above your anchors.
Adaptive Label Off Shows a small draggable status box with the current adaptive factor and effective thresholds. Most users will not need it.

02 Cluster Detection

Setting Default What it does
Cluster Price Tolerance (Ticks) 3 Maximum price distance, in ticks, for two imbalances to belong to the same cluster.
Min Imbalances in Cluster 3 Smallest number of imbalances needed to form a valid cluster. Range 2 to 20.
Min Cluster Volume 400 Smallest total cluster volume (the sum of its member imbalance volumes) before the cluster qualifies.
Cluster Lookback Bars 200 How many recent bars are scanned when rebuilding clusters. Larger values keep older clusters alive longer. Range 50 to 500.
Cluster Window (Bars) 8 Maximum bar distance between the first and last imbalance inside one cluster. Range 1 to 100.

03 Absorption Detection

Setting Default What it does
Enable Absorption Detection On Turns on the confirmed absorption check that fires after the wait period.
Wait Bars 5 Bars to wait after a cluster forms before running the final absorption classification. Range 2 to 20.
Weak Threshold (Points) 2.0 Expected move size in points. If price did not travel this far beyond the zone, the absorption can be classified as weak. One point = one full price unit (ES = 4 ticks, CL = 100 ticks).
Strong Threshold (Points) 3.0 Opposite (reversal) move size in points. If price reverses by this distance after the cluster, the absorption is classified as strong. Same points convention.
Show Provisional Marker On Shows the early faded marker before final confirmation. Turn off for a confirmed-only display.
Min Absorbed Aggression 0 Hides markers where the absorbed aggressive volume is below this value. 0 turns the filter off.
Show Weak Absorption On Shows weak candidate, provisional, and confirmed markers. Live Warning rings remain visible either way.

04 Early Absorption

Setting Default What it does
Enable Early Absorption On Turns on the Live Warning and Candidate layers, the early part of the progressive lifecycle.
Early Window Seconds 6 How many seconds after a cluster the early scorer stays active. After this, only the wait-bars confirmation can fire. Range 1 to 30.
Min Follow Through Ticks 3 Expected continuation move in ticks. If price did not travel this far in the original aggressive direction, the failed-break check raises the early score. Range 1 to 20.
Reclaim Threshold Percent 50 Percent of the zone height price must reclaim to earn a reclaim point. 50 = the middle of the zone. Range 0 to 100.
Min Opposite Response Ticks 2 Smallest move against the cluster direction needed to count a response point. Range 1 to 10.
Live Warning Score 35 Score at which the Live Warning ring appears. Range 0 to 100.
Candidate Score 60 Score at which a Live Warning promotes to a Candidate diamond. Range 0 to 100.
Min Signal Score To Show 0 Hides all markers whose Peak Signal Score is below this value. 0 turns the filter off.

05 DOM Confluence

Setting Default What it does
Enable DOM Confluence On Uses live order-book liquidity as extra context for active clusters. Requires an active session window or Ignore Session Filter = on; otherwise DOM markers will not appear.
DOM Levels 5 Number of bid and ask levels (top-N) summed for the liquidity count. Range 1 to 20.
DOM Sample Interval (ms) 500 Milliseconds between order-book snapshots. Lower is more responsive but uses more CPU. Range 100 to 5000.
DOM Baseline Seconds 300 Seconds used to learn normal order-book liquidity. The current snapshot is compared to this window's average. Range 30 to 3600.
DOM Defense Multiplier 2.5 How much heavier current liquidity must be versus the baseline to count as defense. 2.5 = 250% of normal. Range 1.0 to 20.0.
DOM Min Samples 60 Minimum snapshots before the baseline is considered valid. About 30 seconds at the default interval.
DOM Persistence Samples 3 Consecutive qualifying snapshots needed before DOM defense is marked. Filters single-tick spikes. Range 1 to 20.
Show DOM Defense Label Off Shows the separate DOM label near the marker. Requires Show Marker Details = on and an active session (or Ignore Session Filter). DOM scoring still works when this label is hidden.
Require DOM Defense For Candidate Off A promotion gate: a read can only become Candidate once DOM defense is present. Does not affect Live Warning, Provisional, or Confirmed visibility.
Hide Clusters Without DOM Defense Off A full visibility filter: clusters that never reached DOM defense are hidden completely. No diamond, ring, tint, or label. Stronger than the gate above.

06 Visualization

Setting Default What it does
Show Diamond Markers On Master switch for all cluster-bound visuals. When off, no diamonds, rings, or tinted zones are drawn (the background tint is suppressed regardless of its own setting). DOM labels are controlled separately.
Recolor Cluster Background On Tints the cluster zone with the absorption color. This is the most visually expensive single feature.
Diamond Size (Pixels) 12 Size of the diamond marker in pixels. Range 5 to 30.
Marker Opacity % 80 Opacity of the marker fill, 10 to 100.
Bearish Absorption Color OrangeRed Color used when aggressive buying was absorbed (bearish context).
Bullish Absorption Color LimeGreen Color used when aggressive selling was absorbed (bullish context).
Marker Background Color Black Background color behind the compact absorbed-aggression label.
Marker Font Color White Text color for the compact absorbed-aggression label.

07 Marker Details

Setting Default What it does
Show Marker Details On Shows the compact absorbed-aggression value beside each marker.
Show Detail Tooltip On Shows the full multi-line tooltip (level, zone, absorbed aggression, peak score) when you hover near a marker.

08 Persistent Cache

Setting Default What it does
Enable 5-Day Marker Cache On Saves calculated absorption and DOM events so they reappear after a chart reload.
Marker Cache Days 5 Number of calendar days to keep saved events. Older events are removed. Range 1 to 5.

09 Session Settings

Setting Default What it does
Ignore Session Filter Off When on, no session gating is applied. Reads can occur at any time. Also the simplest way to let DOM markers show without configuring any window.
Use Pre-Market On Enables the Pre-Market session window.
Pre Market Start (HH:mm) 09:00 Pre-Market start time, in your local time.
Pre Market End (HH:mm) 13:00 Pre-Market end time, in your local time.
Use RTH On Enables the Regular Trading Hours window.
RTH Start (HH:mm) 15:00 RTH start time, in your local time.
RTH End (HH:mm) 22:00 RTH end time, in your local time.

10 Auction Engine

These two settings only do something when Flow.42 AuctionEngine is on the same chart. With no engine present, they have no effect and the indicator behaves exactly as before.

Setting Default What it does
Auction Modulation Subtle Controls how AuctionEngine context affects AbsorptionMap markers. Markers aligned with the auction read (continuation) stay at full opacity; counter-read markers are dimmed: slightly where the location still supports the read, strongly once the location threatens it. Off = no dimming. Options: Off, Subtle, Strong.
Auction Context Live Which auction read drives the dimming. Live = the engine's current read, applied to all markers (matches live trading). Historical = each marker is judged by the auction as it was at its own bar, so you can study past behavior, including on a closed market. Historical applies no dimming to bars older than the engine's history window.

8. Starting points per instrument

Do not copy settings from a document. Every Flow.42 release comes with chart templates and indicator templates for the instruments we trade ourselves: ES, MES, NQ, MNQ, CL, GC and BTCUSD. These templates are the reference for AbsorptionMap settings. They carry the current tuning and are updated with every release, so they do not go stale the way a table in a guide does.

The chart template is the active version. It loads the complete Flow.42 chart for the instrument, AbsorptionMap included, with the settings that fit that instrument. Right click the chart, choose Templates, then Load, and pick the Flow.42 template for your instrument.

The indicator template loads AbsorptionMap alone. Open the AbsorptionMap properties, click Template at the bottom of the dialog, then Load. The file name tells you the bar type the settings were made for, for example NQ 1min or GC 5min. On a slower chart type, scale the volume thresholds up. On a finer tick chart, scale them down.

The factory defaults in Section 7 are tuned for ES. On any other instrument, start from the template, not from the defaults. The most instrument sensitive settings are Min Volume, Min Cluster Volume and the two threshold points. If you tune anything by hand, tune those first. The threshold points follow the points convention from Section 3.5: one point is one full price unit. For ES that is 4 ticks, for CL it is 100 ticks. That is why CL needs far smaller threshold values than the index futures.

The templates are starting points, not backtested optima. Session windows in the templates are examples in Central European Time. Adjust them to your own time zone, and validate on your own setup before you commit capital.

A validation routine for any instrument

After loading a template, run a one to two week sanity check.

  1. Marker counts per RTH session. As a rough guide, ES tends to show 5 to 20 events, NQ 8 to 25, CL 3 to 15. Substantially more means your settings are too sensitive; substantially fewer means too strict.
  2. Strong-to-weak ratio. A healthy mix is roughly one strong per three to five weak. If everything is strong, raise Strong Threshold; if nothing is, lower it.
  3. Spot-check the history. Pick a few of yesterday's markers and ask honestly, "would I have traded this?" Tune from there.

9. Troubleshooting

I see no markers at all. Lower Min Volume and Min Cluster Volume to confirm the engine is producing anything. Lower Imbalance Ratio slightly (say 3.0 to 2.5). Set Min Signal Score To Show to 0 so no quality filter is hiding everything. Confirm you are inside a configured session window, or turn on Ignore Session Filter. Check the Output window for warnings.

Diamonds appear but DOM labels never do. DOM is session-gated: if both Pre-Market and RTH are off and Ignore Session Filter is off, DOM labels cannot appear. Enable a window or turn on Ignore Session Filter. Your data feed must provide Level 2 / Market Depth; some retail feeds do not. The DOM baseline also needs its minimum snapshots before defense can fire, so wait a minute or so after connecting.

A marker appears live but disappears on reload. Confirm Enable 5-Day Marker Cache is on. After an upgrade, a one-time cache rebuild is normal. New markers build from live data. Confirm Marker Cache Days is large enough for your reload pattern.

Historical bars show no reads at all; only live bars get markers. Tick Replay is off on the Data Series and the persistent marker cache holds nothing for the loaded history (a new instrument, a fresh installation, or more days than Marker Cache Days). Enable Tick Replay for computed history, or accept that reads begin with live data. The one-time hint box on the chart tells you which case you are in; nothing is wrong with the indicator (Section 5).

Nothing appears in the NinjaScript Output window any more. By design since the September 2026 build: AbsorptionMap prints nothing there. Genuine faults reach the Control Center Log, once per source and session.

Too many Live Warning rings, few promote to Candidate. Raise Live Warning Score (say 35 to 40). Turn on Require DOM Defense For Candidate to stop weak warnings promoting. On thin-book instruments, lower DOM Defense Multiplier (toward 2.0) so defense fires more often, or leave the requirement off.

All my events are weak, none are strong. Lower Strong Threshold (Points). For CL the ES default is far too large. See Section 8. Also confirm the bars under the cluster actually carry trade volume; with almost no trades, there is nothing to reverse.

The chart is slow on high-volume instruments. Raise DOM Sample Interval (500 to 750 or 1000) to lighten the order-book load. Raise Min Volume and Min Cluster Volume to track fewer imbalances. Turn off Recolor Cluster Background. The tinted zone is the single most expensive visual. If you do not need intra-bar updates, consider the OnBarClose calculation mode.


10. Performance notes

OnBarClose is the lightest calculation mode; use it if you do not need intra-bar updates. OnPriceChange is the recommended balance for live trading: it updates every tick but keeps rendering efficient. Raising Min Volume filters tiny prints early and is the cheapest way to reduce load. Rendering is the main per-frame cost, and Recolor Cluster Background is the most expensive single feature. DOM updates are throttled by DOM Sample Interval. Raise it if your feed is noisy. The persistent cache writes infrequently, so disk activity is negligible. Running many charts is fine; there is no shared per-chart state to collide.


11. Glossary


12. Changelog

Version 1.2.0 (September 2026 build)

Version 1.1.0

Version 1.0.0

Initial public release of the AbsorptionMap User Guide.


Flow.42 AbsorptionMap: cluster-based order-flow absorption detection with optional DOM defense confluence and a persistent marker cache.

© 2026 TTW Trading Systems PTE. LTD. · Flow.42 Analytics · All rights reserved.