# Cival Auction Structure — Guide

Release 1.0.0-atas · archive SHA-256 `e88dc88b814fc586e31d8df975f5f12dc70fc8ec3b3f80993a5587b68b9cf81b` · 203,664 bytes

Contents: install guide · reading the indicator · trading playbook · settings reference · platform compatibility

## Cival Auction Structure — Install Guide

Version 1.0.0 · file `Cival.AuctionStructure.dll` · name in ATAS: **Cival Auction Structure**

Cival Auction Structure is a compiled ATAS plugin. This guide takes you from the downloaded zip to a verified, working indicator. The full list of settings is in `02-Settings-Reference.md`.

## 1. Requirements

| Item | What you need |
|---|---|
| Platform | ATAS Platform **8.0.15 or newer**. The plugin runs on the .NET 10 runtime that ATAS ships; you install nothing else. |
| Footprint data | **Strongly recommended.** With bid/ask rows the TPO profile uses the prices that actually traded in each bar. Without them each bar is treated as if it visited every row between its low and its high; the profile is then labelled `APPROXIMATE` and no completed-session levels or failed-auction marks are published from it. |
| Bar length | Bars should be **no longer than the TPO bracket** (default 30 minutes) and should fit evenly inside it: 1, 5, 10, 15 and 30 minute bars fit a 30-minute bracket. A 60-minute bar spans two brackets and makes the profile approximate. |
| History | At least **one complete earlier session** on the chart before you expect levels (the default session is one calendar day), and preferably several. The indicator processes at most the last **Maximum bars back** bars (default 10,000). |
| Instrument | A tick size known to ATAS. The TPO row size is entered in ticks. |
| Windows | You can write to `%APPDATA%\ATAS\Indicators`. |

## 2. Install with the included script

1. **Close ATAS completely** (check the Windows task manager that no ATAS process is left; a running ATAS locks the DLL).
2. Extract `Cival-Auction-Structure-v1.0.0.zip` to a normal folder and open PowerShell in it.
3. Run:

   ```powershell
   .\ATAS\Install.ps1
   ```

   The script copies `Cival.AuctionStructure.dll` to `%APPDATA%\ATAS\Indicators`, keeps a backup of any DLL with the same name that was already there, and verifies the SHA-256 of the copied file against the value recorded in the package. If it reports a mismatch, stop and download the product again.
4. If Windows blocks the script because of the execution policy, run it for this session only:

   ```powershell
   powershell -ExecutionPolicy Bypass -File .\ATAS\Install.ps1
   ```
5. Start ATAS.

## 3. Manual install

1. Close ATAS.
2. Check the file: `Get-FileHash .\ATAS\Cival.AuctionStructure.dll -Algorithm SHA256` and compare the value with the `Cival.AuctionStructure.dll` line in `SHA256SUMS.txt`.
3. If `%APPDATA%\ATAS\Indicators\Cival.AuctionStructure.dll` already exists, copy it somewhere safe first.
4. Copy `ATAS\Cival.AuctionStructure.dll` into `%APPDATA%\ATAS\Indicators`.
5. Start ATAS. ATAS only loads the new DLL when it starts.

## 4. First load

1. Open a chart of the market you study, on a timeframe that is not longer than your TPO bracket (a 5- or 15-minute chart is typical for the default 30-minute bracket). Load several days of history.
2. Open the indicator catalog, search for **Cival Auction Structure** and add it.
3. Wait for the historical calculation to finish.
4. Check the session clock. The default session is **one calendar day starting at midnight in chart time** (**Session start (minutes after midnight)** = 0, **Session timezone** blank). For a market with another day boundary, change those two settings (see section 5).
5. The panel appears at the top-left of the chart, about 50 pixels below the top edge. A small histogram appears along the **right edge** of the chart.

**What the first panel lines mean**

| What you see | Meaning |
|---|---|
| `Cival Auction Structure` / `Waiting for closed candles / historical calculation` | No closed bar has been delivered yet. Normal for a moment after loading. |
| `Cival Auction Structure — developing` | The current session's profile is being built, bar by bar. |
| `TPOC <price> VA <low>–<high>` | Time-based value center and value area of the developing session. By default ATAS shows `TPOC` spelled out as *Time value center*. |
| `Tick size unavailable` | ATAS did not report a tick size. Nothing is built until it does. |
| `No eligible TPO profile; check rows and tick size` | A session has no usable rows (for example no bars yet in the session, or the row size is unusable). |
| `APPROXIMATE: candle range fallback` | Some bar had no footprint rows, or a bar was longer than a bracket, so the profile is an estimate. |
| `COARSE: bar spans multiple brackets` | The current bar is longer than the bracket minutes. |
| `PARTIAL: session starts before history` | The chart history starts after the session start, or bars or footprint data are missing inside the session. |

**You will see only three lines at first.** With the default **Compact panel (title + two lines)** switched on, ATAS shows only the title, the `TPOC…` line and the shape line. The data-quality lines above are further down the panel and are hidden. Untick **Compact panel (title + two lines)** in the *Information panel* group to see all eight lines; do this at least while you check that your data is good.

**On the chart.** The histogram on the right edge shows, for the *current* session, how many brackets visited each price row (gold rows were visited by exactly one bracket). Horizontal lines for the time value center and the value area edges of *completed* sessions appear from the second session onward. Small ▲/▼ marks with the label `FA prior TPO low/high` appear when a bar probes beyond the previous session's profile and closes back inside it.

## 5. Settings to touch first

1. **Session start (minutes after midnight)** (for example 570 means 09:30) and **Session timezone (blank = chart; otherwise input UTC)**. Blank timezone means the session day is cut at midnight (plus your offset) of the clock the chart shows. If you type a Windows time-zone name (for example `UTC` or `Eastern Standard Time`), the indicator treats the chart's candle times as UTC and converts them. An unknown name is rejected. If you use this, make sure your chart is displaying UTC.
2. **TPO row size (ticks)** (default 4) and **TPO bracket minutes** (default 30).
3. **Maximum visible zones** (default 12) if the chart gets crowded.
4. **Compact panel (title + two lines)**: untick while you check data quality.

## 6. Verify it works — checklist

Tick each item.

1. `Get-FileHash` of `%APPDATA%\ATAS\Indicators\Cival.AuctionStructure.dll` matches the `SHA256SUMS.txt` line.
2. After restarting ATAS, **Cival Auction Structure** appears in the indicator catalog.
3. Added to a chart, the panel title reads `Cival Auction Structure — developing` and the second line begins with the time value center (`TPOC` or *Time value center*) and `VA`.
4. A histogram is drawn along the right edge; rows visited by a single bracket are gold, others steel blue. Turning **Show TPO histogram** off removes it.
5. With **Compact panel (title + two lines)** unticked, the panel shows eight lines and the last two read `Visited prices from real footprint rows` and `Bracket counts; not volume counts` when your footprint data is complete.
6. After scrolling back to a day that has a complete earlier day before it, three lines labelled with the earlier date (time value center, time value low, time value high) start at that day's first bar. (If the earlier day was `PARTIAL` or `APPROXIMATE`, no lines are drawn by design.)
7. Changing **TPO row size (ticks)** changes the histogram resolution and the `Effective row` line.
8. With a CSV export folder set, `AuctionStructure-signals.csv` and `AuctionStructure-zones.csv` exist after the calculation finishes.

## 7. Updating

1. Close ATAS completely.
2. Extract the new zip and run its `.\ATAS\Install.ps1`. The previous same-named DLL is backed up automatically.
3. Start ATAS and re-add or reload the indicator on your charts.
4. Before updating, save a chart template and note your session settings and row/bracket sizes. If a new version renames or removes a setting, ATAS may fall back to the default for that one setting.
5. Keep the old zip so that you can return to an older version (close ATAS and copy the older DLL back).

## 8. Uninstalling

1. Remove Cival Auction Structure from your charts and templates.
2. Close ATAS.
3. Run `.\ATAS\Uninstall.ps1` from the extracted folder, **or** delete `%APPDATA%\ATAS\Indicators\Cival.AuctionStructure.dll` yourself.
4. Exported CSV files stay where you wrote them.

## 9. Troubleshooting

| Symptom | Likely cause | What to do |
|---|---|---|
| Cival Auction Structure is not in the indicator list | ATAS was open during install or not restarted; wrong folder; installer blocked | Close ATAS fully, check the DLL is in `%APPDATA%\ATAS\Indicators`, start ATAS, search for `Cival`. Use the `-ExecutionPolicy Bypass` form if the script was blocked. |
| Panel shows only three lines | **Compact panel (title + two lines)** is on (default) | Untick it. |
| `APPROXIMATE: candle range fallback` | Some bars have no footprint rows, or bars are longer than the bracket | Load footprint history for the period; use a shorter chart timeframe; or raise **TPO bracket minutes**. The flag stays for the rest of that session. |
| `COARSE: bar spans multiple brackets` | Bar duration is longer than **TPO bracket minutes** | Use a shorter timeframe or a longer bracket. |
| `PARTIAL: session starts before history` | History begins mid-session, or bars or footprint rows are missing inside the session | Load more history; check for data gaps; check the session start setting. |
| No lines for earlier sessions | Only complete, non-approximate, non-partial sessions publish levels; touched levels are hidden; only the nearest **Maximum visible zones** are drawn; or too little history is loaded | Fix the data flags above; check the loaded history, symbol and timeframe; tick **Show touched levels** to see tested ones; raise **Maximum visible zones**. Missing levels are not a measured zero: they mean the data did not qualify. |
| A row's count looks lower than the number of candles that visited it | The count is the number of different time brackets, not candles and not volume. Repeated visits inside one bracket count once. | This is intended: ten candles visiting a price inside one bracket plus one candle in a second bracket give a count of 2, not 11. For volume at price use a volume profile. |
| The settings do not match this guide | A saved chart or template carries its own values and overrides the defaults | Open the indicator settings and compare each value with `02-Settings-Reference.md`; reset any you do not recognise. |
| No failed-auction marks | They need a complete, exact previous session, and a bar that exceeds its extreme and closes back inside | Check the flags; marks may legitimately be rare. |
| Sessions start at the wrong time | **Session start** or **Session timezone** does not match your market, or the chart is not showing UTC while a time zone is typed | Adjust **Session start (minutes after midnight)**; clear the timezone if unsure. |
| No histogram on the right | **Show TPO histogram** is off, or the panel/chart area is very small | Tick it. |
| DLL is locked during install or update | An ATAS process is still running | Close ATAS, end leftover processes, run the installer again. |
| Settings reset after an update | A setting was renamed or changed in the new version | Re-enter your settings from your notes; load your saved template. |
| CSV files do not appear | Folder blank or not writable; calculation not finished | Set a writable folder; check for a `CSV export failed:` line in the panel. |
| Values changed after reloading the chart | The history is recalculated when a setting changes or a closed bar is revised, and a different history length changes which sessions are complete | Note history range and settings with any screenshot you keep. |

Still stuck? Email `support@civalsystems.com` with the product version (`1.0.0`), your ATAS version, a screenshot with the panel expanded and what you expected to see.



## Cival Auction Structure — Reading the Indicator

Cival Auction Structure builds a **TPO (time-price opportunity) profile** for each session. A TPO profile answers "how long did the market spend at each price?", not "how much traded?". The unit is the **time bracket** (default 30 minutes): a price row's count is the number of *different* brackets in which that row was visited. Two visits inside the same bracket count once; a huge volume in one bracket still counts once. For volume at price use a volume profile; the two are complementary.

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 | Where | Meaning |
|---|---|---|
| **TPO histogram** (**Show TPO histogram**, default on) | along the **right edge** of the chart, for the *developing* session | One thin horizontal bar per price row. Its length is the row's bracket count (100 px for the busiest row, others in proportion, at least 1 px). **Gold** = visited by exactly one bracket (a single print); **steel blue** = two or more. |
| **Completed-session lines** | start at the first bar of the session *after* the one they describe, run to the right edge | Three lines per completed session: **TPOC** (time value center), **TVAL** (value area low), **TVAH** (value area high), each labelled with the date of the session start, e.g. `TPOC 10-18`. |
| **▲ / ▼ with `FA prior TPO low` / `FA prior TPO high`** | at the bar's low (▲) or high (▼) | Failed-auction mark (section 6). |
| **Information panel** | top-left, 50 px below the top edge | Eight lines about the developing session (section 7). |

Colors: lines and arrows use the **Bull color** (default green `#3CB371`) or **Bear color** (default red `#FF6347`). TVAL is always green and TVAH always red. TPOC is green if the prior session's TPOC is *below* the new session's first open and red if it is above. The line is a 1-tick-thick band with a faint fill (the TPOC fill is twice as opaque) and a 1-pixel line at the exact price. A level that has been tested turns grey.

Labels are drawn above the line in the form `<name> <MM-dd> <state>`; by default ATAS shows the names spelled out: `TPOC` as *Time value center*, `TVAL` as *Time value low*, `TVAH` as *Time value high*. The same expansion applies to the panel text. Nothing is drawn for the *developing* session's TPOC or value area except the histogram and the panel; its lines only appear after the session ends.

## 2. The session

The session is a **daily window**: it starts **Session start (minutes after midnight)** (default 0) after midnight and lasts 24 hours.

- **Session timezone** blank: the cut is made on the clock the chart shows.
- **Session timezone** filled with a Windows time-zone name (for example `UTC`, `Eastern Standard Time`): the indicator treats the chart's candle times as UTC, converts them to that zone, cuts the day there and converts back. An unknown name is rejected when you type it. If you use this, display your chart in UTC.
- The date in a level label (`MM-dd`) is the date of the session's start. Crypto and 24-hour markets have no universal session; the daily cut is your analytical convention.

**Initial balance minutes** appears in the settings list but this indicator does not use it.

## 3. How the profile is computed

1. **Brackets.** For each closed bar, `bracket = floor((bar open time − session start) ÷ TPO bracket minutes)`. Brackets are measured from the session start, not from the clock hour.
2. **Rows.** The price grid is `tick size × TPO row size (ticks)` (default 4 ticks). A price belongs to the row `floor(price ÷ row) × row`; the row is identified by its **lower edge**. If a session's range would need more than 2,000 rows, the row size is doubled (repeatedly) and the existing visit sets are merged by union, so no bracket is ever counted twice. The panel's `Effective row` line shows the row size actually in use.
3. **Visited prices.** With footprint data, every price that traded volume in the bar (grouped into rows) records the bar's bracket. If a bar has no footprint rows, every row between its low and its high records it, and the profile is marked `APPROXIMATE`.
4. **Count** of a row = number of distinct brackets that visited it. Ten candles that all visit a row inside one bracket, plus one candle that visits it in a second bracket, give that row a count of **2**, not 11. Footprint volume only decides *which* rows a bar visited; it is grouped into rows, never added to the count.
5. **TPOC (time value center)** = the row with the highest count; ties go to the **lowest** price.
6. **Value area (TVAL–TVAH).** 70% of the total of all row counts. Starting at the TPOC row, the area grows one row at a time towards the neighbour with the larger count (both when they are equal) until it holds at least 70%.
   - The edges shown are placed **half a row** from the row prices: TVAH is at the *middle* of the highest value-area row and TVAL half a row *below the bottom* of the lowest value-area row. With 4-dollar rows that is a 2-dollar offset. Treat the two lines as placed within about one row of the true value-area edge.
7. **Single prints** = rows with a count of exactly 1 (anywhere in the profile, not just at the edges).
8. **Shape candidate**, tested in this order (later rules override earlier ones):

| Rule | Label |
|---|---|
| TPOC sits above 70% of the way up the profile's range | `P candidate` |
| TPOC sits below 30% | `b candidate` |
| otherwise | `D/balanced candidate` |
| At least 10 rows, at least 5 brackets used, and at least 80% of rows have a count of 2 or less | `Trend / low-overlap candidate` |
| Two peaks (each at least half the busiest count, at least three rows apart) with a valley between them no higher than half of the lower peak | `B / double-distribution candidate` |

9. **Auction edges** (low and high separately): if the extreme row has a count of 2 or more, `Poor low candidate` / `Poor high candidate`. If the extreme row has a count of 1 *and* the next row inward is adjacent and also has a count of 1 (a tail of at least two single rows), `Excess low candidate` / `Excess high candidate`. Otherwise `Edge unresolved`.

All shape and edge labels are **rule-based candidates** that change as the session develops; they are not statements about who is buying or selling.

## 4. Lifecycle of a session level

| Stage | When | What you see |
|---|---|---|
| Developing | during the session | Panel and histogram only. |
| Published | on the first closed bar of the next session, **only if the finished profile was complete and exact** (not `PARTIAL`, not `APPROXIMATE`) | Three lines (TPOC, TVAL, TVAH) begin at the first bar of the next session. |
| **New** | no candle has reached the level yet | Coloured line, label `<name> <MM-dd> New`. |
| **Tested** | the high-low range of a bar (including the bar still forming) overlaps the level's 1-tick band | By default the level disappears. With **Show touched levels** on, it is drawn grey up to that bar with its label removed. |

There is no "invalidated" state for these levels: a Tested level simply stops mattering to the indicator.

**Live versus recalculated.** When history is calculated (on loading or after any recalculation) a level is tested against its own first bar as well. In live trading the first bar of the new session is not tested at the moment the level is created, only the bars after it. A level that the first bar's range covered can therefore show *New* live and *Tested* after a reload.

Which levels are drawn: the nearest **Maximum visible zones** (default 12), ranked by distance from the last price divided by strength (TPOC counts as strength 2, the others 1), with a mild penalty for age (up to double at 1,000 bars old). Three levels per session means about four sessions of levels at the default. Levels that are not drawn still exist: they are still tracked (tested) and still written to the CSV zones file. **Maximum visible zones** only limits what is drawn.

## 5. Data-quality flags

| Flag (panel text) | Triggered when | Effect |
|---|---|---|
| `APPROXIMATE: candle range fallback` | a bar had no footprint rows (candle range used), **or** a bar is long enough to span more than one bracket (it is counted only in the bracket of its open) | The flag stays for the rest of the session. The finished profile publishes no levels and cannot serve as the reference for failed-auction marks. |
| `PARTIAL: session starts before history` | the first bar processed opens after the session start; a bar is missing inside the session; a bar's footprint volume differs from its candle volume by more than 1%; or the row budget was exceeded | Same effect as above. The wording is generic: the cause may be a gap, not only the start of history. |
| `COARSE: bar spans multiple brackets` | the bar that was just processed is longer than **TPO bracket minutes** | Shown instead of the PARTIAL line while it applies. |

If none applies the last two panel lines read `Visited prices from real footprint rows` and `Bracket counts; not volume counts`.

## 6. Failed-auction marks

For every closed bar of a session, the indicator compares it with the **previous** session's finished profile, if that profile was complete and exact.

- Let *top* be the **lower edge of the previous profile's highest row** and *bottom* the lower edge of its lowest row.
- If the bar's **high is above *top* and its close is below *top***, a ▼ `FA prior TPO high` mark is placed at the bar's high.
- If the bar's **low is below *bottom* and its close is above *bottom***, a ▲ `FA prior TPO low` mark is placed at the bar's low.

The mark is created when the bar closes. Several marks can appear in one session. Because *top* is the **bottom edge** of the highest row, a bar can be marked while its high is still below the previous session's exact high, by less than one row. A mark records that one bar probed beyond the prior extreme and closed back inside; it says nothing about what happens next.

## 7. The panel, line by line

The panel has eight lines. By default only the first three are visible; untick **Compact panel (title + two lines)** (group *Information panel*) to see all of them.

| # | Text (example from the demo, final bar) | Meaning |
|---|---|---|
| 1 | `Cival Auction Structure — developing` | Title (gold). |
| 2 | `TPOC 82768 VA 82694–83906` | Time value center and value area of the developing session (price units). |
| 3 | `B / double-distribution candidate; single rows 54` | Shape candidate (section 3) and the number of single-print rows. |
| 4 | `Low visits 1 / high visits 1` | Bracket count of the lowest and the highest row. |
| 5 | `Edge unresolved / Excess high candidate` | Low-edge and high-edge classification. |
| 6 | `Effective row 4; auto grouping` | Row size in price units actually used. The words "auto grouping" are always printed; compare the number with your setting to see whether rows were widened. |
| 7 | `Visited prices from real footprint rows` | Or `APPROXIMATE: candle range fallback`. |
| 8 | `Bracket counts; not volume counts` | Or `PARTIAL: session starts before history`, or `COARSE: bar spans multiple brackets`. |

If no profile can be built, the panel shows `No eligible TPO profile; check rows and tick size` (or `Tick size unavailable`). If a CSV problem occurs, an extra line with the message is inserted as line 2.

## 8. 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 levels and 8 recent signals (last 21 bars), short names (*Time value center*, *Value area low*, *Value area high*, *High rejected (time profile)*), the large panel is replaced by a compact board in the top-right corner (`CIVAL / CURRENT CHART READ`) with one line such as `Time profile: Value 82694–83906; center 82768`, and **Show touched levels** is ignored.

## 9. Alerts and CSV export

- **Alerts on closed signal / level touch** (default off) plays **Alert sound** (default `alert1`) when a failed-auction mark closes (`Cival FA prior TPO high: <price>`) or when a level is first touched (`Cival level touched: <label> <low>–<high>`). These are observations, not instructions. Recalculating the history does not fire alerts for old marks.
- **CSV export folder (blank disables)** writes `AuctionStructure-signals.csv` (columns `time, available_time, bar, price, side, kind, label, volume`; `kind` is `failed-auction`, `volume` is always 1; signals older than the last 1,000 retained bars are omitted) and `AuctionStructure-zones.csv` (columns `available_bar, low, high, poc, side, label, state, touched_bar, invalidated_bar`). `side` is 1 (green) or −1 (red). The files are rewritten when history finishes calculating and when a new signal appears; a level's later *Tested* state shows up in the file only at the next write. Use a separate folder per chart.

## 10. Settings that matter, and settings that do nothing here

| Setting | Effect |
|---|---|
| TPO row size (ticks), default 4 | Row height = ticks × tick size. |
| TPO bracket minutes, default 30 | Bracket length. |
| Show TPO histogram, default on | The right-edge histogram. |
| Session start (minutes after midnight), Session timezone | The session cut (section 2). For example a start of 570 means 09:30. |
| 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 visible zones, Show touched levels, Show labels, Minimum bar spacing for signal labels, Avoid overlapping labels, Bull color, Bear color | Which lines and marks are drawn, and their colors. |
| Maximum bars back, default 10,000 | Only the latest N bars are processed. |
| **No effect here:** Initial balance minutes, Show readiness/status panel, Show bubble volume numbers, Bubble number color, Compact volume numbers | Not used by this indicator. |

Changing a calculation setting (row size, bracket minutes, session settings, Maximum bars back) recalculates the whole history. The indicator also recalculates when ATAS revises an already-closed bar. Source corrections, a different history prefix (loading more or fewer bars, which changes which sessions are complete), changes to any calculation setting and a change of timeframe can all legitimately change the results. Panning, zooming or moving the cursor changes only what is drawn, never the profile or the closed-bar marks. Hiding the panel, the histogram or the labels does not remove the underlying levels, marks or CSV rows.

## 11. Worked example — real numbers from the demo

**Source.** The store demo: Hyperliquid BTC perpetual, **15-minute bars** (tick size 1.0) built from trades recorded by the Cival order-flow recorder, 17–21 October 2026, 459 closed bars. Settings: **TPO row size (ticks)** 4 (so 4-dollar rows), **TPO bracket minutes** 30, session start at midnight in chart time. Raw output: `demo\out\auction-structure.json`; profile data: `demo\web\cival-auction-structure.json`.

**One session.** The 18 October session (96 bars, 48 half-hour brackets) built this profile:

| Item | Value |
|---|---|
| TPOC | **81,700**, the busiest row, visited in **14** of the day's 48 brackets |
| Value area (as shown) | **81,194 – 82,222** (the value-area rows run from 81,196 to 82,220; section 3) |
| Range of rows | 80,644 to 82,268 (407 rows of 4 dollars) |
| Single-print rows | 38 |
| Shape | `D/balanced candidate` (the TPOC sat at 65% of the range, between the 30% and 70% limits) |
| Edges | `Excess low candidate` / `Excess high candidate`: at each end the extreme row and the next row inward were visited by one bracket only |

**Levels carried forward.** Because that profile was complete and used real footprint rows, three lines were published on the first bar of 19 October: `TPOC 10-18` (81,700), `TVAL 10-18` (81,194) and `TVAH 10-18` (82,222). The TPOC line is green because the new session opened above it. In the recalculated history `TVAH 10-18` is already *Tested* on that same first bar, because the bar's range reached 82,222, so it is not drawn by default.

**Failed-auction marks.** The 18 October profile's highest row is 82,268. During 19 October six bars (one per mark, at their highs 82,389; 82,288; 82,419; 82,310; 82,378; 82,275) exceeded 82,268 and closed back below it. Each got a `FA prior TPO high` mark. The whole demo sample produced 30 failed-auction marks, 12 session levels (4 completed sessions × 3) and 5 profiled sessions (the last still developing).

**What happened next, as an example of the limits.** The 19 October profile itself came out as `b candidate`: TPOC 82,008, value area 81,858–82,606, 24 single rows, with rows reaching 83,140. Value had moved up, and price traded well above the level where the six marks were placed. The marks did not call the top. They recorded that individual bars closed back under the prior high.

**The last panel** of the sample (the still-developing 21 October session) is quoted in section 7.

## 12. What the indicator can and cannot know

| It can | It cannot |
|---|---|
| Count how many brackets visited each price row, from real footprint rows when available | Tell you who was buying or selling, or whether positions were opened or closed |
| Show where the market spent its time and where it moved through quickly | Reconstruct the path *inside* a bar: a long bar is counted in one bracket only (and flagged) |
| Publish prior-session levels only from complete, exact profiles | Make a thin or early-session profile meaningful: labels change as the session develops |
| Mark bars that probed beyond a prior profile's extreme row and closed back inside | Say that a mark leads to rotation, or that a level will hold |
| Run on any session definition you give it | Know your exchange's real session: crypto and 24-hour markets use your convention |
| Say "no profile" or "no levels" when the data does not qualify | Treat that as a measured zero: unavailable data is not evidence that nothing happened |



## Cival Auction Structure — Trading Playbook

This playbook describes how a discretionary order-flow trader can *think* with the time-based value that Cival Auction Structure maps, and where the indicator's own reference prices sit. It is not a list of trades to take. Nothing the indicator draws is an order, a target or a prediction. Every playbook ends with the conditions that cancel it.

## Context first

- **Time at price is not volume at price.** A TPO row's count is the number of different time brackets that visited it. It shows where the market *accepted* price for a long time and where it moved through quickly (single prints). It does not show who was buying or selling, or where anyone's stops are. Footprints show executed aggression, not positions.
- **Start with the data flags.** Open the panel in full (untick **Compact panel (title + two lines)**). If the developing session is `APPROXIMATE`, `COARSE` or `PARTIAL`, treat its numbers as rough, and expect the finished session to publish no levels. The prior-session lines you see on the chart only exist because that earlier profile was complete and exact.
- **The session is your convention.** In 24-hour markets there is no official session. Check **Session start** and **Session timezone** until the day boundary is the one you actually trade.
- **Early in a session everything is provisional.** Shape and edge labels change as brackets accumulate. A profile with only a few brackets says little.
- **Use it with other context**: a volume profile or the volume-weighted average price, the previous session's high and low, higher-timeframe structure, scheduled news, and order-flow evidence from your footprint. No single reference is a reason to trade.
- **Reference prices are not orders.** The lines are reference prices drawn from a count. TVAL and TVAH sit within half a row of the row edges, so treat them as placed within about one row of the true edge.

## Playbook A — The prior session's value as a map

**Setup.** A new session has just started. The prior session's three lines are on the chart: the time value center (TPOC), value area low (TVAL) and value area high (TVAH), each labelled with the earlier date.

**What must be true on the chart.**
- The three lines exist (so the prior profile was complete and exact) and the current session is not flagged.
- You have noted where the session opened: above TVAH, inside the value area, or below TVAL.
- The line you care about is still *New*: no bar has traded through it (tested lines are not drawn unless **Show touched levels** is on).

**Reference prices.** The prior TVAH, TVAL and TPOC, and the developing TPOC and value area in the panel (`TPOC … VA …`).

**How a trader might frame it.**
- *Open inside prior value:* a discretionary trader may treat the prior edges as the range to watch and wait for a closed bar and bracket that trades outside and is accepted, or one that probes and returns.
- *Open outside prior value:* the question is acceptance. Several closed bars (and brackets) holding outside the prior edge point to acceptance; a close back inside points to rejection. The trader decides in advance what "accepted" means, for example a number of closed bars or brackets.
- *Entry, stop, management* are the trader's own: for instance an entry after a closed bar confirms what the plan describes, a stop beyond the reference line or the rejecting bar's extreme, and the next line (TPOC or the opposite edge) as a reference for where to reassess, not as a promised target.

**Cancel or stand aside when:** price closes beyond your stop reference; the session or prior session is flagged `APPROXIMATE`, `COARSE` or `PARTIAL`; the session cut is wrong for your market; the chart is crowded and the lines you rely on are beyond **Maximum visible zones**; scheduled high-impact news is due; or the level was already tested on its first bar (it has already traded).

## Playbook B — A failed-auction mark at the prior extreme

**Setup.** A ▼ `FA prior TPO high` (or ▲ `FA prior TPO low`) mark appears on a bar that moved beyond the previous session's profile extreme and then closed back inside.

**What must be true on the chart.**
- The mark is on a *closed* bar. Marks only exist when the previous profile was complete and exact.
- This is the first probe at that extreme, or you have counted how many marks already appeared there (the demo sample had six `FA prior TPO high` marks in one session).
- You can see where the mark sits relative to the prior TVAH/TVAL and TPOC.

**Reference prices.** The mark price (the bar's high for a ▼, its low for a ▲) is the invalidation reference: price closing beyond it contradicts the idea. The prior session's TVAH and TPOC (or TVAL and TPOC) are where a move back into prior time-based value would meet earlier acceptance. The mark compares against the prior profile's extreme row, which is not drawn as a line: it lies at the previous session's high or low on your chart, and the comparison uses the lower edge of the highest row, so a mark can appear slightly under the exact prior high.

**How a trader might frame it.** A mark is one bar's rejection. Some traders wait for the next closed bar to stay inside the prior profile before planning anything, define a stop beyond the mark bar's extreme plus a buffer for their market's noise, and use the prior TVAH or TPOC as places to reassess. Size, entry and management are theirs to define in advance.

**Cancel or stand aside when:** a later bar closes beyond the mark bar's extreme; further marks keep appearing at the same extreme without a move back inside (repeated probes can mean price is being accepted there: in the demo, six marks on 19 October were followed by a session that traded as high as 83,140, above the area of the marks); the developing shape reads `Trend / low-overlap candidate`; the data is flagged; or you cannot name why this extreme matters.

## Playbook C — Single prints and edge candidates as unfinished business

**Setup.** The histogram shows gold rows (visited by one bracket) at the edge of the developing profile, and panel line 5 reads `Excess high candidate` or `Excess low candidate`, with `single rows` rising in line 3.

**What must be true on the chart.**
- Enough brackets have formed for the labels to mean something. Early in a session they flip easily.
- The tail has at least two adjacent single-print rows (that is what *excess* means here).
- No data flag is active.

**Reference prices.** The tail's extreme (the end of the gold rows) and the inner edge of the tail (the first row with a count of 2 or more). The tail is an area the market traversed quickly in time terms.

**How a trader might frame it.** As a map of where the market has *not* yet spent time. A trader may watch for a return into the tail, noting whether price lingers (counts rise, the label changes to `Poor …` or `Edge unresolved`, which suggests acceptance) or moves through again quickly. A plan might place its invalidation beyond the tail's extreme.

**Cancel or stand aside when:** the edge label changes to `Poor …` or `Edge unresolved`; price spends several brackets inside the tail; the session is early; the data is flagged; or the same area was already traded through before you looked.

## Playbook D — The shape candidate as a lens on the day

**Setup.** Panel line 3 shows a shape candidate: `P`, `b`, `D/balanced`, `B / double-distribution` or `Trend / low-overlap`.

**How to use it.** Treat the label as a description of how this session's time has been distributed so far, not a forecast. It is computed only from where the TPOC sits in the range and from the pattern of counts. Compare it with where the session opened relative to the prior value (Playbook A). For example, a `Trend / low-overlap candidate` that opened outside prior value describes a day with little overlap so far; a `D/balanced candidate` that opened inside prior value describes rotation so far.

**Reference prices.** The developing TPOC and value area from line 2.

**Cancel or stand aside when:** fewer than a few brackets have formed; the label changed in the last few bars; the data is flagged; or you are using the label as the only reason for a decision.

## Combining with other context

Auction Structure answers "where did the market accept price, in time?" Pair it with something that answers a different question: volume at price (a separate volume profile), the prior day's high and low, VWAP, the footprint (do you see aggressive buying or selling at the reference?), higher-timeframe trend and the event calendar. Write down in advance which two or three things must agree for you to act, and which one disagreement cancels the idea.

## Journaling and review

For every trade or observation record: date and session; the three prior lines and the developing TPOC/VA; where the session opened; the shape and edge labels; any `FA` marks and how many were already at that extreme; data flags; what you planned (entry condition, stop, management) before acting; what happened; and whether you followed the plan. Take a screenshot with the panel expanded. Review weekly: how often did acceptance versus rejection follow the framing you used? Count cases where the data was flagged and you traded anyway.

## Mistakes to avoid

- Reading the panel in compact mode and missing an `APPROXIMATE` or `PARTIAL` flag.
- Treating TPOC or the value area as a volume level, or the lines as targets.
- Treating a single `FA` mark as a signal, and ignoring that several can appear in one session.
- Trusting shape labels early in a session.
- Forgetting that TVAL/TVAH sit within about a row of the true value-area edge, and that a failed-auction mark can sit slightly under the exact prior high.
- Using a wrong session start and then trusting the lines.
- Changing the row size or bracket length merely to make a level, a mark or a label appear. Different settings define a different profile; they are not a way to find the "real" one.
- Trading a market that was closed, thin or at news time with the same assumptions.

## Risk

Trading futures and crypto involves substantial risk of loss and is not suitable for everyone. Indicators describe what happened, not what will happen. A TPO profile, a value area, a failed-auction mark or a shape label is a description of past price and time; none of them predicts the next bar. Test any approach on market replay or a simulated account first. Size positions so that a stop-out, or a run of them, is affordable. Past observations do not predict future results. Nothing in this product is financial advice.



## Cival Auction Structure — Settings Reference

Version 1.0.0. Generated from the compiled ATAS plugin: every value below is the default a fresh instance loads with.

## Cival Auction Structure

### 00 Chart clarity

| Setting | Default | Allowed |
|---|---|---|
| Compact display (full detail must be off) | on | on / off |
| Full analysis detail | on | on / off |

### Alerts

| Setting | Default | Allowed |
|---|---|---|
| Alerts on closed signal / level touch | off | on / off |
| Alert sound | alert1 | String |

### Appearance

| Setting | Default | Allowed |
|---|---|---|
| Show TPO histogram | on | on / off |
| Show information panel | on | on / off |
| Panel top offset (pixels) | 50 | 0 – 1500 |
| Panel width (pixels) | 380 | 180 – 600 |
| Compact volume numbers | on | on / off |
| Avoid overlapping labels | on | on / off |
| Minimum bar spacing for signal labels (pixels) | 6 | 0 – 30 |
| Maximum visible zones | 12 | 1 – 100 |
| Show touched levels | off | on / off |
| Show labels | on | on / off |
| Show bubble volume numbers | on | on / off |
| Bubble number color | #FFFFFF | Color |
| Bull color | #3CB371 | Color |
| Bear color | #FF6347 | Color |

### Calculation

| Setting | Default | Allowed |
|---|---|---|
| TPO row size (ticks) | 4 | 1 – 1000 |
| TPO bracket minutes | 30 | 1 – 240 |

### Export

| Setting | Default | Allowed |
|---|---|---|
| CSV export folder (blank disables) | (blank) | String |

### Information panel

| Setting | Default | Allowed |
|---|---|---|
| Automatic panel placement | on | on / off |
| Panel font size | 13 | 10 – 22 |
| Compact panel (title + two lines) | on | on / off |
| Show readiness/status panel | on | on / off |

### Performance

| Setting | Default | Allowed |
|---|---|---|
| Maximum bars back | 10000 | 100 – 100000 |

### Session

| Setting | Default | Allowed |
|---|---|---|
| Session start (minutes after midnight) | 0 | 0 – 1439 |
| Session timezone (blank = chart; otherwise input UTC) | (blank) | String |
| Initial balance minutes | 60 | 1 – 240 |



## Cival Auction Structure — Platform Compatibility

The ATAS plugin is the reference implementation. Each port computes what its platform's data allows and labels
anything approximate or unavailable inside the indicator itself. The sections below are the READMEs that ship next
to each port's source file (`ports/<platform>/README.md`).

## TradingView (Pine Script v6)

## Cival Auction Structure for TradingView

Port of the ATAS original **Cival Auction Structure v1.0.0.0** to Pine Script v6 (`CivalAuctionStructure.pine`).

Builds a **time-price-opportunity (TPO) profile per session**: for every price row it counts the distinct time brackets
(default 30 minutes) that visited the row. These are **bracket counts, not volume**. From the profile it derives the
time point of control (TPOC), a 70 % value area, single-print rows, rule-based shape and poor/excess-edge *candidates*,
failed-auction marks against the previous completed profile, and prior-session TPOC / TVAL / TVAH levels. Everything is
computed on **closed bars**; shape and edge labels are heuristics and hypotheses, not confirmed market structure.

### Requirements

| Item | Requirement |
|---|---|
| Platform | TradingView, Pine Script v6 |
| Real visited prices | **Premium or Ultimate** plan (`request.footprint()`): rows with traded volume are the visited prices. |
| Any other plan | Runs in **APPROXIMATE** mode: visited prices come from lower-timeframe candle ranges (or the chart candle range). |
| Chart timeframe | Best at or below the bracket length (default 30 minutes). Bars that span several brackets are flagged COARSE / APPROXIMATE. |
| Chart type | Standard candles / bars. |

### Install

1. Open the **Pine Editor**, paste the full contents of `CivalAuctionStructure.pine`, **Save**, then **Add to chart**.
2. Set **TPO row size (ticks)** and **TPO bracket minutes** for the instrument.
3. Set **Session start (minutes after midnight)** and, if needed, **Session timezone** to the session you want profiled
   (blank = the symbol's exchange timezone; or an IANA name such as `America/New_York`, or `UTC-5`). A profile whose first
   bar starts after the session start (history begins mid-session, or the market opens later than the configured start) is
   flagged PARTIAL and its prior-session levels are withheld, exactly as in the original. Crypto "sessions" are your own convention.
4. Optional alerts: *Create alert > Condition: Cival Auction Structure > Any alert() function call*. Off by default.

The second panel line states the data mode: `FOOTPRINT visited prices (real rows)`, `... candle ranges - APPROXIMATE (no footprint)`
or `MIXED`.

> Verification note: the script was compiled on TradingView's servers (0 errors, 0 warnings). It has not been observed
> running on a live chart or against a Premium footprint feed in the build environment.

### Feature matrix

Values: Full / Approximate / Not available / Not ported.

| Feature | ATAS original | This port | Notes |
|---|---|---|---|
| Per-session TPO from unique bracket visits (time, not volume) | Yes | Full with footprint; Approximate without | Without footprint the visited rows are lower-timeframe (or chart) candle ranges, so interior rows with no trades count as visited. |
| Visited prices from footprint rows with volume | Yes | Approximate | TradingView returns rows at *TPO row size* directly; the original groups tick rows. Row grid alignment is assumed to be multiples of the row size. |
| Candle-range fallback | Chart candle range | Approximate | Port prefers lower-timeframe candle ranges (finer bracket assignment); falls back to the chart candle range. |
| Bracket assignment | Bar open time | Full (footprint) / Approximate (ranges) | With lower-timeframe ranges each intrabar candle is assigned to its own bracket. |
| TPOC (lowest price on ties) | Yes | Full | |
| Value area (70 %, contiguous expansion, equal sides expand together) | Yes | Full | VAL/VAH use half-row edges like the original. |
| Single-print rows (count 1) | Yes | Full | Counted in the panel; gold in the histogram. |
| Shape candidates: P, b, D/balanced, B/double distribution, trend/low-overlap | Yes | Full | Same thresholds (0.7 / 0.3, 10 rows, 5 brackets, 80 % rows with 2 or fewer, 50 % peaks). |
| Poor / excess high and low candidates | Yes | Full | |
| Adaptive row grouping when the range exceeds 2000 rows (union of bracket sets) | Yes | Full | Row size doubles; merged rows keep a true bracket union. |
| Developing profile information panel (8 lines) | Yes | Full content | Table; default *Compact panel* shows title + status + TPOC line, as in the original. |
| PARTIAL / APPROXIMATE / COARSE status labels | Yes | Full | See "Known differences" for the one change in when PARTIAL is set. |
| Prior-session levels: TPOC, TVAL, TVAH (strength 2 / 1 / 1) | Yes | Full with footprint | Withheld when the profile is PARTIAL or APPROXIMATE, as in the original. Port-only option publishes APPROXIMATE (not PARTIAL) profiles with an `(approx.)` suffix; off by default. |
| Level lifecycle: untouched until first touch, then Tested | Yes | Full on closed bars | The original also marks touches intrabar; this port updates at bar close. |
| Failed-auction marks vs previous completed profile (`FA prior TPO high/low`) | Yes | Full with footprint | Same publication rule as the levels. |
| Zone fill, level line, label with state (`New` / `Tested`) | Yes | Full | Labels use the original's expanded wording (`Time value center`, `Time value low/high`). |
| Zone ranking and *Maximum visible zones* | Yes | Full | Same rank formula; ranking uses the latest price at the last bar. Viewport-based culling is Not available (Pine cannot see the scrolled window). |
| Show touched levels | Yes | Full | Touched levels end at the touching bar, grey. |
| TPO histogram at the right edge | Yes (pixels) | Approximate | Drawn as boxes to the right of the last bar; width in bars is scaled to the largest count (port-only width input). Above 380 rows neighbouring rows are drawn as one bar. |
| Letters per bracket (A, B, C...) | Not drawn by the original either | n/a | The original shows counts as a histogram. |
| Session start / timezone | Windows timezone ids | Approximate | IANA names or `UTC+-n`. Blank = exchange timezone, not the chart's display timezone. |
| Initial balance minutes | Setting exists, unused by this indicator | Not ported | |
| Alerts on closed signal / level touch | Yes (off) | Full | `alert()` per bar close, off by default. Sound setting Not ported. |
| Chart-clarity compact mode | Yes | Approximate | Plain-language labels, 3 zones, last 8 marks. The cross-indicator "current chart read" board is Not available. |
| CSV export (signals / zones) | Yes | **Not available** | Pine cannot write files. |
| Share with Cival Decision Panel | Yes | Not ported | No cross-indicator bridge. |
| Panel pixel layout (offset, width, automatic placement) | Yes | Not ported | Replaced by *Panel position*. |
| Label overlap avoidance / minimum bar spacing | Yes | Not ported | Pixel geometry is not readable in Pine. |
| Presets / review mode | None in this indicator | n/a | |

### Settings mapping

Names and groups mirror the ATAS display names. Defaults come from `Cival.AuctionStructure.settings.json`.

| Group | Input | Default | Notes |
|---|---|---|---|
| Calculation | TPO row size (ticks) | 4 (1-1000) | Passed to `request.footprint()` as the row size. |
| Calculation | TPO bracket minutes | 30 (1-240) | |
| Appearance | Show TPO histogram | on | |
| Session | Session start (minutes after midnight) | 0 | |
| Session | Session timezone (blank = chart; otherwise input UTC) | blank | Blank = exchange timezone; IANA or `UTC+-n` text. |
| Appearance | Show information panel | on | |
| Appearance | Maximum visible zones | 12 | 3 in compact display. |
| Appearance | Show touched levels | off | |
| Appearance | Show labels | on | |
| Appearance | Bull color / Bear color | `#3CB371` / `#FF6347` | |
| Information panel | Panel font size | 13 | Approximate mapping to text sizes. |
| Information panel | Compact panel (title + two lines) | on | |
| Performance | Maximum bars back | 10000 | |
| Alerts | Alerts on closed signal / level touch | off | |
| 00 Chart clarity | Compact display / Full analysis detail | on / on | |

**Port-only inputs** (group *Port (TradingView only)*): Estimation timeframe (blank = automatic: the chart bars when they
are no longer than one bracket, otherwise 1D+ 15m, 4h+ 5m, else 1m), Footprint completeness tolerance % (default 1),
Publish prior-session levels from APPROXIMATE profiles (default off), Histogram width (bars, default 20), Panel position.

**Not ported:** Initial balance minutes (unused here), Panel top offset / width / automatic placement, Show readiness/status
panel (no effect in the original), Compact volume numbers, Show bubble volume numbers, Bubble number color (no bubbles drawn),
Avoid overlapping labels, Minimum bar spacing for signal labels, CSV export folder, Alert sound, Share with Cival Decision Panel.

### Known differences from ATAS

1. **Footprint rows.** TradingView builds rows from its own intrabar data and returns them at the requested row size; ATAS
   groups the provider's tick rows. The row grid is assumed to be multiples of *row size x tick*. If a feed aligns rows differently,
   a level can sit up to one row away from where ATAS would put it.
2. **PARTIAL in fallback mode.** In ATAS, a missing footprint sets both APPROXIMATE and PARTIAL. Here, missing footprint sets only
   APPROXIMATE; PARTIAL is reserved for a session that starts after its configured start, a row budget overflow, or a
   footprint that fails the completeness check. Publication of prior-session levels is withheld in both cases by default.
3. **Bar span detection.** ATAS compares the bar open with the next candle's time; the port uses the bar's own close time. Bars
   that straddle a market gap are therefore not flagged by the gap itself.
4. **Lower-timeframe fallback is not the original's fallback.** It is finer than the chart candle range but still assumes every row
   between an intrabar candle's low and high was visited. Treat it as APPROXIMATE, which it is labelled.
5. **Timing.** Levels, marks and touches are evaluated at bar close. ATAS also updates touch state on the forming candle.
6. **Session maths.** Session start is computed as local midnight plus the start minutes in the chosen timezone; around daylight-saving
   changes this can differ by the shifted hour from ATAS's elapsed-time rule.
7. **Row budget.** Up to 2000 rows per session after adaptive grouping, as in the original. The histogram draws at most 380 boxes
   (neighbouring rows merged for display only).
8. **Object limits.** TradingView caps boxes, lines and labels at 500 each; only the highest-ranked zones are drawn.
9. **Estimation timeframe.** Lower-timeframe data availability depends on your plan; history older than the intrabar limit falls back to
   chart candle ranges and is flagged APPROXIMATE.
10. **Arithmetic.** Float instead of `decimal`; row indices use a 1e-6 tolerance before flooring.

## NinjaTrader 8 (NinjaScript)

## Cival Auction Structure — NinjaTrader 8

**Compile on import: NinjaScript Editor → F5.** This file has **not been compiled against NinjaTrader 8** (NT8 was not available where the port was written). It was type-checked at C# 7.3 against hand-written stand-ins for the NinjaScript / SharpDX types, and every NT8 API name was checked against the NinjaTrader 8 help guide, but only your F5 compile proves it against the real platform.

### Summary and requirements

Cival Auction Structure builds a time-price-opportunity (TPO) profile per session: for every price row it counts the **distinct time brackets that visited that row** (time at price, not volume). It shows the developing TPOC, a 70 % value area, a rule-based shape candidate (P / b / D / B / trend), single prints, poor / excess high-low candidates, **failed-auction** marks against the prior *completed* profile, prior-session TPOC / value-area levels, and a right-edge histogram. Shapes and edge labels are descriptive candidates, not forecasts. It is an Indicator only: no orders, no network.

Requirements:

- Any NinjaTrader 8 chart works, but **exact visited prices need Order Flow Volumetric Bars** (Order Flow+ entitlement, Ticks per level 1 recommended). Without Volumetric data the bar's high-low range is used and the profile is labelled **APPROXIMATE**; approximate or partial profiles never publish prior-session levels or failed-auction marks.
- Use small time bars (the default bracket is 30 minutes; a bar that spans a bracket boundary makes the profile APPROXIMATE / COARSE). Minute or second bars give exact bracket assignment.
- `Calculate = OnBarClose`; nothing repaints.

### Install

1. Copy `CivalAuctionStructure.cs` to `Documents\NinjaTrader 8\bin\Custom\Indicators\`.
2. **New → NinjaScript Editor**, press **F5** (Compile).
3. Chart → right-click → **Indicators** → **Cival Auction Structure**.
4. Set **Session start (minutes after midnight)** for the instrument. Leave **Session timezone** blank to use chart time (see the note under settings).

### Feature matrix

| Feature | ATAS original | This port | Notes |
|---|---|---|---|
| TPO bracket counting (distinct brackets per row, not volume) | Yes | Full | Adaptive row grouping (row size doubles to keep ≤ 2000 rows; visit sets are unioned, never double-counted). |
| Visited prices from traded rows | Footprint rows | Full | Volumetric price levels with volume > 0, scanned one tick at a time. |
| Resolution when Volumetric *Ticks per level* > 1 | n/a | Approximate | Only ticks that report volume count as visited; use Ticks per level 1 for exact TPO rows. |
| Candle-range fallback (no footprint) | Yes, labelled | Approximate | Labelled "APPROXIMATE: candle range fallback"; no prior levels / failed auctions published from it. |
| Developing TPOC, value area (70 %), expansion rule | Yes | Full | Same arithmetic, including the original's half-row offsets (see differences). |
| Shape candidate (P / b / D / B / trend-low-overlap) | Yes | Full | Rule-based candidates. |
| Single prints | Yes | Full | Count in the panel; single-visit rows are gold in the histogram. |
| Poor / excess high and low candidates | Yes | Full | |
| Failed auctions vs prior completed profile | Yes | Full | Uses the prior profile's highest / lowest TPO row price, as the original does. |
| Prior-session TPOC / TVAL / TVAH levels | Yes | Full | Created at the first bar of the next session; only from complete, non-approximate profiles. |
| Level lifecycle (New → Tested) | Yes | Approximate | The original also tests levels on the forming candle; this port tests on closed bars only (`OnBarClose`). |
| Right-edge histogram | Yes | Full | One thin bar per row, width ∝ bracket count (max 100 px). |
| PARTIAL / APPROXIMATE / COARSE statuses | Yes | Full | See differences for the no-footprint wording. |
| Session start minutes / timezone | Yes | Approximate | Same daily-session rules (incl. DST handling); time-zone semantics differ, see settings note. |
| Initial balance minutes | Setting (no effect here) | Not ported | Accepted for settings parity; like the original it does not change this profile. |
| Panel (TPOC, VA, shape, visits, edges, row size, data status) | Yes | Approximate | Drawn by the indicator; no cross-indicator auto-arrange. |
| Markers + labels with overlap avoidance | Yes | Full | |
| Compact display / Full analysis detail | Yes | Approximate | Full detail expands abbreviations as the original does; compact shows ≤ 3 levels, ≤ 8 recent marks and a one-line read in place of the shared "current chart read" board. |
| CSV export (`AuctionStructure-signals.csv`, `AuctionStructure-zones.csv`) | Yes | Full | Same columns; the invalidated column is always blank (this indicator has no invalidation). |
| Alerts (off by default) | Yes | Approximate | NT `Alert()`, real-time only; sound name maps to `<NT install>\sounds\<name>.wav`. |
| Rebuild when provider revises processed history | Yes | Not available | Reload the data to recalculate. |
| Share with Cival Decision Panel | Yes (ATAS-only bridge) | Not ported | Not part of the shipped settings reference. |
| Review mode / presets | None in the original | — | — |

### Settings mapping

| ATAS group / name | NT8 property | Default | Notes |
|---|---|---|---|
| Calculation / TPO row size (ticks) | `TicksPerRow` | 4 (1–1000) | |
| Calculation / TPO bracket minutes | `BracketMinutes` | 30 (1–240) | |
| Appearance / Show TPO histogram | `ShowHistogram` | true | |
| Session / Session start (minutes after midnight) | `SessionStartMinutes` | 0 (0–1439) | |
| Session / Session timezone (blank = chart; otherwise input UTC) | `SessionTimeZone` | blank | **Semantics adapted.** NinjaTrader bar timestamps are not UTC. When a Windows time-zone id is entered, bar times are read as the PC's local time, converted to UTC, then to that zone to find the session start. Blank = chart time as shown. If your chart is not on PC-local time, leave this blank and express the start in chart time. An unknown id is reported in the panel and chart time is used. |
| Session / Initial balance minutes | `InitialBalanceMinutes` | 60 (1–240) | No effect (as in the original). |
| Appearance / Show information panel, Panel top offset, Panel width | `ShowPanel`, `PanelTop`, `PanelWidth` | true, 50, 380 | |
| Appearance / Avoid overlapping labels, Minimum bar spacing, Maximum visible zones, Show touched levels, Show labels | `AvoidLabelOverlap`, `MinimumLabelBarSpacing`, `MaxVisibleZones`, `ShowTouched`, `ShowLabels` | true, 6, 12, false, true | |
| Appearance / Bull color, Bear color | `BullColor`, `BearColor` | MediumSeaGreen, Tomato | WPF `Brush` |
| Information panel / Panel font size, Compact panel | `PanelFontSize`, `CompactPanel` | 13, true | |
| Export / CSV export folder (blank disables) | `ExportFolder` | blank | |
| Performance / Maximum bars back | `MaxBarsBack` | 10000 | |
| Alerts / Alerts on closed signal / level touch, Alert sound | `EnableAlerts`, `AlertSound` | false, `alert1` | |
| 00 Chart clarity / Compact display, Full analysis detail | `CleanChart`, `FullAnalysisDetail` | true, true | |

**Not ported (and why)**

| ATAS setting | Reason |
|---|---|
| Automatic panel placement | Needs ATAS's shared panel registry. Give each Cival panel a different *Panel top offset* in NT8. |
| Show readiness/status panel | Has no effect in the ATAS analytics indicators. |
| Compact volume numbers, Show bubble volume numbers, Bubble number color | This indicator draws no volume bubbles. |

### Known differences from the ATAS original

1. **Visited-price source.** ATAS uses footprint rows; this port scans Volumetric levels tick by tick (`GetTotalVolumeForPrice`). With Ticks per level above 1 the resolution is coarser; use 1 for exact rows.
2. **Bar open time.** NinjaTrader stamps time bars with their close time. Bracket assignment uses the bar's open: exact for Minute and Second bars (including the base period of Volumetric bars), otherwise the previous bar's stamp. A bar whose span crosses a bracket boundary makes the profile APPROXIMATE, as in the original.
3. **No-footprint wording.** The original marks a bar with no footprint rows both PARTIAL and APPROXIMATE and then shows the PARTIAL text. This port marks it APPROXIMATE only and says why ("candle range fallback" versus "a bar spans several brackets"). PARTIAL is reserved for session-start-before-history, history gaps, row-limit hits and Volumetric rows that fail the 1 % volume reconciliation. The effect is the same: no levels or failed auctions from such profiles.
4. **Original arithmetic kept.** Value-area low / high are the value-area rows' price minus / plus half a row (`VAL = lowest VA row − row/2`, `VAH = highest VA row + row/2`), and failed-auction references are the highest / lowest TPO row's lower-edge price, exactly as in the original.
5. **Closed-bar level tests.** Level "Tested" status updates when a bar closes, not on the forming candle.
6. **Panels.** Drawn with SharpDX at the *Panel top offset*; no auto-arrangement across indicators.
7. **Numeric type.** Doubles with a 1e-6 tick tolerance; rows are keyed by integer tick index internally.

TPO shapes, poor / excess edges and failed auctions are rule-based descriptions of what was observed. They are not calibrated probabilities and no profitability is claimed.
