Cival Liquidity Map — Reading the Indicator

Despite its name, Cival Liquidity Map does not measure liquidity. It does not read the order book, it does not see resting orders and it cannot identify stop orders (the panel says so: stops not identified). It maps market structure from closed candles: confirmed swing highs and lows, equal highs and equal lows, bars that poke beyond a swing and close back, bars that close through a swing with a large body, the candle range behind such a break, and what happens to that range afterwards. Every object is a rule applied to open, high, low and close. Structural liquidity here is not measured resting dollars, hidden stop inventory or liquidation pools. For observed resting quotes you need a separate depth or heatmap tool.

Everything below comes from the shipped plugin (v1.0.0). Defaults are the ones the indicator starts with.

1. What is drawn on the chart

Element Look Meaning
Equal high / equal low (EQH, EQL) one-tick-thick horizontal band with a line, running to the right Two confirmed swing highs (or lows) within the tolerance. EQH is red, EQL green.
Structural block (OB structural) shaded rectangle across a candle's high-low range, with a line at its midpoint The candle range that preceded a displacement break. Green = bullish block (the break was upward), red = bearish block.
Broken block (BRK structural) same rectangle, opposite colour A structural block that a bar has closed through; its range is re-drawn with the opposite side.
Sweep arrow (SWP high / low (price pattern)) ▼ above a bar's high (red) or ▲ below a bar's low (green) A bar traded beyond the latest confirmed swing and closed back on the other side of it.
Structure-break arrow (BOS displacement) ▲/▼ at the bar's close A bar closed through the latest confirmed swing with a body of at least 1.5 times the prior 20-bar average true range.
Information panel top-left, 50 px below the top edge Six lines (section 5).

Colors: Bull color (default green #3CB371) and Bear color (default red #FF6347). A rectangle's fill is about 20% opaque for equal levels and structural blocks and about 10% for broken blocks; the midpoint line is fully opaque. A zone that has been tested turns grey (only visible when Show touched levels is on and the zone has ended).

The remembered swing highs and lows themselves are not drawn; only equal pairs become lines (section 9 shows how to check the swing behind an arrow).

Where objects start: a line or rectangle starts on the bar after the bar that confirmed it, never on the original swing bar, so nothing is drawn with hindsight. It runs to the right edge of the chart until a bar closes through it, then it ends at that bar.

2. The rules

Let N be Pivot confirmation bars (default 3).

2.1 Confirmed swing. Look at a window of 2N+1 closed bars (7 by default). The middle bar is a swing high if its high is strictly above the high of every other bar in the window, and a swing low if its low is strictly below the low of every other bar. A tie disqualifies it. The swing is confirmed only when the last bar of the window closes, N bars after the middle bar. The indicator remembers only the latest confirmed swing high and the latest confirmed swing low.

2.2 Equal highs / equal lows. When a new swing high is confirmed and the remembered previous swing high is within Equal high/low tolerance (ticks) (default 2 ticks; 0 means exactly equal), an EQH line is drawn at the new swing's price. The same for lows (EQL). The tolerance is in ticks, so on a market with a very small tick relative to price (the demo has a 1-dollar tick on a BTC price near 81,000) a 2-tick tolerance is a tight definition of "equal" and equal levels are rare. You may choose a wider tolerance on purpose, but that changes what "equal" means; do not change it merely to make more lines appear. After a structure break in a direction the remembered swing on that side is cleared, so no pair is formed across a break.

2.3 Sweep. A closed bar whose high is above the remembered swing high but whose close is below it gets a ▼ SWP high (price pattern) at its high. A closed bar whose low is below the remembered swing low but whose close is above it gets a ▲ SWP low (price pattern) at its low. The same swing can be swept again and again; each bar gets its own arrow. The label says "price pattern" on purpose: the indicator does not know whether any order was near that swing.

2.4 Structure break with displacement. A closed bar closes above the remembered swing high (up) or below the remembered swing low (down), and its body |close − open| is at least Displacement / prior ATR (default 1.5) times the average true range of the previous 20 bars. The ATR is the plain average of those bars' true ranges (the first of them uses high minus low; the others use the prior close). If both conditions hold, a BOS displacement arrow is drawn at the bar's close, the swing that was broken is forgotten, and a structural block is created if the next step finds a candle. A close through the swing with a smaller body does nothing.

2.5 Structural block. Among the 10 bars before the break bar, take the latest candle of the opposite colour to the break (for an upward break, the latest down candle; for a downward break, the latest up candle). The block is that candle's low-to-high range, with a line at the midpoint. It has the side of the break (green for upward) and starts on the bar after the break bar. If there is no opposite candle in those 10 bars the arrow is drawn but no block.

2.6 Closed through. Every zone ends when a bar closes beyond its far side: a green zone when the close is below its low, a red zone when the close is above its high. A wick through the zone does not end it. Equal-level lines are one tick thick, so they end on a close beyond the line (plus half a tick).

2.7 Broken block. When a structural block is closed through, the same range is drawn again as a BRK structural zone with the opposite side, starting on the next bar. A broken block is not flipped a second time; when it is closed through it simply ends.

3. Lifecycle and what is shown

State (label suffix) Meaning Drawn
New No bar has traded into the zone since it started Yes
Tested A bar's high-low range has overlapped the zone (a wick is enough; this includes the bar still forming) Yes. For this indicator a touch is information only; the zone stays until it is closed through.
Invalidated A bar has closed through the zone (2.6) No, unless Show touched levels is on. The zone then ends at that bar and is drawn grey.

Which zones are drawn: the nearest Maximum visible zones (default 12) that are still active in the visible time range. Ranking uses the distance from the last price to the zone's midpoint, divided by the zone's strength (equal levels and blocks 2, broken blocks 1), with a mild penalty for age (up to double at 1,000 bars old). Closer, stronger and younger zones are preferred. Zones that are not drawn still exist: they are still tracked (touched, closed through) and still written to the CSV zones file. Maximum visible zones only limits what is drawn.

Zone labels end with the state: EQH New, Structure zone structural Tested, and so on.

4. Text on screen

Labels are stored in short form (as in the CSV files). By default (Full analysis detail on) ATAS spells out some abbreviations on screen; with the compact display they become short descriptions.

Stored label Default on-screen text Compact display text
EQH <state> / EQL <state> EQH New / EQL Tested (unchanged) Equal highs <price> / Equal lows <price>
OB structural <state> Structure zone structural New Bullish structure zone <price> / Bearish structure zone <price>
BRK structural <state> Broken structure structural New Broken structure <price>
SWP high (price pattern) Liquidity sweep high (price pattern) High swept and rejected
SWP low (price pattern) Liquidity sweep low (price pattern) Low swept and reclaimed
BOS displacement Structure break displacement Upward structure break / Downward structure break

OB stands for order block in many trading texts; here it only means "structural block", a candle range, and carries no claim about orders. Equal levels and blocks are labelled at their midpoint price in the compact display.

5. The panel, line by line

The panel has six lines. By default only the first three are visible; untick Compact panel (title + two lines) (group Information panel) to see all of them. Until the first swing can be confirmed (7 bars with the default setting) the panel shows Cival Liquidity Map and Active • N bars • no qualifying setup yet.

# Text (example from the demo) Meaning
1 Cival Liquidity Map Title (gold).
2 Confirmed pivots: 3-bar delay Your Pivot confirmation bars setting. Swings appear that many bars after they print.
3 Active zones 10; nearest 12 shown Number of zones not yet closed through (New or Tested, including equal levels) and your Maximum visible zones.
4 EQH/EQL = equal highs/lows Legend.
5 OB/BRK = structural block / broken block Legend. On screen by default: Structure zone/Broken structure = structural block / broken block.
6 SWP = price sweep; stops not identified Legend. On screen by default: Liquidity sweep = price sweep; stops not identified.

If a CSV problem occurs, an extra line with the message is inserted as line 2.

6. Compact display (optional)

Under group 00 Chart clarity, Full analysis detail (default on) and Compact display (full detail must be off) (default on) work together. With the defaults you get everything described above. If you turn Full analysis detail off, the chart switches to a short style: at most 3 zones and 8 recent arrows (last 21 bars), short names (previous section), the large panel is replaced by a board in the top-right corner (CIVAL / CURRENT CHART READ) with one line of the form Structure levels: Above <price> | below <price> (the nearest active zones above and below the last price), and Show touched levels is ignored.

7. Alerts and CSV export

8. Settings that matter, and settings that do nothing here

Setting Effect
Pivot confirmation bars (1–50), default 3 Window of 2N+1 bars for a swing; also the delay.
Equal high/low tolerance (ticks) (0–100), default 2 How close two swings must be to form EQH/EQL.
Displacement / prior ATR (0.1–10), default 1.5 Required body size for a structure break.
Maximum visible zones (1–100), default 12; Show touched levels, default off Which zones are drawn.
Show labels, Minimum bar spacing for signal labels (pixels) (default 6), Avoid overlapping labels, Bull color, Bear color Labels and colors. Labels are hidden, never moved; arrows stay.
Show information panel, Panel top offset, Panel width, Automatic panel placement, Panel font size, Compact panel Panel display. Panel top offset applies only when automatic placement is off; width is limited to 220–700 px.
Maximum bars back, default 10,000 Only the latest N bars are processed.
No effect here: Session start, Session timezone, Initial balance minutes, Show readiness/status panel, Show bubble volume numbers, Bubble number color, Compact volume numbers Not used by this indicator (swings and zones do not depend on sessions).

Changing a calculation setting (the three structure settings or Maximum bars back) recalculates the whole history. So can source corrections, a different history prefix (loading more or fewer bars) and a change of timeframe. Panning, zooming or moving the cursor changes only what is drawn, never the swings, arrows or zone states. Hiding the panel or the labels does not remove the underlying objects or CSV rows.

9. Auditing an object: source swing, break and candle

Every object follows from a few bars you can find on the chart. The remembered swing highs and lows are not drawn (only equal pairs become EQH/EQL lines), so check them by eye. Use this when something looks surprising, or before you rely on an object.

To check Look for
A sweep arrow ▼ (high) The latest swing high before the arrow: a bar, at least N bars before the arrow bar, whose high is strictly above the highs of the N bars on each side. The arrow bar's high must be above it and its close below it. For ▲ use lows in the mirror image. The swing must already have been confirmed (N bars after it printed) before the sweep bar.
A structure-break arrow The same kind of swing; the arrow bar closes beyond it, and its body is clearly larger than the typical range of the previous 20 bars (the rule is 1.5 times their average true range by default).
A structural block The latest candle of the opposite colour among the 10 bars before the break bar. Its high-low range is the block.
The end of a block The first bar after the block started whose close is beyond its far side (below the low of a green block, above the high of a red block). A wick is not enough.
A broken block The same range as an ended block, in the opposite colour, starting on the bar after the closing bar. Original and broken blocks are told apart by the label (OB structural or BRK structural) and by the colour.

If you cannot find the source swing, break bar or candle, treat the object with suspicion and check Pivot confirmation bars, the loaded history and whether the chart has been recalculated since a setting changed.

10. Worked example — real numbers from the demo

Source. The store demo: Hyperliquid BTC perpetual, 5-minute bars (tick size 1.0) built from trades recorded by the Cival order-flow recorder, 17–21 October 2026, 1,380 closed bars (about 4.8 days). Default settings (3-bar confirmation, 2-tick tolerance, 1.5 ATR). Raw output: demo\out\liquidity-map.json; bars and the annotated excerpt: demo\web\cival-liquidity-map.json. All times are UTC on 17 October.

From swing to block. 1. The 15:55 bar printed a low of 81,258, strictly lower than the three bars either side of it. It was confirmed when the 16:10 bar closed. 2. The 16:15 bar (open 81,351, high 81,351, low 81,255, close 81,255) closed below that swing low. Its body was 96. The average true range of the previous 20 bars (computed from the demo bars) was about 52.3, and 1.5 × 52.3 ≈ 78.4, so 96 qualified: a ▼ BOS displacement was drawn at 81,255. 3. The latest up-candle in the 10 bars before the break was the 16:00 bar (low 81,318, high 81,417). That range became a red (bearish) structural block starting on the 16:20 bar.

From block to broken block. The block stayed active until a bar closed above its far side, 81,417. That happened on the 18:00 bar (close 81,473). The block was marked Invalidated and the same range, 81,318–81,417, was re-drawn as a green BRK structural zone from the 18:05 bar, 21 bars after the block had started.

Sweeps in the same stretch. The 14:15 bar (low 81,415, close 81,449) and the 14:20 bar (high 81,515, close 81,493) were each marked as sweeps because they traded beyond a remembered swing and closed back on the other side.

What the sample shows overall.

Count in 4.8 days of 5-minute bars Number
Sweep arrows 110 (67 of highs, 43 of lows), about one every 12 bars
Structure-break arrows 51 (26 down, 25 up)
Structural blocks created 51
Blocks closed through (flipped to broken blocks) 46 (the other 5 were still open when the sample ended)
Broken blocks closed through again 41 of 46
Equal-level lines (EQH/EQL) 3 (1 EQH, 2 EQL), all closed through by the end
Active zones at the end 10

Read this honestly. Sweeps are frequent, so a sweep arrow on its own is a weak piece of information. In this sample structural blocks were closed through far more often than they were left alone. A block is a record of where a candle traded, not a promise of support or resistance. This is one market over a short sample.

11. What the indicator can and cannot know

It can It cannot
Find swing highs and lows by a fixed, confirmed rule Know where stop orders, resting orders or liquidation levels are
Mark bars that traded beyond a swing and closed back, and bars that closed through a swing with a large body Say why a bar did so, or who was involved
Keep a candle range and follow it until a close goes through Say that a block will hold, bounce or break
Show an object only from the bar after it was confirmed Remove the subjectivity of what counts as "equal" (your tolerance) or "large" (your ATR multiple)
Rebuild everything from the loaded bars Show the same swings on another timeframe or history length
Show nothing when nothing qualifies Treat an empty chart as a measured zero: unavailable data or a missing swing is not evidence that nothing happened