stdcion / dxfeed-graal-net-api

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 .NET API, please see the Overview section.
⚠️ It’s a beta version and still under active development.

Build CodeQL NET Platform License Nuget

Table of Contents

Overview

Reasons for the New .NET API Repository

The old version of dxFeed .NET API is built as a thin wrapper over dxFeed C API, which 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 .NET API.

We expect the new repository to go into production in Q2’2023. At the same time, 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.

Future Development

Features planned with high priority:


Features planned for the next stage:

  • Implement a model of incremental updates in Java API and add it to .NET API
  • Implement OrderBookModel with advanced logic (e.g., OnNewBook, OnBookUpdate, OnBookIncrementalChange) in Java API and add it to .NET API
  • Add samples or implement a convenient API for Candlewebservice

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.

Sample Mapping

# Sample Old Version New Version
1 How to subscribe to Quote, Trade, TradeETH, Order, SpreadOrder, AnalyticOrder, TimeAndSale events dxf_events_sample DxFeed.Graal.Net.Samples.DxFeedConnect
2 How to subscribe to Candle event dxf_candle_sample DxFeed.Graal.Net.Samples.CandleSample
3 How to receive IPF data from URL or file dxf_instrument_profile_sample Q3’2023, please see TBD section
4 How to subscribe to IPF live updates dxf_instrument_profile_live_sample Q3’2023, please see TBD section
5 How to subscribe to Order, SpreadOrder, Candle, TimeAndSale, Greeks, Series snapshots dxf_snapshot_sample Q4’2023, please see TBD section
6 How to subscribe to depth of market dxf_price_level_book_sample Q4’2023, please see TBD section
7 How to receive snapshots of TimeAndSale, Candle, Series, Greeks events on a given time interval without live subscription dxf_simple_data_retrieving_sample Q4’2023, please see TBD section
8 How to subscribe to order snapshot with incremental updates dxf_inc_order_snapshot_sample Q4’2023, please see TBD section
9 How to retrieve Candle data from the candle web service dxf_candle_data_retrieving_sample Q4’2023, please see TBD section
10 How to retrieve TimeAndSale data from the candle web service dxf_tns_data_retrieving_sample Q4’2023, please see TBD section

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 Windows support only. Windows-x64, Linux-x64, macOS-x64, macOS-arm64 support by .NET 6.0.
2 Single-threaded architecture limiting throughput. Based on the Java API, each subscription object (DXFeedSubscription) can run on its own thread.
3 User code in event callbacks (for example, OnQuote) is executed in the socket read thread, which can significantly reduce throughput. Socket processing threads and callback threads are separated.
4 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.
5 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.
6 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(new IndexedEventSubscriptionSymbol("AAPL", OrderSource.NTV)); - Order.Source determines which data is being subscribed to.
7 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.
8 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.
9 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.
10 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 .NET API documentation:

Installation

Add this package source to NuGet config.
For example, you can create a NuGet.Config file in your solution folder with the following content:

<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <packageSources>
        <add key="dxFeed" value="https://dxfeed.jfrog.io/artifactory/api/nuget/v3/nuget-open" protocolVersion="3"/>
    </packageSources>
</configuration>

Then add the DxFeed.Graal.Net package to your project using the NuGet package manager.

Usage

using DxFeed.Graal.Net.Api;
using DxFeed.Graal.Net.Events.Market;

using var endpoint = DXEndpoint.Create().Connect("demo.dxfeed.com:7300");
using var subscription = endpoint.GetFeed().CreateSubscription(typeof(Quote));
subscription.AddEventListener(events =>
{
    foreach (var e in events)
    {
        Console.WriteLine(e);
    }
});
subscription.AddSymbols("AAPL");
Console.ReadKey();
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}

Tools

DxFeed.Graal.Net.Tools is a collection of tools that allow you to subscribe to various market events for the specified symbols. The tools can be downloaded from Release (including self-contained versions, that do not require .NET installation)

  • 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.

Samples

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 (.NET API sample)

  • StreamFeed is similar to Feed and also connects to the remote data feed provider but is designed for bulk data parsing from files (.NET API sample)

  • Publisher connects to the remote publisher hub (also known as multiplexor) or creates a publisher on the local host (.NET API sample)

  • StreamPublisher is similar to Publisher and also connects to the remote publisher hub, but is designed for bulk data publishing (.NET API sample)

  • LocalHub is a local hub without the ability to establish network connections. Events published via Publisher are delivered to local Feed only

  • OnDemandFeed is similar to Feed, but it is designed to be used with OnDemandService for historical data replay only

Event Types

  • Order is a snapshot of the full available market depth for a symbol

  • SpreadOrder is a snapshot of the full available market depth for all spreads

  • AnalyticOrder is an Order extension that introduces analytic information, such as adding iceberg-related information to a given order

  • 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

  • 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

  • Candle event with open, high, low, and close prices and other information for a specific period

  • Quote is a snapshot of the best bid and ask prices and other fields that change with each quote

  • Profile is a snapshot that contains the security instrument description

  • Summary is a snapshot of the trading session, including session highs, lows, etc.

  • TimeAndSale represents a trade or other market event with price, such as the open/close price of a market, etc.

  • Greeks is a snapshot of the option price, Black-Scholes volatility, and greeks

  • Series is a snapshot of computed values available for all options series for a given underlying symbol based on options market prices

  • TheoPrice is a snapshot of the theoretical option price computation that is periodically performed by dxPrice model-free computation

  • Underlying is a snapshot of computed values available for an option underlying symbol based on the market’s option prices

  • OptionSale 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

  • Configuration is an event with an application-specific attachment

  • Message is an event with an application-specific attachment

Subscription Symbols

Subscriptions & Models

IPF & Schedule

Services

About

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

License:Mozilla Public License 2.0


Languages

Language:C# 99.6%Language:Shell 0.2%Language:Batchfile 0.2%