Skip to content

For C/C++ developers, this library offers easy access to dxFeed market data. Built upon the GraalVM Native Image and our flagship dxFeed Java API, it provides a seamless experience for С/C++-based applications

License

Notifications You must be signed in to change notification settings

dxFeed/dxfeed-graal-cxx-api

Repository files navigation

light

This package provides access to dxFeed market data. The library is built as a language-specific wrapper over the dxFeed Graal Native library, which was compiled with GraalVM Native Image and dxFeed Java API (our flagman API).

ℹ️ If you already use dxFeed C API, please see the Overview section.

Build Platform Release License

Table of Contents

Overview

Reasons for the New CXX API Repository

The old version of dxFeed C API, has several architectural restrictions that prevent us from providing a state-of-the-art technological solution.

Benefits of the New Version

  • 🚀 Increased performance
  • 🌌 Wider functionality
  • ♊ Identical programming interfaces to our best API
  • 👍 Higher quality of support and service

Milestones

Feature development has already stopped for the old version of dxFeed C API.

The old version will be considered deprecated, and at the end of 2024, we plan to end the service. If you’re already our customer and have difficulty with a future transition, please contact us via our customer portal.

Migration

To help you rewrite the existing API calls, we’ve prepared samples demonstrating how to work with the new API and how several functionalities are implemented. More examples will follow. The table below shows the sample mapping between the old and new versions.

Our support team on our customer portal is ready to answer any questions and help with the transition.

Implementation Details

We use GraalVM Native Image technology and specially written code that wraps Java methods into native ones to get dynamically linked libraries for different platforms (Linux, macOS, and Windows) based on the latest Java API package.

Then, the resulting dynamic link library (dxFeed Graal-native) is used through C ABI (application binary interface), and we write programming interfaces that describe our business model (similar to Java API).

As a result, we get a full-featured, similar performance as with Java API. Regardless of the language, writing the final application logic using API calls will be very similar (only the syntax will be amended, "best practices", specific language restrictions).

Below is a scheme of this process:

light

Architectural Restrictions and Other Limitations of the Old Version

# Limitation How It’s Solved in the New Version
1 Single-threaded architecture limiting throughput Based on the Java API, each subscription object (DXFeedSubscription) can run on its own thread
2 User code in event callbacks (for example, dxf_event_listener_t) is executed in the socket read thread, which can significantly reduce throughput Socket processing threads and callback threads are separated
3 In event callbacks, one market event type and one data portion always arrive (excluding snapshot subscription), which increases the load on the CPU with a large amount of incoming data Event callbacks can receive different market event types, and more than one by batch
4 It’s impossible to subscribe to data without getting regionals (if it is available for the market event) or only for a certain regional subscription->addSymbols({"AAPL"}); - composite
subscription->addSymbols({"AAPL&Q"}); - regional
5 It’s impossible to subscribe to Order event (excluding snapshot subscription) without getting: all sources, Order by Quote (including regionals), Order by MarketMaker subscription->addSymbols(IndexedEventSubscriptionSymbol::create("AAPL", OrderSource::NTV)); - OrderSource determines which data is being subscribed to
6 Data is mixed up when creating two subscriptions (regular and time series) for the same market event type. Both regular and time series data go to both subscriptions Each subscription instance receives only the data requested
7 Each subsequent request for the same symbol set in a subscription instance overwrites the existing one in another subscription instance Subscription instances and the data they receive are independent of each other
8 Removing a symbol from one subscription instance caused it to be removed from all others Subscription instances and the data they receive are independent of each other
9 Incorrect behavior when reading from a file (if a market event in the file hasn't been subscribed to). Reading from a file always occurs at maximum speed. The supported format is binary only endpoint->connect("file:tape.txt[format=text]"); - processing a text file with at it's "real" speed by timestamps
endpoint->connect("file:tape.bin[format=binary,speed=max]"); - processing a binary file with max speed

Documentation

Find useful information in our self-service dxFeed Knowledge Base or CXX API documentation:

Requirements

Windows

Only x64 versions are supported.

OS Version Architectures
Windows 8, 8.1 x64
Windows 10 Version 1607+ x64
Windows 11 Version 22000+ x64
Windows Server 2012+ x64
Windows Server Core 2012+ x64
Nano Server Version 1809+ x64

Requirements

Linux

Only x64 versions are supported.

libc compatibility

  • glibc: 2.35+ (from Ubuntu 22.04)
  • musl: temporarily unsupported

libpthread compatibility

A symlink on libpthread.so, libpthread.so.0, or libcoreclr.so must exist.

macOS

OS Version Architectures
macOS 10.15+ x64
macOS 11+ Arm64

Installation

Examples of how to install the library and integrate with the library can be found here.

The API is delivered as a dynamic library (dxFeedGraalCxxApi.so|dll|dylib) and a static one (dxFeedGraalCxxApi_static.a|lib). Also, it depends on DxFeedGraalNativeSdk.so|dll|dylib. Please place it nearby or available on PATH (Or use RPATH, LD_LIBRARY_PATH).

Usage

How to connect to QD endpoint

To use the dynamic library define the DXFCPP_USE_DLLS preprocessor directive.

#include <iostream>
#include <dxfeed_graal_cpp_api/api.hpp>

int main() {
    using namespace dxfcpp;
    
    // For token-based authorization, use the following address format:
    // "demo.dxfeed.com:7300[login=entitle:token]"
    auto endpoint = DXEndpoint::newBuilder()
            ->withProperty("dxfeed.address", "demo.dxfeed.com:7300")
            ->build();
    
    // Another way to connect the endpoint.
    // auto endpoint = DXEndpoint::create()->connect("demo.dxfeed.com:7300");
    
    auto subscription = endpoint->getFeed()->createSubscription(Quote::TYPE);
    
    subscription->addEventListener([](auto&& events) {
        for (auto&& e : events) {
            std::cout << e << "\n";
        }
    });
    
    subscription->addSymbols({"AAPL"});
    
    std::cin.get();
}
Output
I 221219 224811.681 [main] QD - Using QDS-3.313+file-UNKNOWN+mars-UNKNOWN+monitoring-UNKNOWN+tools-UNKNOWN, (C) Devexperts
I 221219 224811.695 [main] QD - Using scheme com.dxfeed.api.impl.DXFeedScheme DH2FdjP0DtOEIOAbE4pRVpmJsPnaZzAo1mICPJ6b06w
I 221219 224812.010 [main] QD - qd with collectors [Ticker, Stream, History]
I 221219 224812.017 [main] ClientSocket-Distributor - Starting ClientSocketConnector to demo.dxfeed.com:7300
I 221219 224812.017 [demo.dxfeed.com:7300-Reader] ClientSocketConnector - Resolving IPs for demo.dxfeed.com
I 221219 224812.021 [demo.dxfeed.com:7300-Reader] ClientSocketConnector - Connecting to 208.93.103.170:7300
I 221219 224812.170 [demo.dxfeed.com:7300-Reader] ClientSocketConnector - Connected to 208.93.103.170:7300
D 221219 224812.319 [demo.dxfeed.com:7300-Reader] QD - Distributor received protocol descriptor multiplexor@WQMPz [type=qtp, version=QDS-3.306, opt=hs, mars.root=mdd.demo-amazon.multiplexor-demo1] sending [TICKER, STREAM, HISTORY, DATA] from 208.93.103.170
Quote{AAPL, eventTime=0, time=20221219-223311.000, timeNanoPart=0, sequence=0, bidTime=20221219-223311, bidExchange=Q, bidPrice=132.16, bidSize=2, askTime=20221219-223311, askExchange=K, askPrice=132.17, askSize=10}
Quote{AAPL, eventTime=0, time=20221219-223312.000, timeNanoPart=0, sequence=0, bidTime=20221219-223312, bidExchange=Q, bidPrice=132.16, bidSize=6, askTime=20221219-223312, askExchange=K, askPrice=132.17, askSize=10}
Quote{AAPL, eventTime=0, time=20221219-223312.000, timeNanoPart=0, sequence=0, bidTime=20221219-223312, bidExchange=K, bidPrice=132.16, bidSize=10, askTime=20221219-223312, askExchange=V, askPrice=132.17, askSize=4}

How to connect to dxLink

#include <iostream>
#include <dxfeed_graal_cpp_api/api.hpp>

int main() {
    using namespace dxfcpp;
    
    // Enable experimental feature.
    System::setProperty("dxfeed.experimental.dxlink.enable", "true");
    // Set scheme for dxLink.
    System::setProperty("scheme", "ext:opt:sysprops,resource:dxlink.xml");
    
    // For token-based authorization, use the following address format:
    // "dxlink:wss://demo.dxfeed.com/dxlink-ws[login=dxlink:token]"
    auto endpoint = DXEndpoint::newBuilder()
            ->withProperty("dxfeed.address", "dxlink:wss://demo.dxfeed.com/dxlink-ws")
            ->build();
    
    // Another way to connect the endpoint.
    // auto endpoint = DXEndpoint::create()->connect("dxlink:wss://demo.dxfeed.com/dxlink-ws");
    
    auto subscription = endpoint->getFeed()->createSubscription(Quote::TYPE);
    
    subscription->addEventListener([](auto&& events) {
        for (auto&& e : events) {
            std::cout << e << "\n";
        }
    });
    
    subscription->addSymbols({"AAPL"});
    
    std::cin.get();
}
Output
I 231130 154554.594 [main] QD - Using QDS-3.325+file-UNKNOWN, (C) Devexperts
I 231130 154554.602 [main] QD - Using scheme com.dxfeed.api.impl.DXFeedScheme slfwemJduh1J7ibvy9oo8DABTNhNALFQfw0KmE40CMI
I 231130 154555.094 [main] MARS - Started time synchronization tracker using multicast 239.192.51.45:5145 with gixCx
I 231130 154555.100 [main] MARS - Started JVM self-monitoring
I 231130 154555.100 [main] QD - monitoring with collectors [Ticker, Stream, History]
I 231130 154555.103 [main] QD - monitoring DXEndpoint with dxfeed.address=dxlink:wss://demo.dxfeed.com/dxlink-ws
I 231130 154555.105 [main] DxLinkClientWebSocket-Distributor - Starting DxLinkClientWebSocketConnector to wss://demo.dxfeed.com/dxlink-ws
I 231130 154555.107 [wss://demo.dxfeed.com/dxlink-ws-Writer] DxLinkClientWebSocket-Distributor - Connecting to wss://demo.dxfeed.com/dxlink-ws
I 231130 154556.640 [wss://demo.dxfeed.com/dxlink-ws-Writer] DxLinkClientWebSocket-Distributor - Connected to wss://demo.dxfeed.com/dxlink-ws
D 231130 154557.801 [oioEventLoopGroup-2-1] QD - Distributor received protocol descriptor [type=dxlink, version=0.1-0.18-20231017-133150, keepaliveTimeout=120, acceptKeepaliveTimeout=5] sending [] from wss://demo.dxfeed.com/dxlink-ws
D 231130 154557.802 [oioEventLoopGroup-2-1] QD - Distributor received protocol descriptor [type=dxlink, version=0.1-0.18-20231017-133150, keepaliveTimeout=120, acceptKeepaliveTimeout=5, authentication=] sending [] from wss://demo.dxfeed.com/dxlink-ws
Quote{AAPL, eventTime=0, time=20231130-152903.000, timeNanoPart=0, sequence=0, bidTime=20231130-152903, bidExchange=P, bidPrice=189.9, bidSize=5.0, askTime=20231130-152854, askExchange=K, askPrice=189.98, askSize=10.0}

To familiarize with the dxLink protocol, please click here.

Tools

Tools is a collection of utilities that allow you to subscribe to various market events for the specified symbols. The tools can be downloaded from Release:

  • Connect connects to the specified address(es) and subscribes to the specified events with the specified symbol
  • Dump dumps all events received from address. This was designed to retrieve data from a file
  • PerfTest connects to the specified address(es) and calculates performance counters (events per second, memory usage, CPU usage, etc.)
  • LatencyTest connects to the specified address(es) and calculates latency
  • Qds collection of tools ported from the Java qds-tools

Samples

API

  • AuthSample demonstrates how to connect to an endpoint that requires an authentication token, subscribe to market data events, and handle periodic token updates
  • ConnectSample demonstrates how to connect to the endpoint and subscribe to various market events
  • PrintQuoteEventsSample is a simple demonstration of how to subscribe to the Quote event, using a DxFeed instance singleton and dxfeed.properties file
  • QuoteAndTradeSample demonstrates how to create multiple event listeners and subscribe to Quote and Trade events
  • ReconnectSample demonstrates how to connect to an endpoint, subscribe to market data events, handle reconnections and re-subscribing

Candle

Console

  • LastEventConsoleSample demonstrates how to subscribe to various market events with the dxFeed API, cache them in memory, and take snapshots of these events based on user input

File

IPF

  • DxFeedIpfConnect is a simple demonstration of how to get Instrument Profiles
  • DxFeedLiveIpfSample is a simple demonstration of how to get live updates for Instrument Profiles
  • PublishProfiles is a simple demonstration of how to publish market events
  • OptionChainSample demonstrates how to build option chains, and prints quotes for nearby option strikes

Model

Schedule

  • ScheduleSample demonstrates how to get various scheduling information for instruments

OnDemand

  • OnDemandSample a sample that demonstrates how to use the dxFeed on-demand history data replay service API

UI

Current State

Endpoint Roles

  • FEED connects to the remote data feed provider and is optimized for real-time or delayed data processing, this is a default role
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • STREAM_FEED is similar to FEED and also connects to the remote data feed provider but is designed for bulk data parsing from files
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • PUBLISHER connects to the remote publisher hub (also known as multiplexor) or creates a publisher on the local host (WriteTapeFile)
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • STREAM_PUBLISHER is similar to PUBLISHER and also connects to the remote publisher hub, but is designed for bulk data publishing
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • LOCAL_HUB is a local hub without the ability to establish network connections. Events published via publisher are delivered to local feed only.
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • ON_DEMAND_FEED is similar to FEED, but it is designed to be used with OnDemandService for historical data replay only
    • dxFeed Graal C API
    • dxFeed Graal C++ API

Event Types

  • Order is a snapshot of the full available market depth for a symbol
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • SpreadOrder is a snapshot of the full available market depth for all spreads
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • AnalyticOrder represents an extension of Order introducing analytic information, e.g., adding iceberg-related information to this order
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Trade is a snapshot of the price and size of the last trade during regular trading hours and an overall day volume and day turnover
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • TradeETH is a snapshot of the price and size of the last trade during extended trading hours and the extended trading hours day volume and day turnover
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Candle - event with open, high, low, and close prices and other information for a specific period
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Quote is a snapshot of the best bid and ask prices and other fields that change with each quote
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Profile is a snapshot that contains the security instrument description
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Summary is a snapshot of the trading session, including session highs, lows, etc.
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • TimeAndSale - represents a trade or other market event with price, like market open/close price, etc.
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Greeks is a snapshot of the option price, Black-Scholes volatility, and Greeks
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Series is a snapshot of computed values available for all options series for a given underlying symbol based on options market prices
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • TheoPrice is a snapshot of the theoretical option price computation that is periodically performed by dxPrice model-free computation
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Underlying is a snapshot of computed values available for an option underlying symbol based on the market’s option prices
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • Message is an event with an application-specific attachment
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • OptionSale is an event that represents a trade or another market event with the price (for example, market open/close price, etc.) for each option symbol listed under the specified Underlying
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • OtcMarketsOrder represents an extension of Order for the symbols traded on the OTC Markets
    • dxFeed Graal C API
    • dxFeed Graal C++ API

Subscription Symbols

  • String is a string representation of the symbol
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • TimeSeriesSubscriptionSymbol represents subscription to time-series events
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • IndexedEventSubscriptionSymbol represents subscription to a specific source of indexed events
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • WildcardSymbol.ALL represents a wildcard subscription to all events of the specific event type
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • CandleSymbol symbol used with DXFeedSubscription class to subscribe for Candle events
    • dxFeed Graal C API
    • dxFeed Graal C++ API

Subscriptions & Models

  • DXFeedSubscription is a subscription for a set of symbols and event types
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • GetLastEvent returns the last event for the specified event instance
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • GetTimeSeriesPromise requests time series events for the specified event type, symbol, and time range
    • dxFeed Graal C API
    • dxFeed Graal C++ API

IPF & Schedule

  • InstrumentProfile represents basic profile information about a market instrument
  • InstrumentProfileReader reads instrument profiles from the stream using Instrument Profile Format (IPF).
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • InstrumentProfileConnection connects to an instrument profile URL and reads instrument profiles with support of streaming live updates.
    • dxFeed Graal C API
    • dxFeed Graal C++ API
  • InstrumentProfileCollector collects instrument profile updates and provides the live instrument profiles list
  • Schedule provides API to retrieve and explore various exchanges’ trading schedules and different financial instrument classes

Services

About

For C/C++ developers, this library offers easy access to dxFeed market data. Built upon the GraalVM Native Image and our flagship dxFeed Java API, it provides a seamless experience for С/C++-based applications

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages