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 (Windows) or tools/Symbols.sh (Linux).

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. Include useBulkCopyForBatchInsert=trueto enable Microsoft JDBC bulk copy — faster DB loading on large instrument sets.
[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://localhost;databaseName=QH;user=USER;password=PWD;useBulkCopyForBatchInsert=true;" FUT,OPT WBS,ATW,O3FM XCEC 1703:float64:SecID

Increasing JVM memory​

Large referential downloads need a larger heap than the JVM default. Both launchers honor JAVA_OPTS. For full-universe runs, use at least -Xmx5g (observed heap usage is about 4–6 GB):

Windows (cmd):

set JAVA_OPTS=-Xmx5g
Symbols.cmd localhost 8000 joe secret "jdbc:sqlserver://localhost;databaseName=QH;user=USER;password=PWD;useBulkCopyForBatchInsert=true;" ALL ALL ALL

Linux:

export JAVA_OPTS="-Xmx5g"
./Symbols.sh localhost 8000 joe secret "jdbc:sqlserver://localhost;databaseName=QH;user=USER;password=PWD;useBulkCopyForBatchInsert=true;" ALL ALL ALL

Increase -Xmx further if the process still runs out of memory.

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"