VisualHFT Documentation

Type to search the field manual

VisualHFT technical documentation Enter to open
Browse all documentation
Getting Started Foundation

Your first session: from empty dashboard to live data

What to do in the first ten minutes after installing VisualHFT. How the dashboard is built, how to connect a market connector, how to point each tile at a provider and a symbol, and which plugins are included versus bought separately.

Edition / plan corepro
The VisualHFT Predictive Market Analytics dashboard with every tile configured and updating: a quote ladder, a depth chart, a limit order book time series, a time and sales stream, and a column of metric tiles
Where you are heading. Every tile here has been pointed at one provider and one symbol; the footer under each tile names them.

You have installed VisualHFT and signed in. This page is the ten minutes that takes you from a fresh install to a dashboard filling with live market data.

VisualHFT immediately after a fresh install: every tile renders its title with no value, the charts are empty, and the footer reads No market data connected

Two things have to happen, in this order:

  1. Connect a market connector. Nothing connects by itself on a fresh install.
  2. Point each tile at one provider and one symbol. Each tile starts producing as soon as you tell it which venue and which instrument to watch.

Everything else on this page is detail underneath those two steps.

What you are looking at

The shell has four regions, and they never move. The layout is fixed in code, not arranged by you.

The VisualHFT shell: the dashboard picker and toolbar across the top, metric tiles down the left, larger panels in the centre, and the provider rail along the bottom with one chip per connected venue

RegionWhat lives there
Top barThe dashboard picker on the left, then Application Settings, System Diagnose Dashboard, Trigger Management, Plugins Management, Microstructure Diagnostics, Marketplace and User Profile. The notification bell and Logout are pinned far right (View/DashboardL3.xaml:234-327)
Left columnA fixed 500 unit column of small metric tiles and tile groups (View/DashboardL3.xaml:367)
CentreThe large panels: charts, ladders, tables. Scrolls when it overflows
Right columnA fixed 320 unit column holding whatever tiles that dashboard assigns to it, which is Time and Sales on the default dashboard and nothing at all on Infrastructure Monitoring (View/DashboardL3.xaml:556)
FooterThe provider rail: a chip for each connected venue, as many as fit with the rest behind an overflow button, a + that opens the venue catalog, and the recorder and replay consoles in their own region to the right (View/DashboardL3.xaml:364, View/ucProviderRail.xaml:161-170)

Those widths are WPF device-independent units, so at 150 percent display scaling the left column occupies 750 physical pixels rather than 500.

The anatomy of a tile

A standard metric tile has four parts, and three of them are how you diagnose it (UserControls/MetricTile.xaml:40-63):

  • the value, large, in the upper half;
  • the title underneath it;
  • a footer line reading Provider: Symbol, which is the tile’s own report of what it is configured to watch;
  • a gear in the top left corner that opens that tile’s settings, and, on tiles that keep history, a chart icon in the top right.

The footer line is the single most useful thing on the tile. If it is empty, or names a venue you are not connected to, you have your answer before you have looked at anything else.

Not every tile carries all four. Each study decides whether its gear, chart icon and footer appear (ViewModel/vmTile.cs:99-101), the launcher tiles switch all three off, and counter groups are a different control entirely: a titled box whose single gear sits in the group header and configures every counter inside it at once (UserControls/MetricTileGroup.xaml:37, ViewModel/vmTile.cs:111).

Step 1: connect a market connector

Which build this describes. The footer provider rail, and the rule that only previously connected venues start, arrived after release v0.1.11. If your footer is a plain connectivity strip with no + button, you are on v0.1.11 or earlier: every connector starts automatically there, and you manage them from Plugins Management in the top bar instead. Everything else on this page applies to both.

On a fresh install nothing is connected. VisualHFT starts only the connectors you left connected last time, and on a first run that list is empty (PluginManager/PluginManager.cs:320-330). The footer says No market data connected (View/ucProviderRail.xaml:197-198). Hover the information icon beside it and it explains that no market connector is running, that studies, charts and tiles therefore have no live prices to work from, and that this is the normal state on a first run because VisualHFT no longer starts every venue automatically (View/ucProviderRail.xaml:243-252).

Click the + at the end of the chip strip, to the left of the recorder and replay consoles. The venue catalog opens with a search box and one row per connector, each row carrying a status dot, the venue name, a connect switch and a settings gear (View/ucProviderRail.xaml:500-573).

Opening the venue catalog from the footer's plus button and switching Kraken on; its chip appears in the rail and turns green as the socket connects

Flip the switch on one venue. Three things follow:

  • the choice is written down before the socket is touched, so a connector that fails to come up is still retried next launch (ViewModel/vmProviderRail.cs:251);
  • the chip’s status dot turns amber and its tooltip reads Connecting..., settling to the real state when the venue answers (ViewModel/vmProviderRail.cs:255, View/ucProviderRail.xaml:66-68);
  • the choice persists to connector-connections.json, so the venue comes back automatically every time you start the application (Services/Providers/ConnectorConnectionStateStore.cs:44-47).

Start with one venue and one liquid instrument. A single venue keeps the picture clear while you learn the flow, and you can add the rest once data is arriving.

The seven connectors in the installer

All seven ship inside the installer and all seven are unlocked by the free Community plan (VisualHFT.csproj:170-176). None of them needs an API key for public market data.

ConnectorProvider IDSymbols it ships withOrder book depth
Binance1BTCUSDT(BTC/USD), ETHUSDT(ETH/USD)10
Bitfinex2tBTCUSD(BTC/USD), tETHUSD(ETH/USD)25
Kraken3BTC/USD, ETH/USD25
KuCoin4BTC-USDT(BTC/USD)25
Gemini5BTCUSD(BTC/USD), ETHUSD(ETH/USD)20 (fixed)
BitStamp6btcusd(BTC/USD), ethusd(ETH/USD)10
Coinbase7BTC-USD(BTC/USD), ETH-USD(ETH/USD)25

Defaults read from each connector’s own source: BinancePlugin.cs:899-912, BitfinexPlugin.cs:778-789, KrakenPlugin.cs:933-944, KuCoinPlugin.cs:1101-1112, GeminiPlugin.cs:856-870, BitStampPlugin.cs:488-501, CoinbasePlugin.cs:828-839.

Because every connector already ships with a working Bitcoin and Ether subscription, connecting one venue is genuinely all you have to do to get data flowing. You only open the connector’s own settings when you want a different instrument.

Step 2: the connector’s own settings

The gear on a catalog row opens that connector’s settings. The dialog differs a little per venue, but the shape is always the same: Provider ID, Provider Name, API Key, API Secret, Symbols, and usually Depth Levels, then a red validation line with OK and Cancel.

The Kraken connector's settings dialog: Provider ID 3, Provider Name Kraken, empty API key and secret, the symbols box reading BTC/USD,ETH/USD, and depth levels 25

The symbol box is the part worth reading carefully

The label says Symbols (comma separated), and the syntax has two halves:

VENUE_SYMBOL(NAME_SHOWN_IN_THE_APP), VENUE_SYMBOL(NAME_SHOWN_IN_THE_APP)

Everything to the left of the parenthesis is what VisualHFT subscribes to at the venue. Whatever is inside the parenthesis is the name the rest of the application uses. Omit the parentheses and the same string is used for both (VisualHFT.Commons/PluginManager/BasePluginDataRetriever.cs:540-554).

So BTCUSDT(BTC/USD) on Binance and tBTCUSD(BTC/USD) on Bitfinex both arrive as BTC/USD, which is what makes the same instrument comparable across venues. Kraken is the one connector whose defaults carry no parentheses, because Kraken’s own symbol for the pair is already BTC/USD.

Binance: set your region

Binance’s dialog carries an Is Non US location? checkbox. It ships unchecked, which routes to the US venue (BinancePlugin.cs:222-225). If you are trading outside the United States, tick it so Binance connects to the global venue.

API keys

No connector needs an API key or a secret for public market data. All seven ship with both fields blank, and the credential object is simply never attached when they are empty (Binance BinancePlugin.cs:220-221, Kraken KrakenPlugin.cs:101-103). Supplying keys adds your own private order stream. Three surfaces need it and nothing else does: the Exec Lat metric, the Position Manager tile (ViewModel/vmPosition.cs:112) and Microstructure Diagnostics.

The dialog’s own note is accurate: keys are stored locally on your own machine and sent to nobody. Use a key scoped to market data only. That is all any connector on this page needs, and it keeps a trading-enabled key out of a workflow that never requires one.

What OK does

OK saves, reparses the symbol list, and then restarts the connector (BinancePlugin.cs:934-940). The restart goes through the same exponential backoff the reconnection logic uses, so the first attempt waits about two seconds and each further attempt doubles, with up to five attempts (BasePluginDataRetriever.cs:344, :21). A connector that does not come straight back after you press OK is normal for a few seconds. Cancel discards your edits.

Step 3: point each tile at a provider and a symbol

This is the step that brings the dashboard to life, so it is worth understanding the mechanism.

A study receives every order book update the application publishes, and the first thing it does is throw away anything that does not match its own configured provider and symbol:

if (_settings.Provider.ProviderID != e.ProviderID || _settings.Symbol != e.Symbol)
    return;

That is Studies.LOBImbalance/LOBImbalanceStudy.cs:85-86. The study ships configured with Symbol = "" and an empty provider (Studies.LOBImbalance/LOBImbalanceStudy.cs:159-168), and an empty setting matches nothing, so a market-data tile produces its first value as soon as you give it a provider and a symbol.

Every tile on the default dashboard discards non-matching data this way, but they do not all filter on the same thing, which matters once you have more than one venue connected:

StudyFilters on
LOB Imbalance, VPIN, Market Resilience, Market Ratios, Market Event Stats, order and trade ratiosProvider and symbol
Depth Chart, Quotes and Level 2 DOM, LOB TimeSeriesProvider and symbol, checked in their view models (Studies.DepthChart/ViewModels/vmDepthChart.cs:228-230, Studies.QuoteLevel2DOM/ViewModels/vmQuoteLevel2DOM.cs:187-189)
Time and SalesProvider only (Studies.TimeAndSales/ViewModels/vmTimeAndSales.cs:137)
Market Latencies Stats, Market Operational RatiosProvider only. Their settings dialogs have no symbol field at all

A study that filters on provider only still shows nothing until you have chosen a provider, so the step is the same either way. The difference is that its numbers cover every instrument on that venue, not the one you picked.

Three studies are the exception and need no configuration at all. Performance Counters ships watching localhost, Network Performance ships pinging 8.8.8.8, and Data Feeds Monitoring adopts up to three live venue and symbol pairs the first time it starts (Studies.PerformanceCounters/PerformanceCountersPlugin.cs:136-143, Studies.NetworkPerformance/NetworkPerformancePlugin.cs:141-148, Studies.DataFeedsMonitoring/DataFeedsMonitoringPlugin.cs:97-118). All three live on the Infrastructure Monitoring dashboard, which is why parts of that dashboard are alive before you touch anything.

Here is what that looks like. The three counter groups on the left have no provider selected and show labelled but empty boxes, while the panels that configure themselves are already live:

A VisualHFT dashboard where the left hand counter groups render their labels with no values because no provider has been selected, while the centre panels are already showing live data

The dialog

Click the gear in a tile’s top left corner, or, on a counter group, the gear in the group’s header, which configures every counter in that group at once. The market-data studies offer the same three fields, then OK and Cancel (Studies.LOBImbalance/UserControls/PluginSettingsView.xaml:10-34). Three exceptions are worth knowing: Market Latencies Stats and Market Operational Ratios ship without a Symbol field because they report on the venue rather than on an instrument, and Position Manager has no settings dialog at all (Studies.Positions/PositionsPlugin.cs:102-105).

FieldWhat it does
ProviderWhich connected venue this tile watches. The list holds every connector that has registered, and it opens on the first venue that is already connected (Studies.LOBImbalance/ViewModel/PluginSettingsViewModel.cs:186-187)
SymbolWhich instrument, by its normalised name
AggregationHow often the tile recomputes: No Aggregation, 1, 10, 100 or 500 milliseconds, 1, 3 or 5 seconds, or Daily (VisualHFT.Commons/Model/enums.cs:86-108)

Two things about Aggregation that the dropdown does not tell you:

  • The three finest settings are Pro only. On Community and Core, No Aggregation, 1 millisecond and 10 milliseconds are shown locked, and a study asking for one of them runs at the 100 millisecond floor instead (Services/Entitlement/EntitlementService.cs:37-41, :58-68, applied on every study start at VisualHFT.Commons/PluginManager/BasePluginStudy.cs:106).
  • Defaults vary by study, and one study ignores the field. Most order-book studies ship at 100 milliseconds, Market Resilience at 500 milliseconds, the ratio tiles at 1 second, Position Manager at no aggregation. VPIN runs on a fixed 1 second cadence (Studies.VPIN/VPINStudy.cs:303).

The provider list open inside a tile's settings dialog, showing Binance, Bitfinex, Kraken, KuCoin, Gemini, BitStamp, Coinbase and Historical File

On the Pro plan the provider list also includes Historical File, which is the Replay Engine, so the same tiles work identically over a replayed capture. That is why the animation at the top of this page reads Historical File in every tile footer. Below Pro the Replay Engine is not loaded at all and that entry is absent (PluginManager/PluginManager.cs:771-772).

Opening the LOB Imbalance tile's settings from its gear, choosing Kraken as the provider and BTC/USD as the symbol, and confirming with OK

The Symbol dropdown open in a tile's settings, listing the two instruments the Kraken connector has delivered so far: ETH/USD and BTC/USD

Two behaviours to expect

OK stays disabled until both Provider and Symbol are set (Studies.LOBImbalance/ViewModel/PluginSettingsViewModel.cs:149-155). The field you have not filled in is outlined in red, so the outline tells you which field OK is still waiting on.

The Symbol list is empty until a venue has actually delivered a book. The list is not a catalog of tradable instruments. It is the running set of symbols the application has already seen, appended to as data arrives (VisualHFT.Commons/Helpers/HelperSymbol.cs:12-18, fed from BasePluginDataRetriever.cs:105). If you open a tile’s settings within a second or two of connecting a venue, the Symbol box will be empty. Wait for the chip in the footer to go green and try again.

Pressing OK restarts that study. The tile clears and repopulates from the next matching update.

Repeat for each tile you care about, and the column comes alive:

The dashboard after configuration: LOB Imbalance, VPIN, MR and OTR showing live values with Kraken: BTC/USD in each footer, while the TTO tile, deliberately left unconfigured, stays blank with an empty footer

Look at the TTO tile in that clip. It was left unconfigured on purpose so you can see the difference side by side: the tiles carrying a provider and a symbol update, and the one still waiting for its two fields keeps an empty footer. Set those two fields and it joins the others.

The dashboards

The picker in the top left holds three working dashboards and five marked “coming soon”, which are visible but not selectable (DashboardManager/DashboardManager.cs:245-269). The application opens on the first one that can load, which is Predictive Market Analytics.

DashboardWhat it is for
Predictive Market AnalyticsThe default. A quote ladder and level 2 depth, then order book imbalance, VPIN, market resilience and the order and trade ratio tiles, with a depth chart, a limit order book time series, position manager and time and sales
Infrastructure MonitoringFeed health, network path quality, host counters, and per venue latency, error and event rate counters. Covered in its own guide
Liquidity and Order Flow MonitoringThe liquidity and flow subset, plus the two analytics launchers

Two things to know about switching:

  • Each dashboard has a fixed layout. Each dashboard’s slots are declared in code (DashboardManager/DashboardManager.cs:152-223). You cannot drag a tile to a different position or add one that is not in the layout.
  • Switching stops the outgoing dashboard’s studies. Every tile’s study is stopped as its dashboard is torn down (ViewModel/vmDashboardL3.cs:571, ViewModel/vmTile.cs:496-516). Your provider and symbol settings are saved and will still be there when you come back, but each tile starts empty again and refills from the next update.

You do not start studies yourself. A study starts automatically when its tile is built (ViewModel/vmDashboardL3.cs:486-487). Connectors are the only thing you switch on by hand.

What is included, and what is a separate purchase

Two independent things decide whether a plugin works for you: the plan you are on, and, for the six paid add-ons only, whether you own that add-on.

Plans

PlanPriceWhat it adds
CommunityFreeAll seven venue connectors, plus VPIN, order book imbalance, the limit order book time series, the depth chart, position manager, quotes and level 2 depth, time and sales, order to trade ratio, market resilience and market resilience bias
Core (L2)$129 per month, $1,290 per year, 7 day trialEverything in Community, plus market ratios, trade to order ratio, market event statistics, market latency statistics, operational ratios, performance counters, data feed monitoring and network performance
Pro$799 per month, $7,990 per year, 7 day trialEverything in Core, plus the Replay Engine at no extra cost, sub-100-millisecond aggregation, and access to buy the Pro add-ons
EnterpriseContact salesEverything in Pro, plus custom feeds, single sign-on and a private marketplace

Plan rows and prices from scripts/seed-marketplace.js:1463-1548. Core (L2) is the name shown in the Marketplace, not Core. Each plugin declares its own plan floor in its source, and anything that declares nothing is Community (VisualHFT.Commons/PluginManager/BasePluginStudy.cs:60).

The six add-ons that are bought separately

These are the only plugins that are a purchase rather than a plan inclusion. None of them is in the installer. They are delivered to your machine after purchase, so before you own one it is not present on disk at all (VisualHFT.csproj:142-168).

Add-onPlan floorPriceWhat it is
Cross-Venue AnalyticsCore$49 per monthCompares the same instrument across every connected venue
Market AggregatorCore$49 per monthA connector that consolidates several venues into one book
Liquidity AnalyticsCore$149 per monthDepth profile, cost of immediacy, replenishment
Session RecorderPro$249 per monthRecords a session for later replay
Event Capture RecorderPro$249 per monthCaptures a defined event window
Microstructure DiagnosticsPro$799 per monthThe microstructure diagnostics launcher

Catalog rows from scripts/seed-marketplace.js, entries at :54, :65, :329, :418, :443, :454.

The Replay Engine is the exception worth knowing. It is bundled in the installer and it is not a purchase, but its plan floor is Pro, so it is present but unavailable below that plan (scripts/seed-marketplace.js:432-442, VisualHFT.csproj:196).

In the Marketplace, reached from the storefront icon in the top bar, a plugin included with your plan is labelled Included where a price would be, and a paid add-on you own carries a green Purchased badge (View/MarketPlace/MarketPlaceListing.xaml:244).

The Marketplace window showing the Market Connectors section, with every venue connector labelled Included

Plugins Management, when a tile is not the right surface

The jigsaw icon in the top bar opens Plugin Manager: every loaded plugin grouped by type, with its version, description and status, and buttons to start, stop and configure it (View/PluginManagerWindow.xaml:25-88).

The Plugin Manager window listing every loaded market connector with its version, description, STARTED status, and start, stop and configure buttons

The Status column shows the raw internal state. There are eight of them: LOADING, LOADED, STARTING, STARTED, STOPPED, STOPPED_FAILED, MALFUNCTIONING and STOPPING (VisualHFT.Commons/UserSettings/enums.cs:17-27). One caution:

STARTED means the plugin loaded and its wiring completed. Give a study its provider and symbol and it begins producing on the next matching update.

The list refreshes on a ten second timer rather than when something changes (ViewModel/vmPluginManager.cs:21), so give it a moment after starting or stopping something.

Checklist: bringing every tile live

Work down this list. It is ordered by how often each one is the answer.

CheckWhat a live tile looks likeWhat to do otherwise
The tile’s own footer lineKraken: BTC/USD, naming a venue you are connected toBlank or a different venue. Open the gear and set both fields
The footer chip for that venuePresent and greenNo chip means not connected. Open the + catalog and switch it on
The Symbol you choseMatches the name inside the parentheses in the connector’s symbol boxA tile set to BTC/USD will never match a connector publishing BTCUSDT
Time elapsed since OKA few seconds for most tilesSome studies need a warm up window or a minimum number of trades before their first value
The notification bellNo repeating errorRepeated parse or socket errors point at the connector, not the tile
Plugin Manager statusSTARTEDSTOPPED_FAILED means the connector exhausted its five reconnection attempts

Where your settings live

Everything you configure on this page, including connector API keys, is in a single file:

%LOCALAPPDATA%\VisualHFT.UserData\Settings\settings.json

Which connectors you left switched on is kept separately, beside it:

%LOCALAPPDATA%\VisualHFT.UserData\Settings\connector-connections.json

VisualHFT rewrites the whole settings file whenever you press OK in any settings dialog, taking a timestamped copy of it first (VisualHFT.Commons/UserSettings/SettingsManager.cs:146-151). Those copies are stamped to the minute, so two saves in the same minute share one backup, and anything older than 60 days is pruned (:159-188).

Where to go next