diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d314c44e..13ede6c4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -61,24 +61,19 @@ jobs:
7.0.x
8.0.x
- - name: Publish Tools
+ - name: Publish
run: |
- platforms="win-x64 linux-x64 osx-x64 osx-arm64"
- echo "$platforms" | tr ' ' '\n' | while read -r platform; do
- ./publish.sh DxFeed.Graal.Net.Tools net8.0 "$platform"
- done
-
- (cd artifacts/Publish/DxFeed.Graal.Net.Tools && for dir in */; do
- (cd "$dir" && zip "../DxFeed.Graal.Net.Tools-${dir%/}-${{ github.ref_name }}.zip" . -r -D)
- done)
+ dotnet tool install -g dotnet-script
+ dotnet script publish.csx
shell: bash
- - name: Upload Tools
+ - name: Upload
uses: softprops/action-gh-release@v1
with:
generate_release_notes: true
files: |
artifacts/Publish/DxFeed.Graal.Net.Tools/*.zip
+ artifacts/Publish/Samples/*.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Pack NuGet
@@ -135,20 +130,3 @@ jobs:
tag_name: ${{ steps.prepare_tag.outputs.DEPLOY_TAG_NAME }}
commit_message: 'deploy: ${{ github.ref_name }}'
allow_empty_commit: true
-
-# ToDo Create a reusable workflow and extract uploading artifacts to a separate flow.
-# - name: Upload DxFeed.Graal.Net.Tools
-# if: github.event_name == 'workflow_dispatch'
-# uses: actions/upload-artifact@v3
-# with:
-# name: DxFeed.Graal.Net.Tools-self-contained-${{ matrix.OS_NAME }}
-# path: |
-# artifacts/Publish/${{ matrix.OS_NAME }}/
-#
-# - name: Upload DxFeed.Graal.Net.Tools for macOS Apple Silicon
-# if: github.event_name == 'workflow_dispatch' && matrix.os == 'macOS-latest'
-# uses: actions/upload-artifact@v3
-# with:
-# name: DxFeed.Graal.Net.Tools-self-contained-osx-arm64
-# path: |
-# artifacts/Publish/osx-arm64
diff --git a/NuGet.Config b/NuGet.Config
index f3fb6689..872707e2 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -2,6 +2,7 @@
+
diff --git a/README.md b/README.md
index 3f3048d3..b5cf8a6f 100644
--- a/README.md
+++ b/README.md
@@ -77,16 +77,16 @@ ready to answer any questions and help with the transition.
#### Sample Mapping
-| # | Sample | Old Version | New Version |
-|:-:|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------|
-| 1 | How to get Instrument Profiles | [dxf_ipf_connect_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_ipf_connect_sample) | [DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect) |
-| 2 | How to get live updates for Instrument Profiles | [dxf_instrument_profile_live_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_instrument_profile_live_sample) | [DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample) |
-| 3 | How to subscribe to `Order`, `SpreadOrder`, `Candle`, `TimeAndSale`, `Greeks`, `Series` snapshots | [dxf_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_snapshot_sample) | *Q4’2024*, please see [TBD](#future-development) section |
-| 4 | How to subscribe to depth of market | [dxf_price_level_book_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_price_level_book_sample) | [PriceLevelBookSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/PriceLevelBookSample) |
-| 5 | How to receive snapshots of `TimeAndSale`, `Candle`, `Series`, `Greeks` events on a given time interval without live subscription | [dxf_simple_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_simple_data_retrieving_sample) | [FetchDailyCandles](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/FetchDailyCandles) |
-| 6 | How to subscribe to order snapshot with incremental updates | [dxf_inc_order_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_inc_order_snapshot_sample) | [IncOrderSnapshotSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/IncOrderSnapshotSample) |
-| 7 | How to retrieve `Candle` data from the candle web service | [dxf_candle_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_candle_data_retrieving_sample) | [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader) | |
-| 8 | How to retrieve `TimeAndSale` data from the candle web service | [dxf_tns_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_tns_data_retrieving_sample) | [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader) | |
+| # | Sample | Old Version | New Version |
+|:-:|:----------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------|
+| 1 | How to get Instrument Profiles | [dxf_ipf_connect_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_ipf_connect_sample) | [IpfSample](samples/IPF/IpfSample) |
+| 2 | How to get live updates for Instrument Profiles | [dxf_instrument_profile_live_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_instrument_profile_live_sample) | [IpfLiveSample](samples/IPF/IpfLiveSample) |
+| 3 | How to subscribe to `Order`, `SpreadOrder`, `Candle`, `TimeAndSale`, `Greeks`, `Series` snapshots | [dxf_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_snapshot_sample) | *Q4’2024*, please see [TBD](#future-development) section |
+| 4 | How to subscribe to depth of market | [dxf_price_level_book_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_price_level_book_sample) | [PriceLevelBookSample](samples/UI/PriceLevelBookSample) |
+| 5 | How to receive snapshots of `TimeAndSale`, `Candle`, `Series`, `Greeks` events on a given time interval without live subscription | [dxf_simple_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_simple_data_retrieving_sample) | [FetchDailyCandlesSample](samples/Candle/FetchDailyCandlesSample) |
+| 6 | How to subscribe to order snapshot with incremental updates | [dxf_inc_order_snapshot_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_inc_order_snapshot_sample) | [IncOrderSnapshotSample](samples/Model/IncOrderSnapshotSample) |
+| 7 | How to retrieve `Candle` data from the candle web service | [dxf_candle_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_candle_data_retrieving_sample) | [CandleDataSample](samples/Candle/CandleDataSample) | |
+| 8 | How to retrieve `TimeAndSale` data from the candle web service | [dxf_tns_data_retrieving_sample](https://github.com/dxFeed/dxfeed-net-api/tree/master/samples/dxf_tns_data_retrieving_sample) | [CandleDataSample](samples/Candle/CandleDataSample) | |
### Implementation Details
@@ -410,44 +410,44 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine
## Samples
-- [x] [ConvertTapeFile](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/ConvertTapeFile/Program.cs)
+- [x] [ConvertTapeFileSample](samples/File/ConvertTapeFileSample)
demonstrates how to convert one tape file to another tape file with optional intermediate processing or filtering
-- [x] [DxFeedFileParser](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/DxFeedFileParser/Program.cs)
+- [x] [FileParserSample](samples/File/FileParserSample)
is a simple demonstration of how events are read form a tape file
-- [x] [DxFeedSample](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/DxFeedSample/Program.cs)
+- [x] [QuoteAndTradeSample](samples/API/QuoteAndTradeSample)
is a simple demonstration of how to create multiple event listeners and subscribe to `Quote` and `Trade` events
-- [x] [PrintQuoteEvents](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/PrintQuoteEvents/Program.cs)
+- [x] [PrintQuoteEventsSample](samples/API/PrintQuoteEventsSample)
is a simple demonstration of how to subscribe to the `Quote` event, using a `DxFeed` instance singleton
- and `dxfeed.properties` file
-- [x] [WriteTapeFile](https://github.com/dxFeed/dxfeed-graal-net-api/blob/main/samples/WriteTapeFile/Program.cs)
+ and `dxfeed.system.properties` file
+- [x] [WriteTapeFileSample](samples/File/WriteTapeFileSample)
is a simple demonstration of how to write events to a tape file
-- [x] [DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect) is a simple
+- [x] [IpfSample](samples/IPF/IpfSample) is a simple
demonstration of how to get Instrument Profiles
-- [x] [DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample) is a
+- [x] [IpfLiveSample](samples/IPF/IpfLiveSample) is a
simple demonstration of how to get live updates for Instrument Profiles
-- [x] [ScheduleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/ScheduleSample) is a simple
+- [x] [ScheduleSample](samples/Schedule/ScheduleSample) is a simple
demonstration of how to get various scheduling information for instruments
-- [x] [FetchDailyCandles](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/FetchDailyCandles)
+- [x] [FetchDailyCandlesSample](samples/Candle/FetchDailyCandlesSample)
is a simple demonstration of how to fetch last N-days of candles for a specified symbol
-- [x] [DxFeedReconnectSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedReconnectSample)
+- [x] [ReconnectSample](samples/API/ReconnectSample)
is a simple demonstration of how to connect to an endpoint, subscribe to market data events, handle reconnections
and re-subscribing.
-- [x] [CandleDataResponseReader](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/CandleDataResponseReader)
+- [x] [CandleDataSample](samples/Candle/CandleDataSample)
is a simple demonstration of how to parse response from CandleData service.
-- [x] [MarketDepthModelSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/MarketDepthModelSample)
+- [x] [MarketDepthModelSample](samples/UI/MarketDepthModelSample)
is a simple demonstration of how to draw a Market Depth using Avalonia UI.
-- [x] [CandleChartSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/CandleChartSample)
+- [x] [CandleChartSample](samples/UI/CandleChartSample)
is a simple demonstration of how to draw a Candlestick Chart using Avalonia UI.
-- [x] [IncOrderSnapshotSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/IncOrderSnapshotSample)
+- [x] [IncOrderSnapshotSample](samples/Model/IncOrderSnapshotSample)
is a simple demonstration of how to subscribe to the Order event and handle snapshots and updates.
-- [x] [MultipleMarketDepthSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/MultipleMarketDepthSample)
+- [x] [MultipleMarketDepthSample](samples/Model/MultipleMarketDepthSample)
is a simple demonstration of how to use the `MarketDepthModel` to manage and display order books for multiple symbols.
-- [x] [DXFeedOptionChain](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DXFeedOptionChain)
+- [x] [OptionChainSample](samples/IPF/OptionChainSample)
how to build option chains, and prints quotes for nearby option strikes.
-- [x] [LastEventConsoleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/LastEventConsoleSample)
+- [x] [LastEventConsoleSample](samples/Console/LastEventConsoleSample)
is a simple demonstration 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.
-- [x] [PriceLevelBookSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/UI/PriceLevelBookSample)
+- [x] [PriceLevelBookSample](samples/UI/PriceLevelBookSample)
is a simple demonstration of how to represent a price level book (market by price) that aggregates individual orders
(market by order).
@@ -559,8 +559,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine
- [x] [GetLastEvent](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/api/DXFeed.html#getLastEvent-E-)
returns the last event for the specified event instance
- ([DxFeedSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedSample))
-
- [x] [GetTimeSeriesPromise](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/api/DXFeed.html#getTimeSeriesPromise-java.lang.Class-java.lang.Object-long-long-)
requests time series events for the specified event type, symbol, and time range
@@ -568,7 +566,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine
- [x] [InstrumentProfile](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.InstrumentProfile.html)
represents basic profile information about a market instrument
- ([DxFeedIpfConnect](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedIpfConnect))
- [x] [InstrumentProfileReader](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.InstrumentProfileReader.html)
reads
@@ -576,7 +573,6 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine
- [x] [InstrumentProfileCollector](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.Live.InstrumentProfileCollector.html)
collects instrument profile updates and provides the live instrument profiles list
- ([DxFeedLiveIpfSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/DxFeedLiveIpfSample))
- [x] [InstrumentProfileConnection](https://dxfeed.github.io/dxfeed-graal-net-api/docs/api/DxFeed.Graal.Net.Ipf.Live.InstrumentProfileConnection.html)
connects to an instrument profile URL and reads instrument profiles with support of streaming live updates
@@ -584,4 +580,3 @@ sudo /usr/bin/xattr -r -d com.apple.quarantine
- [x] [Schedule](https://docs.dxfeed.com/dxfeed/api/com/dxfeed/schedule/Schedule.html)
provides an API to retrieving and exploring the trading schedules of various exchanges and different financial
instrument classes
- ([ScheduleSample](https://github.com/dxFeed/dxfeed-graal-net-api/tree/main/samples/ScheduleSample))
diff --git a/dxfeed-graal-net-api.sln b/dxfeed-graal-net-api.sln
index 6b6e004e..6b41668b 100644
--- a/dxfeed-graal-net-api.sln
+++ b/dxfeed-graal-net-api.sln
@@ -4,53 +4,71 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net", "src\DxF
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net.Tools", "src\DxFeed.Graal.Net.Tools\DxFeed.Graal.Net.Tools.csproj", "{1F8765D9-1ED0-40EC-8239-B3E9F7BDF38C}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeed.Graal.Net.Tests", "tests\DxFeed.Graal.Net.Tests\DxFeed.Graal.Net.Tests.csproj", "{7F07BB95-9DB6-4331-BCCF-FBF441F8F3E2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{C4490D74-2970-4A1B-8178-A724A06B140A}"
+ ProjectSection(SolutionItems) = preProject
+ samples\Directory.Build.props = samples\Directory.Build.props
+ samples\dxfeed.properties = samples\dxfeed.system.properties
+ EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrintQuoteEvents", "samples\PrintQuoteEvents\PrintQuoteEvents.csproj", "{73597E04-D8A8-4991-A759-7F886CBE2A8F}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "API", "API", "{BABA2486-F8A5-4608-A79F-D03247FE2332}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedConnect", "samples\DxFeedConnect\DxFeedConnect.csproj", "{2A8B6037-09FF-40DC-868F-A0ED54A46287}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AuthSample", "samples\API\AuthSample\AuthSample.csproj", "{B9088D14-10F6-4D88-876D-062B9F6494AB}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectSample", "samples\API\ConnectSample\ConnectSample.csproj", "{2A8B6037-09FF-40DC-868F-A0ED54A46287}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WriteTapeFile", "samples\WriteTapeFile\WriteTapeFile.csproj", "{F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrintQuoteEventsSample", "samples\API\PrintQuoteEventsSample\PrintQuoteEventsSample.csproj", "{73597E04-D8A8-4991-A759-7F886CBE2A8F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertTapeFile", "samples\ConvertTapeFile\ConvertTapeFile.csproj", "{F9369083-EB43-455F-8944-07246E4FE6AC}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuoteAndTradeSample", "samples\API\QuoteAndTradeSample\QuoteAndTradeSample.csproj", "{ECD5E041-0FBF-475E-82A6-DE6384EF25A0}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedFileParser", "samples\DxFeedFileParser\DxFeedFileParser.csproj", "{62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReconnectSample", "samples\API\ReconnectSample\ReconnectSample.csproj", "{C457D53F-A033-465C-B250-A6CC60D02F98}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedSample", "samples\DxFeedSample\DxFeedSample.csproj", "{ECD5E041-0FBF-475E-82A6-DE6384EF25A0}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Candle", "Candle", "{F7C44172-08CC-4CF9-97A8-01460C2AB759}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleSample", "samples\CandleSample\CandleSample.csproj", "{CECAB17A-9DBE-4A4E-8556-5747AB170714}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleDataSample", "samples\Candle\CandleDataSample\CandleDataSample.csproj", "{2567935E-FEFB-470A-BF17-7A883735C4BF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedIpfConnect", "samples\DxFeedIpfConnect\DxFeedIpfConnect.csproj", "{62206DAF-999F-437A-AC18-1217ED14EB52}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleSample", "samples\Candle\CandleSample\CandleSample.csproj", "{CECAB17A-9DBE-4A4E-8556-5747AB170714}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedLiveIpfSample", "samples\DxFeedLiveIpfSample\DxFeedLiveIpfSample.csproj", "{C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FetchDailyCandlesSample", "samples\Candle\FetchDailyCandlesSample\FetchDailyCandlesSample.csproj", "{0797D7A4-3572-457B-AAD9-3F26098D4BDD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FetchDailyCandles", "samples\FetchDailyCandles\FetchDailyCandles.csproj", "{0797D7A4-3572-457B-AAD9-3F26098D4BDD}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Console", "Console", "{6E5A386D-1FB6-45BE-A80E-E29CA4AC697E}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduleSample", "samples\ScheduleSample\ScheduleSample.csproj", "{119E7BB3-4B97-4824-9CA7-0D4C9B57590D}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LastEventConsoleSample", "samples\Console\LastEventConsoleSample\LastEventConsoleSample.csproj", "{0CD0E240-687A-46A7-B343-BA8A6549A216}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxFeedReconnectSample", "samples\DxFeedReconnectSample\DxFeedReconnectSample.csproj", "{C457D53F-A033-465C-B250-A6CC60D02F98}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "File", "File", "{D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAuthSample", "samples\SimpleAuthSample\SimpleAuthSample.csproj", "{B9088D14-10F6-4D88-876D-062B9F6494AB}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertTapeFileSample", "samples\File\ConvertTapeFileSample\ConvertTapeFileSample.csproj", "{F9369083-EB43-455F-8944-07246E4FE6AC}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleDataResponseReader", "samples\CandleDataResponseReader\CandleDataResponseReader.csproj", "{2567935E-FEFB-470A-BF17-7A883735C4BF}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileParserSample", "samples\File\FileParserSample\FileParserSample.csproj", "{62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDepthModelSample", "samples\UI\MarketDepthModelSample\MarketDepthModelSample.csproj", "{930B1039-B76C-42C5-AD0F-9FA1A1FC9D84}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WriteTapeFileSample", "samples\File\WriteTapeFileSample\WriteTapeFileSample.csproj", "{F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleChartSample", "samples\UI\CandleChartSample\CandleChartSample.csproj", "{B74E8A86-1AB7-4B36-AED3-292CDD95BF90}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IPF", "IPF", "{01C0CC82-3B56-434C-B133-4CAA5B3BFE70}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IpfLiveSample", "samples\IPF\IpfLiveSample\IpfLiveSample.csproj", "{C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IpfSample", "samples\IPF\IpfSample\IpfSample.csproj", "{62206DAF-999F-437A-AC18-1217ED14EB52}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IncOrderSnapshotSample", "samples\IncOrderSnapshotSample\IncOrderSnapshotSample.csproj", "{9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OptionChainSample", "samples\IPF\OptionChainSample\OptionChainSample.csproj", "{7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultipleMarketDepthSample", "samples\MultipleMarketDepthSample\MultipleMarketDepthSample.csproj", "{C8F5013F-7F40-46D2-92AD-6B593524A1D0}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Model", "Model", "{2D069CF7-FE52-487B-8AF9-1A7EB0B296FD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IncOrderSnapshotSample", "samples\Model\IncOrderSnapshotSample\IncOrderSnapshotSample.csproj", "{9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultipleMarketDepthSample", "samples\Model\MultipleMarketDepthSample\MultipleMarketDepthSample.csproj", "{C8F5013F-7F40-46D2-92AD-6B593524A1D0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Schedule", "Schedule", "{774DD1AE-2931-44CC-8AF2-F28955230507}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduleSample", "samples\Schedule\ScheduleSample\ScheduleSample.csproj", "{119E7BB3-4B97-4824-9CA7-0D4C9B57590D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI", "UI", "{5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DXFeedOptionChain", "samples\DXFeedOptionChain\DXFeedOptionChain.csproj", "{7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandleChartSample", "samples\UI\CandleChartSample\CandleChartSample.csproj", "{B74E8A86-1AB7-4B36-AED3-292CDD95BF90}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LastEventConsoleSample", "samples\LastEventConsoleSample\LastEventConsoleSample.csproj", "{0CD0E240-687A-46A7-B343-BA8A6549A216}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDepthModelSample", "samples\UI\MarketDepthModelSample\MarketDepthModelSample.csproj", "{930B1039-B76C-42C5-AD0F-9FA1A1FC9D84}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PriceLevelBookSample", "samples\UI\PriceLevelBookSample\PriceLevelBookSample.csproj", "{A5B1FE68-8943-4340-BFEC-6D1B40823493}"
EndProject
@@ -158,28 +176,35 @@ Global
{A5B1FE68-8943-4340-BFEC-6D1B40823493}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {73597E04-D8A8-4991-A759-7F886CBE2A8F} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {2A8B6037-09FF-40DC-868F-A0ED54A46287} = {C4490D74-2970-4A1B-8178-A724A06B140A}
{7F07BB95-9DB6-4331-BCCF-FBF441F8F3E2} = {D8A3B3E7-CFFD-4113-862D-B9E9E7FF0BA5}
- {F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {F9369083-EB43-455F-8944-07246E4FE6AC} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {ECD5E041-0FBF-475E-82A6-DE6384EF25A0} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {CECAB17A-9DBE-4A4E-8556-5747AB170714} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {62206DAF-999F-437A-AC18-1217ED14EB52} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {0797D7A4-3572-457B-AAD9-3F26098D4BDD} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {119E7BB3-4B97-4824-9CA7-0D4C9B57590D} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {C457D53F-A033-465C-B250-A6CC60D02F98} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {B9088D14-10F6-4D88-876D-062B9F6494AB} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {2567935E-FEFB-470A-BF17-7A883735C4BF} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {C8F5013F-7F40-46D2-92AD-6B593524A1D0} = {C4490D74-2970-4A1B-8178-A724A06B140A}
{5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC} = {C4490D74-2970-4A1B-8178-A724A06B140A}
{B74E8A86-1AB7-4B36-AED3-292CDD95BF90} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC}
{930B1039-B76C-42C5-AD0F-9FA1A1FC9D84} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC}
- {7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19} = {C4490D74-2970-4A1B-8178-A724A06B140A}
- {0CD0E240-687A-46A7-B343-BA8A6549A216} = {C4490D74-2970-4A1B-8178-A724A06B140A}
{A5B1FE68-8943-4340-BFEC-6D1B40823493} = {5F74BD34-C2D4-436B-8243-FB0F3BB9F0AC}
+ {BABA2486-F8A5-4608-A79F-D03247FE2332} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {6E5A386D-1FB6-45BE-A80E-E29CA4AC697E} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {01C0CC82-3B56-434C-B133-4CAA5B3BFE70} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {774DD1AE-2931-44CC-8AF2-F28955230507} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {2A8B6037-09FF-40DC-868F-A0ED54A46287} = {BABA2486-F8A5-4608-A79F-D03247FE2332}
+ {ECD5E041-0FBF-475E-82A6-DE6384EF25A0} = {BABA2486-F8A5-4608-A79F-D03247FE2332}
+ {0CD0E240-687A-46A7-B343-BA8A6549A216} = {6E5A386D-1FB6-45BE-A80E-E29CA4AC697E}
+ {7E7BF3A7-C564-4B82-AAD6-6C1D1BCE3F19} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70}
+ {C2F0FF7C-4675-4D5F-AE90-0E8DA33A1EB8} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70}
+ {62206DAF-999F-437A-AC18-1217ED14EB52} = {01C0CC82-3B56-434C-B133-4CAA5B3BFE70}
+ {119E7BB3-4B97-4824-9CA7-0D4C9B57590D} = {774DD1AE-2931-44CC-8AF2-F28955230507}
+ {C457D53F-A033-465C-B250-A6CC60D02F98} = {BABA2486-F8A5-4608-A79F-D03247FE2332}
+ {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {F7C44172-08CC-4CF9-97A8-01460C2AB759} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD} = {C4490D74-2970-4A1B-8178-A724A06B140A}
+ {F9369083-EB43-455F-8944-07246E4FE6AC} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2}
+ {F06FDF6E-6BE8-4A72-A834-62AB1BAA6B7A} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2}
+ {62ED5ABC-B2A7-4CE3-8AE1-25AF185B47E9} = {D3E3A3FE-5F34-40DE-A8F2-7640F7C77BD2}
+ {9B758A5C-8AA1-4560-A7CF-EF375B9A1E4C} = {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD}
+ {C8F5013F-7F40-46D2-92AD-6B593524A1D0} = {2D069CF7-FE52-487B-8AF9-1A7EB0B296FD}
+ {2567935E-FEFB-470A-BF17-7A883735C4BF} = {F7C44172-08CC-4CF9-97A8-01460C2AB759}
+ {CECAB17A-9DBE-4A4E-8556-5747AB170714} = {F7C44172-08CC-4CF9-97A8-01460C2AB759}
+ {0797D7A4-3572-457B-AAD9-3F26098D4BDD} = {F7C44172-08CC-4CF9-97A8-01460C2AB759}
+ {B9088D14-10F6-4D88-876D-062B9F6494AB} = {BABA2486-F8A5-4608-A79F-D03247FE2332}
+ {73597E04-D8A8-4991-A759-7F886CBE2A8F} = {BABA2486-F8A5-4608-A79F-D03247FE2332}
EndGlobalSection
EndGlobal
diff --git a/publish.cmd b/publish.cmd
deleted file mode 100644
index acfab33c..00000000
--- a/publish.cmd
+++ /dev/null
@@ -1,38 +0,0 @@
-@echo off
-
-IF "%3"=="" (
- REM Publish .NET app.
- dotnet publish^
- src/"%1"/"%1".csproj^
- -p:UseAppHost=false^
- -p:DebugType=None^
- -p:DebugSymbols=false^
- --framework "%2"^
- -c Release^
- -o artifacts/Publish/"%1"/
- exit 0
-) ELSE IF "%4"=="" (
- REM Publish self-contained app for specified platform.
- dotnet publish -r "%3"^
- src/"%1"/"%1".csproj^
- -p:PublishSingleFile=true^
- -p:IncludeNativeLibrariesForSelfExtract=true^
- -p:AllowedReferenceRelatedFileExtensions=none^
- -p:DebugType=None^
- --self-contained true^
- --framework "%2"^
- -c Release^
- -o artifacts/Publish/"%3"/"%1"/
- exit 0
-) ELSE (
- REM Print usage.
- echo "Usage:"
- echo " []"
- echo ""
- echo "Where:"
- echo " project Project name."
- echo " framework .NET version (net6.0, net7.0, net8.0)."
- echo " platform Platform name (win-x64, linux-x64, osx-x64, osx-arm64)"
- echo " for self-contained app."
- exit 1
-)
diff --git a/publish.csx b/publish.csx
new file mode 100644
index 00000000..270faa03
--- /dev/null
+++ b/publish.csx
@@ -0,0 +1,173 @@
+#r "nuget: System.Diagnostics.Process, 4.3.0"
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.IO.Compression;
+
+// Define output path for published applications
+var output = "artifacts/Publish/";
+var platforms = new List(){"win-x64", "linux-x64", "osx-x64", "osx-arm64"};
+
+void PublishTools()
+{
+ var name = "DxFeed.Graal.Net.Tools";
+ var framework = "net8.0";
+ var project = FindProject(name);
+
+ PublishProjects(new[] { project }, name, framework, true);
+}
+
+void PublishSamples()
+{
+ var name = "Samples";
+ var framework = "net6.0";
+ var projects = FindAllProjectInDirectory("samples");
+
+ PublishProjects(projects, name, framework, false);
+}
+
+void PublishProjects(IEnumerable projects, string name, string framework, bool isSingleFile)
+{
+ foreach (var project in projects)
+ {
+ foreach (var platform in platforms)
+ {
+ PublishScd(project, framework, platform, $"{output}/{name}/{platform}", isSingleFile);
+ }
+ }
+
+ // Sign the macOS binaries if they exist.
+ Codesign($"{output}/{name}/osx-x64");
+ Codesign($"{output}/{name}/osx-arm64");
+
+ // Zip the output directory.
+ ZipDirectory($"{output}/{name}", name, GetVersion());
+}
+
+// Function to publish self-contained deployment (SCD).
+// Publishes the specified .NET project for the given framework and platform.
+void PublishScd(string project, string framework, string platform, string output, bool isSingleFile)
+{
+ ExecuteCommand("dotnet", $"publish" +
+ $" {project}" +
+ $" --framework {framework}" +
+ $" -r {platform}" +
+ $" -o {output}" +
+ $" -p:PublishSingleFile={isSingleFile}" +
+ $" -p:SolutionDir={GetSolutionFolder()}" +
+ " -p:IncludeNativeLibrariesForSelfExtract=true" +
+ " -p:AllowedReferenceRelatedFileExtensions=none" +
+ " -p:DebugType=None" +
+ " -p:DebugSymbols=false" +
+ " --self-contained true" +
+ " -c Release");
+}
+
+bool CommandExists(string command)
+{
+ try
+ {
+ var process = Process.Start(new ProcessStartInfo
+ {
+ FileName = "sh",
+ Arguments = $"-c \"command -v {command}\"",
+ RedirectStandardOutput = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ });
+ process.WaitForExit();
+ return process.ExitCode == 0;
+ }
+ catch
+ {
+ return false;
+ }
+}
+
+void ExecuteCommand(string command, string arguments)
+{
+ try
+ {
+ var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = command,
+ Arguments = arguments,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ }
+ };
+
+ process.OutputDataReceived += (sender, e) => { if (e.Data != null) Console.WriteLine(e.Data); };
+ process.ErrorDataReceived += (sender, e) => { if (e.Data != null) Console.WriteLine(e.Data); };
+
+ process.Start();
+ process.BeginOutputReadLine();
+ process.BeginErrorReadLine();
+ process.WaitForExit();
+
+ if (process.ExitCode != 0)
+ {
+ Console.WriteLine($"Command failed: {command} {arguments}");
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"Failed to execute command: {command} {arguments}. Error: {ex.Message}");
+ }
+}
+
+
+// Function to sign macOS applications
+// path: Path to the application to be signed
+void Codesign(string path)
+{
+ // Check if codesign is available before attempting to sign
+ if (CommandExists("codesign"))
+ {
+ foreach (var file in Directory.GetFiles(path))
+ {
+ ExecuteCommand("codesign", $"-f -s - {file}");
+ }
+ }
+}
+
+void ZipDirectory(string path, string name, string version)
+{
+ // Iterate through each directory in the base directory.
+ foreach (var dir in Directory.GetDirectories(path))
+ {
+ string dirName = Path.GetFileName(dir); // Get the directory name.
+ string zipFileName = $"{name}-{dirName}-{version}.zip"; // Construct the zip file name.
+ string zipFilePath = Path.Combine(path, zipFileName); // Full path to the zip file.
+
+ // Compress the directory into a zip file.
+ if (File.Exists(zipFilePath))
+ {
+ File.Delete(zipFilePath); // Delete the existing zip file if it exists.
+ }
+
+ ZipFile.CreateFromDirectory(dir, zipFilePath, CompressionLevel.Optimal, false);
+ Console.WriteLine($"Created zip file: {zipFilePath}");
+ }
+}
+
+string FindProject(string name) =>
+ Directory.EnumerateFiles($"{GetSolutionFolder()}", $"{name}.csproj", SearchOption.AllDirectories).First();
+
+List FindAllProjectInDirectory(string path) =>
+ Directory.EnumerateFiles($"{GetSolutionFolder()}/{path}", "*.csproj", SearchOption.AllDirectories).ToList();
+
+string GetVersion() =>
+ File.ReadLines($"{GetSolutionFolder()}/version.txt").First().Trim();
+
+string GetSolutionFolder([CallerFilePath] string path = null) =>
+ Path.GetDirectoryName(path);
+
+PublishSamples();
+PublishTools();
diff --git a/publish.sh b/publish.sh
deleted file mode 100755
index aa311c52..00000000
--- a/publish.sh
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/bin/sh
-
-# Define output path for published applications
-output_path="artifacts/Publish/"
-project_name=""
-target_framework=""
-target_platform=""
-
-# Function to sign macOS applications
-# $1: Path to the application to be signed
-sign() {
- path="$1"
- # Check if codesign is available before attempting to sign
- if command -v codesign > /dev/null; then
- codesign -f -s - "$path"
- fi
-}
-
-# Function to publish framework-dependent deployment (FDD)
-# Publishes the specified .NET project for the given framework
-publish_fdd() {
- dotnet publish \
- src/"$project_name"/"$project_name".csproj \
- -p:UseAppHost=false \
- -p:DebugType=None \
- -p:DebugSymbols=false \
- --framework "$target_framework" \
- -c Release \
- -o "$output_path"/"$project_name"/"$target_framework"/
-}
-
-# Function to publish self-contained deployment (SCD)
-# Publishes the specified .NET project for the given framework and platform
-publish_scd() {
- dotnet publish -r "$target_platform" \
- src/"$project_name"/"$project_name".csproj \
- -p:PublishSingleFile=true \
- -p:IncludeNativeLibrariesForSelfExtract=true \
- -p:AllowedReferenceRelatedFileExtensions=none \
- -p:DebugType=None \
- -p:DebugSymbols=false \
- --framework "$target_framework" \
- --self-contained true \
- -c Release \
- -o "$output_path"/"$project_name"/"$target_platform"/
-
- # Sign the macOS application if the target platform is macOS
- case "$target_platform" in
- *osx*) sign "$output_path/$project_name/$target_platform/$project_name" ;;
- esac
-}
-
-# Main function to control the script flow
-main() {
- if [ "$#" -eq 0 ]; then
- # Print usage instructions if no arguments are provided
- echo "Usage:"
- echo " []"
- echo ""
- echo "Where:"
- echo " project Project name."
- echo " framework .NET version (net6.0, net7.0, net8.0)."
- echo " platform Platform name (win-x64, linux-x64, osx-x64, osx-arm64)"
- echo " for self-contained app."
- exit 1
- fi
-
- project_name="$1"
- target_framework="$2"
- target_platform="$3"
-
- # Determine which type of deployment to publish based on the number of arguments
- if [ "$#" -eq 2 ]; then
- publish_fdd
- elif [ "$#" -eq 3 ]; then
- publish_scd
- fi
- exit 0
-}
-
-# Execute the main function with all passed arguments
-main "$@"
diff --git a/samples/API/AuthSample/AuthSample.csproj b/samples/API/AuthSample/AuthSample.csproj
new file mode 100644
index 00000000..61718a1f
--- /dev/null
+++ b/samples/API/AuthSample/AuthSample.csproj
@@ -0,0 +1,3 @@
+
+
+
diff --git a/samples/SimpleAuthSample/Program.cs b/samples/API/AuthSample/Program.cs
similarity index 100%
rename from samples/SimpleAuthSample/Program.cs
rename to samples/API/AuthSample/Program.cs
diff --git a/samples/API/ConnectSample/ConnectSample.csproj b/samples/API/ConnectSample/ConnectSample.csproj
new file mode 100644
index 00000000..61718a1f
--- /dev/null
+++ b/samples/API/ConnectSample/ConnectSample.csproj
@@ -0,0 +1,3 @@
+
+
+
diff --git a/samples/DxFeedConnect/Program.cs b/samples/API/ConnectSample/Program.cs
similarity index 93%
rename from samples/DxFeedConnect/Program.cs
rename to samples/API/ConnectSample/Program.cs
index 66fa225e..32986fc2 100644
--- a/samples/DxFeedConnect/Program.cs
+++ b/samples/API/ConnectSample/Program.cs
@@ -24,7 +24,7 @@ private static void PrintUsage()
var eventTypeNames = ReflectionUtil.CreateTypesString(DXEndpoint.GetEventTypes());
var usageString = $@"
Usage:
-DxFeedConnect [