VisualHFT Documentation

Type to search the field manual

VisualHFT technical documentation Enter to open
Browse all documentation
Advanced Guides Intermediate

Reading the Order Flow Dynamics Desk: who is pressing the market, and how hard

One Desk, one question: who is pressing the market right now, and how hard? What each constituent tile measures, what it reads from the feed, and how to read it on screen. Footprint and Smart Tape as context, and how to read the tiles together.

Edition / plan core
The OFI tile live on Coinbase BTC/USD, captured 30 October 2026. A signed number, updated every 100 ms, from changes at the best bid and best ask only.

Price is the result. Order flow is the cause. In Cont, Kukanov and Stoikov’s study of 50 US stocks, imbalance at the best quotes explained on average 65% of short-interval mid-price changes. The Order Flow Dynamics Desk in VisualHFT Terminal puts the three order-flow tiles that matter most on one surface, so one glance answers one question: who is pressing the market right now, and how hard?

This guide teaches the three constituent tiles, Order Flow Imbalance (OFI), Cumulative Volume Delta (CVD) and Delta of Trades, as parts of that Desk: what each one measures, what it reads from the feed, and how to read it on screen. Two more panels, the Footprint chart and the Smart Tape (the Time & Sales study), give the Desk its context. The last sections show how to read the tiles together and what comes next.


1. The Desk’s one question

A Desk is one grouped view that mounts several existing studies and answers one question at a glance. It has a tile on a dashboard and a window that shows each part in full, at full speed. The in-app help says it plainly: “This tile is a compact view of the Desk, updated once a second. Open the window (the button on the right) to see each part in full, at full speed. The gear on the left sets one instrument for every part.” (ViewModel/vmDeskTile.cs:34-36).

The Order Flow Dynamics Desk’s question is who is pressing, how hard? Its constituents are the studies that answer it from two directions:

DirectionQuestionTile
The bookIs displayed liquidity at the top of book leaning one way?OFI
The tape, over the sessionWhich side has been taking liquidity since the start?CVD
The tape, right nowWhich side crossed the spread more in the last few seconds?Delta of Trades

Three rules of every Desk hold here, and they decide how you read the numbers:

  • A Desk never recalculates a study. Each tile on the Desk is the same study, with the same settings, publishing the same number it publishes on its own. The Desk reads what the study publishes and shows it, and the Trigger Engine sees the same alert registrations and the same alert fires with or without the Desk.
  • One gear, one instrument. The gear on the Desk tile points every part at one provider and one symbol, written into each study’s own settings exactly as that study’s own gear would write them (ViewModel/Desk/DeskInstrumentAligner.cs:22-30). A tile’s other settings, such as its window length, stay on the tile’s own gear.
  • The window is non-modal. It opens beside the dashboard and stays open while you work (ViewModel/Desk/DeskWindowRegistry.cs:198). Each cell in it is the study’s own frame.

Three sizes exist for a Desk tile: a chip (150 px), a card (310 px) and a panel (630 px) (DashboardManager/Desk/DeskHostEnums.cs:11-29). On Liquidity & Order Flow Monitoring, where order flow is the subject, this Desk is a card: the Directional Flow Pressure tile and the Delta of Trades tile in its first row, the pressure chart under them. On Trading Execution, Market Makers and Predictive Market Analytics it is a chip in the right rail. The window holds every part: the pressure chart and tile in the sidebar, and the Footprint, Cumulative Volume Delta, Order Flow Imbalance, Smart Tape (the Time & Sales study), Delta of Trades and the Market Event Stats panel in the main column, each in its own frame (DashboardManager/Desk/DeskCatalog.cs:228-263).


2. What the Desk reads

All three tiles read a Level 2 feed: order-book updates with price and size per level, plus the venue’s trade stream. That is enough to see pressure (how displayed liquidity is changing) and aggression (which side is crossing the spread). That is the data every venue publishes, so the Desk runs on every connector you use.

Put plainly, the tiles show:

  • Signed change in displayed size at the best bid and ask, every 100 ms.
  • Executed volume with the taker’s side.
  • Direction and size of recent aggression.
  • What has happened in a window you choose.

Each of the three tiles reads one venue and one symbol by default. Each tile stays on one venue, so every number describes one book (OFI Model/PlugInSettings.cs:54; CVD Model/PlugInSettings.cs:69-72; Delta of Trades Model/PlugInSettings.cs:143-146). Delta of Trades can watch up to eight venues as separate legs; that is section 5.


3. The OFI tile: is the top of book leaning?

The question it answers. Over the last few seconds, did displayed liquidity at the best quotes move up or down? It registers a queue draining at the touch while the price is still unchanged, before the quote ticks.

What it reads. Each book update for the chosen venue and symbol, and from each update only the best bid price and size and the best ask price and size (OrderFlowImbalanceStudy.cs:853-869). Trades are never read.

What it computes. On each update, OFI adds and subtracts displayed size according to how the best quotes changed, the best-quote formula of Cont, Kukanov and Stoikov (Model/OfiEngine.cs:256-264):

  • Adds: the best bid size growing, or the best bid moving up; the best ask size shrinking, or the best ask moving up.
  • Subtracts: the best bid size shrinking, or the best bid moving down; the best ask size growing, or the best ask moving down.

The tile shows the sum of those contributions over a trailing window of 1, 2, 3 or 5 seconds, default 5 (Model/PlugInSettings.cs:19-20). A new value is published every 100 ms, whether or not the book changed (OrderFlowImbalanceStudy.cs:1002-1045). The arithmetic is exact decimal, so the number on screen is the sum, not an approximation.

How to read the tile.

  • The number is signed and raw, in the instrument’s own displayed-size unit (Model/OfiEngine.cs:225-226). On BTC/USD it is bitcoin; on a stock it is shares. There is no multiplier, no ratio and no bound.
  • Positive, green: upward pressure on the displayed book. The best bid grew or moved up, or the best ask shrank or moved up. Negative, red: the reverse.
  • Zero in grey-blue means balanced changes. Zero in a lighter grey means Quiet: no book update at all inside the window. The hover tells you which, and when the last update arrived (Helpers/OfiText.cs:27).
  • The hover names the window and the clock it runs on: “Window: last 5 s (app arrival time).” Live, the window runs on the time each update reached the terminal; in replay, on the recorded clock (Helpers/OfiClock.cs:40-46).
  • The chart window plots the same series against the mid price, so a lean and a price move sit on one time axis. The series is named with its window, OFI (5 s) · + upward / − downward pressure, and changing the window starts a new line (Helpers/OfiText.cs:61).

Feed conditions you will see. A dot means warming up: OFI needs one full clean window of book updates before its first value. Three dots in orange mean the feed reported a warning or sent no status for 30 seconds. Three dots in another colour mean the tile has no value: grey when paused while a replay runs on another feed, blue-grey when the feed is disconnected, brown while it reconnects; the hover gives the reason and the time. A crossed, locked or one-sided book is never shown as zero: the tile waits until the book is valid, then warms up for one full window (Model/OfiEngine.cs:147-159, :229-237).

Alerts. OFI publishes its value to the Trigger Engine on every 100 ms boundary. Rules of the form above, below and crosses work on the signed value. A tile that is warming up, stale or in error sends nothing, never a zero (PluginManager/PluginManager.cs:399-408).


4. The CVD tile: who has been taking liquidity since the start?

The question it answers. Since a start point you choose, has more volume traded with the buyer as the taker, or with the seller as the taker? In our held-out test on seven NASDAQ symbols, taker-side counts called the direction of the mid change from one trade to the next 75.7% of the time, and beat a last-tick reversal rule by more than 33 points, even with that rule at its strongest.

What it reads. The venue’s trades for the chosen symbol: size and the taker side the venue reports. The order book is read only to learn how many decimals to show (CumulativeVolumeDeltaStudy.cs:563-567).

What it computes. CVD = buy-taker volume − sell-taker volume, accumulated since the start point (Model/CvdEngine.cs:106). The taker, also called the aggressor, is the order that executed against a resting order. The side comes from the venue’s own report and nothing else: a trade the venue reports without a taker side goes to Side unknown and adds nothing to CVD (CumulativeVolumeDeltaStudy.cs:527; Model/CvdEngine.cs:526-529).

The start point is the study start, a manual reset, or the daily reset. Daily reset is on by default at 00:00 UTC; the time and the time zone are settings (Model/PlugInSettings.cs:28-33). Every shipped venue connector reports the taker side on its trades, so on a live feed the side-unknown bucket stays small.

How to read the tile.

  • The number is the session total so far, in the venue’s own trade-size unit, with a sign (Helpers/CvdPresentation.cs:302-314). Green above zero, red below.
  • Rising means buy-taker volume is being added faster than sell-taker volume. Falling means the reverse. CVD can fall while still positive: the sign says who has led since the start, the slope says who is leading now.
  • Flat means no signed volume was counted: no trades, equal buy and sell volume, or trades the venue reported without a side.
  • The hover carries the full accounting: the start time and its reason, buy, sell and side-unknown volume, the share of volume with a known side, the last bar’s delta and the trade count (Helpers/CvdPresentation.cs:81-200).
  • The chart plots one point per closed bar. Bars are 100 ms, 500 ms, 1 s (default), 3 s or 5 s (Model/PlugInSettings.cs:26). Each point is the value at the bar’s end, plotted against the mid price of the bar’s last trade. After a reset the count starts again from zero.

Reading CVD against price. A reading many desks use: price makes a new high while CVD does not, or price makes a new low while CVD keeps rising. That is a description of what the tape did relative to price. It says that trades and price moved differently; it does not by itself say why. Read it with Delta of Trades, which shows whether the aggression is still there in the last few seconds, and with OFI, which shows whether the displayed book is leaning the same way.

Feed conditions you will see. A dot until the first bar closes. Once the feed is connected with no trades yet, the tile reads 0 with the hover “No trades counted since …”. Three dots in orange mean the feed reported a warning or sent no status for 30 seconds. After a disconnect or reconnect the value carries a warning mark in amber and the hover says that trades around that time may be missing or repeated; a reset clears it (Model/CvdEngine.cs:433-444). A tile not on the replay feed pauses while replay runs and starts a new period when replay ends.

Settings worth knowing. Reset to zero: at start only, or at start and daily. Daily reset time and Reset time zone. Minimum size (0 by default, so every trade counts) and Maximum size (empty by default, no limit): inclusive filters. Reset now zeroes the count without touching the settings. Saving any change starts CVD from zero.


5. The Delta of Trades tile: who crossed the spread more, right now?

The question it answers. In the last few seconds, did more volume trade with the buyer as the taker, or with the seller as the taker?

What it reads. From each trade: provider, symbol, price, size, the reported taker side, flags and timestamp. From the book: only the best bid and ask, for side inference and for the chart’s mid price (DeltaOfTradesStudy.cs:580-592, :729-741). No order id, no queue, no account.

What it computes. Delta = buy-taker volume − sell-taker volume over a rolling window of 1 to 60 seconds, default 10 (Model/DotTotals.cs:17-23; Model/PlugInSettings.cs:27-28). The window is re-evaluated every 100 ms, and older trades drop out as it moves, even when no new trade arrives (Model/DotBucketWindow.cs:3-12). The value is executed quantity, not a count of trades.

The side comes from the shared trade-signing layer, the same one the Footprint chart uses. Three Side method settings:

  • Reported side (default): the taker side the venue reports. A trade without one goes to Side unknown.
  • Inferred side: when the venue reports no side, the quote rule decides. A trade above the mid of the latest best quotes is a buy, below it a sell. At the mid, the tick rule compares with the previous trade price. With no usable quote, a locked or crossed book, no previous trade, or a trade at the mid at the same price as the previous one, the side stays unknown (VisualHFT.Commons/TradeClassification/QuoteRuleSigner.cs:171-201, :253-308).
  • Both, shown separately: the same number, with reported and inferred volume listed separately in the hover.

Every shipped live connector reports the taker side on its trades (Binance, Bitfinex, Kraken, KuCoin, Gemini, BitStamp and Coinbase, listed in VisualHFT.Commons/TradeClassification/TradeSourceCapabilities.cs:16-22). On those feeds Inferred and Reported give the same number. The inference rule matters on recorded sessions whose trades carry no side, such as hidden executions in a NASDAQ TotalView-ITCH replay.

How to read the tile.

  • The number is signed, in the feed’s own trade-size unit, with the suffix qty (Helpers/DotPresentation.cs:117-134). Green above zero, red below. An exact zero reads 0 qty.
  • The footer under the venue line reads the window and the classified share: 10 s · Classified 100.0% (Helpers/DotText.cs:130-136). Classified is the share of volume in the window that has a reported or inferred side. It is coverage, not accuracy; 100% does not mean no trade was missed.
  • Zero with trades means equal buy-taker and sell-taker volume. Zero with no trades is Quiet, in a lighter grey, with the hover “No trades in the last 10 s”. Volume with no side gives zero too, and the hover says plainly that side-unknown volume is not a sign of balance (Helpers/DotText.cs:64).
  • The chart plots the value every 100 ms against the order-book mid of the last valid quote, so a burst of aggression lines up with the mid at that moment.

Combined venues. The Venues setting takes two to eight venue-symbol rows and shows one delta across them, with the footer reading n venues · 10 s · Classified …. The combined value appears only while every venue is live; the worst venue’s state wins (Model/DotEngine.cs:1255-1309).

Feed conditions you will see. The footer carries the status word when the tile is not live: Warming up (the first value appears one window after the feed connects), Stale (a feed warning, or paused while replay runs on another feed) or Invalid (disconnected, reconnecting, a replay seek, or the computer’s clock moving more than 100 ms). After any of those the tile warms up again, so the window never mixes trades from before and after a gap (Model/DotVenueLeg.cs:170-211).

Alerts. The value reaches the Trigger Engine on every 100 ms boundary while the tile is live. While warming up, stale or invalid it sends a marker that fires no rule, so no crossing ever spans a gap (PluginManager/PluginManager.cs:401-408).


6. Window context: Footprint and Smart Tape

The three tiles say who is pressing and how hard. Two panels in the Desk window say where the fight happened and how it arrived. Both are context: read them when a tile moves, not instead of it.

Footprint: where the volume traded

The Footprint chart shows buy-taker and sell-taker volume at each price in each bar (Helpers/FpText.cs:11). In the default Bid × Ask display a cell reads sell-taker volume on the left and buy-taker volume on the right; Delta shows buy minus sell per cell, Volume shows the total. Bars are time bars of one minute by default, from 1 second to 1 hour (Model/PlugInSettings.cs:48-72); volume bars and trade-count bars are the alternatives. Trade sides come from the same shared signing layer Delta of Trades uses; inferred volume is hatched, and an imbalance mark that rests on it is outlined dashed.

Three things to read on it:

  • Diagonal imbalances. A buy imbalance is buy volume at a price that is at least a ratio (default 3:1) times the sell volume one row below it; a sell imbalance is the mirror, against the buy volume one row above. Marks appear only once you set a Minimum volume in the settings, and only in bars whose classified share is at or above the floor, 80% by default (Model/FpBarMath.cs:55-64, :102; Helpers/FpText.cs:15, :189). The tooltip says the important part: “This is imbalance of traded volume, not of the order book.”
  • Point of control. The row with the most volume in the bar.
  • Closed-bar delta. The tile’s own value, with the bar’s volume and point of control under it. Alerts can be set on it (FootprintChartStudy.cs:277).

Clicking a cell opens that cell’s own print list, docked inside the Footprint window, so a heavy cell can be read trade by trade.

Smart Tape: how the volume arrived

The Smart Tape, the Time & Sales study, lists each print: price, size, time and a side mark, with a venue column in the wide window (Helpers/TapeText.cs:90-95). The side is the venue’s own buy or sell flag on the trade; a print the venue reports without one shows no mark (TimeAndSalesPlugin.cs:366-373). The header reads the trade rate, prints per second over the panel’s window (10 seconds by default, 1 to 60), with a sparkline beside it (Helpers/TapePresentation.cs:42-63). Display filters narrow the rows to a minimum size, one side, one venue or a flag without changing the rate. Pause holds the rows while the metrics keep running, and Jump to newest catches up.

Read the tape when Delta of Trades jumps: the rate says whether the delta came from a few large prints or a run of small ones, and the rows say at which prices.


7. Reading the tiles together

Each tile answers its own question. The Desk exists so you read them as one.

TileQuestionInputTypical readNot evidence of
OFIIs the top of book leaning?Best bid and ask price and size, every updatePositive and growing: displayed liquidity moving up; negative and growing: moving downTrades, fills, hidden size, what price does next
CVDWho has led the session?Trades with the venue’s taker sideSign says who has led since the start; slope says who leads nowIdentity, intent, anything beyond this venue
Delta of TradesWho is crossing the spread now?Trades with reported or inferred taker side, last 10 s by defaultSign and size of recent aggression; footer says how much volume had a sideQueue position, a forecast, a session total
FootprintWhere did the fight happen?Signed trades per price per barImbalance marks and the point of control locate the heavy pricesOrder-book imbalance
Smart TapeHow did it arrive?Each printRate and size tell you a few large prints from a run of small onesWho traded

Three short reads, each on one instrument, each at a glance:

Book and tape agree. OFI positive and rising for several windows; Delta of Trades positive with a high classified share; CVD rising. Displayed liquidity is moving up and buyers are taking what is offered. The Footprint shows buy imbalances stacking on the upper rows of the current bar. This is pressure with participation behind it.

Tape without the book. Delta of Trades jumps positive on a few large prints, the trade rate spikes, but OFI stays near zero or turns negative. Buyers crossed the spread and the displayed book did not follow: the best ask was refilled, or the bid thinned. The tape alone reads like a push; the book shows it being absorbed, which a tape-only screen never shows.

Book without the tape. OFI swings positive while Delta of Trades sits near zero and the trade rate is low. Quotes are being rewritten, not traded. A market maker checks displayed size before leaning on it.

In every case the tiles describe what has just happened on this book.


8. The Desk’s own reading: Directional Flow Pressure

The Desk’s headline is one signed number, Directional Flow Pressure, from −100 to +100: negative when sellers are pressing, zero when balanced, positive when buyers are pressing. Its label is the participation regime, one of Quiet · Normal · Active · Urgent, which says how intensely the market is trading. One tile answers the Desk’s question; the tiles on this page are the parts you drill into from it.

The reading compares this market now with its own last 24 hours, so compare it only with itself, never across instruments (DashboardManager/Desk/DeskCatalog.cs:192-195). It is a proprietary reading built from the components on this Desk; the method is not disclosed. An instrument with no saved history from the last 24 hours settles for up to 30 minutes before its first value, and the tile shows a dash while settling, while a part is missing, or while a source is stale, disconnected, resyncing or the book is crossed (DeskCatalog.cs:209-222).

How to read it: a strong positive with Active or Urgent means buyers are pressing hard; a strong negative, sellers. Near zero with Urgent means heavy two-way trading with no side in control. Read pressure and regime together. The pressure value is available to Trigger Engine rules, as on any study.


9. Availability

Every tile on this page ships in the VisualHFT Terminal installer and is included with every plan (OrderFlowImbalanceStudy.cs:173; CumulativeVolumeDeltaStudy.cs:147; DeltaOfTradesStudy.cs:188; FootprintChartStudy.cs:273). The Order Flow Dynamics Desk that groups them is open to every plan as well. It sits as a card on Liquidity & Order Flow Monitoring and as a chip on Trading Execution, Market Makers and Predictive Market Analytics (DashboardManager/Desk/DeskCatalog.cs:248-253). A study mounted by a Desk on a dashboard shows inside that Desk rather than as its own tile, and keeps running and alerting exactly as before; on Predictive Market Analytics the Smart Tape keeps its own panel beside the Desk.


Method and limits

  • Verification. Each behavioural claim above is cited to the shipping source file and line, read on 2026-11-01 on the line this release was cut from. The clips were captured on 2026-10-30 from a real run of the application on a live Coinbase BTC/USD feed.
  • Clocks. OFI and Delta of Trades run their windows on the time each update reached the terminal, not on the exchange timestamp (Helpers/OfiClock.cs:40-46; DeltaOfTradesStudy.cs:964-981). CVD closes its bars on the same clock. In replay all three run on the recorded clock.
  • Scope. OFI and CVD read one venue and one symbol; Delta of Trades, the Footprint and the Smart Tape can also combine two to eight venues as separate legs. None of the tiles reads order ids, queue position or hidden quantity, and none forecasts price.
  • Duplicates. CVD counts every trade the feed delivers. Delta of Trades and the Footprint ignore a repeated trade id when the feed sends ids. Each hover says which applies.
  • What the tiles do not show. Which orders were cancelled and which were filled; who traded, or how many traders; queue position, hidden or reserve quantity; what price will do next. None of the tiles is a prediction, and a reading on one instrument says nothing about another.
  • OFI. Not traded volume, and not the standing bid-ask balance (the LOB Imbalance tile shows that). It counts changes at the best bid and ask only; it cannot tell a cancelled order from a filled one, and a refill at the same price counts as new size. When the feed folds several book changes into one update, the changes in between are not counted (Helpers/OfiText.cs:56-57). It describes the recent past and does not forecast price.
  • CVD. Not a trade classifier (it never guesses a side) and not multi-venue; its value moves only with trade size and side (Helpers/CvdText.cs:15-22). The 75.7% figure above is our research desk’s EDGE verdict on taker-side counts (.dashboard-runs/edge-results/CVD.md, pooled hold-out, 61,696 trades on AAPL, AMZN, CSCO, GILD, NFLX, IDXX and CTAS): one session, 22 August 2023, the mid change from one trade to the next, trades where the mid never moved excluded, before costs; the 65% figure is Cont, Kukanov and Stoikov’s same-interval explanatory fit, not a forecast.
  • Delta of Trades. Not an identity or intent tool (seven trade fields, nothing about who sent the order), not a trade-count delta, not a book or depth measure, and not a session total: the window is at most 60 seconds and clears at every gap (Helpers/DotText.cs:18).
  • Side classification. CVD takes the taker side only from the venue’s report. Delta of Trades and the Footprint take it from the shared trade-signing layer, which uses the venue’s report first and the quote and tick rules only when the Side method is Inferred side or Both and no side was reported; the Footprint’s default is Both, Delta of Trades’ is Reported side. The Smart Tape shows the venue’s own flag.

New to VisualHFT? Get Started. New accounts get a 7-day trial.