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:
- Imbalances find the price levels inside each bar where one side of the order flow clearly dominated.
- Clusters group repeated imbalances at nearby prices into a single absorption zone.
- Absorption logic then watches each zone and asks the key question: did the aggressive flow win, or was it absorbed?
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:
- Ring only, no diamond: earliest stage (Live Warning)
- Hollow diamond: candidate (early, not yet confirmed)
- Faded filled diamond: provisional (likely to confirm soon)
- Solid filled diamond: confirmed absorption
- Solid diamond with an outer ring: strong confirmed absorption
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
- Bearish absorption → OrangeRed. Aggressive buying was absorbed by hidden sellers. Buyers exhausted themselves into a wall. Downside pressure is the expectation.
- Bullish absorption → LimeGreen. Aggressive selling was absorbed by hidden buyers. Sellers exhausted themselves into a wall. Upside pressure is the expectation.
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:
- Aggressive buyers lift the offer over and over, eating contracts, but a wall of hidden sellers refills the offer as fast as the buyers eat it. The aggression is absorbed. When the buyers run out of conviction, price falls. There are no buyers left and plenty of sellers.
- Aggressive sellers dump into the bid over and over, but hidden buyers refill the bid just as fast. The aggression is absorbed. When the sellers exhaust, price rises. The bid held like a fortress.
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.
- Live Warning: earliest sign. The read has crossed the warning threshold. The zone is fresh, defense is partial, no turn is visible yet. Treat as "watch this level." Drawn as a ring only.
- Candidate: stronger evidence is present: a failed break, a small opposing response, DOM defense or a reclaim. Treat as "this level is active." Drawn as a hollow diamond.
- Provisional: the wait period has elapsed and the absorption check has fired, but full confirmation is still pending. Treat as "tradable with confirmation." Drawn as a faded filled diamond.
- Confirmed: the checks passed: a failed break plus a price reaction or follow-through. Treat as "absorption proven." Drawn as a solid filled diamond.
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:
- Weak Threshold is how far price would have needed to travel to break the zone. If price stayed inside or only barely exited, the absorption is at least weak: something held.
- Strong Threshold is how far price reversed in the opposite direction after absorption. If price reversed beyond this distance from the zone, the absorption is strong: something held and then bounced.
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.
- Min Volume Floor and Min Cluster Volume Floor set the lower bounds. Recommended starting points are about 50% of Min Volume and about 75% of Min Cluster Volume.
- Use Day Factor additionally adapts to the overall pace of the current day, comparing today's cumulative volume to the typical cumulative volume at the same time. It helps on unusually quiet days and half sessions and never raises thresholds above your anchor values.
- Adaptive Label shows a small draggable status box with the current adaptive factor and the effective thresholds. Most users will not need it.
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:
- If Ignore Session Filter is on, all session times are bypassed. Reads can occur around the clock.
- If it is off and at least one window is enabled, only reads inside an active window are kept.
- If it is off and both windows are disabled, DOM markers will not appear (DOM is strictly session-gated). Absorption markers can still appear, because with no window configured the absorption logic applies no gating.
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.
- 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.
- 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.
- 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
- Absorption: aggressive trading volume that did not move price, because hidden resting liquidity or counter-flow absorbed it.
- Bid imbalance: buy-side dominance: buy volume at a price much larger than sell volume one level below.
- Ask imbalance: sell-side dominance: sell volume at a price much larger than buy volume one level above.
- Cluster: a group of imbalances close in price and time that together form an absorption zone.
- Live Warning: earliest stage; a ring only. The read has crossed the warning threshold but no further requirement yet.
- Candidate: second stage; a hollow diamond. Stronger evidence is present and, if required, DOM defense is in place.
- Provisional: third stage; a faded filled diamond. The wait period has elapsed and the absorption check fired, but full confirmation is pending.
- Confirmed: fourth stage; a solid filled diamond. The final check fired and the details are frozen.
- Strong absorption: a confirmed read where price reversed at least the Strong Threshold beyond the zone.
- Weak absorption: a confirmed read where price held inside or barely exited the zone, without a strong reversal.
- DOM (Depth of Market): resting liquidity in the order book across multiple levels.
- DOM Defense: current order-book liquidity on the absorbing side exceeding its rolling baseline by the DOM Defense Multiplier.
- Peak Signal Score: the highest score a read reached during its lifetime. Sticky; never decreases.
- Absorbed aggression: the aggressive contracts that were absorbed at the zone; shown on the compact ABS label.
12. Changelog
Version 1.2.0 (September 2026 build)
- Settings per instrument now come from the Flow.42 templates (Section 8).
- Section 5 explains Tick Replay and history. A reload reproduces the live outputs.
- Unlimited look-back on all outputs. No messages in the NinjaScript Output window.
Version 1.1.0
- Automation outputs for BloodHound and similar systems, documented in Section 5: a long output, a short output, and a combined one.
- Note on reading the direction, which is the trade direction and not the raw bid or ask side.
Version 1.0.0
Initial public release of the AbsorptionMap User Guide.
- Stable cluster identity that does not drift across detection cycles.
- Progressive read lifecycle: Live Warning, Candidate, Provisional, Confirmed, plus a Strong tier.
- Optional Adaptive Scaling for time-of-day and day-pace volume.
- DOM Defense confluence with a rolling baseline and persistence filtering.
- Persistent marker cache so reads survive a chart reload.
- Optional Flow.42 AuctionEngine integration that dims counter-read markers.
- Suggested starting settings for ES, NQ, and CL.
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.