Read-only market intelligence · self-hosted

The complete read on the order book.
On one screen. In real time.

Sentinel-Pro fuses live order flow, volatility, structure, and macro context into a single decision surface for ES & NQ futures — engineered read-only, so it observes everything and can touch nothing. Self-hosted. No cloud. Yours.

ES · CVD · VWAP · feed LIVE
See it running → How it's built
scroll ↓
the thesis

Institutional-grade order-flow intelligence — without the institution.

Professional desks read the market across a wall of fragmented terminals. Sentinel-Pro delivers that same read — the tape, the book, implied volatility, structure, and macro tone, fused into one calm cockpit — and runs entirely on your own machine. Because it's a watcher, not a trader, it imports nothing that could place, modify, or route an order. No cloud, no per-token cost, no market data ever leaving the box.

READ-ONLYby design, enforced
0automated tests
Pythonone language · no build
24/7records while it watches
the inputs

Four streams of context. One decision surface.

Each tells you something the others can't. Sentinel-Pro reads all four off the same live connection and reconciles them onto one screen.

Order flow

Tick-by-tick trades, classified buyer vs. seller into cumulative volume delta — who's actually pressing.

CVD · tape · DOM/OBI

Volatility

SPX/NDX implied vol and 25-delta put/call skew — the market's price for fear, live.

IV · skew

Structure

Session VWAP, prior-day high/low, and where price sits against them — the lines that matter.

VWAP · levels

Macro tone

A local model reads world news as risk-on / risk-off — context the tape alone can't give you.

news · sentiment
four reads    one cockpit    your call
how it's wired

The architecture.

One clean pipeline behind a single seam. Market data enters on the left, folds into one typed snapshot, and fans out to three consumers. Click any block.

FIG.1 — SENTINEL-PRO · DATA PIPELINE · READ-ONLY TWSib_async · read-only Live sourcetape · book · quotes Engineone cycle MarketStatetyped snapshot Cockpitthe screen Recorderfmt-2 tape Discorddata-free
select a block

The whole platform is one seam.

The engine never knows whether its data is live, a recording, or a simulation — it consumes one MarketDataSource protocol. That single decision is what makes the rest of this page possible.

▸ data is flowing left-to-right along the wires in real time.

One engine. Three sources. Provable correctness.

Because the engine sits behind that seam, the exact same code runs against a live feed, a recorded tape, or a synthetic market. Nothing branches on "is this real."

So every session can be replayed byte-for-byte and checked against what it produced the first time. The math can't quietly drift — a regression is a failing test, not a surprise on a live day.

Liveib_async Replayrecorded tape Simulatedsynthetic Engineone cycle · pure kernel
in motion

From exchange to insight, in about a second.

Track a single contract through the machine — scroll.

EXCHANGE TAPE CLASSIFY → CVD BAR + VWAP COCKPIT
stage 1

The print.

One real trade clears on the E-mini — a price and a size. Interactive Brokers delivers it over a read-only socket.

stage 2

Every trade, captured.

The platform subscribes to reqTickByTickData("AllLast") — the true tick feed, not throttled snapshots. Every print lands, which is what makes the downstream numbers exact.

stage 3

Aggressor, identified.

The trade is classified against the live book: at/above the ask is an aggressive buy, at/below the bid a sell. Signed and summed, that's cumulative volume delta.

stage 4

The same print, three jobs.

That identical trade also drives the candle and the VWAP — accumulated locally, Σ(price×size)/Σsize, anchored to the 9:30 cash open. CVD and VWAP share one stream, so they never disagree.

stage 5

On screen, ~1s later.

It folds into one typed snapshot, written atomically; the cockpit picks it up. Exchange to screen in about a second — and nothing along the way could send an order back.

the engineering

Built like infrastructure, not a script.

The design decisions that make it trustworthy enough to watch real money.

determinism

Record → replay → verify

Every session is recorded tick-for-tick and can be replayed byte-for-byte, proving the math never drifted.

# identical engine, any source
state = engine.cycle(Replay(tape))
assert replay(day) == recording(day)
Why it matters: correctness becomes a test, not a hope.
single source of truth

One definition of the math

OBI, CVD classification, VWAP, ATR, confluence — one pure module, golden-vector tested. The live engine, the analyzer, and the reports all call it.

# the only place buy/sell is decided
def classify(px, bid, ask):
  return +1 if px>=ask  # buy
  else -1 if px<=bid # sell
Why it matters: the screen and the research can't disagree.
resilience

Runs unattended for days

A never-die loop survives any single bad cycle, auto-reconnects through TWS's nightly bounce, and rolls a fresh recording every session.

while alive:
  try: cycle()
  except: log(); carry_on
  reconnect_if_dropped()
Why it matters: it's watching when it counts — including overnight.
exact, anchored

Tick-true VWAP & CVD

No "give me a VWAP" call — both are accumulated from the raw tape so they line up perfectly, anchored to the 9:30 cash open and seeded from history on a mid-session start.

pv += price*size; v += size
vwap = pv / v   ✓ exact
Why it matters: the textbook version reads stale off-hours. This one doesn't.
self-monitoring

The watcher watches itself

Tiered, time-aware feed health: during cash hours a slow tape flips it yellow in 5s and red in 15s — looser overnight, where gaps are normal.

LIVE  # flowing
STALE # slowing · 5s
DEAD  # stopped · 15s
Why it matters: a served file can read "200 OK" over a dead feed. Not anymore.
the contract

Read-only, enforced

The code imports nothing related to placing, modifying, or routing an order — and a test guards it. Paired with TWS's read-only API.

# the one rule, in code
no placement · no routing
it only ever watches
Why it matters: the thing on your screen can't cost you by acting.
see it run

A live slice of the cockpit.

Simulated market, real logic: tick → CVD → candles → VWAP, an order book with imbalance, and the self-monitoring health system on top. Cut the feed and watch it notice.

ES · DEMO COCKPIT

Live Data simulated · ~1s cycle
Price
Session CVD
VWAP
OBI
Depth of market
watch it turn yellow at 5s, red at 15s — sped up for the demo
trust is earned

Engineered against the failure modes that bite.

Real systems fail in subtle ways. Two we found and hardened against — and what they bought.

failure mode

The "200 OK" over a dead feed

A web server will happily serve a file the feed stopped updating — a green light over a corpse. The fix: the cockpit now reports feed truth, not HTTP status. A stalled or dead tape is impossible to miss.

failure mode

Sentinel garbage in the price feed

Exchange APIs emit -1 for "no data," and the odd NaN — one slip distorts every downstream number. The fix: invalid prices are rejected at ingest, before they can touch CVD, VWAP, or the chart.

0
tests, all green
0
symbols · ES & NQ
0
orders it can place
0
hours/day watching
under the hood

Specifications.

Language
Python 3.13 — one language, no build step, vanilla-first
Market data
Interactive Brokers via ib_async — tick-by-tick AllLast tape, depth-of-market, real-time quotes
Core types
pydantic — every snapshot validated; a typo is a load-time error, not a missing number
Recorder
fmt-2 flight recorder, flushed each cycle, rolled per session — powers replay & offline research
Alerts
Discord — data-free by construction; sentiment, news & setups only, raw numbers stay local
Deployment
self-hosted · one-command launch · read-only TWS API · no cloud, no data leaves the machine
Verification
104 automated tests · golden-vector math · record→replay parity