
QuantHouse Market Data Connector
QuantHouse Data Connector based on FeedOS API.
Features
quanthouseConnector KeyConfiguration
Data Connector Parameters
| Parameter | Default Value | Description |
|---|---|---|
| Host | N/A | Server host. |
| Port | N/A | Server port. |
| User Name | N/A | User name for the session. |
| Password | N/A | Password for the session. |
| Custom Filter File Path | N/A | Path to the custom filter implementation file, relative to the 'config/plugins/' subfolder of your QuantServer home folder. See Custom User Filters. |
| Custom Transformation File Path | N/A | Path 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 Data | false | Select 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 Prices | false | Select this option if you want to subscribe to implied prices (layer #1). |
| Snapshot Interval | 10S | This 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.
| Field | Type | Description |
|---|---|---|
| Entries | array of L1Entry, L2EntryNew, L2EntryUpdate, TradeEntry, BookResetEntry | The batch of universal entries carried by this update. |
QuantHouse Depth Info
Book-depth metadata accompanying a Level2 update.
| Field | Type | Description |
|---|---|---|
| Max Visible Depth | int | Number of visible depth levels included in the update. |
| Is Implied | boolean | Whether the update reflects implied (synthetic) prices rather than firm orders. |
QuantHouse Imbalance Data
Auction/imbalance data published around opening, closing and intraday auctions.
| Field | Type | Description |
|---|---|---|
| Last Auction Imbalance Side | char | Side (buy/sell) of the last auction imbalance. |
| Last Auction Price | Decimal64 | Indicative or final price of the last auction. |
| Last Auction Volume | Decimal64 | Volume matched at the last auction. |
| Last Auction Imbalance Volume | Decimal64 | Unmatched (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.
| Field | Type | Description |
|---|---|---|
| (inherits all fields of QuantHouse Imbalance Data above) | ||
| Auction Interest Clearing Price | Decimal64 | Price at which auction interest would clear. |
| Continuous Book Clearing Price | Decimal64 | Price at which the continuous order book would clear. |
| Significant Imbalance | char | Flag indicating a significant order imbalance. |
| Unpaired Side | char | Side (buy/sell) of the unpaired (imbalance) quantity. |
| Unpaire Qty | Decimal64 | Unpaired (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
| Field | Type | Description |
|---|---|---|
| Daily Settlement Price | Decimal64 | Settlement price for the current business day. |
| Settlement Price Type | char | Vendor code describing how the settlement price was derived. |
| Settlement Price Date | timestamp | Date the settlement price applies to. |
| Open Interest | Decimal64 | Open interest for the current business day. |
| Open Interest Date | timestamp | Date the open interest applies to. |
| Current Business Day | timestamp | Business day this snapshot refers to. |
| Trading Status | int | Vendor trading-status code for the instrument. |
| Internal Daily Closing Price Type | char | Vendor code describing how the daily closing price was derived. |
| MARKET ICE EFP Volume | Decimal64 | ICE Exchange-for-Physical volume. |
| MARKET ICE EFS Volume | Decimal64 | ICE Exchange-for-Swap volume. |
| MARKET ICE Block Volume | Decimal64 | ICE block-trade volume. |
Last trade / price activity
| Field | Type | Description |
|---|---|---|
| Last Price | Decimal64 | Last traded or reference price. |
| Last Trade Price / Qty / Timestamp | Decimal64 / Decimal64 / timestamp | Price, quantity and time of the last on-book trade. |
| Last Eligible Trade Price / Qty / Timestamp | Decimal64 / Decimal64 / timestamp | Price, quantity and time of the last trade eligible for reference-price calculations. |
| Last Off Book Trade Price / Qty / Timestamp | Decimal64 / Decimal64 / timestamp | Price, quantity and time of the last off-book (OTC) trade. |
| Last Auction Price / Volume | Decimal64 / Decimal64 | Price and volume of the last auction for this instrument. |
| Mid Price | Decimal64 | Current mid price (average of best bid/ask). |
| Session VWAP Price | Decimal64 | Volume-weighted average price for the session. |
| Price Activity Market Timestamp | timestamp | Time of the last price-affecting market activity. |
Daily statistics
| Field | Type | Description |
|---|---|---|
| Daily Number Of Trades | int | Number of on-book trades so far today. |
| Daily Number Of Block Trades | int | Number of block trades so far today. |
| Daily Total Volume / Asset Traded | Decimal64 / Decimal64 | Total on-book traded volume / notional value today. |
| Daily Total Off Book Volume / Asset Traded | Decimal64 / Decimal64 | Total off-book traded volume / notional value today. |
| Daily Total Block Volume Traded | Decimal64 | Total block-traded volume today. |
Daily OHLC and closing quotes
| Field | Type | Description |
|---|---|---|
| Daily Opening Price / Timestamp | Decimal64 / timestamp | Opening price and time. |
| Daily High Price / Timestamp | Decimal64 / timestamp | Highest traded price and time. |
| Daily Low Price / Timestamp | Decimal64 / timestamp | Lowest traded price and time. |
| Daily High/Low Bid Price / Qty | Decimal64 | Highest/lowest bid price and quantity seen today. |
| Daily High/Low Ask Price / Qty | Decimal64 | Highest/lowest ask price and quantity seen today. |
| Daily High/Low Mid Price | Decimal64 | Highest/lowest mid price seen today. |
| Daily Closing Bid Price / Qty / Timestamp | Decimal64 / Decimal64 / timestamp | Closing bid quote for the day. |
| Daily Closing Ask Price / Qty / Timestamp | Decimal64 / Decimal64 / timestamp | Closing ask quote for the day. |
Internal timestamps
| Field | Type | Description |
|---|---|---|
| Internal Daily Business Day Timestamp | timestamp | Internal business-day marker. |
| Internal Price Activity Timestamp | timestamp | Internal marker for the last price activity. |
| Internal Last Auction Timestamp | timestamp | Internal marker for the last auction. |
| Internal Daily Open / Close / High / Low Timestamp | timestamp | Internal markers for the day's open, close, high and low events. |
Previous business day
| Field | Type | Description |
|---|---|---|
| Previous Business Day | timestamp | The prior business day. |
| Previous Daily Closing / High / Low / Settlement Price | Decimal64 | Prior day's closing, high, low and settlement prices. |
| Previous Internal Daily Closing Price Type | char | Vendor code describing how the prior day's closing price was derived. |
| Previous Settlement Price Type / Date | char / timestamp | Type and date of the prior day's settlement price. |
| Previous Open Interest / Date | Decimal64 / timestamp | Prior day's open interest and its date. |
| Previous Valid Bid / Ask Timestamp | timestamp | Time of the last valid bid/ask quote on the prior day. |
| Previous Daily Total Volume / Asset Traded | Decimal64 | Prior day's total on-book traded volume / notional value. |
| Previous Daily Total Off Book Volume / Asset Traded | Decimal64 | Prior day's total off-book traded volume / notional value. |
Risk
| Field | Type | Description |
|---|---|---|
| Var Close | Decimal64 | Variation from the previous close (absolute). |
| Var Close Pct | Decimal64 | Variation from the previous close (percentage). |
QuantHouse Security Trading Status
Standard TimeBase trading-status message extended with a raw, vendor-specific status code.
| Field | Type | Description |
|---|---|---|
| (inherits all fields of the standard trading-status message) | ||
| Status Code | int | Raw 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.
| Field | Type | Description |
|---|---|---|
| Trade Event Dump | CharSequence | Raw 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.
| Field | Type | Description |
|---|---|---|
| Symbol | string | Instrument symbol the command applies to, or #ALL# to apply it to all currently subscribed symbols. |
| User Command | QHUserCommand enum: SubscribeL1, SubscribeL2, UnsubscribeL1, UnsubscribeL2, UnsubscribeL1L2, SendSnapshotL1, SendSnapshotL2 | Action 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.
| Property | Type | Default | Description |
|---|---|---|---|
deltix.qsrv.hf.plugins.data.quanthouse.l2ByUserOnly | boolean | false | When 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.queueSize | int | 300000 | Capacity, in elements, of the internal bounded queue that buffers incoming FeedOS events between the FeedOS session thread and the connector's processing thread. |
qh.queueSizeThreshold | int | 0 | Percentage (0-100) of the qh.queueSize capacity that, once exceeded, triggers automatic clearing of stale queued items to relieve backpressure. |
qh.periodicalSnapshotInterval | int (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 Notation | Examples |
|---|---|
MIC@Symbol — ISO market identifier code followed by the QuantHouse symbol | XEUR@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 code | 1280042 |
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).
| Argument | Description |
|---|---|
-tb | TimeBase URL, e.g. dxtick://localhost:8011 or dxtick://user:password@localhost:8011. |
-in | Directory containing the QuantHouse binary files to load, e.g. C:\QH\Data. |
-exchange | Name of the exchange — the subfolder of the data directory to read from, e.g. ice_eu. |
-type | Comma-separated list of data types to load: L1, MBL, MBO. |
-period | Time period to load, e.g. 2024-04-18,2024-04-20. |
-stream | Name of the target TimeBase stream. Created automatically if it doesn't exist. |
-controlField | Field in the securities stream used for instrument mapping (internal QuantHouse ID). Only one field name per instrument is supported. |
-qql | QQL query used to select securities. Defaults to SELECT * FROM securities. |
-processImplied | Store implied prices. Only applies when loading MBL data. |
-requireAllTypes | When more than one -type is specified, fail if any day in the requested period is missing one of the specified types. Defaults to false. |
-limit | Limit on the total number of messages to load. |
-verbose | Print the original messages to the output. |
-l1Filter | Path to a custom L1 filter class — see Custom User Filters. |
-l1Transform | Path to a custom L1 transformation class — see Custom User Filters. |
-oauthProvider, -oauthClientId, -oauthClientSecret, -oauthScope | OAuth 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]
| Argument | Description |
|---|---|
SERVER, PORT | Host and port of the FeedOS server. |
LOGIN, PASSWORD | FeedOS credentials. |
JDBC_CONNECTION | JDBC 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.
| Argument | Description |
|---|---|
-in | Directory containing the QuantHouse binary referential files, e.g. C:\QH\Data. |
-exchange | Name of the exchange — the subfolder of the data directory to read from, e.g. ice_eu. |
-period | Time period to load, e.g. 2024-04-18,2024-04-20. |
-odbc | ODBC/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"
