Skip to main content

QuantHouse Market Data Connector

QuantHouse Data Connector based on FeedOS API.

Features

quanthouseConnector Key
Instrument Types
EquitiesFuturesOptionsFXBonds
Technology
Custom API
Feed Mode
Real-Time
Order Book Update Mode
SnapshotIncremental Updates
Order Book Type
Aggregated
Message Types
Level 1
Level 2
Level 3
Trades
Funding Rates
Custom Message Types
QuantHouse Depth Info
QuantHouse Imbalance Data
QuantHouse Instrument Info
QuantHouse NYSE OI Data
QuantHouse Order
QuantHouse Security Trading Status
QuantHouse Trade Event
QuantHouse User Command

Configuration

Data Connector Parameters

ParameterDefault ValueDescription
HostN/AServer host.
PortN/AServer port.
User NameN/AUser name for the session.
PasswordN/APassword for the session.
Custom Filter File PathN/APath to the custom filter implementation file, relative to the 'config/plugins/' subfolder of your QuantServer home folder. See Custom User Filters.
Custom Transformation File PathN/APath to the custom transformation implementation file, relative to the 'config/plugins/' subfolder of your QuantServer home folder. See Custom User Filters.
Filter Magic Prices For L1 DatafalseSelect this option if you want to filter out "magic" prices from L1 data (Top-of-book and Trades).

"Magic" prices are reserved FeedOS price constants (At Best, At Open, Peg, At Close, Unquoted) that the venue uses to encode a special order type instead of an actual price — e.g. a pegged order or a market order priced "at open"/"at close". Enabling this option drops updates carrying such a placeholder price rather than passing it through as if it were a real quote or trade price.
Subscribe Implied PricesfalseSelect this option if you want to subscribe to implied prices (layer #1).
Snapshot Interval10SThis property sets an interval in seconds between periodical Level2 snapshots which sent to Aggregator.

Snapshots will be generated as soon as this threshold is exceeded AND the next increment message arrives. Conversely, snapshots are NOT generated every period if no data is coming in.

Default value is 10 seconds.

Message Types

In addition to the standard universal market-data message types, the connector defines a set of custom message types (package deltix.qsrv.hf.plugins.data.quanthouse.types) that carry vendor-specific data.

QuantHouse Package Header

Top-level output message that wraps a batch of book/trade entries published by the connector. All L1, L2, trade and book-reset updates for an instrument are delivered inside this envelope.

FieldTypeDescription
Entriesarray of L1Entry, L2EntryNew, L2EntryUpdate, TradeEntry, BookResetEntryThe batch of universal entries carried by this update.

QuantHouse Depth Info

Book-depth metadata accompanying a Level2 update.

FieldTypeDescription
Max Visible DepthintNumber of visible depth levels included in the update.
Is ImpliedbooleanWhether the update reflects implied (synthetic) prices rather than firm orders.

QuantHouse Imbalance Data

Auction/imbalance data published around opening, closing and intraday auctions.

FieldTypeDescription
Last Auction Imbalance SidecharSide (buy/sell) of the last auction imbalance.
Last Auction PriceDecimal64Indicative or final price of the last auction.
Last Auction VolumeDecimal64Volume matched at the last auction.
Last Auction Imbalance VolumeDecimal64Unmatched (imbalance) volume at the last auction.

QuantHouse NYSE OI Data

NYSE-specific extension of QuantHouse Imbalance Data carrying additional opening/closing "Order Imbalance" (OI) fields.

FieldTypeDescription
(inherits all fields of QuantHouse Imbalance Data above)
Auction Interest Clearing PriceDecimal64Price at which auction interest would clear.
Continuous Book Clearing PriceDecimal64Price at which the continuous order book would clear.
Significant ImbalancecharFlag indicating a significant order imbalance.
Unpaired SidecharSide (buy/sell) of the unpaired (imbalance) quantity.
Unpaire QtyDecimal64Unpaired (imbalance) quantity.

QuantHouse Instrument Info

Per-instrument reference/state snapshot, populated from FeedOS instrument-characteristics tags. Fields are grouped below by purpose; most price/quantity fields are Decimal64 and most date/timestamp fields are TimeBase timestamps.

Settlement, open interest and reference data

FieldTypeDescription
Daily Settlement PriceDecimal64Settlement price for the current business day.
Settlement Price TypecharVendor code describing how the settlement price was derived.
Settlement Price DatetimestampDate the settlement price applies to.
Open InterestDecimal64Open interest for the current business day.
Open Interest DatetimestampDate the open interest applies to.
Current Business DaytimestampBusiness day this snapshot refers to.
Trading StatusintVendor trading-status code for the instrument.
Internal Daily Closing Price TypecharVendor code describing how the daily closing price was derived.
MARKET ICE EFP VolumeDecimal64ICE Exchange-for-Physical volume.
MARKET ICE EFS VolumeDecimal64ICE Exchange-for-Swap volume.
MARKET ICE Block VolumeDecimal64ICE block-trade volume.

Last trade / price activity

FieldTypeDescription
Last PriceDecimal64Last traded or reference price.
Last Trade Price / Qty / TimestampDecimal64 / Decimal64 / timestampPrice, quantity and time of the last on-book trade.
Last Eligible Trade Price / Qty / TimestampDecimal64 / Decimal64 / timestampPrice, quantity and time of the last trade eligible for reference-price calculations.
Last Off Book Trade Price / Qty / TimestampDecimal64 / Decimal64 / timestampPrice, quantity and time of the last off-book (OTC) trade.
Last Auction Price / VolumeDecimal64 / Decimal64Price and volume of the last auction for this instrument.
Mid PriceDecimal64Current mid price (average of best bid/ask).
Session VWAP PriceDecimal64Volume-weighted average price for the session.
Price Activity Market TimestamptimestampTime of the last price-affecting market activity.

Daily statistics

FieldTypeDescription
Daily Number Of TradesintNumber of on-book trades so far today.
Daily Number Of Block TradesintNumber of block trades so far today.
Daily Total Volume / Asset TradedDecimal64 / Decimal64Total on-book traded volume / notional value today.
Daily Total Off Book Volume / Asset TradedDecimal64 / Decimal64Total off-book traded volume / notional value today.
Daily Total Block Volume TradedDecimal64Total block-traded volume today.

Daily OHLC and closing quotes

FieldTypeDescription
Daily Opening Price / TimestampDecimal64 / timestampOpening price and time.
Daily High Price / TimestampDecimal64 / timestampHighest traded price and time.
Daily Low Price / TimestampDecimal64 / timestampLowest traded price and time.
Daily High/Low Bid Price / QtyDecimal64Highest/lowest bid price and quantity seen today.
Daily High/Low Ask Price / QtyDecimal64Highest/lowest ask price and quantity seen today.
Daily High/Low Mid PriceDecimal64Highest/lowest mid price seen today.
Daily Closing Bid Price / Qty / TimestampDecimal64 / Decimal64 / timestampClosing bid quote for the day.
Daily Closing Ask Price / Qty / TimestampDecimal64 / Decimal64 / timestampClosing ask quote for the day.

Internal timestamps

FieldTypeDescription
Internal Daily Business Day TimestamptimestampInternal business-day marker.
Internal Price Activity TimestamptimestampInternal marker for the last price activity.
Internal Last Auction TimestamptimestampInternal marker for the last auction.
Internal Daily Open / Close / High / Low TimestamptimestampInternal markers for the day's open, close, high and low events.

Previous business day

FieldTypeDescription
Previous Business DaytimestampThe prior business day.
Previous Daily Closing / High / Low / Settlement PriceDecimal64Prior day's closing, high, low and settlement prices.
Previous Internal Daily Closing Price TypecharVendor code describing how the prior day's closing price was derived.
Previous Settlement Price Type / Datechar / timestampType and date of the prior day's settlement price.
Previous Open Interest / DateDecimal64 / timestampPrior day's open interest and its date.
Previous Valid Bid / Ask TimestamptimestampTime of the last valid bid/ask quote on the prior day.
Previous Daily Total Volume / Asset TradedDecimal64Prior day's total on-book traded volume / notional value.
Previous Daily Total Off Book Volume / Asset TradedDecimal64Prior day's total off-book traded volume / notional value.

Risk

FieldTypeDescription
Var CloseDecimal64Variation from the previous close (absolute).
Var Close PctDecimal64Variation from the previous close (percentage).

QuantHouse Security Trading Status

Standard TimeBase trading-status message extended with a raw, vendor-specific status code.

FieldTypeDescription
(inherits all fields of the standard trading-status message)
Status CodeintRaw QuantHouse/FeedOS trading-status code, in addition to the normalized standard status.

QuantHouse Trade Event

Raw diagnostic dump of everything received on the L1 subscription channel for an instrument — not only trades. It carries the full content of the underlying QuotationTradeEventExt/QuotationTradeCancelCorrection FeedOS event: content mask, context/value tags, best bid/ask, last trade price/quantity, off-book trades and cancels/corrections alike. This is a troubleshooting/logging aid, not a primary market-data record — the corresponding normalized updates are delivered separately as L1Entry/TradeEntry inside QuantHouse Package Header.

FieldTypeDescription
Trade Event DumpCharSequenceRaw text dump of the original FeedOS L1 event (content mask, context/value tags, best bid/ask, last trade or off-book trade price and quantity, or cancel/correction details), as received before any filtering or transformation.

QuantHouse User Command

Inbound control message used to dynamically subscribe/unsubscribe to L1/L2 data, or request a snapshot, for a symbol at runtime. See l2ByUserOnly and the _QHUserCommands stream.

FieldTypeDescription
SymbolstringInstrument symbol the command applies to, or #ALL# to apply it to all currently subscribed symbols.
User CommandQHUserCommand enum: SubscribeL1, SubscribeL2, UnsubscribeL1, UnsubscribeL2, UnsubscribeL1L2, SendSnapshotL1, SendSnapshotL2Action to perform for the given symbol.

Advanced Options

These parameters are not exposed in the connector UI. They are set in the admin.properties file, or passed as Java system properties (-D<name>=<value>) to the QuantServer process. Do not change these values unless you clearly understand what they do — incorrect values can cause data loss or destabilize the connector.

PropertyTypeDefaultDescription
deltix.qsrv.hf.plugins.data.quanthouse.l2ByUserOnlybooleanfalseWhen true, Level2/MBO subscriptions are not started automatically for instruments required by the output model. Instead, a Level2 subscription is only started on demand, in response to a QuantHouse User Command carrying the SubscribeL2 command. These commands are monitored in the stream named _QHUserCommands.
qh.queueSizeint300000Capacity, in elements, of the internal bounded queue that buffers incoming FeedOS events between the FeedOS session thread and the connector's processing thread.
qh.queueSizeThresholdint0Percentage (0-100) of the qh.queueSize capacity that, once exceeded, triggers automatic clearing of stale queued items to relieve backpressure.
qh.periodicalSnapshotIntervalint (seconds)0 (disabled)Interval, in seconds, at which the connector independently forces periodic book snapshots per instrument, in addition to the snapshot behavior controlled by the Snapshot Interval parameter above.

Symbology

QuantHouse instrument identifiers can be specified in one of three formats:

Symbol NotationExamples
MIC@Symbol — ISO market identifier code followed by the QuantHouse symbolXEUR@FDAX1220
XEUR@FGBL0621
XNYM@NGJ3
!ROOT_SYMBOL — group subscription, expands to all instruments currently available under the root symbol!GC
!EUR
INTERNAL_NUMERIC_CODE — raw internal FeedOS instrument code1280042

For the full list of tradable instruments, refer to the FeedOS API documentation.

Logging

To enable detailed logging, use these lines in the <QSHOME>/config/gflog.xml file:

<logger name="deltix.qsrv.hf.plugins.data.quanthouse" level="TRACE">
<appender-ref ref="safeAppender"/>
</logger>

Custom User Filters

The Custom Filter File Path and Custom Transformation File Path parameters let you plug in your own Java logic to accept/reject or modify L1 (top-of-book and trade) updates before they are published. The file is compiled at runtime — no rebuild or restart of QuantServer packaging is required, only a restart of the connector — and must be located relative to the config/plugins/ subfolder of your QuantServer home folder (<QSHome>/config/plugins/<path from field>).

Each file must contain a single class implementing one of the two interfaces below (package deltix.qsrv.hf.plugins.data.quanthouse.custom). The class does not need to be named after the file, and does not need a package declaration, but it must have a public no-argument constructor.

L1Filter

Installing a filter causes the feed to ignore every L1 update for which accept returns false.

public interface L1Filter {
// Called once by the framework before first use.
void setLogger(Logger logger);

// Return false to drop this L1 top-of-book/trade update.
boolean accept(int instrument_code, QuotationTradeEventExt trade_event_ext);

// Return false to drop this trade cancel/correction. Defaults to true.
default boolean accept(int instrument_code, QuotationTradeCancelCorrection correction) {
return true;
}
}

Sample implementation (L1FilterSample.java, drops updates where the best ask quantity is greater than zero):

public class L1FilterSample implements L1Filter {

private Logger logger;

@Override
public void setLogger(Logger logger) {
this.logger = logger;
}

@Override
public boolean accept(int instrument_code, QuotationTradeEventExt trade_event_ext) {
if (trade_event_ext.best_ask_qty > 0) {
logger.log(Level.INFO, "Filtered event with ask > 0");
return false;
}
return true;
}
}

L1Transform

A transformation can modify a trade or best bid/ask entry in place, and can also veto sending it by returning false. It is invoked separately for the trade entry, for the best bid/ask pair, and for trade cancel/corrections.

public interface L1Transform {
// Called once by the framework before first use.
void setLogger(Logger logger);

// Modify the trade entry in place; return false to drop it.
boolean transform(TradeEntry trade, QuotationTradeEventExt trade_event_ext);

// Modify the best bid/ask entries in place; return false to drop the update.
boolean transform(L1Entry bestBid, L1Entry bestAsk, QuotationTradeEventExt trade_event_ext);

// Modify a trade cancel/correction; return false to drop it. Defaults to true.
default boolean transform(TradeEntry trade, QuotationTradeCancelCorrection correction) {
return true;
}
}

Sample implementation (L1TransformSample.java, caps large trade sizes, drops zero-size trades, and nulls out zero-size bid/ask entries):

public class L1TransformSample implements L1Transform {

private Logger logger;

@Override
public void setLogger(Logger logger) {
this.logger = logger;
}

@Override
public boolean transform(TradeEntry trade, QuotationTradeEventExt trade_event_ext) {
if (Decimal64Utils.isGreater(trade.getSize(), Decimal64Utils.fromDouble(12.34))) {
logger.log(Level.INFO, "Found big trade: " + Decimal64Utils.toString(trade.getSize()));
trade.setSize(Decimal64Utils.fromDouble(5));
} else if (Decimal64Utils.isZero(trade.getSize())) {
logger.log(Level.INFO, "Skip trade with zero size");
return false;
}
return true;
}

@Override
public boolean transform(L1Entry bestBid, L1Entry bestAsk, QuotationTradeEventExt trade_event_ext) {
if (bestBid != null && Decimal64Utils.isZero(bestBid.getSize())) {
bestBid.setSize(Decimal64Utils.NULL);
bestBid.setPrice(Decimal64Utils.NULL);
}
if (bestAsk != null && Decimal64Utils.isZero(bestAsk.getSize())) {
bestAsk.setSize(Decimal64Utils.NULL);
bestAsk.setPrice(Decimal64Utils.NULL);
}
return true;
}

@Override
public boolean transform(TradeEntry trade, QuotationTradeCancelCorrection correction) {
return true;
}
}

If a filter is configured, it is evaluated before a transformation on the same event; if the filter rejects the event, the transformation is not invoked.

Utilities

The connector ships with a set of standalone command-line utilities, located in the tools folder of the QuantHouse connector distribution.

DataLoader

Loads historical QuantHouse binary feed-recording files from disk and publishes them into a TimeBase stream. Launched via tools/DataLoader.sh (Linux) or tools/DataLoader.cmd (Windows).

ArgumentDescription
-tbTimeBase URL, e.g. dxtick://localhost:8011 or dxtick://user:password@localhost:8011.
-inDirectory containing the QuantHouse binary files to load, e.g. C:\QH\Data.
-exchangeName of the exchange — the subfolder of the data directory to read from, e.g. ice_eu.
-typeComma-separated list of data types to load: L1, MBL, MBO.
-periodTime period to load, e.g. 2024-04-18,2024-04-20.
-streamName of the target TimeBase stream. Created automatically if it doesn't exist.
-controlFieldField in the securities stream used for instrument mapping (internal QuantHouse ID). Only one field name per instrument is supported.
-qqlQQL query used to select securities. Defaults to SELECT * FROM securities.
-processImpliedStore implied prices. Only applies when loading MBL data.
-requireAllTypesWhen more than one -type is specified, fail if any day in the requested period is missing one of the specified types. Defaults to false.
-limitLimit on the total number of messages to load.
-verbosePrint the original messages to the output.
-l1FilterPath to a custom L1 filter class — see Custom User Filters.
-l1TransformPath to a custom L1 transformation class — see Custom User Filters.
-oauthProvider, -oauthClientId, -oauthClientSecret, -oauthScopeOAuth credentials for the target TimeBase server. All four must be specified together to enable OAuth authorization.

Example:

DataLoader -in c:\QH\FEED\ -exchange ice_eu -type L1 -period 2024-04-18,2024-04-20 \
-tb dxtick://localhost:8011 -stream QHData -l1Filter C:\QH\L1FilterSample.java \
-qql "SELECT * FROM securities WHERE Symbol in ('XNYM@NGJ3', 'XEUR@FGBL0321')"

Symbols (Metadata)

Connects live to a FeedOS server and downloads referential/instrument metadata directly into a SQL Server database via JDBC. Launched via tools/Symbols.cmd.

Symbols SERVER PORT LOGIN PASSWORD JDBC_CONNECTION [TYPE1,TYPE2/ALL] [ROOT1,ROOT2/ALL] [EXCHANGE1,EXCHANGE2/ALL] [TAG_ID1:TAG_TYPE:DB_FIELD,TAG_ID2:TAG_TYPE:DB_FIELD/ALL]
ArgumentDescription
SERVER, PORTHost and port of the FeedOS server.
LOGIN, PASSWORDFeedOS credentials.
JDBC_CONNECTIONJDBC connection string of the target SQL Server database.
[TYPE1,TYPE2/ALL]Instrument types to download, or ALL.
[ROOT1,ROOT2/ALL]Root symbols to download, or ALL.
[EXCHANGE1,EXCHANGE2/ALL]Exchanges (MICs) to download, or ALL.
[TAG_ID:TAG_TYPE:DB_FIELD, ...]Optional mapping of FeedOS tag IDs to database columns, or ALL. DB_FIELD may not be a primary or foreign key. Available TAG_TYPE values: bool, char, string, float64, int8, int16, int32, int64, uint8, uint16, uint32, uint64, timestamp.

Example:

Symbols localhost 8000 joe secret jdbc:sqlserver://etc FUT,OPT WBS,ATW,O3FM XCEC 1703:float64:SecID

SymbolsCSV (MetadataCSV)

Loads referential data from local QuantHouse binary referential files (offline) into a SQL Server database. Launched via tools/SymbolsCSV.cmd.

ArgumentDescription
-inDirectory containing the QuantHouse binary referential files, e.g. C:\QH\Data.
-exchangeName of the exchange — the subfolder of the data directory to read from, e.g. ice_eu.
-periodTime period to load, e.g. 2024-04-18,2024-04-20.
-odbcODBC/JDBC connection string of the target SQL Server database, e.g. jdbc:sqlserver://localhost\SQLEXPRESS;databaseName=QH;integratedSecurity=false;user=USER;password=PWD.

Example:

SymbolsCSV -in c:\QH\FEED\ -exchange ice_eu -period 2024-04-18,2024-04-20 \
-odbc "jdbc:sqlserver://localhost\SQLEXPRESS;databaseName=QH;integratedSecurity=false;user=USER;password=PWD"