From b47c03802f2f6e4718365fdabb11093cb482bc21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 07:42:34 +0200 Subject: [PATCH 001/125] Bump xunit.runner.visualstudio from 2.5.0 to 2.5.1 (#669) Bumps [xunit.runner.visualstudio](https://github.com/xunit/xunit) from 2.5.0 to 2.5.1. - [Commits](https://github.com/xunit/xunit/compare/2.5.0...2.5.1) --- updated-dependencies: - dependency-name: xunit.runner.visualstudio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit db6a41af101c784716e61e1aa78614976a93f1a9) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 19cbd1ff..b61e772d 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -20,7 +20,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index ce8458cb..50e8cc0b 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -18,7 +18,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From a8887265187422fbcf2bfb02ecb7a49468fcd19f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 07:51:03 +0200 Subject: [PATCH 002/125] Bump xunit from 2.5.0 to 2.5.1 (#668) Bumps [xunit](https://github.com/xunit/xunit) from 2.5.0 to 2.5.1. - [Commits](https://github.com/xunit/xunit/compare/2.5.0...2.5.1) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 77132adef6b0a12f58918b97c2ef437849e7b925) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index b61e772d..c403e299 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 50e8cc0b..0e02f694 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 91fc16d2957319e6cc957b29a3e7106b503c936c Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 18 Sep 2023 08:57:20 +0200 Subject: [PATCH 003/125] Convert some warning-level obsoletes into error-level ones. --- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/AlpacaCryptoDataClient.cs | 6 +++--- Alpaca.Markets/Parameters/LatestDataListRequest.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 1b177d5b..0cad83b4 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -19,7 +19,7 @@ -- Fix all discrepancies with the latest 6.2.x release and prepare for the final code cleanup. +- Added the new 'IErrorInformation` interface and the `ErrorInformation` property into the `RestClientException` class. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp diff --git a/Alpaca.Markets/AlpacaCryptoDataClient.cs b/Alpaca.Markets/AlpacaCryptoDataClient.cs index 2431c03a..a5f3d8d3 100644 --- a/Alpaca.Markets/AlpacaCryptoDataClient.cs +++ b/Alpaca.Markets/AlpacaCryptoDataClient.cs @@ -11,7 +11,7 @@ internal AlpacaCryptoDataClient( } [ExcludeFromCodeCoverage] - [Obsolete("This method will be removed in the next major release of SDK. Use the ListLatestBarsAsync method instead.", false)] + [Obsolete("This method will be removed in the next minor release of SDK. Use the ListLatestBarsAsync method instead.", true)] public async Task GetLatestBarAsync( LatestDataRequest request, CancellationToken cancellationToken = default) => @@ -27,7 +27,7 @@ public Task> ListLatestBarsAsync( request, "bars", data => data.Bars, cancellationToken); [ExcludeFromCodeCoverage] - [Obsolete("This method will be removed in the next major release of SDK. Use the ListLatestTradesAsync method instead.", false)] + [Obsolete("This method will be removed in the next minor release of SDK. Use the ListLatestTradesAsync method instead.", true)] public async Task GetLatestTradeAsync( LatestDataRequest request, CancellationToken cancellationToken = default) => @@ -43,7 +43,7 @@ public Task> ListLatestTradesAsync( request, "trades", data => data.Trades, cancellationToken); [ExcludeFromCodeCoverage] - [Obsolete("This method will be removed in the next major release of SDK. Use the ListLatestQuotesAsync method instead.", false)] + [Obsolete("This method will be removed in the next minor release of SDK. Use the ListLatestQuotesAsync method instead.", true)] public async Task GetLatestQuoteAsync( LatestDataRequest request, CancellationToken cancellationToken = default) => diff --git a/Alpaca.Markets/Parameters/LatestDataListRequest.cs b/Alpaca.Markets/Parameters/LatestDataListRequest.cs index 18437f70..d03fec47 100644 --- a/Alpaca.Markets/Parameters/LatestDataListRequest.cs +++ b/Alpaca.Markets/Parameters/LatestDataListRequest.cs @@ -45,7 +45,7 @@ public LatestDataListRequest( /// [UsedImplicitly] [ExcludeFromCodeCoverage] - [Obsolete("This query parameter doesn't support anymore, the property will be removed in the next major release of SDK.", false)] + [Obsolete("This query parameter doesn't support anymore, the property will be removed in the next minor release of SDK.", true)] public CryptoExchange Exchange { get; } internal async ValueTask GetUriBuilderAsync( From 68e1700dfc60f90599a50704d3c297b33f914252 Mon Sep 17 00:00:00 2001 From: hiohiohio Date: Fri, 29 Sep 2023 05:50:09 +0900 Subject: [PATCH 004/125] Added IPO attribute (#672) (cherry picked from commit 90740b1e380d2138fa9a74dcc60819e2901f0d7b) --- Alpaca.Markets/Enums/AssetAttributes.cs | 9 ++++++++- Alpaca.Markets/PublicAPI.Shipped.txt | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Alpaca.Markets/Enums/AssetAttributes.cs b/Alpaca.Markets/Enums/AssetAttributes.cs index b34ec46f..e9745aab 100644 --- a/Alpaca.Markets/Enums/AssetAttributes.cs +++ b/Alpaca.Markets/Enums/AssetAttributes.cs @@ -18,5 +18,12 @@ public enum AssetAttributes /// [UsedImplicitly] [EnumMember(Value = "ptp_with_exception")] - PtpWithException + PtpWithException, + + /// + /// IPO asset, only limit orders are allowed prior to an IPO being traded on secondary market + /// + [UsedImplicitly] + [EnumMember(Value = "ipo")] + IPO } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 11b95666..f1dacb04 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -122,6 +122,7 @@ Alpaca.Markets.AnnouncementsRequest.TimeInterval.get -> Alpaca.Markets.IInclusiv Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpNoException = 0 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpWithException = 1 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.IPO = 2 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.Crypto = 1 -> Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.UsEquity = 0 -> Alpaca.Markets.AssetClass From 51c33f63253cc9e0aceaa8b94025cf8951d63322 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 22:50:53 +0200 Subject: [PATCH 005/125] Bump jetbrains.dotcover.globaltool from 2023.2.1 to 2023.2.2 (#670) Bumps jetbrains.dotcover.globaltool from 2023.2.1 to 2023.2.2. --- updated-dependencies: - dependency-name: jetbrains.dotcover.globaltool dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit fedf9b59f306555794566065316b3b0644eb880c) --- .config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 8ab3a1a9..4fab1ecc 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "jetbrains.dotcover.globaltool": { - "version": "2023.2.1", + "version": "2023.2.2", "commands": [ "dotnet-dotcover" ] From b6ff0ab89e45fa975328869904363c5c40aa6b03 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Thu, 28 Sep 2023 22:58:56 +0200 Subject: [PATCH 006/125] Prepare 7.0.0-rc2 release of SDK. --- Alpaca.Markets/Alpaca.Markets.csproj | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 0cad83b4..f23b9645 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,14 +12,15 @@ - 7.0.0.7 - 7.0.0.7 - 7.0.0-rc1 + 7.0.0.8 + 7.0.0.8 + 7.0.0-rc2 - Added the new 'IErrorInformation` interface and the `ErrorInformation` property into the `RestClientException` class. +- Added the new `IPO` enumeration member into the `AssetAttributes` enumeration. Thanks to @hiohiohio for help! C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 38e3cba897088a35dc8af7ec58ac6ffe76152abc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:31:55 +0200 Subject: [PATCH 007/125] Bump stefanzweifel/git-auto-commit-action from 4 to 5 (#674) Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 4 to 5. - [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases) - [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/v4...v5) --- updated-dependencies: - dependency-name: stefanzweifel/git-auto-commit-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 5623def5326f5a163fdbaafe0cf333c10585b915) --- .github/workflows/lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lockfiles.yml b/.github/workflows/lockfiles.yml index 81c2b916..e2d92ac4 100644 --- a/.github/workflows/lockfiles.yml +++ b/.github/workflows/lockfiles.yml @@ -22,6 +22,6 @@ jobs: run: dotnet restore --force-evaluate - name: Auto-commit changed files - uses: stefanzweifel/git-auto-commit-action@v4 + uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Update NuGet lock files after Dependabot dependency update. From 95101505e9bed6aa11e766e9a61e1f20c2346928 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 06:38:01 +0200 Subject: [PATCH 008/125] Bump xunit.runner.visualstudio from 2.5.1 to 2.5.3 (#678) Bumps [xunit.runner.visualstudio](https://github.com/xunit/visualstudio.xunit) from 2.5.1 to 2.5.3. - [Release notes](https://github.com/xunit/visualstudio.xunit/releases) - [Commits](https://github.com/xunit/visualstudio.xunit/compare/2.5.1...2.5.3) --- updated-dependencies: - dependency-name: xunit.runner.visualstudio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit dc1c14ba57d14325d3fb0c43d34e5054de2277a4) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index c403e299..1c4968bf 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -20,7 +20,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 0e02f694..eb4ed2d1 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -18,7 +18,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 89164d7b109a42bb8fc43bed8361ad7249a14fe6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 06:47:19 +0200 Subject: [PATCH 009/125] Bump xunit from 2.5.1 to 2.5.2 (#676) Bumps [xunit](https://github.com/xunit/xunit) from 2.5.1 to 2.5.2. - [Commits](https://github.com/xunit/xunit/compare/2.5.1...2.5.2) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 906e23e88f3fe123abef0ba8ed917063e86f0ceb) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 1c4968bf..e2d83448 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index eb4ed2d1..5de2f165 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 22eeabec3a6ffc56f426180d8be3b854d4d1c58a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 07:01:51 +0200 Subject: [PATCH 010/125] Bump RichardSzalay.MockHttp from 6.0.0 to 7.0.0 (#677) Bumps [RichardSzalay.MockHttp](https://github.com/richardszalay/mockhttp) from 6.0.0 to 7.0.0. - [Release notes](https://github.com/richardszalay/mockhttp/releases) - [Changelog](https://github.com/richardszalay/mockhttp/blob/master/CHANGELOG) - [Commits](https://github.com/richardszalay/mockhttp/compare/v6.0.0...v7.0.0) --- updated-dependencies: - dependency-name: RichardSzalay.MockHttp dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit fe5a7d6aee8cd3d733dd89b471d9edc0c8ff3d0c) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index e2d83448..baee4ba3 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 5de2f165..edc5de0f 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -16,7 +16,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive From 702d955564baf9ce158065c9bca8e547bed35a65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 07:11:28 +0200 Subject: [PATCH 011/125] Bump Microsoft.Extensions.Http.Polly from 7.0.11 to 7.0.12 (#675) * Bump Microsoft.Extensions.Http.Polly from 7.0.11 to 7.0.12 Bumps [Microsoft.Extensions.Http.Polly](https://github.com/dotnet/aspnetcore) from 7.0.11 to 7.0.12. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md) - [Commits](https://github.com/dotnet/aspnetcore/compare/v7.0.11...v7.0.12) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http.Polly dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 28f5a4d79dddfadad0f8e94a393dbcd9fb303133) --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- .../Alpaca.Markets.Tests.csproj | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index af661928..24112804 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -94,7 +94,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index f45161e7..9ea6c25c 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -48,9 +48,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.11, )", - "resolved": "7.0.11", - "contentHash": "S5Hf0yN82oa9Z/gy+fzyKfnTfuItDoF1hL+ikJrruJGv+STC622gLqXZyntMSQjLfwGYIf9zrLU8AESMWIRj0g==", + "requested": "[7.0.12, )", + "resolved": "7.0.12", + "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -320,9 +320,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.11, )", - "resolved": "7.0.11", - "contentHash": "S5Hf0yN82oa9Z/gy+fzyKfnTfuItDoF1hL+ikJrruJGv+STC622gLqXZyntMSQjLfwGYIf9zrLU8AESMWIRj0g==", + "requested": "[7.0.12, )", + "resolved": "7.0.12", + "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -580,9 +580,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.11, )", - "resolved": "7.0.11", - "contentHash": "S5Hf0yN82oa9Z/gy+fzyKfnTfuItDoF1hL+ikJrruJGv+STC622gLqXZyntMSQjLfwGYIf9zrLU8AESMWIRj0g==", + "requested": "[7.0.12, )", + "resolved": "7.0.12", + "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -795,9 +795,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.11, )", - "resolved": "7.0.11", - "contentHash": "S5Hf0yN82oa9Z/gy+fzyKfnTfuItDoF1hL+ikJrruJGv+STC622gLqXZyntMSQjLfwGYIf9zrLU8AESMWIRj0g==", + "requested": "[7.0.12, )", + "resolved": "7.0.12", + "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index edc5de0f..7b518c9e 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,7 +13,7 @@ - + From 372c418cf919541c082909d10f80417c886cb1c6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 4 Nov 2023 09:05:27 +0100 Subject: [PATCH 012/125] Upgrade dependencies before upcoming release. --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 +- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 ++-- .../Alpaca.Markets.Tests.csproj | 4 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 107 +++++++++++++++--- UsageExamples/UsageExamples.csproj | 2 +- 7 files changed, 113 insertions(+), 32 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index baee4ba3..bdb6e131 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 24112804..8f576082 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -94,7 +94,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 9ea6c25c..b59fcd2d 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -48,9 +48,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.12, )", - "resolved": "7.0.12", - "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", + "requested": "[7.0.13, )", + "resolved": "7.0.13", + "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -320,9 +320,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.12, )", - "resolved": "7.0.12", - "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", + "requested": "[7.0.13, )", + "resolved": "7.0.13", + "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -580,9 +580,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.12, )", - "resolved": "7.0.12", - "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", + "requested": "[7.0.13, )", + "resolved": "7.0.13", + "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", @@ -795,9 +795,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.12, )", - "resolved": "7.0.12", - "contentHash": "ydLK3X8c714By7gPzyhqEvNBIFOx/FynhK4CbnjJfjvbZRd05eIfQdTVwC55nOf9uuyUh2G+sz6OXYCuDoE+yg==", + "requested": "[7.0.13, )", + "resolved": "7.0.13", + "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", "dependencies": { "Microsoft.Extensions.Http": "7.0.0", "Polly": "7.2.3", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 7b518c9e..f9aade4f 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,11 +13,11 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index f23b9645..509a8370 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -107,7 +107,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index cc8743a4..ed0dd2d9 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==", + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", "dependencies": { - "System.ValueTuple": "4.5.0" + "Polly.Core": "8.1.0" } }, "Portable.System.DateTimeOnly": { @@ -93,6 +93,14 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -108,11 +116,27 @@ "resolved": "1.1.1", "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.1.0", + "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4", + "System.ValueTuple": "4.5.0" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", @@ -193,9 +217,12 @@ }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "dependencies": { + "Polly.Core": "8.1.0" + } }, "Portable.System.DateTimeOnly": { "type": "Direct", @@ -226,6 +253,14 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -241,11 +276,26 @@ "resolved": "1.1.1", "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.1.0", + "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", @@ -312,9 +362,12 @@ }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "dependencies": { + "Polly.Core": "8.1.0" + } }, "Portable.System.DateTimeOnly": { "type": "Direct", @@ -339,6 +392,11 @@ "resolved": "7.0.0", "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -349,11 +407,26 @@ "resolved": "1.1.1", "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.1.0", + "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, "System.Buffers": { "type": "Transitive", "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", @@ -420,9 +493,12 @@ }, "Polly": { "type": "Direct", - "requested": "[7.2.4, )", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "dependencies": { + "Polly.Core": "8.1.0" + } }, "System.IO.Pipelines": { "type": "Direct", @@ -445,6 +521,11 @@ "type": "Transitive", "resolved": "1.1.1", "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.1.0", + "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==" } } } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 1221293f..c78f2621 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -21,7 +21,7 @@ - + From a6b399b0133b041d931ef4260b5e95d121a2f09f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Nov 2023 07:42:37 +0100 Subject: [PATCH 013/125] Bump jetbrains.dotcover.globaltool from 2023.2.2 to 2023.2.3 (#685) Bumps jetbrains.dotcover.globaltool from 2023.2.2 to 2023.2.3. --- updated-dependencies: - dependency-name: jetbrains.dotcover.globaltool dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit e7d9f7bdaed8b5983e1d00719c0bf9ff52865209) --- .config/dotnet-tools.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 4fab1ecc..303423f4 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "jetbrains.dotcover.globaltool": { - "version": "2023.2.2", + "version": "2023.2.3", "commands": [ "dotnet-dotcover" ] From 2bc62738b87c5d6993549581acedebcc249e0927 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 6 Nov 2023 12:22:19 +0100 Subject: [PATCH 014/125] Fixed all R# problems found in the current code base. --- Alpaca.Markets/Enums/AssetAttributes.cs | 2 +- Alpaca.Markets/Interfaces/IActiveStock.cs | 3 +++ Alpaca.Markets/Interfaces/IAlpacaDataClient.cs | 2 ++ Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs | 1 + Alpaca.Markets/Interfaces/IErrorInformation.cs | 5 +++++ Alpaca.Markets/Interfaces/IMarketMover.cs | 4 ++++ Alpaca.Markets/Interfaces/IMarketMovers.cs | 2 ++ Alpaca.Markets/PublicAPI.Shipped.txt | 2 +- 8 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets/Enums/AssetAttributes.cs b/Alpaca.Markets/Enums/AssetAttributes.cs index e9745aab..851d5103 100644 --- a/Alpaca.Markets/Enums/AssetAttributes.cs +++ b/Alpaca.Markets/Enums/AssetAttributes.cs @@ -25,5 +25,5 @@ public enum AssetAttributes /// [UsedImplicitly] [EnumMember(Value = "ipo")] - IPO + Ipo } diff --git a/Alpaca.Markets/Interfaces/IActiveStock.cs b/Alpaca.Markets/Interfaces/IActiveStock.cs index 80ac4037..03e4f7a1 100644 --- a/Alpaca.Markets/Interfaces/IActiveStock.cs +++ b/Alpaca.Markets/Interfaces/IActiveStock.cs @@ -9,15 +9,18 @@ public interface IActiveStock /// /// Gets the stock instrument symbol name. /// + [UsedImplicitly] String Symbol { get; } /// /// Gets the current instrument volume value. /// + [UsedImplicitly] Decimal Volume { get; } /// /// Gets the current instrument trade count value. /// + [UsedImplicitly] UInt64 TradeCount { get; } } diff --git a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs index 265ec406..44db9516 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs @@ -418,6 +418,7 @@ Task> GetHistoricalAuctionsAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// Read-only list of most active stocks ranked by volume. + [UsedImplicitly] Task> ListMostActiveStocksByVolumeAsync( Int32? numberOfTopMostActiveStocks = default, CancellationToken cancellationToken = default); @@ -442,6 +443,7 @@ Task> ListMostActiveStocksByVolumeAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// Read-only list of most active stocks ranked by trade count. + [UsedImplicitly] Task> ListMostActiveStocksByTradeCountAsync( Int32? numberOfTopMostActiveStocks = default, CancellationToken cancellationToken = default); diff --git a/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs b/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs index dc67bed8..cd087567 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs @@ -25,6 +25,7 @@ public interface IAlpacaScreenerClient /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// Read-only market movers collections. + [UsedImplicitly] Task GetTopMarketMoversAsync( Int32? numberOfLosersAndGainersInResponse = default, CancellationToken cancellationToken = default); diff --git a/Alpaca.Markets/Interfaces/IErrorInformation.cs b/Alpaca.Markets/Interfaces/IErrorInformation.cs index d9baa88a..d896c8e2 100644 --- a/Alpaca.Markets/Interfaces/IErrorInformation.cs +++ b/Alpaca.Markets/Interfaces/IErrorInformation.cs @@ -8,25 +8,30 @@ public interface IErrorInformation /// /// Gets the symbol name related for the error. /// + [UsedImplicitly] String Symbol { get; } /// /// Gets the number of opened orders if this value related to the error. /// + [UsedImplicitly] Int32? OpenOrdersCount { get; } /// /// Gets the day trading buying power if this value related to the error. /// + [UsedImplicitly] Decimal? DayTradingBuyingPower { get; } /// /// Gets the maximal day trading buying power if this value related to the error. /// + [UsedImplicitly] Decimal? MaxDayTradingBuyingPowerUsed { get; } /// /// Gets the used maximal day trading buying power if this value related to the error. /// + [UsedImplicitly] Decimal? MaxDayTradingBuyingPowerUsedSoFar { get; } } diff --git a/Alpaca.Markets/Interfaces/IMarketMover.cs b/Alpaca.Markets/Interfaces/IMarketMover.cs index 18b6c21d..02e868ad 100644 --- a/Alpaca.Markets/Interfaces/IMarketMover.cs +++ b/Alpaca.Markets/Interfaces/IMarketMover.cs @@ -8,20 +8,24 @@ public interface IMarketMover /// /// Gets the instrument symbol name. /// + [UsedImplicitly] String Symbol { get; } /// /// Gets the current instrument price value. /// + [UsedImplicitly] Decimal Price { get; } /// /// Gets the current instrument price change value. /// + [UsedImplicitly] Decimal Change { get; } /// /// Gets the current instrument price change value in percents. /// + [UsedImplicitly] Decimal PercentChange { get; } } diff --git a/Alpaca.Markets/Interfaces/IMarketMovers.cs b/Alpaca.Markets/Interfaces/IMarketMovers.cs index e6eb8ea0..a91df959 100644 --- a/Alpaca.Markets/Interfaces/IMarketMovers.cs +++ b/Alpaca.Markets/Interfaces/IMarketMovers.cs @@ -8,10 +8,12 @@ public interface IMarketMovers /// /// Gets list of the top market losers. /// + [UsedImplicitly] IReadOnlyList Losers { get; } /// /// Gets list of the top market gainers. /// + [UsedImplicitly] IReadOnlyList Gainers { get; } } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index f1dacb04..7737ed34 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -122,7 +122,7 @@ Alpaca.Markets.AnnouncementsRequest.TimeInterval.get -> Alpaca.Markets.IInclusiv Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpNoException = 0 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpWithException = 1 -> Alpaca.Markets.AssetAttributes -Alpaca.Markets.AssetAttributes.IPO = 2 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.Ipo = 2 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.Crypto = 1 -> Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.UsEquity = 0 -> Alpaca.Markets.AssetClass From cfaef48efce85deb3278307115057e71f6504964 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Tue, 7 Nov 2023 09:54:23 +0100 Subject: [PATCH 015/125] Update dependencies and fix some small issues. --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 18 +++++++++--------- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/PublicAPI.Shipped.txt | 7 ++++--- Alpaca.Markets/packages.lock.json | 18 +++++++++--------- UsageExamples/UsageExamples.csproj | 2 +- 6 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 8f576082..5fb2a6a5 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -106,7 +106,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index b59fcd2d..3aa3ea21 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -78,9 +78,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==", + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", "dependencies": { "System.Memory": "4.5.5" } @@ -350,9 +350,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==", + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", "dependencies": { "System.Memory": "4.5.5" } @@ -601,9 +601,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==" + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==" }, "System.Linq.Async": { "type": "Direct", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 509a8370..01e87836 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -117,7 +117,7 @@ - + diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 7737ed34..06c0f0d6 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -120,9 +120,10 @@ Alpaca.Markets.AnnouncementsRequest.Symbol.get -> string? Alpaca.Markets.AnnouncementsRequest.Symbol.set -> void Alpaca.Markets.AnnouncementsRequest.TimeInterval.get -> Alpaca.Markets.IInclusiveTimeInterval! Alpaca.Markets.AssetAttributes -Alpaca.Markets.AssetAttributes.PtpNoException = 0 -> Alpaca.Markets.AssetAttributes -Alpaca.Markets.AssetAttributes.PtpWithException = 1 -> Alpaca.Markets.AssetAttributes -Alpaca.Markets.AssetAttributes.Ipo = 2 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.PtpNoException = 1 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.PtpWithException = 2 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.Ipo = 3 -> Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.Unknown = 0 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.Crypto = 1 -> Alpaca.Markets.AssetClass Alpaca.Markets.AssetClass.UsEquity = 0 -> Alpaca.Markets.AssetClass diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index ed0dd2d9..582f323d 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -56,9 +56,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==", + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", "dependencies": { "System.Memory": "4.5.5" } @@ -226,9 +226,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==", + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", "dependencies": { "System.Memory": "4.5.5" } @@ -371,9 +371,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[7.0.1, )", - "resolved": "7.0.1", - "contentHash": "2X7BoEcSLwRJwfrmsNzL+5mhEyENa8YeL2goDdVhjG9lGaRgOGlRRNbfloIpS6FpvMtgYyADouLeFQNRKFNDiQ==" + "requested": "[8.0.0-rc1, )", + "resolved": "8.0.0-rc1", + "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==" }, "System.IO.Pipelines": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index c78f2621..1083fe33 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -17,7 +17,7 @@ - + From 8d7df67611a5c3c8719dc513e429e35fac9a3aff Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Tue, 7 Nov 2023 09:55:36 +0100 Subject: [PATCH 016/125] Added the new `Unknown` enumeration member into the `AssetAttributes` enumeration as fallback option. --- Alpaca.Markets/Enums/AssetAttributes.cs | 9 +++++++- .../Helpers/AssetAttributesEnumConverter.cs | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs diff --git a/Alpaca.Markets/Enums/AssetAttributes.cs b/Alpaca.Markets/Enums/AssetAttributes.cs index 851d5103..ecf391fa 100644 --- a/Alpaca.Markets/Enums/AssetAttributes.cs +++ b/Alpaca.Markets/Enums/AssetAttributes.cs @@ -3,9 +3,16 @@ /// /// Unique asset characteristics for Alpaca REST API. /// -[JsonConverter(typeof(StringEnumConverter))] +[JsonConverter(typeof(AssetAttributesEnumConverter))] public enum AssetAttributes { + /// + /// Unknown asset attribute. + /// + [UsedImplicitly] + [EnumMember(Value = "-")] + Unknown, + /// /// PTP asset accepting orders without exception. /// diff --git a/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs new file mode 100644 index 00000000..40a55bf5 --- /dev/null +++ b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs @@ -0,0 +1,23 @@ +namespace Alpaca.Markets; + +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class AssetAttributesEnumConverter : StringEnumConverter +{ + public override Object? ReadJson( + JsonReader reader, + Type objectType, + Object? existingValue, + JsonSerializer serializer) + { + try + { + return base.ReadJson(reader, objectType, existingValue, serializer); + } + catch (JsonSerializationException) + { + return AssetAttributes.Unknown; + } + } +} From c847e3c5dea9690fe3f7762ab82ae56d223e3d29 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Tue, 7 Nov 2023 10:00:08 +0100 Subject: [PATCH 017/125] Prepare release 7.0.0-rc3 --- Alpaca.Markets/Alpaca.Markets.csproj | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 01e87836..92263d73 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,15 +12,14 @@ - 7.0.0.8 - 7.0.0.8 - 7.0.0-rc2 + 7.0.0.9 + 7.0.0.9 + 7.0.0-rc3 -- Added the new 'IErrorInformation` interface and the `ErrorInformation` property into the `RestClientException` class. -- Added the new `IPO` enumeration member into the `AssetAttributes` enumeration. Thanks to @hiohiohio for help! +- Added the new `Unknown` enumeration member into the `AssetAttributes` enumeration as fallback option. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 6480fb78e38473deef180390f5ae04e57aaefa37 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 11 Nov 2023 07:12:53 +0100 Subject: [PATCH 018/125] Prepare release 7.0.0 --- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 92263d73..fcface38 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -14,7 +14,7 @@ 7.0.0.9 7.0.0.9 - 7.0.0-rc3 + 7.0.0 From eb19c787a85950e366cb57f8385d9a66d9ae880c Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 11 Nov 2023 07:24:14 +0100 Subject: [PATCH 019/125] Revert "Prepare release 7.0.0" This reverts commit 6480fb78e38473deef180390f5ae04e57aaefa37. --- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index fcface38..92263d73 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -14,7 +14,7 @@ 7.0.0.9 7.0.0.9 - 7.0.0 + 7.0.0-rc3 From ebc6942478692b2f02d8bf660ed13120e4a4c82d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 05:28:11 +0100 Subject: [PATCH 020/125] Bump JetBrains.Annotations from 2023.2.0 to 2023.3.0 (#686) * Bump JetBrains.Annotations from 2023.2.0 to 2023.3.0 Bumps [JetBrains.Annotations](https://github.com/JetBrains/JetBrains.Annotations) from 2023.2.0 to 2023.3.0. - [Commits](https://github.com/JetBrains/JetBrains.Annotations/compare/v2023.2.0...2023.3) --- updated-dependencies: - dependency-name: JetBrains.Annotations dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 95aafc6fbe0155e21ad71772649a070a36a4593e) --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 24 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 5fb2a6a5..6705736d 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -82,7 +82,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 3aa3ea21..68930a7b 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -24,9 +24,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -296,9 +296,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -556,9 +556,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -771,9 +771,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 92263d73..48e7b52c 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -91,7 +91,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 582f323d..0f7ff819 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -10,9 +10,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -180,9 +180,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -334,9 +334,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -465,9 +465,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.2.0, )", - "resolved": "2023.2.0", - "contentHash": "dvO//8aLmLRsCVVgoc/7qBqi2/y4BTyRcg20LCBWtK4n6E9Um06Zp7jF1n0hOE+yqBHwcrDzAjWvCaM3qH8flg==" + "requested": "[2023.3.0, )", + "resolved": "2023.3.0", + "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", From 9dad1e2ab1e048c4be58d4741e4cf822d45a47f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Nov 2023 05:30:21 +0100 Subject: [PATCH 021/125] Bump Microsoft.NET.Test.Sdk from 17.7.2 to 17.8.0 (#687) Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.7.2 to 17.8.0. - [Release notes](https://github.com/microsoft/vstest/releases) - [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md) - [Commits](https://github.com/microsoft/vstest/compare/v17.7.2...v17.8.0) --- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit e8495940b1003f307a762af08245bb269e241249) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index bdb6e131..496d87be 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index f9aade4f..85b7287f 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -14,7 +14,7 @@ - + From 903146155a7af1d27c1afe973423961532993011 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:28:11 +0100 Subject: [PATCH 022/125] Bump Microsoft.Extensions.DependencyInjection from 7.0.0 to 8.0.0 (#689) Bumps [Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: Microsoft.Extensions.DependencyInjection dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit f47a1076b67d6a6cee654d9abadc48382c4d64af) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 496d87be..b181a2e6 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -13,7 +13,7 @@ - + From 90ac5f64a7bc3b97ce4d18fc5db2e300c3b35e70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:34:17 +0100 Subject: [PATCH 023/125] Bump System.Threading.Channels from 7.0.0 to 8.0.0 (#693) * Bump System.Threading.Channels from 7.0.0 to 8.0.0 Bumps [System.Threading.Channels](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: System.Threading.Channels dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 93a16ae0fd27096a5cffe6ac271542e10b0e6dba) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 24 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index b181a2e6..a7791fe2 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -24,7 +24,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 6705736d..2796d0a9 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -96,7 +96,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 68930a7b..a414bd20 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -96,9 +96,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -368,9 +368,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -613,9 +613,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", @@ -825,9 +825,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 48e7b52c..812dbf58 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -103,7 +103,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 0f7ff819..011fb85f 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -86,9 +86,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -246,9 +246,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -388,9 +388,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -508,9 +508,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 1083fe33..9bd4bfc2 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -18,7 +18,7 @@ - + From f63ccdb8d2f49fa899bd5374ba3040a792e93903 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:40:46 +0100 Subject: [PATCH 024/125] Bump System.Net.Http.WinHttpHandler from 7.0.0 to 8.0.0 (#690) * Bump System.Net.Http.WinHttpHandler from 7.0.0 to 8.0.0 Bumps [System.Net.Http.WinHttpHandler](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: System.Net.Http.WinHttpHandler dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 3cae3ed25fe028335696db6183aeb6b7cdeebd7d) --- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 6 +++--- UsageExamples/UsageExamples.csproj | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 812dbf58..d0f43bcc 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -111,7 +111,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 011fb85f..bab0254f 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -76,9 +76,9 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "DJjlxpGJMHd7WxTo/WRb9q1tahjZvjer7Xo4rsOKAocrwewpA9L0YLxcKEx0nHQnruiWGgbngSzYt3YUwxc+2A==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 9bd4bfc2..df4a8973 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -26,7 +26,7 @@ - + From 0790ef117ba8292e9ea5e94e53459980f443a245 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:41:46 +0100 Subject: [PATCH 025/125] Bump System.IO.Pipelines from 7.0.0 to 8.0.0 (#691) * Bump System.IO.Pipelines from 7.0.0 to 8.0.0 Bumps [System.IO.Pipelines](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: System.IO.Pipelines dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit ab0be82e64c0f2e6310983b153c0aa3362dbfc2e) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 24 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index a7791fe2..3d330d78 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -25,7 +25,7 @@ all - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index d0f43bcc..bf98161e 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -104,7 +104,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index bab0254f..0657c030 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -65,9 +65,9 @@ }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -235,9 +235,9 @@ }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -377,9 +377,9 @@ }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -502,9 +502,9 @@ }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" }, "System.Threading.Channels": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index df4a8973..626da950 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -19,7 +19,7 @@ - + From abfa7035a23fc2c364b22c6d6e77dae840452b25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Nov 2023 23:52:16 +0100 Subject: [PATCH 026/125] Bump Polly from 8.1.0 to 8.2.0 (#694) * Bump Polly from 8.1.0 to 8.2.0 Bumps [Polly](https://github.com/App-vNext/Polly) from 8.1.0 to 8.2.0. - [Release notes](https://github.com/App-vNext/Polly/releases) - [Changelog](https://github.com/App-vNext/Polly/blob/main/CHANGELOG.md) - [Commits](https://github.com/App-vNext/Polly/compare/8.1.0...8.2.0) --- updated-dependencies: - dependency-name: Polly dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 14630ebdbf522f56467e524033b6ec4ac668e967) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 92 ++++++++++++++----- UsageExamples/UsageExamples.csproj | 2 +- 4 files changed, 71 insertions(+), 27 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 3d330d78..0f324b4a 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index bf98161e..67acf5eb 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -106,7 +106,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 0657c030..daec9614 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.1.0, )", - "resolved": "8.1.0", - "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "requested": "[8.2.0, )", + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", "dependencies": { - "Polly.Core": "8.1.0" + "Polly.Core": "8.2.0" } }, "Portable.System.DateTimeOnly": { @@ -101,6 +101,15 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ValueTuple": "4.5.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -118,10 +127,11 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", "System.ComponentModel.Annotations": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.4", "System.ValueTuple": "4.5.0" @@ -217,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.1.0, )", - "resolved": "8.1.0", - "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "requested": "[8.2.0, )", + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", "dependencies": { - "Polly.Core": "8.1.0" + "Polly.Core": "8.2.0" } }, "Portable.System.DateTimeOnly": { @@ -261,6 +271,14 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -278,10 +296,11 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", "System.ComponentModel.Annotations": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.4" } @@ -362,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.1.0, )", - "resolved": "8.1.0", - "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "requested": "[8.2.0, )", + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", "dependencies": { - "Polly.Core": "8.1.0" + "Polly.Core": "8.2.0" } }, "Portable.System.DateTimeOnly": { @@ -397,6 +416,14 @@ "resolved": "6.0.0", "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -409,10 +436,11 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", "System.ComponentModel.Annotations": "4.5.0", "System.Threading.Tasks.Extensions": "4.5.4" } @@ -493,11 +521,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.1.0, )", - "resolved": "8.1.0", - "contentHash": "EeCJCjxX/Czm6sjnEWbeCBfogYHLcPNEL6yJT5nZzT0U78sizhTYhY2l5aXxTD+DWeVRLZtkUHqWp7ij+tvYCQ==", + "requested": "[8.2.0, )", + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", "dependencies": { - "Polly.Core": "8.1.0" + "Polly.Core": "8.2.0" } }, "System.IO.Pipelines": { @@ -512,6 +540,19 @@ "resolved": "8.0.0", "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "1.1.1", @@ -524,8 +565,11 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "M9Mlim+I9QNP/Hu6SuWMTUFnjQPvYViGk1IAJyvdl85zNedmos8Yzx74/xPa+TEi3uof3H1xQLwAzWebhEvEYw==" + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "dependencies": { + "Microsoft.Bcl.TimeProvider": "8.0.0" + } } } } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 626da950..5592939b 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -21,7 +21,7 @@ - + From 13fd952b192ded4694230b1ef146d8e20656cf91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 00:04:16 +0100 Subject: [PATCH 027/125] Bump Microsoft.Extensions.Http from 7.0.0 to 8.0.0 (#692) * Bump Microsoft.Extensions.Http from 7.0.0 to 8.0.0 Bumps [Microsoft.Extensions.Http](https://github.com/dotnet/runtime) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v7.0.0...v8.0.0) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 348640eb574fef4631c268cff155e9b0595240eb) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 294 ++++++++++-------- 3 files changed, 172 insertions(+), 126 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 0f324b4a..33b607bf 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 2796d0a9..2b40a1e0 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -95,7 +95,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index a414bd20..ddd2e834 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -36,14 +36,15 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9Pq9f/CvOSz0t9yQa6g1uWpxa2sm13daLFm8EZwy9MaQUjKXWdNUXQwIxwhmba5N83UIqURiPHSNqGK1vfWF2w==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Http.Polly": { @@ -105,8 +106,8 @@ }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -116,61 +117,71 @@ "resolved": "1.1.1", "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0", + "System.ValueTuple": "4.5.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0", "System.ValueTuple": "4.5.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "System.Buffers": "4.5.1", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0", + "System.ValueTuple": "4.5.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -214,8 +225,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -308,14 +319,15 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9Pq9f/CvOSz0t9yQa6g1uWpxa2sm13daLFm8EZwy9MaQUjKXWdNUXQwIxwhmba5N83UIqURiPHSNqGK1vfWF2w==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Http.Polly": { @@ -377,8 +389,8 @@ }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -388,61 +400,69 @@ "resolved": "1.1.1", "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0" + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "System.Buffers": "4.5.1", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0", "System.ComponentModel.Annotations": "5.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -488,8 +508,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -568,14 +588,15 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9Pq9f/CvOSz0t9yQa6g1uWpxa2sm13daLFm8EZwy9MaQUjKXWdNUXQwIxwhmba5N83UIqURiPHSNqGK1vfWF2w==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Http.Polly": { @@ -622,53 +643,62 @@ "resolved": "1.1.1", "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "System.Buffers": "4.5.1", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0", + "System.ComponentModel.Annotations": "5.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -702,10 +732,15 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", + "resolved": "8.0.0", + "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -783,14 +818,15 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9Pq9f/CvOSz0t9yQa6g1uWpxa2sm13daLFm8EZwy9MaQUjKXWdNUXQwIxwhmba5N83UIqURiPHSNqGK1vfWF2w==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Http.Polly": { @@ -839,48 +875,58 @@ "resolved": "1.1.1", "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0" } From 3e1604b1e419b3c9e2681f19bc50cc2531cc70aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 00:10:20 +0100 Subject: [PATCH 028/125] Bump Microsoft.Extensions.Http.Polly from 7.0.13 to 8.0.0 (#695) * Bump Microsoft.Extensions.Http.Polly from 7.0.13 to 8.0.0 Bumps [Microsoft.Extensions.Http.Polly](https://github.com/dotnet/aspnetcore) from 7.0.13 to 8.0.0. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md) - [Commits](https://github.com/dotnet/aspnetcore/compare/v7.0.13...v8.0.0) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http.Polly dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit ccf102305fc67bcc47bb19d0904b23c55e35f1f7) --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 56 +++++++++---------- .../Alpaca.Markets.Tests.csproj | 2 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 2b40a1e0..2998c850 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -94,7 +94,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index ddd2e834..51570abc 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,12 +49,12 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.13, )", - "resolved": "7.0.13", - "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", "dependencies": { - "Microsoft.Extensions.Http": "7.0.0", - "Polly": "7.2.3", + "Microsoft.Extensions.Http": "8.0.0", + "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, @@ -204,8 +204,8 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.3", - "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==", + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==", "dependencies": { "System.ValueTuple": "4.5.0" } @@ -332,12 +332,12 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.13, )", - "resolved": "7.0.13", - "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", "dependencies": { - "Microsoft.Extensions.Http": "7.0.0", - "Polly": "7.2.3", + "Microsoft.Extensions.Http": "8.0.0", + "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, @@ -485,8 +485,8 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.3", - "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, "Polly.Extensions.Http": { "type": "Transitive", @@ -601,12 +601,12 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.13, )", - "resolved": "7.0.13", - "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", "dependencies": { - "Microsoft.Extensions.Http": "7.0.0", - "Polly": "7.2.3", + "Microsoft.Extensions.Http": "8.0.0", + "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, @@ -716,8 +716,8 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.3", - "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, "Polly.Extensions.Http": { "type": "Transitive", @@ -831,12 +831,12 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[7.0.13, )", - "resolved": "7.0.13", - "contentHash": "KHrizaQ5/qXvSZVrHwoka63OYsxwYX4WBoF+gMTLVoP+8B1wv3POtGAJiw7XO6wKmbSZOr2RXigyyk6HwFscIw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", "dependencies": { - "Microsoft.Extensions.Http": "7.0.0", - "Polly": "7.2.3", + "Microsoft.Extensions.Http": "8.0.0", + "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } }, @@ -943,8 +943,8 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.3", - "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + "resolved": "7.2.4", + "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" }, "Polly.Extensions.Http": { "type": "Transitive", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 85b7287f..6c3ee0d2 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,7 +13,7 @@ - + From 6454b9975eec18031ab56b22cc5661a3160bebb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Nov 2023 08:27:54 +0100 Subject: [PATCH 029/125] Bump Microsoft.SourceLink.GitHub from 1.1.1 to 8.0.0 (#696) * Bump Microsoft.SourceLink.GitHub from 1.1.1 to 8.0.0 Bumps [Microsoft.SourceLink.GitHub](https://github.com/dotnet/sourcelink) from 1.1.1 to 8.0.0. - [Release notes](https://github.com/dotnet/sourcelink/releases) - [Commits](https://github.com/dotnet/sourcelink/commits) --- updated-dependencies: - dependency-name: Microsoft.SourceLink.GitHub dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: OlegRa (cherry picked from commit 5a4154f1b0a3deb1c08165a1d864cd47f0f254dc) --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 72 +++++++++---------- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 72 +++++++++---------- 4 files changed, 74 insertions(+), 74 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 2998c850..0c64c226 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -90,7 +90,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 51570abc..2cac32fb 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -69,12 +69,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "Portable.System.DateTimeOnly": { @@ -114,8 +114,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -194,8 +194,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Newtonsoft.Json": { "type": "Transitive", @@ -343,12 +343,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "NETStandard.Library": { @@ -397,8 +397,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -475,8 +475,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Newtonsoft.Json": { "type": "Transitive", @@ -612,12 +612,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "Portable.System.DateTimeOnly": { @@ -640,8 +640,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -706,8 +706,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Newtonsoft.Json": { "type": "Transitive", @@ -842,12 +842,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "System.Linq.Async": { @@ -872,8 +872,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", @@ -933,8 +933,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Newtonsoft.Json": { "type": "Transitive", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 67acf5eb..b8d6894c 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -99,7 +99,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index daec9614..435db84b 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -31,12 +31,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "Newtonsoft.Json": { @@ -112,8 +112,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.NETFramework.ReferenceAssemblies.net462": { "type": "Transitive", @@ -122,8 +122,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Polly.Core": { "type": "Transitive", @@ -202,12 +202,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "NETStandard.Library": { @@ -281,8 +281,8 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", @@ -291,8 +291,8 @@ }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Polly.Core": { "type": "Transitive", @@ -365,12 +365,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "Newtonsoft.Json": { @@ -426,13 +426,13 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Polly.Core": { "type": "Transitive", @@ -505,12 +505,12 @@ }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", "dependencies": { - "Microsoft.Build.Tasks.Git": "1.1.1", - "Microsoft.SourceLink.Common": "1.1.1" + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" } }, "Newtonsoft.Json": { @@ -555,13 +555,13 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==" + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==" + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" }, "Polly.Core": { "type": "Transitive", From 2b73eeb547deb8d1031420d95e084dacaf04c057 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Thu, 16 Nov 2023 08:58:38 +0100 Subject: [PATCH 030/125] Prepare release 7.0.0 --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 18 +++++++++--------- Alpaca.Markets/Alpaca.Markets.csproj | 16 ++++++++++++---- Alpaca.Markets/packages.lock.json | 18 +++++++++--------- UsageExamples/UsageExamples.csproj | 2 +- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 0c64c226..de02a4b8 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -106,7 +106,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 2cac32fb..d1628861 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -79,9 +79,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", "dependencies": { "System.Memory": "4.5.5" } @@ -362,9 +362,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", "dependencies": { "System.Memory": "4.5.5" } @@ -622,9 +622,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==" }, "System.Linq.Async": { "type": "Direct", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index b8d6894c..60dc78f2 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,14 +12,22 @@ - 7.0.0.9 - 7.0.0.9 - 7.0.0-rc3 + 7.0.0.10 + 7.0.0.10 + 7.0.0 +- Added the new `IErrorInformation` interface and the `ErrorInformation` property into the `RestClientException` class. +- Added support for requesting the most active (by volume or trade count) stocks for the current trading session. +- Added support for requesting the top market movers (gainers and losers) for both stocks and crypto instruments. - Added the new `Unknown` enumeration member into the `AssetAttributes` enumeration as fallback option. +- Added sorting support into all (quotes, trades, bars, etc.) stock/crypto historical data requests. +- Added the `IRateLimitProvider` interface implementation for all HTTP-based clients in SDK. +- The obsolete attribute was removed from historical crypto quotes requesting methods. +- Added the new `Ipo` enumeration member into the `AssetAttributes` enumeration. +- Fixed problem with announcement object deserialization. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp @@ -116,7 +124,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 435db84b..849bbd25 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -56,9 +56,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", "dependencies": { "System.Memory": "4.5.5" } @@ -236,9 +236,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", "dependencies": { "System.Memory": "4.5.5" } @@ -390,9 +390,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0-rc1, )", - "resolved": "8.0.0-rc1", - "contentHash": "XFHPyrKJXfc24E858LxxBIxLoSX6psexI2FSGkVQpqWq0VIJLjboFO8KkpEZFSmuNs82rSknXj44qFcsomxxqw==" + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==" }, "System.IO.Pipelines": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 5592939b..f917ea9b 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -17,7 +17,7 @@ - + From 10d0c760ee340a696c6370209600301466c6fddc Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Thu, 16 Nov 2023 09:37:46 +0100 Subject: [PATCH 031/125] Prepare release 7.0.0 of Extensions --- .../Alpaca.Markets.Extensions.csproj | 12 +- Alpaca.Markets.Extensions/packages.lock.json | 186 +++++++++++++----- 2 files changed, 147 insertions(+), 51 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index de02a4b8..9e5b3f2c 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,14 +12,16 @@ - 7.0.0.3 - 7.0.0.3 - 7.0.0-rc1 + 7.0.0.4 + 7.0.0.4 + 7.0.0 -- Fix all discrepancies with the latest 6.2.x release and prepare for the final code cleanup. += Added sorting support into all (quotes, trades, bars, etc.) stock/crypto historical data requests. +- The obsolete attribute was removed from historical crypto quotes requesting methods. +- Fixed problem with announcement object deserialization. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp @@ -98,7 +100,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index d1628861..bef3dcb4 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,16 +4,16 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0-alpha4, )", - "resolved": "7.0.0-alpha4", - "contentHash": "NDuFtSBbNcUAsUd2ruRTe1RRiA6prKG9lCFpWooW55IGJ53nW9kelunCUcYq+IcPwWGSniBiyBtBaGIQ/2xNCw==", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "7.2.3", - "Portable.System.DateTimeOnly": "7.0.1", - "System.IO.Pipelines": "7.0.0", - "System.Net.Http.WinHttpHandler": "7.0.0", - "System.Threading.Channels": "7.0.0" + "Polly": "8.2.0", + "Portable.System.DateTimeOnly": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Threading.Channels": "8.0.0" } }, "IsExternalInit": { @@ -112,6 +112,15 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "System.ValueTuple": "4.5.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -204,9 +213,21 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==", + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4", "System.ValueTuple": "4.5.0" } }, @@ -223,6 +244,11 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "8.0.0", @@ -234,8 +260,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -254,8 +280,8 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "DJjlxpGJMHd7WxTo/WRb9q1tahjZvjer7Xo4rsOKAocrwewpA9L0YLxcKEx0nHQnruiWGgbngSzYt3YUwxc+2A==", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" @@ -288,15 +314,15 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0-alpha4, )", - "resolved": "7.0.0-alpha4", - "contentHash": "NDuFtSBbNcUAsUd2ruRTe1RRiA6prKG9lCFpWooW55IGJ53nW9kelunCUcYq+IcPwWGSniBiyBtBaGIQ/2xNCw==", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "7.2.3", - "Portable.System.DateTimeOnly": "7.0.1", - "System.IO.Pipelines": "7.0.0", - "System.Threading.Channels": "7.0.0" + "Polly": "8.2.0", + "Portable.System.DateTimeOnly": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Threading.Channels": "8.0.0" } }, "IsExternalInit": { @@ -395,6 +421,14 @@ "System.Threading.Tasks.Extensions": "4.5.4" } }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -485,8 +519,22 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } }, "Polly.Extensions.Http": { "type": "Transitive", @@ -517,8 +565,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -557,15 +605,15 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0-alpha4, )", - "resolved": "7.0.0-alpha4", - "contentHash": "NDuFtSBbNcUAsUd2ruRTe1RRiA6prKG9lCFpWooW55IGJ53nW9kelunCUcYq+IcPwWGSniBiyBtBaGIQ/2xNCw==", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "7.2.3", - "Portable.System.DateTimeOnly": "7.0.1", - "System.IO.Pipelines": "7.0.0", - "System.Threading.Channels": "7.0.0" + "Polly": "8.2.0", + "Portable.System.DateTimeOnly": "8.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Threading.Channels": "8.0.0" } }, "IsExternalInit": { @@ -638,6 +686,19 @@ "resolved": "8.0.0", "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -716,8 +777,22 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.Bcl.TimeProvider": "8.0.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } }, "Polly.Extensions.Http": { "type": "Transitive", @@ -748,8 +823,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -788,14 +863,14 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0-alpha4, )", - "resolved": "7.0.0-alpha4", - "contentHash": "NDuFtSBbNcUAsUd2ruRTe1RRiA6prKG9lCFpWooW55IGJ53nW9kelunCUcYq+IcPwWGSniBiyBtBaGIQ/2xNCw==", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "7.2.3", - "System.IO.Pipelines": "7.0.0", - "System.Threading.Channels": "7.0.0" + "Polly": "8.2.0", + "System.IO.Pipelines": "8.0.0", + "System.Threading.Channels": "8.0.0" } }, "IsExternalInit": { @@ -870,6 +945,14 @@ "resolved": "6.0.0", "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -943,8 +1026,19 @@ }, "Polly": { "type": "Transitive", - "resolved": "7.2.4", - "contentHash": "bw00Ck5sh6ekduDE3mnCo1ohzuad946uslCDEENu3091+6UKnBuKLo4e+yaNcCzXxOZCXWY2gV4a35+K1d4LDA==" + "resolved": "8.2.0", + "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "dependencies": { + "Polly.Core": "8.2.0" + } + }, + "Polly.Core": { + "type": "Transitive", + "resolved": "8.2.0", + "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "dependencies": { + "Microsoft.Bcl.TimeProvider": "8.0.0" + } }, "Polly.Extensions.Http": { "type": "Transitive", @@ -956,8 +1050,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", From ffe91fa2aa176ea65a1dea7030dc1e16282e6c3f Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 17 Nov 2023 08:38:24 +0100 Subject: [PATCH 032/125] Fix build issue on server side - enable trimming only for .NET not for .NET Framework (cherry picked from commit cf05aa812be8dc1eafc4ccaa7f3304f554d08b96) --- UsageExamples/UsageExamples.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index f917ea9b..4eed20fa 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -6,10 +6,13 @@ true link enable - true latest + + true + + all From fbe914a39235592ff89134a0fbeab6eb27da9f0c Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 20 Nov 2023 11:53:50 +0100 Subject: [PATCH 033/125] Fix build issues: - Enable trimming only for .NET not for .NET Framework. - Async tests and .NET Framework usages. --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 +- .../CompatibilitySuppressions.xml | 32 +++ .../GlobalSuppressions.cs | 5 + Alpaca.Markets.Extensions/packages.lock.json | 12 ++ .../Alpaca.Markets.Tests.csproj | 4 +- .../AlpacaTradingClientTest.Orders.cs | 4 +- .../ThrottleParametersTest.cs | 4 +- Alpaca.Markets/CompatibilitySuppressions.xml | 196 ++++++++++++++++++ Alpaca.Markets/GlobalSuppressions.cs | 4 + Alpaca.Markets/packages.lock.json | 12 ++ 10 files changed, 269 insertions(+), 8 deletions(-) create mode 100644 Alpaca.Markets.Extensions/CompatibilitySuppressions.xml create mode 100644 Alpaca.Markets.Extensions/GlobalSuppressions.cs diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 33b607bf..566dafbb 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,8 +19,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml b/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml new file mode 100644 index 00000000..096125f6 --- /dev/null +++ b/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml @@ -0,0 +1,32 @@ + + + + + CP0001 + T:Alpaca.Markets.Extensions.ConfigurationExtensions + lib/net462/Alpaca.Markets.Extensions.dll + lib/net462/Alpaca.Markets.Extensions.dll + true + + + CP0001 + T:Alpaca.Markets.Extensions.ConfigurationExtensions + lib/net6.0/Alpaca.Markets.Extensions.dll + lib/net6.0/Alpaca.Markets.Extensions.dll + true + + + CP0001 + T:Alpaca.Markets.Extensions.ConfigurationExtensions + lib/netstandard2.0/Alpaca.Markets.Extensions.dll + lib/netstandard2.0/Alpaca.Markets.Extensions.dll + true + + + CP0001 + T:Alpaca.Markets.Extensions.ConfigurationExtensions + lib/netstandard2.1/Alpaca.Markets.Extensions.dll + lib/netstandard2.1/Alpaca.Markets.Extensions.dll + true + + \ No newline at end of file diff --git a/Alpaca.Markets.Extensions/GlobalSuppressions.cs b/Alpaca.Markets.Extensions/GlobalSuppressions.cs new file mode 100644 index 00000000..771556d5 --- /dev/null +++ b/Alpaca.Markets.Extensions/GlobalSuppressions.cs @@ -0,0 +1,5 @@ +// This file is used by Code Analysis to maintain SuppressMessage attributes that are applied to this project. + +#if NETFRAMEWORK +global using System.Net.Http; +#endif diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index bef3dcb4..ace09dc9 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -915,6 +915,18 @@ "Polly.Extensions.Http": "3.0.0" } }, + "Microsoft.NET.ILLink.Analyzers": { + "type": "Direct", + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 6c3ee0d2..6f9bcab9 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,8 +17,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs index 258f95cf..34db66e9 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs @@ -144,11 +144,11 @@ public async Task PostStopLossOrderAsyncWorks() } [Fact] - public void NewOrderRequestValidationWorks() + public async Task NewOrderRequestValidationWorks() { using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); - Assert.ThrowsAsync(() => mock.Client.PostOrderAsync( + await Assert.ThrowsAsync(() => mock.Client.PostOrderAsync( MarketOrder.Buy(String.Empty, OrderQuantity.Fractional(-FractionalQuantity)))); } diff --git a/Alpaca.Markets.Tests/ThrottleParametersTest.cs b/Alpaca.Markets.Tests/ThrottleParametersTest.cs index a94fc627..cf6503b8 100644 --- a/Alpaca.Markets.Tests/ThrottleParametersTest.cs +++ b/Alpaca.Markets.Tests/ThrottleParametersTest.cs @@ -161,10 +161,10 @@ await Assert.ThrowsAsync( } [Fact] - public void DefaultThrottleParametersWorks() + public async Task DefaultThrottleParametersWorks() { using var client = Environments.Paper.GetAlpacaTradingClient( new SecretKey(Guid.NewGuid().ToString("N"), Guid.NewGuid().ToString("N"))); - Assert.ThrowsAsync(() => client.GetClockAsync()); + await Assert.ThrowsAsync(() => client.GetClockAsync()); } } diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index 5a0c244c..e5868f18 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -64,6 +64,27 @@ lib/net462/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.HistoricalBarsRequest.get_Feed + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalTradesRequest.get_Feed + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) @@ -155,6 +176,20 @@ lib/net462/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.LatestMarketDataRequest.get_Feed + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) @@ -176,6 +211,27 @@ lib/net6.0/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.HistoricalBarsRequest.get_Feed + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalTradesRequest.get_Feed + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) @@ -267,6 +323,20 @@ lib/net6.0/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.LatestMarketDataRequest.get_Feed + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) @@ -288,6 +358,27 @@ lib/netstandard2.0/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.HistoricalBarsRequest.get_Feed + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalTradesRequest.get_Feed + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) @@ -379,6 +470,20 @@ lib/netstandard2.0/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.LatestMarketDataRequest.get_Feed + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) @@ -400,6 +505,27 @@ lib/netstandard2.1/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.HistoricalBarsRequest.get_Feed + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.HistoricalTradesRequest.get_Feed + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) @@ -491,6 +617,20 @@ lib/netstandard2.1/Alpaca.Markets.dll true + + CP0002 + M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0002 + M:Alpaca.Markets.LatestMarketDataRequest.get_Feed + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + CP0002 M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) @@ -685,4 +825,60 @@ lib/netstandard2.1/Alpaca.Markets.dll true + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpNoException + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpWithException + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpNoException + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpWithException + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpNoException + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpWithException + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpNoException + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0011 + F:Alpaca.Markets.AssetAttributes.PtpWithException + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + \ No newline at end of file diff --git a/Alpaca.Markets/GlobalSuppressions.cs b/Alpaca.Markets/GlobalSuppressions.cs index c9e0c0d9..41e03226 100644 --- a/Alpaca.Markets/GlobalSuppressions.cs +++ b/Alpaca.Markets/GlobalSuppressions.cs @@ -4,3 +4,7 @@ global using Newtonsoft.Json.Converters; global using System.Diagnostics; global using Newtonsoft.Json; + +#if NETFRAMEWORK +global using System.Net.Http; +#endif diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 849bbd25..e53af964 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -503,6 +503,18 @@ "resolved": "3.3.4", "contentHash": "kNLTfXtXUWDHVt5iaPkkiPuyHYlMgLI6SOFT4w88bfeI2vqSeGgHunFkdvlaCM8RDfcY0t2+jnesQtidRJJ/DA==" }, + "Microsoft.NET.ILLink.Analyzers": { + "type": "Direct", + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" + }, "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", From b1440023a52dcbc306fd898f740bacb4456de0be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 21:06:16 +0100 Subject: [PATCH 034/125] Merge dependencies upgrades from the `devel` branch: Bump xunit from 2.6.3 to 2.6.4 (#707) Bumps [xunit](https://github.com/xunit/xunit) from 2.6.3 to 2.6.4. - [Commits](https://github.com/xunit/xunit/compare/2.6.3...2.6.4) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 78291b97239a8d25887f14016dc4a812337643ae) (+8 squashed commit) Squashed commit: [6d65eb69] Bump xunit.runner.visualstudio from 2.5.5 to 2.5.6 (#708) Bumps [xunit.runner.visualstudio](https://github.com/xunit/visualstudio.xunit) from 2.5.5 to 2.5.6. - [Release notes](https://github.com/xunit/visualstudio.xunit/releases) - [Commits](https://github.com/xunit/visualstudio.xunit/compare/2.5.5...2.5.6) --- updated-dependencies: - dependency-name: xunit.runner.visualstudio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit d703d1beae247bd60c613c5a5ac8626417c8c90d) [6d305c81] Bump actions/download-artifact from 3 to 4 (#705) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 70cbeb6506be61ce90739a67d0f5edc200328ac5) [9d15a3e7] Bump actions/upload-artifact from 3 to 4 (#706) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 315892bd0963b21fbbc39c0b0f5d9a1d77f29028) [4e2d4a9a] Bump github/codeql-action from 2 to 3 (#704) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 3efa47c8ee90631320eacde1f4d09b596ce4f839) [0fd7f999] Bump actions/setup-dotnet from 3 to 4 (#703) Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 3 to 4. - [Release notes](https://github.com/actions/setup-dotnet/releases) - [Commits](https://github.com/actions/setup-dotnet/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-dotnet dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 36317a9f77540ab4ab76a1a7f41f474bdc9aea72) [d04c6c3a] Bump Moq from 4.20.69 to 4.20.70 (#700) Bumps [Moq](https://github.com/moq/moq) from 4.20.69 to 4.20.70. - [Release notes](https://github.com/moq/moq/releases) - [Changelog](https://github.com/devlooped/moq/blob/main/CHANGELOG.md) - [Commits](https://github.com/moq/moq/compare/v4.20.69...v4.20.70) --- updated-dependencies: - dependency-name: Moq dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 0d39c70f694589909313197ffa857af82d5ddb56) --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/documentation.yml | 6 +++--- .github/workflows/lockfiles.yml | 2 +- .github/workflows/release.yml | 10 +++++----- .../Alpaca.Markets.Extensions.Tests.csproj | 6 +++--- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9e8b4eae..ff7ddeb8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,12 +26,12 @@ jobs: uses: actions/checkout@v4 - name: Setup .NET 7.0.x - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '7.0.x' - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} @@ -47,4 +47,4 @@ jobs: run: dotnet build -c Release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index c1bba8ab..14d1c236 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -12,7 +12,7 @@ jobs: uses: actions/checkout@v4 - name: Setup .NET 7.0.x - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '7.0.x' @@ -31,7 +31,7 @@ jobs: run: tar -cvf Documentation.tar -C Documentation/_site . - name: Save Documentation - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: documentation path: Documentation.tar @@ -58,7 +58,7 @@ jobs: git rm ** -f - name: Load Documentation - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: documentation diff --git a/.github/workflows/lockfiles.yml b/.github/workflows/lockfiles.yml index e2d92ac4..f4f64ca5 100644 --- a/.github/workflows/lockfiles.yml +++ b/.github/workflows/lockfiles.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v4 - name: Setup .NET 7.0.x - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '7.0.x' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f32abd3..4bb23d43 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@v4 - name: Setup .NET 7.0.x - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: '7.0.x' @@ -37,7 +37,7 @@ jobs: run: dotnet build -c Release - name: Save SDK Packages - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: sdk-packages path: | @@ -45,7 +45,7 @@ jobs: Alpaca.Markets/bin/Release/*.snupkg - name: Save Extensions Packages - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ext-packages path: | @@ -66,7 +66,7 @@ jobs: steps: - name: Load SDK Packages - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: sdk-packages @@ -87,7 +87,7 @@ jobs: steps: - name: Load Extensions Packages - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ext-packages diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 566dafbb..fd4f83ce 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -16,11 +16,11 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 6f9bcab9..efa2d690 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -15,10 +15,10 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all From 8e0eaa8109ce39192cac47e2e8e744318ab814b4 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 11:11:47 +0100 Subject: [PATCH 035/125] Issue #709 - Updated GH workflows and use .NET SDK 8.0 everywhere. (cherry picked from commit f2824da9afbc3a9fcc32a24d89e1ccd760e31dc6) --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/documentation.yml | 18 ++++++------------ .github/workflows/lockfiles.yml | 10 +++++++--- .github/workflows/release.yml | 8 ++++++-- Alpaca.Markets.sln | 18 +++++++++++++----- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ff7ddeb8..9a4602e3 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,4 +1,4 @@ -name: CodeQL Analyis +name: C# CodeQL Analyis on: push: @@ -25,10 +25,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Setup .NET 7.0.x + - name: Setup .NET 8.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '7.0.x' + dotnet-version: '8.0.x' - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 14d1c236..b7a85c29 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -11,10 +11,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 7.0.x + - name: Setup .NET 8.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '7.0.x' + dotnet-version: '8.0.x' - name: Cache NuGet Packages uses: actions/cache@v3 @@ -27,14 +27,13 @@ jobs: - name: Dotnet Build run: dotnet build -c Documentation - - name: Pack Documentation - run: tar -cvf Documentation.tar -C Documentation/_site . - - name: Save Documentation uses: actions/upload-artifact@v4 with: + retention-days: 1 + compression-level: 0 name: documentation - path: Documentation.tar + path: Documentation/_site/ publish: name: Publish Documentation @@ -62,13 +61,8 @@ jobs: with: name: documentation - - name: Unpack Documentation - run: | - tar -xvf Documentation.tar - rm Documentation.tar - git add ** -f - - name: Commit and Push run: | + git add ** -f git commit -m "Update content of .NET SDK documentation on GitHub Pages web site." git push origin gh-pages diff --git a/.github/workflows/lockfiles.yml b/.github/workflows/lockfiles.yml index f4f64ca5..a4dbc841 100644 --- a/.github/workflows/lockfiles.yml +++ b/.github/workflows/lockfiles.yml @@ -1,6 +1,9 @@ name: Update NuGet Lock Files + on: - workflow_dispatch: + pull_request: + branches: [ develop ] + permissions: contents: write @@ -8,15 +11,16 @@ jobs: lockfiles: name: Update and Commit runs-on: ubuntu-latest + if: github.actor == 'dependabot[bot]' steps: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 7.0.x + - name: Setup .NET 8.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '7.0.x' + dotnet-version: '8.0.x' - name: Restore Dependencies run: dotnet restore --force-evaluate diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4bb23d43..89761fef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,10 +13,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 7.0.x + - name: Setup .NET 8.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '7.0.x' + dotnet-version: '8.0.x' - name: Cache NuGet Packages uses: actions/cache@v3 @@ -39,6 +39,8 @@ jobs: - name: Save SDK Packages uses: actions/upload-artifact@v4 with: + retention-days: 1 + compression-level: 0 name: sdk-packages path: | Alpaca.Markets/bin/Release/*.nupkg @@ -47,6 +49,8 @@ jobs: - name: Save Extensions Packages uses: actions/upload-artifact@v4 with: + retention-days: 1 + compression-level: 0 name: ext-packages path: | Alpaca.Markets.Extensions/bin/Release/*.nupkg diff --git a/Alpaca.Markets.sln b/Alpaca.Markets.sln index 9051a5d6..85f5732c 100644 --- a/Alpaca.Markets.sln +++ b/Alpaca.Markets.sln @@ -22,12 +22,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Alpaca.Markets.Extensions.T EndProject Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Portable.Helpers", "Portable.Helpers\Portable.Helpers.shproj", "{B628BF16-AB9C-4A2C-B13F-3FCC491D15D7}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workflows", "Workflows", "{7447D0EC-8468-4527-8223-6A27A674448B}" + ProjectSection(SolutionItems) = preProject + .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml + .github\workflows\documentation.yml = .github\workflows\documentation.yml + .github\workflows\lockfiles.yml = .github\workflows\lockfiles.yml + .github\workflows\release.yml = .github\workflows\release.yml + EndProjectSection +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - Portable.Helpers\Portable.Helpers.projitems*{4cce5c4a-688a-40da-befd-12e6803b41d3}*SharedItemsImports = 5 - Portable.Helpers\Portable.Helpers.projitems*{b628bf16-ab9c-4a2c-b13f-3fcc491d15d7}*SharedItemsImports = 13 - Portable.Helpers\Portable.Helpers.projitems*{f339d73b-347f-47d4-9bfb-ebea010fc6f7}*SharedItemsImports = 5 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Documentation|Any CPU = Documentation|Any CPU @@ -70,4 +73,9 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7748A3F4-1EFB-47D1-AFC7-C558CCBA9FCE} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Portable.Helpers\Portable.Helpers.projitems*{4cce5c4a-688a-40da-befd-12e6803b41d3}*SharedItemsImports = 5 + Portable.Helpers\Portable.Helpers.projitems*{b628bf16-ab9c-4a2c-b13f-3fcc491d15d7}*SharedItemsImports = 13 + Portable.Helpers\Portable.Helpers.projitems*{f339d73b-347f-47d4-9bfb-ebea010fc6f7}*SharedItemsImports = 5 + EndGlobalSection EndGlobal From df7faf17b09351b0604b79e4dad7c19c865066c0 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 11:33:22 +0100 Subject: [PATCH 036/125] Issue #709 - Replaced empty bodies with just semicolon if applicable. (cherry picked from commit b6b348b7dc375bdb04c7b4fb6f4d4c5d17754656) --- Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs | 4 +--- .../Subscriptions/IDisposableAlpacaDataSubscription.cs | 4 +--- Alpaca.Markets.Tests/MockClientsFactory.cs | 4 +--- Portable.Helpers/ValidatedNotNullAttribute.cs | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs b/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs index 1fd5669a..4c3f7b58 100644 --- a/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs @@ -25,6 +25,4 @@ public MockClient [CollectionDefinition("MockEnvironment")] public sealed class MockClientsFactoryCollection - : ICollectionFixture -{ -} + : ICollectionFixture; diff --git a/Alpaca.Markets.Extensions/Subscriptions/IDisposableAlpacaDataSubscription.cs b/Alpaca.Markets.Extensions/Subscriptions/IDisposableAlpacaDataSubscription.cs index 06e6216c..58fa7fd9 100644 --- a/Alpaca.Markets.Extensions/Subscriptions/IDisposableAlpacaDataSubscription.cs +++ b/Alpaca.Markets.Extensions/Subscriptions/IDisposableAlpacaDataSubscription.cs @@ -6,6 +6,4 @@ /// /// public interface IDisposableAlpacaDataSubscription - : IAlpacaDataSubscription, IAsyncDisposable, IDisposable -{ -} + : IAlpacaDataSubscription, IAsyncDisposable, IDisposable; diff --git a/Alpaca.Markets.Tests/MockClientsFactory.cs b/Alpaca.Markets.Tests/MockClientsFactory.cs index cd92606c..757ddf49 100644 --- a/Alpaca.Markets.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Tests/MockClientsFactory.cs @@ -65,6 +65,4 @@ public IEnumerator GetEnumerator() [CollectionDefinition("MockEnvironment")] public sealed class MockClientsFactoryCollection - : ICollectionFixture -{ -} + : ICollectionFixture; diff --git a/Portable.Helpers/ValidatedNotNullAttribute.cs b/Portable.Helpers/ValidatedNotNullAttribute.cs index 6038d28f..4c9bd131 100644 --- a/Portable.Helpers/ValidatedNotNullAttribute.cs +++ b/Portable.Helpers/ValidatedNotNullAttribute.cs @@ -2,6 +2,4 @@ [ExcludeFromCodeCoverage] [AttributeUsage(AttributeTargets.Parameter)] -internal sealed class ValidatedNotNullAttribute : Attribute -{ -} +internal sealed class ValidatedNotNullAttribute : Attribute; From 542f238f109c8ec3c352c811becf45101b1e3b4c Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 11:56:55 +0100 Subject: [PATCH 037/125] Issue #709 - The primary constructor usage in helpers code. (cherry picked from commit 4309ecaa684be7c9f2bbefc2b911b34e922258f2) --- .../CallerArgumentExpressionAttribute.cs | 9 +++---- Portable.Helpers/Range.cs | 26 ++----------------- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/Portable.Helpers/CallerArgumentExpressionAttribute.cs b/Portable.Helpers/CallerArgumentExpressionAttribute.cs index ae157896..7d7adc41 100644 --- a/Portable.Helpers/CallerArgumentExpressionAttribute.cs +++ b/Portable.Helpers/CallerArgumentExpressionAttribute.cs @@ -3,14 +3,11 @@ namespace System.Runtime.CompilerServices; [AttributeUsage(AttributeTargets.Parameter)] -internal sealed class CallerArgumentExpressionAttribute : Attribute +internal sealed class CallerArgumentExpressionAttribute( + String parameterName) : Attribute { - public CallerArgumentExpressionAttribute( - String parameterName) => - ParameterName = parameterName; - [UsedImplicitly] - public String ParameterName { get; } + public String ParameterName { get; } = parameterName; } #endif diff --git a/Portable.Helpers/Range.cs b/Portable.Helpers/Range.cs index 08098557..1153651a 100644 --- a/Portable.Helpers/Range.cs +++ b/Portable.Helpers/Range.cs @@ -2,31 +2,9 @@ namespace System; -internal readonly struct Range : IEquatable +internal readonly record struct Range( + Index Start, Index End) { - [UsedImplicitly] - public Index Start { get; } - - [UsedImplicitly] - public Index End { get; } - - public Range( - Index start, - Index end) - { - Start = start; - End = end; - } - - public override Boolean Equals(Object? value) => - value is Range r && - r.Start.Equals(Start) && - r.End.Equals(End); - - public Boolean Equals(Range other) => other.Start.Equals(Start) && other.End.Equals(End); - - public override Int32 GetHashCode() => Start.GetHashCode() * 31 + End.GetHashCode(); - public override String ToString() => Start + ".." + End; [UsedImplicitly] From 67b073a8d377154a2ebbbdd83be0605a0e8c1ad6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 12:23:34 +0100 Subject: [PATCH 038/125] Issue #709 - The primary constructor usage in unit testing code. (cherry picked from commit 5be4f248df697f39f7bfb31bceb678c342982f3f) --- .../AlpacaCryptoDataClientTest.cs | 11 +++------ .../AlpacaDataClientTest.Auctions.cs | 8 +++---- .../AlpacaDataClientTest.Bars.cs | 16 ++++++------- .../AlpacaDataClientTest.News.cs | 4 ++-- .../AlpacaDataClientTest.Quotes.cs | 8 +++---- .../AlpacaDataClientTest.Trades.cs | 8 +++---- .../AlpacaDataClientTest.cs | 9 ++----- .../AlpacaDataSubscriptionExtensions.cs | 11 +++------ .../AlpacaTradingClientTest.cs | 15 ++++-------- .../AlpacaCryptoDataClientTest.Bars.cs | 10 ++++---- .../AlpacaCryptoDataClientTest.Latest.cs | 6 ++--- .../AlpacaCryptoDataClientTest.Other.cs | 2 +- .../AlpacaCryptoDataClientTest.Quotes.cs | 10 ++++---- .../AlpacaCryptoDataClientTest.Snapshot.cs | 4 ++-- .../AlpacaCryptoDataClientTest.Trades.cs | 10 ++++---- .../AlpacaCryptoDataClientTest.cs | 15 ++++-------- .../AlpacaCryptoStreamingClientTest.cs | 21 +++++++--------- .../AlpacaDataClientTest.Auctions.cs | 10 ++++---- .../AlpacaDataClientTest.Bars.cs | 10 ++++---- .../AlpacaDataClientTest.Latest.cs | 12 +++++----- .../AlpacaDataClientTest.Meta.cs | 6 ++--- .../AlpacaDataClientTest.Other.cs | 6 ++--- .../AlpacaDataClientTest.Quotes.cs | 10 ++++---- .../AlpacaDataClientTest.Snapshot.cs | 4 ++-- .../AlpacaDataClientTest.Trades.cs | 10 ++++---- Alpaca.Markets.Tests/AlpacaDataClientTest.cs | 17 +++++-------- .../AlpacaDataStreamingClientTest.cs | 23 +++++++----------- .../AlpacaNewsStreamingClientTest.cs | 13 ++++------ .../AlpacaStreamingClientTest.cs | 17 +++++-------- .../AlpacaTradingClientTest.Account.cs | 10 ++++---- .../AlpacaTradingClientTest.Actions.cs | 4 ++-- .../AlpacaTradingClientTest.Assets.cs | 4 ++-- .../AlpacaTradingClientTest.Orders.cs | 24 +++++++++---------- .../AlpacaTradingClientTest.Positions.cs | 10 ++++---- .../AlpacaTradingClientTest.Watchlists.cs | 22 ++++++++--------- .../AlpacaTradingClientTest.cs | 21 +++++++--------- .../ThrottleParametersTest.cs | 17 +++++-------- 37 files changed, 179 insertions(+), 239 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs index e5699508..4af0a40b 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs @@ -1,12 +1,11 @@ namespace Alpaca.Markets.Extensions.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaCryptoDataClientTest +public sealed class AlpacaCryptoDataClientTest( + MockClientsFactoryFixture mockClientsFactory) { private static readonly Interval _timeInterval = getTimeInterval(); - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const String Crypto = "BTC/USD"; private const Decimal Volume = 1_000M; @@ -15,14 +14,10 @@ public sealed class AlpacaCryptoDataClientTest private const Int32 Pages = 5; - public AlpacaCryptoDataClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public async Task GetAverageDailyTradeVolumeAsyncWithIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); addPaginatedResponses(mock, addMultiBarsPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Auctions.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Auctions.cs index da734f81..4266afec 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Auctions.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Auctions.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalAuctionsAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleAuctionsPageExpectation); @@ -19,7 +19,7 @@ public async Task GetHistoricalAuctionsAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalAuctionsDictionaryOfAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiAuctionsPageExpectation); @@ -33,7 +33,7 @@ public async Task GetHistoricalAuctionsDictionaryOfAsyncEnumerableWorks() [Fact] public async Task GetHistoricalAuctionsPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleAuctionsPageExpectation); @@ -47,7 +47,7 @@ public async Task GetHistoricalAuctionsPagesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalAuctionsMultiPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiAuctionsPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Bars.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Bars.cs index 8344b486..0a967c32 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Bars.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Bars.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetAverageDailyTradeVolumeAsyncWithDatesWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleBarsPageExpectation); @@ -20,7 +20,7 @@ public async Task GetAverageDailyTradeVolumeAsyncWithDatesWorks() [Fact] public async Task GetAverageDailyTradeVolumeAsyncWithIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleBarsPageExpectation); @@ -34,7 +34,7 @@ public async Task GetAverageDailyTradeVolumeAsyncWithIntervalWorks() [Fact] public async Task GetSimpleMovingAverageAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleBarsPageExpectation); @@ -48,7 +48,7 @@ public async Task GetSimpleMovingAverageAsyncWorks() [Fact] public async Task GetSimpleMovingAverageAsyncZeroWindowWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); var counter = await validateList( mock.Client.GetSimpleMovingAverageAsync( @@ -60,7 +60,7 @@ public async Task GetSimpleMovingAverageAsyncZeroWindowWorks() [Fact] public async Task GetHistoricalBarsAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleBarsPageExpectation); @@ -74,7 +74,7 @@ public async Task GetHistoricalBarsAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalBarsDictionaryOfAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiBarsPageExpectation); @@ -88,7 +88,7 @@ public async Task GetHistoricalBarsDictionaryOfAsyncEnumerableWorks() [Fact] public async Task GetHistoricalBarsPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleBarsPageExpectation); @@ -102,7 +102,7 @@ public async Task GetHistoricalBarsPagesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalBarsMultiPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiBarsPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.News.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.News.cs index ea81ceb5..bce035a9 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.News.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.News.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetNewsArticlesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleNewsPageExpectation); @@ -19,7 +19,7 @@ public async Task GetNewsArticlesAsAsyncEnumerableWorks() [Fact] public async Task GetNewsArticlesPagesAsAsyncEnumerable() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleNewsPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Quotes.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Quotes.cs index 9f841cbf..b93200be 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Quotes.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Quotes.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalQuotesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleQuotesPageExpectation); @@ -19,7 +19,7 @@ public async Task GetHistoricalQuotesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalQuotesDictionaryOfAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiQuotesPageExpectation); @@ -33,7 +33,7 @@ public async Task GetHistoricalQuotesDictionaryOfAsyncEnumerableWorks() [Fact] public async Task GetHistoricalQuotesPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleQuotesPageExpectation); @@ -47,7 +47,7 @@ public async Task GetHistoricalQuotesPagesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalQuotesMultiPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiQuotesPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Trades.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Trades.cs index d61719bd..40424e2a 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Trades.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.Trades.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalTradesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleTradesPageExpectation); @@ -19,7 +19,7 @@ public async Task GetHistoricalTradesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalTradesDictionaryOfAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiTradesPageExpectation); @@ -33,7 +33,7 @@ public async Task GetHistoricalTradesDictionaryOfAsyncEnumerableWorks() [Fact] public async Task GetHistoricalTradesPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addSingleTradesPageExpectation); @@ -47,7 +47,7 @@ public async Task GetHistoricalTradesPagesAsAsyncEnumerableWorks() [Fact] public async Task GetHistoricalTradesMultiPagesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); addPaginatedResponses(mock, addMultiTradesPageExpectation); diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs index b1e777cf..7706a58f 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs @@ -1,12 +1,11 @@ namespace Alpaca.Markets.Extensions.Tests; [Collection("MockEnvironment")] -public sealed partial class AlpacaDataClientTest +public sealed partial class AlpacaDataClientTest( + MockClientsFactoryFixture mockClientsFactory) { private static readonly Interval _timeInterval = getTimeInterval(); - private readonly MockClientsFactoryFixture _mockClientsFactory; - private static readonly String[] _symbols = { Stock, Other }; private const Decimal Volume = 1_000M; @@ -21,10 +20,6 @@ public sealed partial class AlpacaDataClientTest private const Int32 Pages = 5; - public AlpacaDataClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - private static void addPaginatedResponses( MockClient mock, Action, String?> singleResponseFactory) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataSubscriptionExtensions.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataSubscriptionExtensions.cs index 60e56642..4c1a8948 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataSubscriptionExtensions.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataSubscriptionExtensions.cs @@ -5,18 +5,13 @@ namespace Alpaca.Markets.Extensions.Tests; internal static class AlpacaDataSubscriptionExtensions { - private sealed class Subscription : IAlpacaDataSubscription + private sealed class Subscription( + String stream) : IAlpacaDataSubscription where TItem : class { - private readonly String _stream; - - public Subscription( - String stream) => - _stream = stream; - public IEnumerable Streams { - get { yield return _stream; } + get { yield return stream; } } public Boolean Subscribed diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs index 24042d7e..a6c6333f 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs @@ -1,20 +1,15 @@ namespace Alpaca.Markets.Extensions.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaTradingClientTest +public sealed class AlpacaTradingClientTest( + MockClientsFactoryFixture mockClientsFactory) { - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const Int32 Items = 5; - public AlpacaTradingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public async Task GetCalendarForSingleDayAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var today = DateOnly.FromDateTime(DateTime.Now); mock.AddGet("/v2/calendar", new JArray( @@ -34,7 +29,7 @@ public async Task GetCalendarForSingleDayAsyncWorks() [Fact] public async Task GetNewsArticlesAsAsyncEnumerableWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); addSinglePageExpectation(mock, Items); addSinglePageExpectation(mock); @@ -49,7 +44,7 @@ public async Task GetNewsArticlesAsAsyncEnumerableWorks() [Fact] public async Task IsMarketOpenAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var tomorrow = DateTime.Today.AddDays(1); var dayAfterTomorrow = tomorrow.AddDays(1); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Bars.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Bars.cs index 5013f1d2..c785af1b 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Bars.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Bars.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaCryptoDataClientTest [Fact] public async Task GetHistoricalBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalBarsAsyncWorks() [Fact] public async Task GetHistoricalBarsAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbol); @@ -38,7 +38,7 @@ public async Task GetHistoricalBarsAsyncForSingleWorks() [Fact] public async Task ListHistoricalBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbol); @@ -55,7 +55,7 @@ public async Task ListHistoricalBarsAsyncWorks() [Fact] public async Task ListHistoricalBarsAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalBarsAsyncForManyWorks() [Fact] public async Task ListHistoricalBarsAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbol); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Latest.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Latest.cs index 47ee0703..fdd9f531 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Latest.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Latest.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaCryptoDataClientTest [Fact] public async Task ListLatestBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddLatestCryptoBarsExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task ListLatestBarsAsyncWorks() [Fact] public async Task ListLatestQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddLatestCryptoQuotesExpectation(PathPrefix, _symbols); @@ -39,7 +39,7 @@ public async Task ListLatestQuotesAsyncWorks() [Fact] public async Task ListLatestTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddLatestCryptoTradesExpectation(PathPrefix, _symbols); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Other.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Other.cs index e8eca175..50844002 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Other.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Other.cs @@ -7,7 +7,7 @@ public async Task GetTopMarketMoversAsyncWorks() { const Int32 numberOfLosersAndGainers = 5; - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddGet("/v1beta1/screener/crypto/movers", new JObject( new JProperty("gainers", new JArray(Enumerable.Repeat( diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Quotes.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Quotes.cs index 462d359c..d4fa4ba6 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Quotes.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Quotes.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaCryptoDataClientTest [Fact] public async Task GetHistoricalQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalQuotesAsyncWorks() [Fact] public async Task GetHistoricalQuotesAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbol); @@ -38,7 +38,7 @@ public async Task GetHistoricalQuotesAsyncForSingleWorks() [Fact] public async Task ListHistoricalQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbol); @@ -55,7 +55,7 @@ public async Task ListHistoricalQuotesAsyncWorks() [Fact] public async Task ListHistoricalQuotesAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalQuotesAsyncForManyWorks() [Fact] public async Task ListHistoricalQuotesAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbol); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Snapshot.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Snapshot.cs index be07228d..67fa177d 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Snapshot.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Snapshot.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaCryptoDataClientTest [Fact] public async Task ListSnapshotsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task ListSnapshotsAsyncWorks() [Fact] public async Task ListLatestOrderBooksAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddOrderBooksExpectation(PathPrefix, _symbols); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Trades.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Trades.cs index 9a26acb1..370c0690 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Trades.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.Trades.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaCryptoDataClientTest [Fact] public async Task GetHistoricalTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalTradesAsyncWorks() [Fact] public async Task GetHistoricalTradesAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbol); @@ -38,7 +38,7 @@ public async Task GetHistoricalTradesAsyncForSingleWorks() [Fact] public async Task ListHistoricalTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbol); @@ -55,7 +55,7 @@ public async Task ListHistoricalTradesAsyncWorks() [Fact] public async Task ListHistoricalTradesAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalTradesAsyncForManyWorks() [Fact] public async Task ListHistoricalTradesAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaCryptoDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaCryptoDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbol); diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs index f54a57d2..fd1930eb 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs @@ -1,12 +1,11 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed partial class AlpacaCryptoDataClientTest +public sealed partial class AlpacaCryptoDataClientTest( + MockClientsFactoryFixture mockClientsFactory) { private static readonly Interval _timeInterval = getTimeInterval(); - private readonly MockClientsFactoryFixture _mockClientsFactory; - private static readonly String[] _symbols = { Crypto, Other }; private static readonly List _exchangesList = @@ -24,10 +23,6 @@ public sealed partial class AlpacaCryptoDataClientTest private const String Other = "ETH/USD"; - public AlpacaCryptoDataClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public void AlpacaCryptoDataClientConfigurationValidationWorks() { @@ -35,19 +30,19 @@ public void AlpacaCryptoDataClientConfigurationValidationWorks() var nullSecurityId = new AlpacaCryptoDataClientConfiguration { SecurityId = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws( - () => _mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullSecurityId)); + () => mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullSecurityId)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullApiEndpoint = new AlpacaCryptoDataClientConfiguration { ApiEndpoint = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws( - () => _mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullApiEndpoint)); + () => mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullApiEndpoint)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullThrottleParameters = new AlpacaCryptoDataClientConfiguration { ThrottleParameters = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws( - () => _mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullThrottleParameters)); + () => mockClientsFactory.GetAlpacaCryptoDataClientMock(Environments.Paper, nullThrottleParameters)); } private static Interval getTimeInterval() diff --git a/Alpaca.Markets.Tests/AlpacaCryptoStreamingClientTest.cs b/Alpaca.Markets.Tests/AlpacaCryptoStreamingClientTest.cs index 8f7b0c02..59c27c3b 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoStreamingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoStreamingClientTest.cs @@ -1,20 +1,15 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaCryptoStreamingClientTest +public sealed class AlpacaCryptoStreamingClientTest( + MockClientsFactoryFixture mockClientsFactory) { - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const String Crypto = "BTCUSD"; - public AlpacaCryptoStreamingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public async Task ConnectAndSubscribeMinuteBarsWorks() { - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock(Environments.Paper); + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock(Environments.Paper); await client.AddAuthenticationAsync(); @@ -37,7 +32,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeDailyBarsWorks() { - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock( + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock( configuration: new AlpacaCryptoStreamingClientConfiguration() .WithExchanges(CryptoExchange.Cbse)); @@ -67,7 +62,7 @@ public async Task ConnectAndSubscribeQuotesWorks() var configuration = new AlpacaCryptoStreamingClientConfiguration() .WithExchanges(Enum.GetValues().AsEnumerable()); - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock(configuration: configuration); + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock(configuration: configuration); await client.AddAuthenticationAsync(); @@ -94,7 +89,7 @@ public async Task ConnectAndSubscribeAllQuotesWorks() var configuration = new AlpacaCryptoStreamingClientConfiguration() .WithExchanges(Enum.GetValues().AsEnumerable()); - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock(configuration: configuration); + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock(configuration: configuration); await client.AddAuthenticationAsync(); @@ -118,7 +113,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeTradesWorks() { - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock(); await client.AddAuthenticationAsync(); @@ -140,7 +135,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeOrderBookWorks() { - using var client = _mockClientsFactory.GetAlpacaCryptoStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaCryptoStreamingClientMock(); await client.AddAuthenticationAsync(); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Auctions.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Auctions.cs index 7b5464c8..3d3c7ca9 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Auctions.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Auctions.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalAuctionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiAuctionsPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalAuctionsAsyncWorks() [Fact] public async Task GetHistoricalAuctionsAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleAuctionsPageExpectation(PathPrefix, Stock); @@ -38,7 +38,7 @@ public async Task GetHistoricalAuctionsAsyncForSingleWorks() [Fact] public async Task ListHistoricalAuctionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleAuctionsPageExpectation(PathPrefix, Stock); @@ -55,7 +55,7 @@ public async Task ListHistoricalAuctionsAsyncWorks() [Fact] public async Task ListHistoricalAuctionsAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiAuctionsPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalAuctionsAsyncForManyWorks() [Fact] public async Task ListHistoricalAuctionsAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleAuctionsPageExpectation(PathPrefix, Stock); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Bars.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Bars.cs index b22abc9e..3fb47383 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Bars.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Bars.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); @@ -25,7 +25,7 @@ public async Task GetHistoricalBarsAsyncWorks() [Fact] public async Task GetHistoricalBarsAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleBarsPageExpectation(PathPrefix, Stock); @@ -44,7 +44,7 @@ public async Task GetHistoricalBarsAsyncForSingleWorks() [Fact] public async Task ListHistoricalBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleBarsPageExpectation(PathPrefix, Stock); @@ -64,7 +64,7 @@ public async Task ListHistoricalBarsAsyncWorks() [Fact] public async Task ListHistoricalBarsAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); @@ -85,7 +85,7 @@ public async Task ListHistoricalBarsAsyncForManyWorks() [Fact] public async Task ListHistoricalBarsAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleBarsPageExpectation(PathPrefix, Stock); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Latest.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Latest.cs index 47505e15..7beb7f03 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Latest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Latest.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetLatestBarAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestBarExpectation(PathPrefix, Stock); @@ -17,7 +17,7 @@ public async Task GetLatestBarAsyncWorks() [Fact] public async Task ListLatestBarsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestBarsExpectation(PathPrefix, _symbols); @@ -34,7 +34,7 @@ public async Task ListLatestBarsAsyncWorks() [Fact] public async Task GetLatestQuoteAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestQuoteExpectation(PathPrefix, Stock); @@ -46,7 +46,7 @@ public async Task GetLatestQuoteAsyncWorks() [Fact] public async Task ListLatestQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestQuotesExpectation(PathPrefix, _symbols); @@ -63,7 +63,7 @@ public async Task ListLatestQuotesAsyncWorks() [Fact] public async Task GetLatestTradeAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestTradeExpectation(PathPrefix, Stock); @@ -75,7 +75,7 @@ public async Task GetLatestTradeAsyncWorks() [Fact] public async Task ListLatestTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddLatestTradesExpectation(PathPrefix, _symbols); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Meta.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Meta.cs index e13794e3..1dee0619 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Meta.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Meta.cs @@ -7,7 +7,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task ListExchangesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v2/stocks/meta/exchanges", createDictionary()); @@ -17,7 +17,7 @@ public async Task ListExchangesAsyncWorks() [Fact] public async Task ListTradeConditionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v2/stocks/meta/conditions/trade", createDictionary()); @@ -27,7 +27,7 @@ public async Task ListTradeConditionsAsyncWorks() [Fact] public async Task ListQuoteConditionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v2/stocks/meta/conditions/quote", createDictionary()); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Other.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Other.cs index a97731a2..ce69e067 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Other.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Other.cs @@ -11,7 +11,7 @@ public async Task GetTopMarketMoversAsyncWorks() { const Int32 numberOfLosersAndGainers = 5; - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v1beta1/screener/stocks/movers", new JObject( new JProperty("gainers", new JArray(Enumerable.Repeat( @@ -34,7 +34,7 @@ public async Task ListMostActiveStocksByVolumeAsyncWorks() { const Int32 numberOfTopMostActiveStocks = 5; - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v1beta1/screener/stocks/most-actives", new JObject( new JProperty("most_actives", new JArray(Enumerable.Repeat( @@ -52,7 +52,7 @@ public async Task ListMostActiveStocksByTradeCountAsyncWorks() { const Int32 numberOfTopMostActiveStocks = 5; - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddGet("/v1beta1/screener/stocks/most-actives", new JObject( new JProperty("most_actives", new JArray(Enumerable.Repeat( diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Quotes.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Quotes.cs index ccb0c02f..0687f4fd 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Quotes.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Quotes.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalQuotesAsyncWorks() [Fact] public async Task GetHistoricalQuotesAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleQuotesPageExpectation(PathPrefix, Stock); @@ -38,7 +38,7 @@ public async Task GetHistoricalQuotesAsyncForSingleWorks() [Fact] public async Task ListHistoricalQuotesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleQuotesPageExpectation(PathPrefix, Stock); @@ -55,7 +55,7 @@ public async Task ListHistoricalQuotesAsyncWorks() [Fact] public async Task ListHistoricalQuotesAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiQuotesPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalQuotesAsyncForManyWorks() [Fact] public async Task ListHistoricalQuotesAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleQuotesPageExpectation(PathPrefix, Stock); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Snapshot.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Snapshot.cs index d0c75550..bb9ca177 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Snapshot.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Snapshot.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetSnapshotAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSnapshotExpectation(PathPrefix, Stock); @@ -21,7 +21,7 @@ public async Task GetSnapshotAsyncWorks() [Fact] public async Task ListSnapshotsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSnapshotsExpectation(PathPrefix, _symbols); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.Trades.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.Trades.cs index a32d088d..470ad52b 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.Trades.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.Trades.cs @@ -5,7 +5,7 @@ public sealed partial class AlpacaDataClientTest [Fact] public async Task GetHistoricalTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); @@ -22,7 +22,7 @@ public async Task GetHistoricalTradesAsyncWorks() [Fact] public async Task GetHistoricalTradesAsyncForSingleWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleTradesPageExpectation(PathPrefix, Stock); @@ -38,7 +38,7 @@ public async Task GetHistoricalTradesAsyncForSingleWorks() [Fact] public async Task ListHistoricalTradesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleTradesPageExpectation(PathPrefix, Stock); @@ -55,7 +55,7 @@ public async Task ListHistoricalTradesAsyncWorks() [Fact] public async Task ListHistoricalTradesAsyncForManyWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); @@ -73,7 +73,7 @@ public async Task ListHistoricalTradesAsyncForManyWorks() [Fact] public async Task ListHistoricalTradesAsyncWithoutIntervalWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(); mock.AddSingleTradesPageExpectation(PathPrefix, Stock); diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs index 77907da9..6ad479b4 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs @@ -1,12 +1,11 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed partial class AlpacaDataClientTest +public sealed partial class AlpacaDataClientTest( + MockClientsFactoryFixture mockClientsFactory) { private static readonly Interval _timeInterval = getTimeInterval(); - private readonly MockClientsFactoryFixture _mockClientsFactory; - private static DateTime Yesterday => _timeInterval.From!.Value; private static readonly String[] _symbols = { Stock, Other }; @@ -21,10 +20,6 @@ public sealed partial class AlpacaDataClientTest private const String Other = "MSFT"; - public AlpacaDataClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public void AlpacaDataClientConfigurationValidationWorks() { @@ -32,25 +27,25 @@ public void AlpacaDataClientConfigurationValidationWorks() var nullSecurityId = new AlpacaDataClientConfiguration { SecurityId = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullSecurityId)); + mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullSecurityId)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullApiEndpoint = new AlpacaDataClientConfiguration { ApiEndpoint = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullApiEndpoint)); + mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullApiEndpoint)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullThrottleParameters = new AlpacaDataClientConfiguration { ThrottleParameters = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullThrottleParameters)); + mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper, nullThrottleParameters)); } [Fact] public async Task ListNewsArticlesAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper); + using var mock = mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper); mock.AddGet("/v1beta1/news", new JObject( new JProperty("news", new JArray(Stock.CreateNewsArticle())))); diff --git a/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs b/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs index ac00da1b..9936584b 100644 --- a/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs @@ -1,24 +1,19 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaDataStreamingClientTest +public sealed class AlpacaDataStreamingClientTest( + MockClientsFactoryFixture mockClientsFactory) { - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const Decimal DownPrice = 100M; private const Decimal UpPrice = 200M; private const String Stock = "AAPL"; - public AlpacaDataStreamingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public async Task ConnectAndSubscribeQuotesWorks() { - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(Environments.Paper); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(Environments.Paper); await client.AddAuthenticationAsync(); @@ -40,7 +35,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeAllQuotesWorks() { - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(Environments.Paper); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(Environments.Paper); await client.AddAuthenticationAsync(); @@ -62,7 +57,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeTradesWorks() { - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); await client.AddAuthenticationAsync(); @@ -87,7 +82,7 @@ await client.AddMessageAsync( [Fact] public async Task ConnectAndSubscribeStatusesWorks() { - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); await client.AddAuthenticationAsync(); @@ -108,7 +103,7 @@ public async Task ConnectAndSubscribeStatusesWorks() [Fact] public async Task ConnectAndSubscribeLimitUpLimitDownsWorks() { - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); await client.AddAuthenticationAsync(); @@ -131,7 +126,7 @@ public async Task ConnectAndSubscribeCorrectionsWorks() { const String channel = "trades"; - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); await client.AddAuthenticationAsync(); @@ -164,7 +159,7 @@ public async Task ErrorsAndWarningsWorks() var expectedWarnings = (0, 0); var expectedErrors = (3, 4); - using var client = _mockClientsFactory.GetAlpacaDataStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); using var tracker = new ErrorsAndWarningsTracker( client.Client, expectedWarnings, expectedErrors); diff --git a/Alpaca.Markets.Tests/AlpacaNewsStreamingClientTest.cs b/Alpaca.Markets.Tests/AlpacaNewsStreamingClientTest.cs index b5c7a28d..be593394 100644 --- a/Alpaca.Markets.Tests/AlpacaNewsStreamingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaNewsStreamingClientTest.cs @@ -1,23 +1,18 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaNewsStreamingClientTest +public sealed class AlpacaNewsStreamingClientTest( + MockClientsFactoryFixture mockClientsFactory) { - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const String NewsChannelName = "news"; private const String Stock = "AAPL"; - public AlpacaNewsStreamingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Theory] [ClassData(typeof(EnvironmentTestData))] public async Task ConnectAndSubscribeWorks(IEnvironment environment) { - using var client = _mockClientsFactory.GetAlpacaNewsStreamingClientMock(environment); + using var client = mockClientsFactory.GetAlpacaNewsStreamingClientMock(environment); await client.AddAuthenticationAsync(); @@ -47,7 +42,7 @@ public async Task ErrorsAndWarningsWorks() var expectedWarnings = (3, 3); var expectedErrors = (3, 4); - using var client = _mockClientsFactory.GetAlpacaNewsStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaNewsStreamingClientMock(); using var tracker = new ErrorsAndWarningsTracker( client.Client, expectedWarnings, expectedErrors); diff --git a/Alpaca.Markets.Tests/AlpacaStreamingClientTest.cs b/Alpaca.Markets.Tests/AlpacaStreamingClientTest.cs index fc24ef32..1a74c12e 100644 --- a/Alpaca.Markets.Tests/AlpacaStreamingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaStreamingClientTest.cs @@ -4,7 +4,8 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed class AlpacaStreamingClientTest +public sealed class AlpacaStreamingClientTest( + MockClientsFactoryFixture mockClientsFactory) { private readonly record struct FakeEnvironment : IEnvironment { @@ -21,8 +22,6 @@ public sealed class AlpacaStreamingClientTest public Uri AlpacaNewsStreamingApi => Environments.Paper.AlpacaTradingApi; } - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const String TradeUpdates = "trade_updates"; private const String Authorization = "authorization"; @@ -37,17 +36,13 @@ public sealed class AlpacaStreamingClientTest private const String Stock = "AAPL"; - public AlpacaStreamingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Theory] [ClassData(typeof(EnvironmentTestData))] public async Task ConnectAndSubscribeWorks(IEnvironment environment) { Assert.NotNull(environment); - using var client = _mockClientsFactory.GetAlpacaStreamingClientMock(environment, + using var client = mockClientsFactory.GetAlpacaStreamingClientMock(environment, environment.GetAlpacaStreamingClientConfiguration(new SecretKey( Guid.NewGuid().ToString("N"), Guid.NewGuid().ToString("N")))); @@ -101,7 +96,7 @@ public async Task ErrorsAndWarningWorks() const Int32 expectedWarnings = 3; const Int32 expectedErrors = 2; - using var client = _mockClientsFactory.GetAlpacaStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaStreamingClientMock(); using var tracker = new ErrorsAndWarningsTracker( client.Client, expectedWarnings, expectedErrors); @@ -134,7 +129,7 @@ public async Task RecursiveErrorsWorks() const Int32 expectedWarnings = 1; const Int32 expectedErrors = 1; - using var client = _mockClientsFactory.GetAlpacaStreamingClientMock(); + using var client = mockClientsFactory.GetAlpacaStreamingClientMock(); using var tracker = new ErrorsAndWarningsTracker( client.Client, expectedWarnings, expectedErrors); @@ -177,7 +172,7 @@ public async Task TopLevelExceptionsWorks() const Int32 expectedWarnings = 0; const Int32 expectedErrors = 1; - using var client = _mockClientsFactory.GetAlpacaStreamingClientMock(new FakeEnvironment()); + using var client = mockClientsFactory.GetAlpacaStreamingClientMock(new FakeEnvironment()); using var tracker = new ErrorsAndWarningsTracker( client.Client, expectedWarnings, expectedErrors); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index 32926b98..3e6c45b3 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -17,7 +17,7 @@ public async Task GetAccountAsyncWorks() const Int32 multiplier = 4; const UInt64 count = 2UL; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/account", new JObject( new JProperty("account_number", Guid.NewGuid().ToString("D")), @@ -100,7 +100,7 @@ public async Task ListAccountActivitiesAsyncWorks() const Decimal amount = 42M; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var orderId = Guid.NewGuid(); var activityGuid = Guid.NewGuid(); @@ -156,7 +156,7 @@ public async Task GetPortfolioHistoryAsyncWorks() const Decimal profitLoss = 10M; const Decimal equity = 20M; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var today = DateTime.UtcNow.Date; var todayDateOnly = DateOnly.FromDateTime(today); @@ -196,7 +196,7 @@ public async Task GetPortfolioHistoryAsyncWorks() [Fact] public async Task GetAccountConfigurationAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/account/configurations", createConfiguration()); @@ -208,7 +208,7 @@ public async Task GetAccountConfigurationAsyncWorks() [Fact] public async Task PatchAccountConfigurationAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/account/configurations", createConfiguration()); mock.AddPatch("/v2/account/configurations",createConfiguration()); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Actions.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Actions.cs index 25fa73ee..b6dc4838 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Actions.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Actions.cs @@ -7,7 +7,7 @@ public sealed partial class AlpacaTradingClientTest [Fact] public async Task ListAnnouncementsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var into = DateOnly.FromDateTime(DateTime.Today); var from = into.AddMonths(-1); @@ -47,7 +47,7 @@ public async Task ListAnnouncementsAsyncWorks() [Fact] public async Task GetAnnouncementAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/corporate_actions/announcements/**", createAnnouncement(DateOnly.FromDateTime(DateTime.Today))); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs index 838a7214..6c9afa05 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs @@ -7,7 +7,7 @@ public sealed partial class AlpacaTradingClientTest [Fact] public async Task GetAssetAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var assetId = Guid.NewGuid(); @@ -21,7 +21,7 @@ public async Task GetAssetAsyncWorks() [Fact] public async Task ListAssetsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var assetId = Guid.NewGuid(); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs index 34db66e9..ed9ccd47 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs @@ -13,7 +13,7 @@ public async Task ListOrdersAsyncWorks() { const Int64 pageSize = 100; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var date = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified); @@ -37,7 +37,7 @@ public async Task ListOrdersAsyncWorks() [Fact] public async Task GetOrderByClientOrderIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet($"{OrdersUrlPrefix}:by_client_order_id", createOrder()); @@ -49,7 +49,7 @@ public async Task GetOrderByClientOrderIdAsyncWorks() [Fact] public async Task GetOrderByServerOrderIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet(OrdersWildcardUrl, createOrder()); @@ -64,7 +64,7 @@ public async Task PostRawOrderAsyncWorks() const Decimal trailOffsetInDollars = 0.01M; const Decimal trailOffsetInPercent = 10M; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(OrdersUrlPrefix, createOrder()); @@ -90,7 +90,7 @@ public async Task PostRawOrderAsyncWorks() [Fact] public async Task PostBuyOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(OrdersUrlPrefix, createOrder()); @@ -106,7 +106,7 @@ public async Task PostBuyOrderAsyncWorks() [Fact] public async Task PostSellOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(OrdersUrlPrefix, createOrder()); @@ -120,7 +120,7 @@ public async Task PostSellOrderAsyncWorks() [Fact] public async Task PostTakeProfitOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(OrdersUrlPrefix, createOrder()); @@ -133,7 +133,7 @@ public async Task PostTakeProfitOrderAsyncWorks() [Fact] public async Task PostStopLossOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(OrdersUrlPrefix, createOrder()); @@ -146,7 +146,7 @@ public async Task PostStopLossOrderAsyncWorks() [Fact] public async Task NewOrderRequestValidationWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); await Assert.ThrowsAsync(() => mock.Client.PostOrderAsync( MarketOrder.Buy(String.Empty, OrderQuantity.Fractional(-FractionalQuantity)))); @@ -155,7 +155,7 @@ await Assert.ThrowsAsync(() => mock.Client.PostOrderAsync( [Fact] public async Task PatchOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPatch(OrdersWildcardUrl, createOrder()); @@ -174,7 +174,7 @@ public async Task PatchOrderAsyncWorks() [Fact] public async Task CancelOrderAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete(OrdersWildcardUrl, createOrder()); @@ -184,7 +184,7 @@ public async Task CancelOrderAsyncWorks() [Fact] public async Task CancelAllOrdersAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete(OrdersUrlPrefix, new JArray( new JObject( diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs index 06d54b47..b7988a68 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs @@ -19,7 +19,7 @@ public sealed partial class AlpacaTradingClientTest [Fact] public async Task ListPositionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/positions", new JArray(createPosition())); @@ -31,7 +31,7 @@ public async Task ListPositionsAsyncWorks() [Fact] public async Task GetPositionAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/positions/**", createPosition()); @@ -43,7 +43,7 @@ public async Task GetPositionAsyncWorks() [Fact] public async Task DeletePositionAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete("/v2/positions/**", createOrder()); @@ -59,7 +59,7 @@ public async Task DeletePositionAsyncWorks() [Fact] public async Task DeleteAllPositionsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete("/v2/positions", getDeletePositionsResponse()); @@ -78,7 +78,7 @@ public async Task DeleteAllPositionsAsyncWorks() [Fact] public async Task DeleteAllPositionsWithOrdersAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete("/v2/positions", getDeletePositionsResponse()); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs index 0f8900d0..21073b7b 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs @@ -11,7 +11,7 @@ public sealed partial class AlpacaTradingClientTest [Fact] public async Task ListWatchListsAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet(WatchlistsUrl, new JArray(createWatchList())); @@ -26,7 +26,7 @@ public async Task ListWatchListsAsyncWorks() [Fact] public async Task GetWatchListByIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet(WatchListsWildcardUrl, createWatchList()); @@ -38,7 +38,7 @@ public async Task GetWatchListByIdAsyncWorks() [Fact] public async Task GetWatchListByNameAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet(WatchlistsByNameUrl, createWatchList()); @@ -50,7 +50,7 @@ public async Task GetWatchListByNameAsyncWorks() [Fact] public async Task CreateWatchListAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(WatchlistsUrl, createWatchList()); @@ -63,7 +63,7 @@ public async Task CreateWatchListAsyncWorks() [Fact] public async Task UpdateWatchListByIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPut(WatchListsWildcardUrl, createWatchList()); @@ -76,7 +76,7 @@ public async Task UpdateWatchListByIdAsyncWorks() [Fact] public async Task AddAssetIntoWatchListByIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(WatchListsWildcardUrl, createWatchList()); @@ -89,7 +89,7 @@ public async Task AddAssetIntoWatchListByIdAsyncWorks() [Fact] public async Task AddAssetIntoWatchListByNameAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddPost(WatchlistsByNameUrl, createWatchList()); @@ -102,7 +102,7 @@ public async Task AddAssetIntoWatchListByNameAsyncWorks() [Fact] public async Task DeleteAssetFromWatchListByIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete(WatchListsWildcardUrl, createWatchList()); @@ -115,7 +115,7 @@ public async Task DeleteAssetFromWatchListByIdAsyncWorks() [Fact] public async Task DeleteAssetFromWatchListByNameAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete($"{WatchlistsByNameUrl}/**", createWatchList()); @@ -127,7 +127,7 @@ public async Task DeleteAssetFromWatchListByNameAsyncWorks() [Fact] public async Task DeleteWatchListByIdAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete(WatchListsWildcardUrl, createWatchList()); @@ -137,7 +137,7 @@ public async Task DeleteWatchListByIdAsyncWorks() [Fact] public async Task DeleteWatchListByNameAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddDelete(WatchlistsByNameUrl, createWatchList()); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs index bf2655fc..965fa60a 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs @@ -3,18 +3,13 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed partial class AlpacaTradingClientTest +public sealed partial class AlpacaTradingClientTest( + MockClientsFactoryFixture mockClientsFactory) { private const String Crypto = "BTCUSD"; private const String Stock = "AAPL"; - private readonly MockClientsFactoryFixture _mockClientsFactory; - - public AlpacaTradingClientTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public void AlpacaTradingClientConfigurationValidationWorks() { @@ -22,25 +17,25 @@ public void AlpacaTradingClientConfigurationValidationWorks() var nullSecurityId = new AlpacaTradingClientConfiguration { SecurityId = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullSecurityId)); + mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullSecurityId)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullApiEndpoint = new AlpacaTradingClientConfiguration { ApiEndpoint = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullApiEndpoint)); + mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullApiEndpoint)); #pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. var nullThrottleParameters = new AlpacaTradingClientConfiguration { ThrottleParameters = null }; #pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. Assert.Throws(() => - _mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullThrottleParameters)); + mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper, nullThrottleParameters)); } [Fact] public async Task ListIntervalCalendarAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(Environments.Paper); var today = DateOnly.FromDateTime(DateTime.Today); @@ -82,7 +77,7 @@ public async Task ListIntervalCalendarAsyncWorks() [Fact] public async Task GetClockAsyncWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet("/v2/clock", new JObject( new JProperty("next_close", DateTime.Today.AddDays(2)), @@ -102,7 +97,7 @@ public async Task GetClockAsyncWorks() [Fact] public async Task GetRateLimitValuesWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var oldLimits = mock.Client.GetRateLimitValues(); diff --git a/Alpaca.Markets.Tests/ThrottleParametersTest.cs b/Alpaca.Markets.Tests/ThrottleParametersTest.cs index cf6503b8..b2f9cc9b 100644 --- a/Alpaca.Markets.Tests/ThrottleParametersTest.cs +++ b/Alpaca.Markets.Tests/ThrottleParametersTest.cs @@ -4,10 +4,9 @@ namespace Alpaca.Markets.Tests; [Collection("MockEnvironment")] -public sealed class ThrottleParametersTest +public sealed class ThrottleParametersTest( + MockClientsFactoryFixture mockClientsFactory) { - private readonly MockClientsFactoryFixture _mockClientsFactory; - private const String OrdersUrl = "/v2/orders/**"; private const String ClockUrl = "/v2/clock"; @@ -16,10 +15,6 @@ public sealed class ThrottleParametersTest private const Int32 ErrorCode = 451; - public ThrottleParametersTest( - MockClientsFactoryFixture mockClientsFactory) => - _mockClientsFactory = mockClientsFactory; - [Fact] public async Task ThrottlingWithErrorMessageWorks() { @@ -27,7 +22,7 @@ public async Task ThrottlingWithErrorMessageWorks() const Decimal money = 1_000M; const Int32 orders = 10; - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var errorMessage = new JObject( new JProperty("day_trading_buying_power", money), @@ -74,7 +69,7 @@ KeyValuePair AsHeader( [Fact] public async Task ThrottlingWithSocketErrorsWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); mock.AddGet(ClockUrl, AsException(SocketError.TryAgain)); mock.AddGet(ClockUrl, AsException(SocketError.TimedOut)); @@ -96,7 +91,7 @@ SocketException AsException( [Fact] public async Task ThrottlingWithoutErrorMessageWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); const String errorMessage = "HTTP 500: Unknown server error."; @@ -114,7 +109,7 @@ public async Task ThrottlingWithoutErrorMessageWorks() [Fact] public async Task ThrottlingWithInvalidErrorMessageWorks() { - using var mock = _mockClientsFactory.GetAlpacaTradingClientMock(); + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var errorMessage = new JObject( new JProperty("msg", Message), From 0d8ef0f9c48b1f9090aad0c6fbbdbfc852a39201 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 12:34:22 +0100 Subject: [PATCH 039/125] Issue #709 - The primary constructor usage in core library code. (cherry picked from commit 05e4ef72c6a36f20b63fb5923601c523364a09b0) --- .../AlpacaCryptoStreamingClientExtensions.cs | 16 +++----- .../AlpacaDataStreamingClientExtensions.cs | 16 +++----- .../AlpacaNewsStreamingClientExtensions.cs | 14 +++---- .../AlpacaStreamingClientExtensions.cs | 14 +++---- .../ClientWithSubscriptionReconnectBase.cs | 14 +++---- Alpaca.Markets/AlpacaCryptoDataClient.cs | 2 + Alpaca.Markets/AlpacaDataClient.cs | 2 + Alpaca.Markets/DataHistoricalClientBase.cs | 10 ++--- .../WebSocket/WebSocketTransport.cs | 37 +++++-------------- 9 files changed, 44 insertions(+), 81 deletions(-) diff --git a/Alpaca.Markets.Extensions/Reconnection/AlpacaCryptoStreamingClientExtensions.cs b/Alpaca.Markets.Extensions/Reconnection/AlpacaCryptoStreamingClientExtensions.cs index 95d7f51f..47dd1f39 100644 --- a/Alpaca.Markets.Extensions/Reconnection/AlpacaCryptoStreamingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Reconnection/AlpacaCryptoStreamingClientExtensions.cs @@ -6,18 +6,14 @@ /// public static partial class AlpacaCryptoStreamingClientExtensions { - private sealed class ClientWithReconnection : - ClientWithSubscriptionReconnectBase, + [method: ExcludeFromCodeCoverage] + private sealed class ClientWithReconnection( + IAlpacaCryptoStreamingClient client, + ReconnectionParameters reconnectionParameters) : + ClientWithSubscriptionReconnectBase( + client, reconnectionParameters), IAlpacaCryptoStreamingClient { - [ExcludeFromCodeCoverage] - public ClientWithReconnection( - IAlpacaCryptoStreamingClient client, - ReconnectionParameters reconnectionParameters) - : base(client, reconnectionParameters) - { - } - [ExcludeFromCodeCoverage] public IAlpacaDataSubscription GetTradeSubscription() => Client.GetTradeSubscription(); diff --git a/Alpaca.Markets.Extensions/Reconnection/AlpacaDataStreamingClientExtensions.cs b/Alpaca.Markets.Extensions/Reconnection/AlpacaDataStreamingClientExtensions.cs index dd268a2b..57b2e4e9 100644 --- a/Alpaca.Markets.Extensions/Reconnection/AlpacaDataStreamingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Reconnection/AlpacaDataStreamingClientExtensions.cs @@ -6,18 +6,14 @@ /// public static partial class AlpacaDataStreamingClientExtensions { - private sealed class ClientWithReconnection : - ClientWithSubscriptionReconnectBase, + [method: ExcludeFromCodeCoverage] + private sealed class ClientWithReconnection( + IAlpacaDataStreamingClient client, + ReconnectionParameters reconnectionParameters) : + ClientWithSubscriptionReconnectBase( + client, reconnectionParameters), IAlpacaDataStreamingClient { - [ExcludeFromCodeCoverage] - public ClientWithReconnection( - IAlpacaDataStreamingClient client, - ReconnectionParameters reconnectionParameters) - : base(client, reconnectionParameters) - { - } - [ExcludeFromCodeCoverage] public IAlpacaDataSubscription GetTradeSubscription() => Client.GetTradeSubscription(); diff --git a/Alpaca.Markets.Extensions/Reconnection/AlpacaNewsStreamingClientExtensions.cs b/Alpaca.Markets.Extensions/Reconnection/AlpacaNewsStreamingClientExtensions.cs index 65af2412..d7155c91 100644 --- a/Alpaca.Markets.Extensions/Reconnection/AlpacaNewsStreamingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Reconnection/AlpacaNewsStreamingClientExtensions.cs @@ -6,17 +6,13 @@ /// public static partial class AlpacaNewsStreamingClientExtensions { - private sealed class ClientWithReconnection : - ClientWithSubscriptionReconnectBase, + private sealed class ClientWithReconnection( + IAlpacaNewsStreamingClient client, + ReconnectionParameters reconnectionParameters) : + ClientWithSubscriptionReconnectBase( + client, reconnectionParameters), IAlpacaNewsStreamingClient { - public ClientWithReconnection( - IAlpacaNewsStreamingClient client, - ReconnectionParameters reconnectionParameters) - : base (client, reconnectionParameters) - { - } - [ExcludeFromCodeCoverage] public IAlpacaDataSubscription GetNewsSubscription() => Client.GetNewsSubscription(); diff --git a/Alpaca.Markets.Extensions/Reconnection/AlpacaStreamingClientExtensions.cs b/Alpaca.Markets.Extensions/Reconnection/AlpacaStreamingClientExtensions.cs index 5d3b74ff..53cab57a 100644 --- a/Alpaca.Markets.Extensions/Reconnection/AlpacaStreamingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Reconnection/AlpacaStreamingClientExtensions.cs @@ -6,17 +6,13 @@ /// public static class AlpacaStreamingClientExtensions { - private sealed class ClientWithReconnection : - ClientWithReconnectBase, + private sealed class ClientWithReconnection( + IAlpacaStreamingClient client, + ReconnectionParameters reconnectionParameters) : + ClientWithReconnectBase( + client, reconnectionParameters), IAlpacaStreamingClient { - public ClientWithReconnection( - IAlpacaStreamingClient client, - ReconnectionParameters reconnectionParameters) - : base(client, reconnectionParameters) - { - } - /// public event Action? OnTradeUpdate { diff --git a/Alpaca.Markets.Extensions/Reconnection/ClientWithSubscriptionReconnectBase.cs b/Alpaca.Markets.Extensions/Reconnection/ClientWithSubscriptionReconnectBase.cs index 7366c2aa..0bb279c3 100644 --- a/Alpaca.Markets.Extensions/Reconnection/ClientWithSubscriptionReconnectBase.cs +++ b/Alpaca.Markets.Extensions/Reconnection/ClientWithSubscriptionReconnectBase.cs @@ -2,20 +2,16 @@ namespace Alpaca.Markets.Extensions; -internal abstract class ClientWithSubscriptionReconnectBase : - ClientWithReconnectBase +internal abstract class ClientWithSubscriptionReconnectBase( + TClient client, + ReconnectionParameters reconnectionParameters) : + ClientWithReconnectBase( + client, reconnectionParameters) where TClient : class, IStreamingClient, ISubscriptionHandler { private readonly ConcurrentDictionary _subscriptions = new(StringComparer.Ordinal); - protected ClientWithSubscriptionReconnectBase( - TClient client, - ReconnectionParameters reconnectionParameters) - : base(client, reconnectionParameters) - { - } - public ValueTask SubscribeAsync( IAlpacaDataSubscription subscription) => SubscribeAsync(subscription, CancellationToken.None); diff --git a/Alpaca.Markets/AlpacaCryptoDataClient.cs b/Alpaca.Markets/AlpacaCryptoDataClient.cs index a5f3d8d3..d2826fa4 100644 --- a/Alpaca.Markets/AlpacaCryptoDataClient.cs +++ b/Alpaca.Markets/AlpacaCryptoDataClient.cs @@ -6,7 +6,9 @@ internal sealed class AlpacaCryptoDataClient : { internal AlpacaCryptoDataClient( AlpacaCryptoDataClientConfiguration configuration) +#pragma warning disable CA2000 : base(configuration.EnsureNotNull().GetConfiguredHttpClient()) +#pragma warning restore CA2000 { } diff --git a/Alpaca.Markets/AlpacaDataClient.cs b/Alpaca.Markets/AlpacaDataClient.cs index 6ec8c7c1..1d174db0 100644 --- a/Alpaca.Markets/AlpacaDataClient.cs +++ b/Alpaca.Markets/AlpacaDataClient.cs @@ -6,7 +6,9 @@ internal sealed class AlpacaDataClient : { internal AlpacaDataClient( AlpacaDataClientConfiguration configuration) +#pragma warning disable CA2000 : base(configuration.EnsureNotNull().GetConfiguredHttpClient()) +#pragma warning restore CA2000 { } diff --git a/Alpaca.Markets/DataHistoricalClientBase.cs b/Alpaca.Markets/DataHistoricalClientBase.cs index 48cfd176..2c814e76 100644 --- a/Alpaca.Markets/DataHistoricalClientBase.cs +++ b/Alpaca.Markets/DataHistoricalClientBase.cs @@ -1,7 +1,7 @@ namespace Alpaca.Markets; -internal abstract class DataHistoricalClientBase - : IRateLimitProvider, IDisposable +internal abstract class DataHistoricalClientBase(HttpClient httpClient) : IRateLimitProvider, IDisposable where THistoricalQuotesRequest : HistoricalRequestBase, Validation.IRequest where THistoricalTradesRequest : HistoricalRequestBase, Validation.IRequest where THistoricalBarsRequest : HistoricalRequestBase, Validation.IRequest @@ -9,11 +9,7 @@ internal abstract class DataHistoricalClientBase - HttpClient = httpClient; + protected readonly HttpClient HttpClient = httpClient; public void Dispose() { diff --git a/Alpaca.Markets/WebSocket/WebSocketTransport.cs b/Alpaca.Markets/WebSocket/WebSocketTransport.cs index 0a2bab69..ed95442d 100644 --- a/Alpaca.Markets/WebSocket/WebSocketTransport.cs +++ b/Alpaca.Markets/WebSocket/WebSocketTransport.cs @@ -5,7 +5,9 @@ namespace Alpaca.Markets; -internal sealed class WebSocketsTransport : IDisposable +internal sealed class WebSocketsTransport( + Func webSocketFactory, + Uri url) : IDisposable { private sealed class DuplexPipe : IDuplexPipe { @@ -19,7 +21,9 @@ private DuplexPipe(PipeReader reader, PipeWriter writer) public PipeWriter Output { get; } - public static DuplexPipePair CreateConnectionPair(PipeOptions inputOptions, PipeOptions outputOptions) + public static DuplexPipePair CreateConnectionPair( + PipeOptions inputOptions, + PipeOptions outputOptions) { var input = new Pipe(inputOptions); var output = new Pipe(outputOptions); @@ -31,27 +35,14 @@ public static DuplexPipePair CreateConnectionPair(PipeOptions inputOptions, Pipe } // This class exists to work around issues with value tuple on .NET Framework - public readonly struct DuplexPipePair - { - public IDuplexPipe Transport { get; } - public IDuplexPipe Application { get; } - - public DuplexPipePair(IDuplexPipe transport, IDuplexPipe application) - { - Transport = transport; - Application = application; - } - } + public readonly record struct DuplexPipePair( + IDuplexPipe Transport, IDuplexPipe Application); } private Task _running = Task.CompletedTask; private SpinLock _sendLock = new(false); - private readonly Func _webSocketFactory; - - private readonly Uri _resolvedUrl; - private volatile Boolean _aborted; private IDuplexPipe? _application; @@ -60,14 +51,6 @@ public DuplexPipePair(IDuplexPipe transport, IDuplexPipe application) private IWebSocket? _webSocket; - public WebSocketsTransport( - Func webSocketFactory, - Uri url) - { - _webSocketFactory = webSocketFactory; - _resolvedUrl = url; - } - public event Action? Opened; public event Action? Closed; @@ -86,7 +69,7 @@ public async Task StartAsync( { try { - _webSocket = _webSocketFactory(); + _webSocket = webSocketFactory(); if (_webSocket is null) { Error?.Invoke(new InvalidOperationException( @@ -103,7 +86,7 @@ public async Task StartAsync( _transport = pair.Transport; _application = pair.Application; - await _webSocket.ConnectAsync(_resolvedUrl, cancellationToken) + await _webSocket.ConnectAsync(url, cancellationToken) .ConfigureAwait(false); } catch (Exception ex) From cf8888ea469f5fd7141d4def6f87458517e549ce Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 12:43:16 +0100 Subject: [PATCH 040/125] Issue #709 - The collecton expression usage in unit testing code. (cherry picked from commit bce7f7d3712389d4268d7c2fceaa0ca910d2fc26) --- .../AlpacaCryptoStreamingClientTest.cs | 2 +- Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs | 2 +- .../AlpacaDataStreamingClientTest.cs | 2 +- .../AlpacaNewsStreamingClientTest.cs | 2 +- Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs | 6 +++--- Alpaca.Markets.Tests/AlpacaDataClientTest.cs | 2 +- Alpaca.Markets.Tests/HistoricalRequestTest.cs | 4 ++-- Alpaca.Markets.Tests/MockClientsFactory.cs | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs index 70ad2cc8..9bd9e7cc 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs @@ -4,7 +4,7 @@ namespace Alpaca.Markets.Extensions.Tests; public sealed class AlpacaCryptoStreamingClientTest { - private static readonly List _symbols = new() { Crypto, Other }; + private static readonly List _symbols = [ Crypto, Other ]; private const Int32 ExpectedNumberOfEventsForAllSymbols = 4; diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs index 7706a58f..1a4e3c8a 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataClientTest.cs @@ -6,7 +6,7 @@ public sealed partial class AlpacaDataClientTest( { private static readonly Interval _timeInterval = getTimeInterval(); - private static readonly String[] _symbols = { Stock, Other }; + private static readonly String[] _symbols = [ Stock, Other ]; private const Decimal Volume = 1_000M; diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.cs index fc3f7f54..4d139ff2 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.cs @@ -4,7 +4,7 @@ namespace Alpaca.Markets.Extensions.Tests; public sealed partial class AlpacaDataStreamingClientTest { - private static readonly List _symbols = new() { Stock, Other }; + private static readonly List _symbols = [ Stock, Other ]; private const Int32 ExpectedNumberOfEventsForAllSymbols = 4; diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs index b8ccf6d9..311c0a97 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs @@ -6,7 +6,7 @@ namespace Alpaca.Markets.Extensions.Tests; public sealed class AlpacaNewsStreamingClientTest { - private static readonly List _symbols = new() { Stock, Other }; + private static readonly List _symbols = [ Stock, Other ]; private const Int32 ExpectedNumberOfEventsForAllSymbols = 4; diff --git a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs index fd1930eb..18a8e656 100644 --- a/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaCryptoDataClientTest.cs @@ -6,10 +6,10 @@ public sealed partial class AlpacaCryptoDataClientTest( { private static readonly Interval _timeInterval = getTimeInterval(); - private static readonly String[] _symbols = { Crypto, Other }; + private static readonly String[] _symbols = [ Crypto, Other ]; private static readonly List _exchangesList = - new() { CryptoExchange.Ersx, CryptoExchange.Ftx }; + [ CryptoExchange.Ersx, CryptoExchange.Ftx ]; private const String PathPrefix = "/v1beta3/crypto/us"; @@ -17,7 +17,7 @@ public sealed partial class AlpacaCryptoDataClientTest( private static DateTime Today => _timeInterval.Into!.Value; - private static readonly String[] _symbol = { Crypto }; + private static readonly String[] _symbol = [ Crypto ]; private const String Crypto = "BTC/USD"; diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs index 6ad479b4..36221647 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs @@ -8,7 +8,7 @@ public sealed partial class AlpacaDataClientTest( private static DateTime Yesterday => _timeInterval.From!.Value; - private static readonly String[] _symbols = { Stock, Other }; + private static readonly String[] _symbols = [ Stock, Other ]; private static DateTime Today => _timeInterval.Into!.Value; diff --git a/Alpaca.Markets.Tests/HistoricalRequestTest.cs b/Alpaca.Markets.Tests/HistoricalRequestTest.cs index 0a595662..4a8cf9ef 100644 --- a/Alpaca.Markets.Tests/HistoricalRequestTest.cs +++ b/Alpaca.Markets.Tests/HistoricalRequestTest.cs @@ -5,9 +5,9 @@ namespace Alpaca.Markets.Tests; [SuppressMessage("ReSharper", "StringLiteralTypo")] public sealed class HistoricalRequestTest { - private static readonly String[] _crypto = { "ETHUSD", "BTCUSD" }; + private static readonly String[] _crypto = [ "ETHUSD", "BTCUSD" ]; - private static readonly String[] _stocks = { "AAPL", "MSFT" }; + private static readonly String[] _stocks = [ "AAPL", "MSFT" ]; private static readonly Interval _timeInterval = new(DateTime.Today.AddDays(-1), DateTime.Today); diff --git a/Alpaca.Markets.Tests/MockClientsFactory.cs b/Alpaca.Markets.Tests/MockClientsFactory.cs index 757ddf49..e52f515a 100644 --- a/Alpaca.Markets.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Tests/MockClientsFactory.cs @@ -56,8 +56,8 @@ public sealed class EnvironmentTestData : IEnumerable { public IEnumerator GetEnumerator() { - yield return new Object[] { Environments.Paper }; - yield return new Object[] { Environments.Live }; + yield return [ Environments.Paper ]; + yield return [ Environments.Live ]; } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); From f4eb64e21814dc6049a2094f2f3bd5710c6024da Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 29 Dec 2023 12:57:03 +0100 Subject: [PATCH 041/125] Issue #709 - The collecton expression usage in core library code. (cherry picked from commit 0a89162f75b096927159fa96ba9017032b07ed30) --- .../Reconnection/ReconnectionParameters.cs | 4 ++-- Alpaca.Markets/AlpacaStreamingClient.cs | 2 +- Alpaca.Markets/DataStreamingClientBase.cs | 2 +- Alpaca.Markets/Helpers/EnumExtensions.cs | 2 +- Alpaca.Markets/Helpers/TimeOnlyConverter.cs | 2 +- Alpaca.Markets/Messages/JsonAccountActivity.cs | 2 +- Alpaca.Markets/Messages/JsonActiveStocks.cs | 2 +- Alpaca.Markets/Messages/JsonAsset.cs | 2 +- Alpaca.Markets/Messages/JsonAuction.cs | 4 ++-- Alpaca.Markets/Messages/JsonAuctionsPage.cs | 2 +- Alpaca.Markets/Messages/JsonBarsPage.cs | 2 +- Alpaca.Markets/Messages/JsonCorrection.cs | 4 ++-- Alpaca.Markets/Messages/JsonHistoricalOrderBook.cs | 4 ++-- Alpaca.Markets/Messages/JsonHistoricalQuote.cs | 2 +- Alpaca.Markets/Messages/JsonHistoricalTrade.cs | 2 +- Alpaca.Markets/Messages/JsonListenRequest.cs | 2 +- Alpaca.Markets/Messages/JsonMarketMovers.cs | 4 ++-- Alpaca.Markets/Messages/JsonNewsArticle.cs | 4 ++-- Alpaca.Markets/Messages/JsonNewsPage.cs | 2 +- Alpaca.Markets/Messages/JsonPortfolioHistory.cs | 2 +- Alpaca.Markets/Messages/JsonQuotesPage.cs | 2 +- Alpaca.Markets/Messages/JsonRealTimeCryptoQuote.cs | 2 +- Alpaca.Markets/Messages/JsonRealTimeOrderBook.cs | 4 ++-- Alpaca.Markets/Messages/JsonRealTimeQuote.cs | 2 +- Alpaca.Markets/Messages/JsonRealTimeTrade.cs | 2 +- Alpaca.Markets/Messages/JsonTradesPage.cs | 2 +- Alpaca.Markets/Parameters/AccountActivitiesRequest.cs | 2 +- .../Parameters/AlpacaCryptoStreamingClientConfiguration.cs | 2 +- Alpaca.Markets/Parameters/AnnouncementsRequest.cs | 2 +- Alpaca.Markets/Parameters/AssetsRequest.cs | 2 +- Alpaca.Markets/Parameters/LatestOrderBooksRequest.cs | 2 +- Alpaca.Markets/Parameters/NewWatchListRequest.cs | 2 +- Alpaca.Markets/Parameters/UpdateWatchListRequest.cs | 2 +- Alpaca.Markets/Throttling/ThrottleParameters.cs | 4 ++-- UsageExamples/MeanReversionBrokerage.cs | 2 +- UsageExamples/MeanReversionWithCrypto.cs | 2 +- 36 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Alpaca.Markets.Extensions/Reconnection/ReconnectionParameters.cs b/Alpaca.Markets.Extensions/Reconnection/ReconnectionParameters.cs index 7f76ca41..a1ba7b1a 100644 --- a/Alpaca.Markets.Extensions/Reconnection/ReconnectionParameters.cs +++ b/Alpaca.Markets.Extensions/Reconnection/ReconnectionParameters.cs @@ -8,10 +8,10 @@ namespace Alpaca.Markets.Extensions; public sealed class ReconnectionParameters { private static readonly WebSocketError[] _defaultWebSocketErrorCodes = - { + [ WebSocketError.ConnectionClosedPrematurely, WebSocketError.NotAWebSocket - }; + ]; /// /// Gets or sets the maximum number of reconnection attempts in case of a connection closing. diff --git a/Alpaca.Markets/AlpacaStreamingClient.cs b/Alpaca.Markets/AlpacaStreamingClient.cs index 561ca020..1828749c 100644 --- a/Alpaca.Markets/AlpacaStreamingClient.cs +++ b/Alpaca.Markets/AlpacaStreamingClient.cs @@ -99,7 +99,7 @@ private async void handleAuthorization( Action = JsonAction.Listen, Data = new JsonListenRequest.JsonData { - Streams = new List { TradeUpdates } + Streams = [ TradeUpdates ] } }; diff --git a/Alpaca.Markets/DataStreamingClientBase.cs b/Alpaca.Markets/DataStreamingClientBase.cs index 7dab8094..c058f3ad 100644 --- a/Alpaca.Markets/DataStreamingClientBase.cs +++ b/Alpaca.Markets/DataStreamingClientBase.cs @@ -174,7 +174,7 @@ public void OnReceived( private const Int32 SubscriptionChunkSize = 100; // ReSharper disable once StaticMemberInGenericType - private static readonly Char[] _channelSeparator = { '.' }; + private static readonly Char[] _channelSeparator = [ '.' ]; // ReSharper disable once StaticMemberInGenericType private static readonly SortedSet _implicitChannels = new(StringComparer.Ordinal) diff --git a/Alpaca.Markets/Helpers/EnumExtensions.cs b/Alpaca.Markets/Helpers/EnumExtensions.cs index 9f2df662..b36fc1fb 100644 --- a/Alpaca.Markets/Helpers/EnumExtensions.cs +++ b/Alpaca.Markets/Helpers/EnumExtensions.cs @@ -2,7 +2,7 @@ internal static class EnumExtensions { - private static readonly Char[] _doubleQuotes = { '"' }; + private static readonly Char[] _doubleQuotes = [ '"' ]; public static String ToEnumString( this T enumValue) diff --git a/Alpaca.Markets/Helpers/TimeOnlyConverter.cs b/Alpaca.Markets/Helpers/TimeOnlyConverter.cs index ac0d74b6..44fec506 100644 --- a/Alpaca.Markets/Helpers/TimeOnlyConverter.cs +++ b/Alpaca.Markets/Helpers/TimeOnlyConverter.cs @@ -7,7 +7,7 @@ namespace Alpaca.Markets; Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] internal sealed class TimeOnlyConverter : JsonConverter { - private static readonly String[] _timeFormats = { "HH:mm", "HHmm" }; + private static readonly String[] _timeFormats = [ "HH:mm", "HHmm" ]; public override void WriteJson( JsonWriter writer, diff --git a/Alpaca.Markets/Messages/JsonAccountActivity.cs b/Alpaca.Markets/Messages/JsonAccountActivity.cs index a29c0e58..90caea15 100644 --- a/Alpaca.Markets/Messages/JsonAccountActivity.cs +++ b/Alpaca.Markets/Messages/JsonAccountActivity.cs @@ -9,7 +9,7 @@ namespace Alpaca.Markets; internal sealed class JsonAccountActivity : IAccountActivity { [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private static readonly Char[] _activityIdSeparator = { ':' }; + private static readonly Char[] _activityIdSeparator = [ ':' ]; [JsonProperty(PropertyName = "activity_type", Required = Required.Always)] public AccountActivityType ActivityType { get; set; } diff --git a/Alpaca.Markets/Messages/JsonActiveStocks.cs b/Alpaca.Markets/Messages/JsonActiveStocks.cs index 2a36148c..9608a281 100644 --- a/Alpaca.Markets/Messages/JsonActiveStocks.cs +++ b/Alpaca.Markets/Messages/JsonActiveStocks.cs @@ -6,5 +6,5 @@ internal sealed class JsonActiveStocks { [JsonProperty(PropertyName = "most_actives", Required = Required.Always)] - public List MostActives { get; } = new(); + public List MostActives { get; } = []; } diff --git a/Alpaca.Markets/Messages/JsonAsset.cs b/Alpaca.Markets/Messages/JsonAsset.cs index 6efbbc58..1f9463c6 100644 --- a/Alpaca.Markets/Messages/JsonAsset.cs +++ b/Alpaca.Markets/Messages/JsonAsset.cs @@ -55,7 +55,7 @@ internal sealed class JsonAsset : IAsset public IReadOnlyList Attributes => AttributesList; [JsonProperty(PropertyName = "attributes", Required = Required.Default)] - internal List AttributesList { get; [ExcludeFromCodeCoverage] set; } = new(); + internal List AttributesList { get; [ExcludeFromCodeCoverage] set; } = []; [ExcludeFromCodeCoverage] public override String ToString() => diff --git a/Alpaca.Markets/Messages/JsonAuction.cs b/Alpaca.Markets/Messages/JsonAuction.cs index 6dd91793..113a1f84 100644 --- a/Alpaca.Markets/Messages/JsonAuction.cs +++ b/Alpaca.Markets/Messages/JsonAuction.cs @@ -13,12 +13,12 @@ internal sealed class JsonAuction : IAuction, ISymbolMutable [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "o", Required = Required.Always)] - internal List OpeningsList { get; set; } = new(); + internal List OpeningsList { get; set; } = []; [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "c", Required = Required.Always)] - internal List ClosingsList { get; set; } = new(); + internal List ClosingsList { get; set; } = []; [JsonIgnore] public String Symbol { get; private set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonAuctionsPage.cs b/Alpaca.Markets/Messages/JsonAuctionsPage.cs index 99a2cd9c..574a580d 100644 --- a/Alpaca.Markets/Messages/JsonAuctionsPage.cs +++ b/Alpaca.Markets/Messages/JsonAuctionsPage.cs @@ -5,7 +5,7 @@ internal sealed class JsonAuctionsPage : IPageMutable, ISymbolMutable { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "auctions", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "symbol", Required = Required.Always)] public String Symbol { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonBarsPage.cs b/Alpaca.Markets/Messages/JsonBarsPage.cs index a7e78c14..2ac9bf09 100644 --- a/Alpaca.Markets/Messages/JsonBarsPage.cs +++ b/Alpaca.Markets/Messages/JsonBarsPage.cs @@ -5,7 +5,7 @@ internal sealed class JsonBarsPage : IPageMutable, ISymbolMutable { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "bars", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "symbol", Required = Required.Always)] public String Symbol { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonCorrection.cs b/Alpaca.Markets/Messages/JsonCorrection.cs index 41634df6..b6850448 100644 --- a/Alpaca.Markets/Messages/JsonCorrection.cs +++ b/Alpaca.Markets/Messages/JsonCorrection.cs @@ -26,7 +26,7 @@ internal sealed class JsonCorrection : JsonRealTimeBase, ICorrection, ITrade [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "oc", Required = Required.Default)] - public List ConditionsList { get; } = new(); + public List ConditionsList { get; } = []; [JsonProperty(PropertyName = "ci", Required = Required.Default)] public UInt64 CorrectedTradeId { get; set; } @@ -39,7 +39,7 @@ internal sealed class JsonCorrection : JsonRealTimeBase, ICorrection, ITrade [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "cc", Required = Required.Default)] - public List CorrectedConditionsList { get; } = new(); + public List CorrectedConditionsList { get; } = []; [JsonProperty(PropertyName = "tks", Required = Required.Default)] public TakerSide TakerSide { get; set; } = TakerSide.Unknown; diff --git a/Alpaca.Markets/Messages/JsonHistoricalOrderBook.cs b/Alpaca.Markets/Messages/JsonHistoricalOrderBook.cs index f2873d11..22e4fdf5 100644 --- a/Alpaca.Markets/Messages/JsonHistoricalOrderBook.cs +++ b/Alpaca.Markets/Messages/JsonHistoricalOrderBook.cs @@ -12,12 +12,12 @@ internal sealed class JsonHistoricalOrderBook : IOrderBook, ISymbolMutable [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "b", Required = Required.Always)] - internal List BidsList { get; set; } = new(); + internal List BidsList { get; set; } = []; [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "a", Required = Required.Always)] - internal List AsksList { get; set; } = new(); + internal List AsksList { get; set; } = []; [JsonIgnore] public String Symbol { get; private set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonHistoricalQuote.cs b/Alpaca.Markets/Messages/JsonHistoricalQuote.cs index 8c5a4d42..89ae473b 100644 --- a/Alpaca.Markets/Messages/JsonHistoricalQuote.cs +++ b/Alpaca.Markets/Messages/JsonHistoricalQuote.cs @@ -26,7 +26,7 @@ internal sealed class JsonHistoricalQuote : IQuote, ISymbolMutable [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ConditionsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "z", Required = Required.Default)] public String Tape { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonHistoricalTrade.cs b/Alpaca.Markets/Messages/JsonHistoricalTrade.cs index 5cdfa2e6..79d8b409 100644 --- a/Alpaca.Markets/Messages/JsonHistoricalTrade.cs +++ b/Alpaca.Markets/Messages/JsonHistoricalTrade.cs @@ -26,7 +26,7 @@ internal sealed class JsonHistoricalTrade : ITrade, ISymbolMutable [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; } = new(); + public List ConditionsList { get; } = []; [JsonProperty(PropertyName = "tks", Required = Required.Default)] public TakerSide TakerSide { get; [ExcludeFromCodeCoverage] set; } = TakerSide.Unknown; diff --git a/Alpaca.Markets/Messages/JsonListenRequest.cs b/Alpaca.Markets/Messages/JsonListenRequest.cs index 6c65be5c..ad0153ca 100644 --- a/Alpaca.Markets/Messages/JsonListenRequest.cs +++ b/Alpaca.Markets/Messages/JsonListenRequest.cs @@ -5,7 +5,7 @@ internal sealed class JsonListenRequest internal sealed class JsonData { [JsonProperty(PropertyName = "streams", Required = Required.Always)] - public List Streams { get; set; } = new(); + public List Streams { get; set; } = []; } [JsonProperty(PropertyName = "action", Required = Required.Always)] diff --git a/Alpaca.Markets/Messages/JsonMarketMovers.cs b/Alpaca.Markets/Messages/JsonMarketMovers.cs index 30796876..aba2f0b8 100644 --- a/Alpaca.Markets/Messages/JsonMarketMovers.cs +++ b/Alpaca.Markets/Messages/JsonMarketMovers.cs @@ -7,10 +7,10 @@ internal sealed class JsonMarketMovers : IMarketMovers { [JsonProperty(PropertyName = "losers", Required = Required.Always)] - public List LosersList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List LosersList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "gainers", Required = Required.Always)] - public List GainersList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List GainersList { get; [ExcludeFromCodeCoverage] set; } = []; public IReadOnlyList Losers => LosersList.EmptyIfNull(); diff --git a/Alpaca.Markets/Messages/JsonNewsArticle.cs b/Alpaca.Markets/Messages/JsonNewsArticle.cs index a402abc5..0bd017db 100644 --- a/Alpaca.Markets/Messages/JsonNewsArticle.cs +++ b/Alpaca.Markets/Messages/JsonNewsArticle.cs @@ -45,10 +45,10 @@ public sealed class Image public String Source { get; set; } = String.Empty; [JsonProperty(PropertyName = "symbols", Required = Required.Always)] - public List SymbolsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List SymbolsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "images", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)] - public List Images { get; [ExcludeFromCodeCoverage] set; } = new(); + public List Images { get; [ExcludeFromCodeCoverage] set; } = []; [JsonIgnore] public IReadOnlyList Symbols => SymbolsList.EmptyIfNull(); diff --git a/Alpaca.Markets/Messages/JsonNewsPage.cs b/Alpaca.Markets/Messages/JsonNewsPage.cs index 47677b94..125e7ee5 100644 --- a/Alpaca.Markets/Messages/JsonNewsPage.cs +++ b/Alpaca.Markets/Messages/JsonNewsPage.cs @@ -8,7 +8,7 @@ internal sealed class JsonNewsPage : IPage { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "news", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] public String? NextPageToken { get; [ExcludeFromCodeCoverage] set; } diff --git a/Alpaca.Markets/Messages/JsonPortfolioHistory.cs b/Alpaca.Markets/Messages/JsonPortfolioHistory.cs index 9ded2e63..bbd69a72 100644 --- a/Alpaca.Markets/Messages/JsonPortfolioHistory.cs +++ b/Alpaca.Markets/Messages/JsonPortfolioHistory.cs @@ -24,7 +24,7 @@ private sealed class Item : IPortfolioHistoryItem $"{nameof(IPortfolioHistoryItem)} {{ Time = {TimestampUtc:O}, Equity = {Equity}, ProfitLoss = {ProfitLoss} }}"; } - private readonly List _items = new(); + private readonly List _items = []; [JsonProperty(PropertyName = "equity", Required = Required.Always)] public List? EquityList { get; set; } diff --git a/Alpaca.Markets/Messages/JsonQuotesPage.cs b/Alpaca.Markets/Messages/JsonQuotesPage.cs index 271b9175..e58b2a3f 100644 --- a/Alpaca.Markets/Messages/JsonQuotesPage.cs +++ b/Alpaca.Markets/Messages/JsonQuotesPage.cs @@ -6,7 +6,7 @@ internal sealed class JsonQuotesPage : IPageMutable, ISymbolMuta { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "quotes", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "symbol", Required = Required.Always)] public String Symbol { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonRealTimeCryptoQuote.cs b/Alpaca.Markets/Messages/JsonRealTimeCryptoQuote.cs index 80cd6e79..16a4f86d 100644 --- a/Alpaca.Markets/Messages/JsonRealTimeCryptoQuote.cs +++ b/Alpaca.Markets/Messages/JsonRealTimeCryptoQuote.cs @@ -22,7 +22,7 @@ internal sealed class JsonRealTimeCryptoQuote : JsonRealTimeBase, IQuote public Decimal AskSize { get; set; } [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; } = new(); + public List ConditionsList { get; } = []; [JsonProperty(PropertyName = "z", Required = Required.Default)] public String Tape { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonRealTimeOrderBook.cs b/Alpaca.Markets/Messages/JsonRealTimeOrderBook.cs index 2115b5bc..6a6f2b93 100644 --- a/Alpaca.Markets/Messages/JsonRealTimeOrderBook.cs +++ b/Alpaca.Markets/Messages/JsonRealTimeOrderBook.cs @@ -12,12 +12,12 @@ internal sealed class JsonRealTimeOrderBook : JsonRealTimeBase, IOrderBook [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "b", Required = Required.Always)] - internal List BidsList { get; set; } = new(); + internal List BidsList { get; set; } = []; [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "a", Required = Required.Always)] - internal List AsksList { get; set; } = new(); + internal List AsksList { get; set; } = []; [JsonProperty(PropertyName = "r", Required = Required.Default)] public Boolean IsReset { get; set; } diff --git a/Alpaca.Markets/Messages/JsonRealTimeQuote.cs b/Alpaca.Markets/Messages/JsonRealTimeQuote.cs index 3a41d546..344c2482 100644 --- a/Alpaca.Markets/Messages/JsonRealTimeQuote.cs +++ b/Alpaca.Markets/Messages/JsonRealTimeQuote.cs @@ -25,7 +25,7 @@ internal sealed class JsonRealTimeQuote : JsonRealTimeBase, IQuote public Decimal AskSize { get; set; } [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; } = new(); + public List ConditionsList { get; } = []; [JsonProperty(PropertyName = "z", Required = Required.Default)] public String Tape { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Messages/JsonRealTimeTrade.cs b/Alpaca.Markets/Messages/JsonRealTimeTrade.cs index cb2ee666..000bc981 100644 --- a/Alpaca.Markets/Messages/JsonRealTimeTrade.cs +++ b/Alpaca.Markets/Messages/JsonRealTimeTrade.cs @@ -22,7 +22,7 @@ internal sealed class JsonRealTimeTrade : JsonRealTimeBase, ITrade public Decimal Size { get; set; } [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; set; } = new(); + public List ConditionsList { get; set; } = []; [JsonProperty(PropertyName = "tks", Required = Required.Default)] public TakerSide TakerSide { get; set; } = TakerSide.Unknown; diff --git a/Alpaca.Markets/Messages/JsonTradesPage.cs b/Alpaca.Markets/Messages/JsonTradesPage.cs index aa36b474..c8d4ff09 100644 --- a/Alpaca.Markets/Messages/JsonTradesPage.cs +++ b/Alpaca.Markets/Messages/JsonTradesPage.cs @@ -5,7 +5,7 @@ internal sealed class JsonTradesPage : IPageMutable, ISymbolMutable { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "trades", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "symbol", Required = Required.Always)] public String Symbol { get; set; } = String.Empty; diff --git a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs index dd356a5b..13b64e04 100644 --- a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs +++ b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs @@ -5,7 +5,7 @@ /// public sealed class AccountActivitiesRequest { - private readonly HashSet _accountActivityTypes = new(); + private readonly HashSet _accountActivityTypes = []; /// /// Creates new instance of object for all activity types. diff --git a/Alpaca.Markets/Parameters/AlpacaCryptoStreamingClientConfiguration.cs b/Alpaca.Markets/Parameters/AlpacaCryptoStreamingClientConfiguration.cs index a4426e39..71242616 100644 --- a/Alpaca.Markets/Parameters/AlpacaCryptoStreamingClientConfiguration.cs +++ b/Alpaca.Markets/Parameters/AlpacaCryptoStreamingClientConfiguration.cs @@ -5,7 +5,7 @@ /// public sealed class AlpacaCryptoStreamingClientConfiguration : StreamingClientConfiguration { - private readonly HashSet _exchanges = new(); + private readonly HashSet _exchanges = []; /// /// Creates new instance of class. diff --git a/Alpaca.Markets/Parameters/AnnouncementsRequest.cs b/Alpaca.Markets/Parameters/AnnouncementsRequest.cs index 2280fde9..1db414c5 100644 --- a/Alpaca.Markets/Parameters/AnnouncementsRequest.cs +++ b/Alpaca.Markets/Parameters/AnnouncementsRequest.cs @@ -5,7 +5,7 @@ /// public sealed class AnnouncementsRequest : Validation.IRequest { - private readonly HashSet _corporateActionTypes = new(); + private readonly HashSet _corporateActionTypes = []; /// /// Creates new instance of object. diff --git a/Alpaca.Markets/Parameters/AssetsRequest.cs b/Alpaca.Markets/Parameters/AssetsRequest.cs index f406cf19..3d14e9ef 100644 --- a/Alpaca.Markets/Parameters/AssetsRequest.cs +++ b/Alpaca.Markets/Parameters/AssetsRequest.cs @@ -5,7 +5,7 @@ /// public sealed class AssetsRequest { - private readonly HashSet _attributes = new(); + private readonly HashSet _attributes = []; /// /// Gets or sets asset status for filtering. diff --git a/Alpaca.Markets/Parameters/LatestOrderBooksRequest.cs b/Alpaca.Markets/Parameters/LatestOrderBooksRequest.cs index 170203ac..e1c6708f 100644 --- a/Alpaca.Markets/Parameters/LatestOrderBooksRequest.cs +++ b/Alpaca.Markets/Parameters/LatestOrderBooksRequest.cs @@ -7,7 +7,7 @@ public sealed class LatestOrderBooksRequest : Validation.IRequest { private readonly HashSet _symbols = new(StringComparer.Ordinal); - private readonly HashSet _exchanges = new(); + private readonly HashSet _exchanges = []; /// /// Creates new instance of object. diff --git a/Alpaca.Markets/Parameters/NewWatchListRequest.cs b/Alpaca.Markets/Parameters/NewWatchListRequest.cs index 79108647..98f352e8 100644 --- a/Alpaca.Markets/Parameters/NewWatchListRequest.cs +++ b/Alpaca.Markets/Parameters/NewWatchListRequest.cs @@ -5,7 +5,7 @@ /// public sealed class NewWatchListRequest : Validation.IRequest { - private readonly List _assets = new(); + private readonly List _assets = []; /// /// Creates new instance of object. diff --git a/Alpaca.Markets/Parameters/UpdateWatchListRequest.cs b/Alpaca.Markets/Parameters/UpdateWatchListRequest.cs index 4d048430..7089bccc 100644 --- a/Alpaca.Markets/Parameters/UpdateWatchListRequest.cs +++ b/Alpaca.Markets/Parameters/UpdateWatchListRequest.cs @@ -5,7 +5,7 @@ /// public sealed class UpdateWatchListRequest : Validation.IRequest { - private readonly List _assets = new(); + private readonly List _assets = []; /// /// Creates new instance of object. diff --git a/Alpaca.Markets/Throttling/ThrottleParameters.cs b/Alpaca.Markets/Throttling/ThrottleParameters.cs index d8364633..825fe5c5 100644 --- a/Alpaca.Markets/Throttling/ThrottleParameters.cs +++ b/Alpaca.Markets/Throttling/ThrottleParameters.cs @@ -92,13 +92,13 @@ value is TimeSpan requestSpecificTimeoutValue }; private static readonly SocketError[] _defaultSocketErrorCodes = - { + [ SocketError.TryAgain, SocketError.TimedOut, SocketError.WouldBlock, SocketError.NotConnected, SocketError.HostNotFound - }; + ]; private readonly HashSet _retryHttpStatuses; diff --git a/UsageExamples/MeanReversionBrokerage.cs b/UsageExamples/MeanReversionBrokerage.cs index 26d35364..c6cdad35 100644 --- a/UsageExamples/MeanReversionBrokerage.cs +++ b/UsageExamples/MeanReversionBrokerage.cs @@ -34,7 +34,7 @@ internal sealed class MeanReversionBrokerage : IDisposable private Boolean lastTradeOpen; - private readonly List closingPrices = new(); + private readonly List closingPrices = []; private Boolean isAssetShortable; diff --git a/UsageExamples/MeanReversionWithCrypto.cs b/UsageExamples/MeanReversionWithCrypto.cs index 075ad35b..a84cc020 100644 --- a/UsageExamples/MeanReversionWithCrypto.cs +++ b/UsageExamples/MeanReversionWithCrypto.cs @@ -34,7 +34,7 @@ internal sealed class MeanReversionWithCrypto : IDisposable private Boolean lastTradeOpen; - private readonly List closingPrices = new(); + private readonly List closingPrices = []; private Boolean isAssetShortable; From 982aef689d298c68a086b369e9275e612ff2dd06 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 30 Dec 2023 05:19:22 +0100 Subject: [PATCH 042/125] Don't spend time on artifact creation if they will not be used. (cherry picked from commit fa7e69487ded9ad43014e563331f3261cad6df26) --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 89761fef..16ef576f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,6 +38,7 @@ jobs: - name: Save SDK Packages uses: actions/upload-artifact@v4 + if: github.repository == 'alpacahq/alpaca-trade-api-csharp' && startsWith(github.ref, 'refs/tags/sdk') with: retention-days: 1 compression-level: 0 @@ -48,6 +49,7 @@ jobs: - name: Save Extensions Packages uses: actions/upload-artifact@v4 + if: github.repository == 'alpacahq/alpaca-trade-api-csharp' && startsWith(github.ref, 'refs/tags/ext') with: retention-days: 1 compression-level: 0 From 848ea1f183d0fa7895cba5aca267e84194b2aa5a Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 30 Dec 2023 06:11:49 +0100 Subject: [PATCH 043/125] Issue #709 - The C# 12 issues in the obsolete code. --- Alpaca.Markets/Obsolete/ITimeInterval.cs | 4 ++-- Alpaca.Markets/Obsolete/LatestBestBidOfferListRequest.cs | 2 +- Alpaca.Markets/Obsolete/LatestBestBidOfferRequest.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Alpaca.Markets/Obsolete/ITimeInterval.cs b/Alpaca.Markets/Obsolete/ITimeInterval.cs index 1e427427..06c1012f 100644 --- a/Alpaca.Markets/Obsolete/ITimeInterval.cs +++ b/Alpaca.Markets/Obsolete/ITimeInterval.cs @@ -21,10 +21,10 @@ public interface ITimeInterval /// Represents the inclusive version of the interface. /// [Obsolete("Use the Interval structure instead of this interface.", true)] -public interface IInclusiveTimeInterval : ITimeInterval, IEquatable { } +public interface IInclusiveTimeInterval : ITimeInterval, IEquatable; /// /// Represents the exclusive version of the interface. /// [Obsolete("Use the Interval structure instead of this interface.", true)] -public interface IExclusiveTimeInterval : ITimeInterval, IEquatable { } +public interface IExclusiveTimeInterval : ITimeInterval, IEquatable; diff --git a/Alpaca.Markets/Obsolete/LatestBestBidOfferListRequest.cs b/Alpaca.Markets/Obsolete/LatestBestBidOfferListRequest.cs index 341204a6..daa3e359 100644 --- a/Alpaca.Markets/Obsolete/LatestBestBidOfferListRequest.cs +++ b/Alpaca.Markets/Obsolete/LatestBestBidOfferListRequest.cs @@ -9,7 +9,7 @@ public sealed class LatestBestBidOfferListRequest : Validation.IRequest { private readonly HashSet _symbols = new(StringComparer.Ordinal); - private readonly HashSet _exchanges = new(); + private readonly HashSet _exchanges = []; /// /// Creates new instance of object. diff --git a/Alpaca.Markets/Obsolete/LatestBestBidOfferRequest.cs b/Alpaca.Markets/Obsolete/LatestBestBidOfferRequest.cs index cbdb40fa..a637957b 100644 --- a/Alpaca.Markets/Obsolete/LatestBestBidOfferRequest.cs +++ b/Alpaca.Markets/Obsolete/LatestBestBidOfferRequest.cs @@ -7,7 +7,7 @@ [Obsolete("This class will be removed in the next major release of SDK.", true)] public sealed class LatestBestBidOfferRequest : Validation.IRequest { - private readonly HashSet _exchanges = new(); + private readonly HashSet _exchanges = []; /// /// Creates new instance of object. From 79be869c41e4b9ae295e92e16caed8068bff35b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jan 2024 08:18:47 +0100 Subject: [PATCH 044/125] Bump xunit from 2.6.4 to 2.6.5 (#711) Bumps [xunit](https://github.com/xunit/xunit) from 2.6.4 to 2.6.5. - [Commits](https://github.com/xunit/xunit/compare/2.6.4...2.6.5) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 63e56cad0250118b6539973631e0b6161ab821c9) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index fd4f83ce..b6976f6c 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index efa2d690..aa2c94f8 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 934c7f3621b8ffb46f0d7a391bb555e1f21c0a2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jan 2024 08:30:44 +0100 Subject: [PATCH 045/125] Bump Polly from 8.2.0 to 8.2.1 (#710) * Bump Polly from 8.2.0 to 8.2.1 Bumps [Polly](https://github.com/App-vNext/Polly) from 8.2.0 to 8.2.1. - [Release notes](https://github.com/App-vNext/Polly/releases) - [Changelog](https://github.com/App-vNext/Polly/blob/main/CHANGELOG.md) - [Commits](https://github.com/App-vNext/Polly/compare/8.2.0...8.2.1) --- updated-dependencies: - dependency-name: Polly dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] (cherry picked from commit 4dc89a542a936a9547919d71a4172e966a9263c9) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 48 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index b6976f6c..057fc311 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 60dc78f2..78552888 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -114,7 +114,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index e53af964..98fbfb72 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.0, )", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Portable.System.DateTimeOnly": { @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.0, )", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.0, )", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.0, )", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.2.1" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.2.1", + "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 4eed20fa..85a9be84 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,7 +24,7 @@ - + From 29c4201e89b19a394cd0d803e3e05d4c06501d11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jan 2024 08:35:07 +0100 Subject: [PATCH 046/125] Bump Microsoft.Extensions.Http.Polly from 8.0.0 to 8.0.1 (#712) Bumps [Microsoft.Extensions.Http.Polly](https://github.com/dotnet/aspnetcore) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md) - [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.0...v8.0.1) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http.Polly dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit d5caf93f470e813364fa430dba9c4c3149438fc5) --- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index aa2c94f8..44c33914 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,7 +13,7 @@ - + From 4dd8d836b26a194b817afa1c30824245507940a1 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 13 Jan 2024 10:58:48 +0100 Subject: [PATCH 047/125] Issue #714 - Added support for `options_enabled` asset attribute. (cherry picked from commit 5e6396820f3c413042438880b7f4dff0854fb833) --- Alpaca.Markets/Enums/AssetAttributes.cs | 9 ++++++++- Alpaca.Markets/PublicAPI.Shipped.txt | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Alpaca.Markets/Enums/AssetAttributes.cs b/Alpaca.Markets/Enums/AssetAttributes.cs index ecf391fa..a470177c 100644 --- a/Alpaca.Markets/Enums/AssetAttributes.cs +++ b/Alpaca.Markets/Enums/AssetAttributes.cs @@ -32,5 +32,12 @@ public enum AssetAttributes /// [UsedImplicitly] [EnumMember(Value = "ipo")] - Ipo + Ipo, + + /// + /// Asset supports options trading. + /// + [UsedImplicitly] + [EnumMember(Value = "options_enabled")] + OptionsEnabled } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 06c0f0d6..46f0662d 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -120,6 +120,7 @@ Alpaca.Markets.AnnouncementsRequest.Symbol.get -> string? Alpaca.Markets.AnnouncementsRequest.Symbol.set -> void Alpaca.Markets.AnnouncementsRequest.TimeInterval.get -> Alpaca.Markets.IInclusiveTimeInterval! Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.OptionsEnabled = 4 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpNoException = 1 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpWithException = 2 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.Ipo = 3 -> Alpaca.Markets.AssetAttributes From c63ca624cc30a3f50315f9521d6eb28ec0c507dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 06:11:09 +0100 Subject: [PATCH 048/125] Bump xunit from 2.6.5 to 2.6.6 (#715) Bumps [xunit](https://github.com/xunit/xunit) from 2.6.5 to 2.6.6. - [Commits](https://github.com/xunit/xunit/compare/2.6.5...2.6.6) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 363cf283cf6dc5c1b059e36871b9dd2edb9c8650) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 057fc311..5e1c98d7 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 44c33914..21b4ce4d 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 7d3ddf735e48473b31edc0f39f5714281c4c3ca6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Thu, 18 Jan 2024 06:14:04 +0100 Subject: [PATCH 049/125] Prepare release 7.0.1 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 78552888..d300288b 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,26 +12,18 @@ - 7.0.0.10 - 7.0.0.10 - 7.0.0 + 7.0.1.0 + 7.0.1.0 + 7.0.1 -- Added the new `IErrorInformation` interface and the `ErrorInformation` property into the `RestClientException` class. -- Added support for requesting the most active (by volume or trade count) stocks for the current trading session. -- Added support for requesting the top market movers (gainers and losers) for both stocks and crypto instruments. -- Added the new `Unknown` enumeration member into the `AssetAttributes` enumeration as fallback option. -- Added sorting support into all (quotes, trades, bars, etc.) stock/crypto historical data requests. -- Added the `IRateLimitProvider` interface implementation for all HTTP-based clients in SDK. -- The obsolete attribute was removed from historical crypto quotes requesting methods. -- Added the new `Ipo` enumeration member into the `AssetAttributes` enumeration. -- Fixed problem with announcement object deserialization. +- Added the new `OptionsEnabled` enumeration member into the `AssetAttributes` enumeration. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp - © 2018-2023 Alpaca Securities LLC. All rights reserved. + © 2018-2024 Alpaca Securities LLC. All rights reserved. false Aplaca API SDK REST WebSocket trading Apache-2.0 From 4e8da2798e8d1703a91bba4537713a7f97ce19ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:56:52 +0100 Subject: [PATCH 050/125] Bump actions/cache from 3 to 4 (#718) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 095c6ebf5d556485b55f340bd6a81c65880ecc44) --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/documentation.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9a4602e3..8c3a8d5a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -36,7 +36,7 @@ jobs: languages: ${{ matrix.language }} - name: Cache NuGet Packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b7a85c29..b0ee8f22 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -17,7 +17,7 @@ jobs: dotnet-version: '8.0.x' - name: Cache NuGet Packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 16ef576f..d47edb38 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: dotnet-version: '8.0.x' - name: Cache NuGet Packages - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} From 684a86dd06f95f94b2b940ce56ce14c2a4e20014 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 26 Jan 2024 06:41:03 +0100 Subject: [PATCH 051/125] Issue #719 - Added basic support for the US options trading: - Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties - Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. - Added the new 'AssetType.UsOption` enumeration member. - Added the new 'OptionTradingLevel` enumeration. --- .../AlpacaTradingClientTest.Account.cs | 5 + Alpaca.Markets.Tests/ConvertersTest.cs | 12 + Alpaca.Markets/Alpaca.Markets.csproj | 7 +- Alpaca.Markets/CompatibilitySuppressions.xml | 841 +----------------- Alpaca.Markets/Enums/AssetClass.cs | 11 +- Alpaca.Markets/Enums/OptionTradingLevel.cs | 25 + Alpaca.Markets/Interfaces/IAccount.cs | 13 + .../Interfaces/IAccountConfiguration.cs | 6 + Alpaca.Markets/Messages/JsonAccount.cs | 6 + .../Messages/JsonAccountConfiguration.cs | 3 + Alpaca.Markets/PublicAPI.Unshipped.txt | 8 + 11 files changed, 110 insertions(+), 827 deletions(-) create mode 100644 Alpaca.Markets/Enums/OptionTradingLevel.cs diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index 3e6c45b3..d5447027 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -21,6 +21,8 @@ public async Task GetAccountAsyncWorks() mock.AddGet("/v2/account", new JObject( new JProperty("account_number", Guid.NewGuid().ToString("D")), + new JProperty("option_approved_level", OptionTradingLevel.Disabled), + new JProperty("option_trading_level", OptionTradingLevel.Disabled), new JProperty("crypto_status", AccountStatus.Active), new JProperty("non_maginable_buying_power", Price), new JProperty("daytrading_buying_power", Price), @@ -74,6 +76,8 @@ public async Task GetAccountAsyncWorks() Assert.NotNull(account.NonMarginableBuyingPower); Assert.NotNull(account.DayTradingBuyingPower); Assert.NotNull(account.RegulationBuyingPower); + Assert.NotNull(account.OptionApprovedLevel); + Assert.NotNull(account.OptionTradingLevel); Assert.NotNull(account.ShortMarketValue); Assert.NotNull(account.LongMarketValue); Assert.NotNull(account.InitialMargin); @@ -222,6 +226,7 @@ public async Task PatchAccountConfigurationAsyncWorks() private static JObject createConfiguration() => new( // ReSharper disable once StringLiteralTypo + new JProperty("max_option_trading_level", OptionTradingLevel.LongCallPut), new JProperty("dtbp_check", DayTradeMarginCallProtection.Both), new JProperty("trade_confirm_email", TradeConfirmEmail.All), new JProperty("ptp_no_exception_entry", false), diff --git a/Alpaca.Markets.Tests/ConvertersTest.cs b/Alpaca.Markets.Tests/ConvertersTest.cs index 7fb45c8b..648b3f5b 100644 --- a/Alpaca.Markets.Tests/ConvertersTest.cs +++ b/Alpaca.Markets.Tests/ConvertersTest.cs @@ -42,4 +42,16 @@ public void CryptoExchangeEnumConverterWorks() Assert.NotEqual(original.Item, converted.Item); Assert.Equal(CryptoExchange.Unknown, converted.Item); } + + [Fact] + public void AssetAttributesEnumConverterWorks() + { + var original = new EnumWrapper { Item = (AssetAttributes)42 }; + var json = JsonConvert.SerializeObject(original) + .Replace("42", "\"VerySpecificAsset\""); + var converted = JsonConvert.DeserializeObject>(json); + + Assert.NotEqual(original.Item, converted.Item); + Assert.Equal(AssetAttributes.Unknown, converted.Item); + } } diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index d300288b..03f8a70d 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -19,7 +19,10 @@ -- Added the new `OptionsEnabled` enumeration member into the `AssetAttributes` enumeration. +- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties +- Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. +- Added the new 'AssetType.UsOption` enumeration member. +- Added the new 'OptionTradingLevel` enumeration. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp @@ -49,7 +52,7 @@ true - 6.2.4 + 7.0.0 true true AllEnabledByDefault diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index e5868f18..0d4275bb 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -2,775 +2,68 @@ - CP0001 - T:Alpaca.Markets.HistoricalCryptoRequestBase - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.MarkedDataFeed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.HistoricalCryptoRequestBase - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.MarkedDataFeed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.HistoricalCryptoRequestBase - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.MarkedDataFeed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.HistoricalCryptoRequestBase - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0001 - T:Alpaca.Markets.MarkedDataFeed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - F:Alpaca.Markets.CryptoExchange.Gnss - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalBarsRequest.get_Feed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalTradesRequest.get_Feed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestQuoteAsync(System.String,System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestTradeAsync(System.String,System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotAsync(System.String,System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestBarsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteAllOrdersAsync(System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteOrderAsync(System.Guid,System.Threading.CancellationToken) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.ILimitUpLimitDown.get_TimeUtc - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IStatus.get_TimeUtc - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataRequest.get_Feed - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.get_Exchange - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0002 - F:Alpaca.Markets.CryptoExchange.Gnss - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalBarsRequest.get_Feed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalTradesRequest.get_Feed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestQuoteAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestTradeAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestBarsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteAllOrdersAsync(System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteOrderAsync(System.Guid,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.ILimitUpLimitDown.get_TimeUtc - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IStatus.get_TimeUtc - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataRequest.get_Feed - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.get_Exchange - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0002 - F:Alpaca.Markets.CryptoExchange.Gnss - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalBarsRequest.get_Feed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalTradesRequest.get_Feed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestQuoteAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestTradeAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestBarsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteAllOrdersAsync(System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteOrderAsync(System.Guid,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.ILimitUpLimitDown.get_TimeUtc - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IStatus.get_TimeUtc - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataRequest.get_Feed - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.get_Exchange - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0002 - F:Alpaca.Markets.CryptoExchange.Gnss - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalBarsRequest.get_Feed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalQuotesRequest.get_Feed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.HistoricalTradesRequest.get_Feed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestQuoteAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetLatestTradeAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.GetSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestBarsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable{System.String},System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteAllOrdersAsync(System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IAlpacaTradingClient.DeleteOrderAsync(System.Guid,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.ILimitUpLimitDown.get_TimeUtc - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.IStatus.get_TimeUtc - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataListRequest.get_Feed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.LatestMarketDataRequest.get_Feed - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.#ctor(System.Collections.Generic.IEnumerable{System.String},Alpaca.Markets.CryptoExchange) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0002 - M:Alpaca.Markets.SnapshotDataListRequest.get_Exchange - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0007 - T:Alpaca.Markets.HistoricalCryptoBarsRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0007 - T:Alpaca.Markets.HistoricalCryptoQuotesRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0007 - T:Alpaca.Markets.HistoricalCryptoTradesRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0007 - T:Alpaca.Markets.HistoricalCryptoBarsRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionApprovedLevel lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoQuotesRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionTradingLevel lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoTradesRequest + CP0006 + P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoBarsRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionApprovedLevel lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoQuotesRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionTradingLevel lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoTradesRequest + CP0006 + P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoBarsRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionApprovedLevel lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoQuotesRequest + CP0006 + P:Alpaca.Markets.IAccount.OptionTradingLevel lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true - CP0007 - T:Alpaca.Markets.HistoricalCryptoTradesRequest + CP0006 + P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true - - CP0008 - T:Alpaca.Markets.AccountActivitiesRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.CalendarRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.PortfolioHistoryRequest - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.AccountActivitiesRequest - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.CalendarRequest - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.PortfolioHistoryRequest - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - CP0008 T:Alpaca.Markets.RequestValidationException @@ -783,102 +76,4 @@ lib/netstandard2.0/Alpaca.Markets.dll lib/net462/Alpaca.Markets.dll - - CP0008 - T:Alpaca.Markets.AccountActivitiesRequest - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.CalendarRequest - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.PortfolioHistoryRequest - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.AccountActivitiesRequest - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.CalendarRequest - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.PortfolioHistoryRequest - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpNoException - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpWithException - lib/net462/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpNoException - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpWithException - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpNoException - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpWithException - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpNoException - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0011 - F:Alpaca.Markets.AssetAttributes.PtpWithException - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - \ No newline at end of file diff --git a/Alpaca.Markets/Enums/AssetClass.cs b/Alpaca.Markets/Enums/AssetClass.cs index 9babd4e5..bcf62740 100644 --- a/Alpaca.Markets/Enums/AssetClass.cs +++ b/Alpaca.Markets/Enums/AssetClass.cs @@ -14,9 +14,16 @@ public enum AssetClass UsEquity, /// - /// Crypto currency asset class. + /// Cryptocurrency asset class. /// [UsedImplicitly] [EnumMember(Value = "crypto")] - Crypto + Crypto, + + /// + /// US option asset class. + /// + [UsedImplicitly] + [EnumMember(Value = "us_option")] + UsOption } diff --git a/Alpaca.Markets/Enums/OptionTradingLevel.cs b/Alpaca.Markets/Enums/OptionTradingLevel.cs new file mode 100644 index 00000000..aff7a729 --- /dev/null +++ b/Alpaca.Markets/Enums/OptionTradingLevel.cs @@ -0,0 +1,25 @@ +namespace Alpaca.Markets; + +/// +/// Options trading level for Alpaca REST API. +/// +public enum OptionTradingLevel +{ + /// + /// US options trading completely disabled. + /// + [UsedImplicitly] + Disabled = 0, + + /// + /// Us options trading with covered call / cash-secured put. + /// + [UsedImplicitly] + CoveredCallCashSecuredPut, + + /// + /// US options trading with long call and put support. + /// + [UsedImplicitly] + LongCallPut +} diff --git a/Alpaca.Markets/Interfaces/IAccount.cs b/Alpaca.Markets/Interfaces/IAccount.cs index eac63448..722aeef1 100644 --- a/Alpaca.Markets/Interfaces/IAccount.cs +++ b/Alpaca.Markets/Interfaces/IAccount.cs @@ -185,4 +185,17 @@ public interface IAccount /// [UsedImplicitly] Decimal? PendingTransferOut { get; } + + /// + /// Gets the effective option trading level of the account. This is the minimum between the + /// and the . + /// + [UsedImplicitly] + OptionTradingLevel? OptionTradingLevel { get; } + + /// + /// Gets the option trading level that was approved for this account. + /// + [UsedImplicitly] + OptionTradingLevel? OptionApprovedLevel { get; } } diff --git a/Alpaca.Markets/Interfaces/IAccountConfiguration.cs b/Alpaca.Markets/Interfaces/IAccountConfiguration.cs index d2d26f18..07163229 100644 --- a/Alpaca.Markets/Interfaces/IAccountConfiguration.cs +++ b/Alpaca.Markets/Interfaces/IAccountConfiguration.cs @@ -34,4 +34,10 @@ public interface IAccountConfiguration /// [UsedImplicitly] public Boolean IsPtpNoExceptionEntry { get; set; } + + /// + /// Gets the desired maximum option trading level. + /// + [UsedImplicitly] + OptionTradingLevel? MaxOptionTradingLevel { get; } } diff --git a/Alpaca.Markets/Messages/JsonAccount.cs b/Alpaca.Markets/Messages/JsonAccount.cs index e722a6b0..a59d1264 100644 --- a/Alpaca.Markets/Messages/JsonAccount.cs +++ b/Alpaca.Markets/Messages/JsonAccount.cs @@ -98,6 +98,12 @@ internal sealed class JsonAccount : IAccount [JsonProperty(PropertyName = "pending_transfer_out", Required = Required.Default)] public Decimal? PendingTransferOut { get; set; } + [JsonProperty(PropertyName = "option_trading_level", Required = Required.Default)] + public OptionTradingLevel? OptionTradingLevel { get; set; } + + [JsonProperty(PropertyName = "option_approved_level", Required = Required.Default)] + public OptionTradingLevel? OptionApprovedLevel { get; set; } + [OnDeserialized] [UsedImplicitly] internal void OnDeserializedMethod( diff --git a/Alpaca.Markets/Messages/JsonAccountConfiguration.cs b/Alpaca.Markets/Messages/JsonAccountConfiguration.cs index 6e0c38f6..360b3ad2 100644 --- a/Alpaca.Markets/Messages/JsonAccountConfiguration.cs +++ b/Alpaca.Markets/Messages/JsonAccountConfiguration.cs @@ -22,6 +22,9 @@ internal sealed class JsonAccountConfiguration : IAccountConfiguration [JsonProperty(PropertyName = "ptp_no_exception_entry", Required = Required.Default)] public Boolean IsPtpNoExceptionEntry { get; set; } + [JsonProperty(PropertyName = "max_option_trading_level", Required = Required.Default)] + public OptionTradingLevel? MaxOptionTradingLevel { get; set; } + [ExcludeFromCodeCoverage] public override String ToString() => JsonConvert.SerializeObject(this); diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index ab058de6..efacf404 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1 +1,9 @@ #nullable enable +Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass +Alpaca.Markets.IAccount.OptionApprovedLevel.get -> Alpaca.Markets.OptionTradingLevel? +Alpaca.Markets.IAccount.OptionTradingLevel.get -> Alpaca.Markets.OptionTradingLevel? +Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel.get -> Alpaca.Markets.OptionTradingLevel? +Alpaca.Markets.OptionTradingLevel +Alpaca.Markets.OptionTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionTradingLevel +Alpaca.Markets.OptionTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionTradingLevel +Alpaca.Markets.OptionTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionTradingLevel From ab1f33fb7bd510531eb0b5a97076a2b8c6f9730e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 20:08:59 +0100 Subject: [PATCH 052/125] Bump Microsoft.NET.Test.Sdk from 17.8.0 to 17.9.0 (#723) Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.8.0 to 17.9.0. - [Release notes](https://github.com/microsoft/vstest/releases) - [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md) - [Commits](https://github.com/microsoft/vstest/compare/v17.8.0...v17.9.0) --- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit f3917d21edaa176cfc558774793803b063e69765) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 5e1c98d7..c4dc701a 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 21b4ce4d..9d681c3a 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -14,7 +14,7 @@ - + From a4687d6932d29044f775875f62a53b9aea903906 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Feb 2024 20:17:25 +0100 Subject: [PATCH 053/125] Bump Polly from 8.2.1 to 8.3.0 (#722) * Bump Polly from 8.2.1 to 8.3.0 Bumps [Polly](https://github.com/App-vNext/Polly) from 8.2.1 to 8.3.0. - [Release notes](https://github.com/App-vNext/Polly/releases) - [Changelog](https://github.com/App-vNext/Polly/blob/main/CHANGELOG.md) - [Commits](https://github.com/App-vNext/Polly/compare/8.2.1...8.3.0) --- updated-dependencies: - dependency-name: Polly dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] (cherry picked from commit 76da4850d65c2090385cf2a8890505bfabdda3b9) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 48 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index c4dc701a..99e3557e 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 03f8a70d..1f96ba92 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -109,7 +109,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 98fbfb72..9af06966 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.1, )", - "resolved": "8.2.1", - "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "requested": "[8.3.0, )", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.1" + "Polly.Core": "8.3.0" } }, "Portable.System.DateTimeOnly": { @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.1", - "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.1, )", - "resolved": "8.2.1", - "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "requested": "[8.3.0, )", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.1" + "Polly.Core": "8.3.0" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.1", - "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.1, )", - "resolved": "8.2.1", - "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "requested": "[8.3.0, )", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.1" + "Polly.Core": "8.3.0" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.1", - "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.2.1, )", - "resolved": "8.2.1", - "contentHash": "tVHvP5Z0fNoZCE9mpKAsh0IaValwsTGPrqjlWqkWR/Gpl5jL05HWC/AVGSL+jkAqkl1Jn7uBUOArnRD+dK5PfQ==", + "requested": "[8.3.0, )", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.1" + "Polly.Core": "8.3.0" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.1", - "contentHash": "/Z3EspfWBdTla4I9IAcQn32/7kB5WS3rSnOYloz8YlVyClu8h7uuYf4pfUvffOYVbxmDX/mFRfxwzqW2Zs96ZA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 85a9be84..bcf31f5c 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,7 +24,7 @@ - + From 38001429b6ced8509295338a0e9d84e958edcee7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 08:22:31 +0100 Subject: [PATCH 054/125] Bump xunit.runner.visualstudio from 2.5.6 to 2.5.7 (#727) Bumps [xunit.runner.visualstudio](https://github.com/xunit/visualstudio.xunit) from 2.5.6 to 2.5.7. - [Release notes](https://github.com/xunit/visualstudio.xunit/releases) - [Commits](https://github.com/xunit/visualstudio.xunit/compare/2.5.6...2.5.7) --- updated-dependencies: - dependency-name: xunit.runner.visualstudio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 31957a959c2626e5ff6024a0befc333e97480c4f) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 99e3557e..0ef7038a 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -20,7 +20,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 9d681c3a..a5911228 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -18,7 +18,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From bfc2c00aa339198c8725f8d1cfd8636a01b807ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Feb 2024 08:32:39 +0100 Subject: [PATCH 055/125] Bump xunit from 2.6.6 to 2.7.0 (#726) Bumps [xunit](https://github.com/xunit/xunit) from 2.6.6 to 2.7.0. - [Commits](https://github.com/xunit/xunit/compare/2.6.6...2.7.0) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit ddce2e1b6f6dca35af1210846d57c4c07dcd4c7d) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 0ef7038a..401092ae 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index a5911228..822faf3c 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From ea73dabbeee39344dd4f97ff2dc284c768503feb Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 25 Feb 2024 11:10:29 +0100 Subject: [PATCH 056/125] Issue #719 - Bunch of renamings according to latest API specifications. --- .../AlpacaTradingClientTest.Account.cs | 12 +++--- Alpaca.Markets/CompatibilitySuppressions.xml | 39 ++++++++++++++----- ...TradingLevel.cs => OptionsTradingLevel.cs} | 2 +- Alpaca.Markets/Interfaces/IAccount.cs | 16 +++++--- .../Interfaces/IAccountConfiguration.cs | 4 +- Alpaca.Markets/Messages/JsonAccount.cs | 11 ++++-- .../Messages/JsonAccountConfiguration.cs | 4 +- Alpaca.Markets/PublicAPI.Unshipped.txt | 15 +++---- 8 files changed, 68 insertions(+), 35 deletions(-) rename Alpaca.Markets/Enums/{OptionTradingLevel.cs => OptionsTradingLevel.cs} (94%) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index d5447027..6e98d418 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -21,8 +21,8 @@ public async Task GetAccountAsyncWorks() mock.AddGet("/v2/account", new JObject( new JProperty("account_number", Guid.NewGuid().ToString("D")), - new JProperty("option_approved_level", OptionTradingLevel.Disabled), - new JProperty("option_trading_level", OptionTradingLevel.Disabled), + new JProperty("options_approved_level", OptionsTradingLevel.Disabled), + new JProperty("options_trading_level", OptionsTradingLevel.Disabled), new JProperty("crypto_status", AccountStatus.Active), new JProperty("non_maginable_buying_power", Price), new JProperty("daytrading_buying_power", Price), @@ -32,6 +32,7 @@ public async Task GetAccountAsyncWorks() new JProperty("trade_suspended_by_user", true), new JProperty("status", AccountStatus.Active), new JProperty("created_at", DateTime.UtcNow), + new JProperty("options_buying_power", cash), new JProperty("short_market_value", Price), new JProperty("maintenance_margin", Price), new JProperty("pattern_day_trader", false), @@ -64,6 +65,7 @@ public async Task GetAccountAsyncWorks() Assert.Equal(transfer, account.PendingTransferOut); Assert.Equal(transfer, account.PendingTransferIn); Assert.Equal(transfer, account.AccruedFees); + Assert.Equal(cash, account.OptionsBuyingPower); Assert.True(account.LastMaintenanceMargin != 0M); Assert.True(account.MaintenanceMargin != 0M); @@ -76,8 +78,8 @@ public async Task GetAccountAsyncWorks() Assert.NotNull(account.NonMarginableBuyingPower); Assert.NotNull(account.DayTradingBuyingPower); Assert.NotNull(account.RegulationBuyingPower); - Assert.NotNull(account.OptionApprovedLevel); - Assert.NotNull(account.OptionTradingLevel); + Assert.NotNull(account.OptionsApprovedLevel); + Assert.NotNull(account.OptionsTradingLevel); Assert.NotNull(account.ShortMarketValue); Assert.NotNull(account.LongMarketValue); Assert.NotNull(account.InitialMargin); @@ -226,7 +228,7 @@ public async Task PatchAccountConfigurationAsyncWorks() private static JObject createConfiguration() => new( // ReSharper disable once StringLiteralTypo - new JProperty("max_option_trading_level", OptionTradingLevel.LongCallPut), + new JProperty("max_option_trading_level", OptionsTradingLevel.LongCallPut), new JProperty("dtbp_check", DayTradeMarginCallProtection.Both), new JProperty("trade_confirm_email", TradeConfirmEmail.All), new JProperty("ptp_no_exception_entry", false), diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index 0d4275bb..473bf5c4 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -3,63 +3,84 @@ CP0006 - P:Alpaca.Markets.IAccount.OptionApprovedLevel + P:Alpaca.Markets.IAccount.OptionsApprovedLevel lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccount.OptionTradingLevel + P:Alpaca.Markets.IAccount.OptionsBuyingPower lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel + P:Alpaca.Markets.IAccount.OptionsTradingLevel lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccount.OptionApprovedLevel + P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0006 + P:Alpaca.Markets.IAccount.OptionsApprovedLevel + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0006 + P:Alpaca.Markets.IAccount.OptionsBuyingPower lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccount.OptionTradingLevel + P:Alpaca.Markets.IAccount.OptionsTradingLevel lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel + P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccount.OptionApprovedLevel + P:Alpaca.Markets.IAccount.OptionsApprovedLevel + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0006 + P:Alpaca.Markets.IAccount.OptionsBuyingPower lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccount.OptionTradingLevel + P:Alpaca.Markets.IAccount.OptionsTradingLevel lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel + P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true diff --git a/Alpaca.Markets/Enums/OptionTradingLevel.cs b/Alpaca.Markets/Enums/OptionsTradingLevel.cs similarity index 94% rename from Alpaca.Markets/Enums/OptionTradingLevel.cs rename to Alpaca.Markets/Enums/OptionsTradingLevel.cs index aff7a729..dec1ce0d 100644 --- a/Alpaca.Markets/Enums/OptionTradingLevel.cs +++ b/Alpaca.Markets/Enums/OptionsTradingLevel.cs @@ -3,7 +3,7 @@ /// /// Options trading level for Alpaca REST API. /// -public enum OptionTradingLevel +public enum OptionsTradingLevel { /// /// US options trading completely disabled. diff --git a/Alpaca.Markets/Interfaces/IAccount.cs b/Alpaca.Markets/Interfaces/IAccount.cs index 722aeef1..cae3c19d 100644 --- a/Alpaca.Markets/Interfaces/IAccount.cs +++ b/Alpaca.Markets/Interfaces/IAccount.cs @@ -187,15 +187,21 @@ public interface IAccount Decimal? PendingTransferOut { get; } /// - /// Gets the effective option trading level of the account. This is the minimum between the - /// and the . + /// Gets the effective options trading level of the account. This is the minimum between the + /// and the . /// [UsedImplicitly] - OptionTradingLevel? OptionTradingLevel { get; } + OptionsTradingLevel? OptionsTradingLevel { get; } /// - /// Gets the option trading level that was approved for this account. + /// Gets the options trading level that was approved for this account. /// [UsedImplicitly] - OptionTradingLevel? OptionApprovedLevel { get; } + OptionsTradingLevel? OptionsApprovedLevel { get; } + + /// + /// Gets the option buying power that was approved for this account. + /// + [UsedImplicitly] + Decimal? OptionsBuyingPower { get; } } diff --git a/Alpaca.Markets/Interfaces/IAccountConfiguration.cs b/Alpaca.Markets/Interfaces/IAccountConfiguration.cs index 07163229..e0ab99b5 100644 --- a/Alpaca.Markets/Interfaces/IAccountConfiguration.cs +++ b/Alpaca.Markets/Interfaces/IAccountConfiguration.cs @@ -36,8 +36,8 @@ public interface IAccountConfiguration public Boolean IsPtpNoExceptionEntry { get; set; } /// - /// Gets the desired maximum option trading level. + /// Gets the desired maximum options trading level. /// [UsedImplicitly] - OptionTradingLevel? MaxOptionTradingLevel { get; } + OptionsTradingLevel? MaxOptionsTradingLevel { get; } } diff --git a/Alpaca.Markets/Messages/JsonAccount.cs b/Alpaca.Markets/Messages/JsonAccount.cs index a59d1264..bf57a9b1 100644 --- a/Alpaca.Markets/Messages/JsonAccount.cs +++ b/Alpaca.Markets/Messages/JsonAccount.cs @@ -98,11 +98,14 @@ internal sealed class JsonAccount : IAccount [JsonProperty(PropertyName = "pending_transfer_out", Required = Required.Default)] public Decimal? PendingTransferOut { get; set; } - [JsonProperty(PropertyName = "option_trading_level", Required = Required.Default)] - public OptionTradingLevel? OptionTradingLevel { get; set; } + [JsonProperty(PropertyName = "options_trading_level", Required = Required.Default)] + public OptionsTradingLevel? OptionsTradingLevel { get; set; } - [JsonProperty(PropertyName = "option_approved_level", Required = Required.Default)] - public OptionTradingLevel? OptionApprovedLevel { get; set; } + [JsonProperty(PropertyName = "options_approved_level", Required = Required.Default)] + public OptionsTradingLevel? OptionsApprovedLevel { get; set; } + + [JsonProperty(PropertyName = "options_buying_power", Required = Required.Default)] + public Decimal? OptionsBuyingPower { get; set; } [OnDeserialized] [UsedImplicitly] diff --git a/Alpaca.Markets/Messages/JsonAccountConfiguration.cs b/Alpaca.Markets/Messages/JsonAccountConfiguration.cs index 360b3ad2..34643e2a 100644 --- a/Alpaca.Markets/Messages/JsonAccountConfiguration.cs +++ b/Alpaca.Markets/Messages/JsonAccountConfiguration.cs @@ -22,8 +22,8 @@ internal sealed class JsonAccountConfiguration : IAccountConfiguration [JsonProperty(PropertyName = "ptp_no_exception_entry", Required = Required.Default)] public Boolean IsPtpNoExceptionEntry { get; set; } - [JsonProperty(PropertyName = "max_option_trading_level", Required = Required.Default)] - public OptionTradingLevel? MaxOptionTradingLevel { get; set; } + [JsonProperty(PropertyName = "max_options_trading_level", Required = Required.Default)] + public OptionsTradingLevel? MaxOptionsTradingLevel { get; set; } [ExcludeFromCodeCoverage] public override String ToString() => diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index efacf404..c06bfa21 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,9 +1,10 @@ #nullable enable Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass -Alpaca.Markets.IAccount.OptionApprovedLevel.get -> Alpaca.Markets.OptionTradingLevel? -Alpaca.Markets.IAccount.OptionTradingLevel.get -> Alpaca.Markets.OptionTradingLevel? -Alpaca.Markets.IAccountConfiguration.MaxOptionTradingLevel.get -> Alpaca.Markets.OptionTradingLevel? -Alpaca.Markets.OptionTradingLevel -Alpaca.Markets.OptionTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionTradingLevel -Alpaca.Markets.OptionTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionTradingLevel -Alpaca.Markets.OptionTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionTradingLevel +Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? +Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionsTradingLevel From b24f8c03b5c1f1f91f8f509fc58ed8ddd22a5640 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 26 Feb 2024 13:11:43 +0100 Subject: [PATCH 057/125] Issue #719 - Added support for the options contract requesting: - Added the new `IOptionContract` interface and two related enums: `OptionType` and `OptionStyle`. - Added the new `IAlpacaTradingClient.ListOptionContractsAsync` method and related `OptionContractsRequest` class. - Added the new `IAlpacaTradingClient.GetOptionContractByidAsync` and `IAlpacaTradingClient.GetOptionContractBySymbolAsync` methods. --- Alpaca.Markets/AlpacaTradingClient.General.cs | 20 +++ Alpaca.Markets/CompatibilitySuppressions.xml | 63 ++++++++ Alpaca.Markets/Enums/OptionStyle.cs | 22 +++ Alpaca.Markets/Enums/OptionType.cs | 22 +++ .../Interfaces/IAlpacaTradingClient.cs | 76 +++++++++- Alpaca.Markets/Interfaces/IOptionContract.cs | 108 ++++++++++++++ Alpaca.Markets/Messages/JsonOptionContract.cs | 71 +++++++++ .../Messages/JsonOptionContractsPage.cs | 10 ++ .../Parameters/OptionContractsRequest.cs | 137 ++++++++++++++++++ Alpaca.Markets/PublicAPI.Unshipped.txt | 52 +++++++ .../WebSocket/StreamingClientBase.cs | 6 +- 11 files changed, 584 insertions(+), 3 deletions(-) create mode 100644 Alpaca.Markets/Enums/OptionStyle.cs create mode 100644 Alpaca.Markets/Enums/OptionType.cs create mode 100644 Alpaca.Markets/Interfaces/IOptionContract.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionContract.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionContractsPage.cs create mode 100644 Alpaca.Markets/Parameters/OptionContractsRequest.cs diff --git a/Alpaca.Markets/AlpacaTradingClient.General.cs b/Alpaca.Markets/AlpacaTradingClient.General.cs index b0a88d36..3138a3af 100644 --- a/Alpaca.Markets/AlpacaTradingClient.General.cs +++ b/Alpaca.Markets/AlpacaTradingClient.General.cs @@ -114,4 +114,24 @@ await _httpClient.GetAsync, List> await request.EnsureNotNull().Validate() .GetUriBuilderAsync(_httpClient).ConfigureAwait(false), _rateLimitHandler, cancellationToken).ConfigureAwait(false); + + public async Task> ListOptionContractsAsync( + OptionContractsRequest request, + CancellationToken cancellationToken = default) => + (await _httpClient.GetAsync( + await request.EnsureNotNull().Validate() + .GetUriBuilderAsync(_httpClient).ConfigureAwait(false), + _rateLimitHandler, cancellationToken).ConfigureAwait(false)).Contracts; + + public Task GetOptionContractByIdAsync( + Guid contractId, + CancellationToken cancellationToken = default) => + _httpClient.GetAsync( + $"v2/options/contracts/{contractId:D}", _rateLimitHandler, cancellationToken); + + public Task GetOptionContractBySymbolAsync( + String symbol, + CancellationToken cancellationToken = default) => + _httpClient.GetAsync( + $"v2/options/contracts/{symbol.EnsureNotNull()}", _rateLimitHandler, cancellationToken); } diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index 473bf5c4..461aeee6 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -1,6 +1,27 @@  + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + CP0006 P:Alpaca.Markets.IAccount.OptionsApprovedLevel @@ -29,6 +50,27 @@ lib/net6.0/Alpaca.Markets.dll true + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + CP0006 P:Alpaca.Markets.IAccount.OptionsApprovedLevel @@ -57,6 +99,27 @@ lib/netstandard2.0/Alpaca.Markets.dll true + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + CP0006 P:Alpaca.Markets.IAccount.OptionsApprovedLevel diff --git a/Alpaca.Markets/Enums/OptionStyle.cs b/Alpaca.Markets/Enums/OptionStyle.cs new file mode 100644 index 00000000..1d062c54 --- /dev/null +++ b/Alpaca.Markets/Enums/OptionStyle.cs @@ -0,0 +1,22 @@ +namespace Alpaca.Markets; + +/// +/// Supported option contract styles for Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum OptionStyle +{ + /// + /// American option contract execution style. + /// + [UsedImplicitly] + [EnumMember(Value = "american")] + American, + + /// + /// European option contract execution style. + /// + [UsedImplicitly] + [EnumMember(Value = "european")] + European +} diff --git a/Alpaca.Markets/Enums/OptionType.cs b/Alpaca.Markets/Enums/OptionType.cs new file mode 100644 index 00000000..acbb3cf6 --- /dev/null +++ b/Alpaca.Markets/Enums/OptionType.cs @@ -0,0 +1,22 @@ +namespace Alpaca.Markets; + +/// +/// Supported option contract types for Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum OptionType +{ + /// + /// Call option contract. + /// + [UsedImplicitly] + [EnumMember(Value = "call")] + Call, + + /// + /// Put option contract. + /// + [UsedImplicitly] + [EnumMember(Value = "put")] + Put +} diff --git a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs index b1798cc0..230fd3f0 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs @@ -26,7 +26,6 @@ public interface IAlpacaTradingClient : IRateLimitProvider, IDisposable [UsedImplicitly] Task> ListWatchListsAsync( CancellationToken cancellationToken = default); - /// /// Add new watch list object into Alpaca REST API endpoint. /// @@ -929,4 +928,79 @@ Task GetAnnouncementAsync( Task> ListAnnouncementsAsync( AnnouncementsRequest request, CancellationToken cancellationToken = default); + + /// + /// Gets list of active option contracts from Alpaca REST API endpoint. By default, only active contracts that expire before the upcoming weekend are returned. + /// + /// Option contracts request parameters. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only list of corporate action information objects. + [UsedImplicitly] + Task> ListOptionContractsAsync( + OptionContractsRequest request, + CancellationToken cancellationToken = default); + + /// + /// Gets option contract from Alpaca REST API endpoint using contract identifier. + /// + /// Option contract unique identifier. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// Read-only list of corporate action information objects. + [UsedImplicitly] + Task GetOptionContractByIdAsync( + Guid contractId, + CancellationToken cancellationToken = default); + + /// + /// Gets option contract from Alpaca REST API endpoint using contract symbol name. + /// + /// Option contract unique symbol name. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// Read-only list of corporate action information objects. + [UsedImplicitly] + Task GetOptionContractBySymbolAsync( + String symbol, + CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Interfaces/IOptionContract.cs b/Alpaca.Markets/Interfaces/IOptionContract.cs new file mode 100644 index 00000000..22967f74 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IOptionContract.cs @@ -0,0 +1,108 @@ +namespace Alpaca.Markets; + +/// +/// +/// +public interface IOptionContract +{ + /// + /// Gets unique option contract identifier used by Alpaca. + /// + [UsedImplicitly] + Guid ContractId { get; } + + /// + /// Get option contract symbol. + /// + String Symbol { get; } + + /// + /// Gets option contract name. + /// + [UsedImplicitly] + String Name { get; } + + /// + /// Get option contract status in API. + /// + [UsedImplicitly] + AssetStatus Status { get; } + + /// + /// Returns true if asset is tradable. + /// + [UsedImplicitly] + Boolean IsTradable { get; } + + /// + /// Get option contract size. + /// + [UsedImplicitly] + Decimal Size { get; } + + /// + /// Get option contract type. + /// + [UsedImplicitly] + OptionType OptionType { get; } + + /// + /// Get option contract strike price. + /// + [UsedImplicitly] + Decimal StrikePrice { get; } + + /// + /// Get option contract expiration date. + /// + [UsedImplicitly] + DateOnly ExpirationDate { get; } + + /// + /// Get option contract execution style. + /// + [UsedImplicitly] + OptionStyle OptionStyle { get; } + + /// + /// Get option contract root asset property. + /// + [UsedImplicitly] + String RootSymbol { get; } + + /// + /// Get option contract underlying asset property. + /// + [UsedImplicitly] + String UnderlyingSymbol { get; } + + /// + /// Get option contract underlying asset property. + /// + [UsedImplicitly] + Guid UnderlyingAssetId { get; } + + /// + /// Get option contract open interest. + /// + [UsedImplicitly] + Decimal? OpenInterest { get; } + + /// + /// Get option contract open interest date. + /// + [UsedImplicitly] + DateOnly? OpenInterestDate { get; } + + /// + /// Get option contract close price. + /// + [UsedImplicitly] + Decimal? ClosePrice { get; } + + /// + /// Get option contract close price date. + /// + [UsedImplicitly] + DateOnly? ClosePriceDate { get; } +} diff --git a/Alpaca.Markets/Messages/JsonOptionContract.cs b/Alpaca.Markets/Messages/JsonOptionContract.cs new file mode 100644 index 00000000..dd00fb8e --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionContract.cs @@ -0,0 +1,71 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IOptionContract))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonOptionContract : IOptionContract +{ + [JsonProperty(PropertyName = "id", Required = Required.Always)] + public Guid ContractId { get; set; } + + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "name", Required = Required.Always)] + public String Name { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "status", Required = Required.Always)] + public AssetStatus Status { get; set; } + + [JsonProperty(PropertyName = "tradable", Required = Required.Always)] + public Boolean IsTradable { get; set; } + + [JsonProperty(PropertyName = "size", Required = Required.Always)] + public Decimal Size { get; set; } + + [JsonProperty(PropertyName = "type", Required = Required.Always)] + public OptionType OptionType { get; } + + [JsonProperty(PropertyName = "strike_price", Required = Required.Always)] + public Decimal StrikePrice { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "expiration_date", Required = Required.Always)] + public DateOnly ExpirationDate { get; set; } + + [JsonProperty(PropertyName = "style", Required = Required.Always)] + public OptionStyle OptionStyle { get; } + + [JsonProperty(PropertyName = "root_symbol", Required = Required.Always)] + public String RootSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "underlying_symbol", Required = Required.Always)] + public String UnderlyingSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "underlying_asset_id", Required = Required.Always)] + public Guid UnderlyingAssetId { get; set; } + + [JsonProperty(PropertyName = "open_interest", Required = Required.Default)] + public Decimal? OpenInterest { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "open_interest_date", Required = Required.Default)] + public DateOnly? OpenInterestDate { get; set; } + + [JsonProperty(PropertyName = "close_price", Required = Required.Default)] + public Decimal? ClosePrice { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "close_price_date", Required = Required.Default)] + public DateOnly? ClosePriceDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IOptionContract)} {{ ID = {ContractId:B}, Symbol = \"{Symbol}\" }}"; +} diff --git a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs new file mode 100644 index 00000000..ee80c8c1 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs @@ -0,0 +1,10 @@ +namespace Alpaca.Markets; + +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonOptionContractsPage +{ + [JsonProperty(PropertyName = "option_contracts", Required = Required.Always)] + public List Contracts { get; set; } = []; +} \ No newline at end of file diff --git a/Alpaca.Markets/Parameters/OptionContractsRequest.cs b/Alpaca.Markets/Parameters/OptionContractsRequest.cs new file mode 100644 index 00000000..b90a0075 --- /dev/null +++ b/Alpaca.Markets/Parameters/OptionContractsRequest.cs @@ -0,0 +1,137 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates request parameters for call. +/// +public sealed class OptionContractsRequest : Validation.IRequest +{ + /// + /// Creates new instance of object. + /// + /// The symbol of the underlying asset for filtering. + public OptionContractsRequest( + String underlyingSymbol) => + UnderlyingSymbol = underlyingSymbol.EnsureNotNull(); + + /// + /// Gets the symbol of the underlying asset for filtering. + /// + [UsedImplicitly] + public String UnderlyingSymbol { get; } + + /// + /// Gets or sets filter by the asset status. By default, only active contracts are returned. + /// + [UsedImplicitly] + public AssetStatus? AssetStatus { get; set; } + + /// + /// Gets or sets filter by the exact option contract expiration date. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateEqualTo { get; set; } + + /// + /// Gets or sets filter by the expiration date greater than or equal to the specified value. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateGreaterThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter by the expiration date less than or equal to the specified value. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateLessThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter ty the root symbol. + /// + [UsedImplicitly] + public String? RootSymbol { get; set; } + + /// + /// Gets or sets filter the option contract type. + /// + [UsedImplicitly] + public OptionType? OptionType { get; set; } + + /// + /// Gets or sets filter the option contract execution style. + /// + [UsedImplicitly] + public OptionStyle? OptionStyle { get; set; } + + /// + /// Gets or sets filter by the strike price greater than or equal to the specified value. + /// + [UsedImplicitly] + public Decimal? StrikePriceGreaterThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter by the strike price less than or equal to the specified value. + /// + [UsedImplicitly] + public Decimal? StrikePriceLessThanOrEqualTo { get; set; } + + /// + /// Gets or sets the desired page number. The null treated as 1st page. + /// + [UsedImplicitly] + [CLSCompliant(false)] + public UInt32? PageNumber { get; set; } + + /// + /// Gets or sets the number of contracts to limit per page (default = 10000). + /// + [UsedImplicitly] + [CLSCompliant(false)] + public UInt32? PageSize { get; set; } + + internal async ValueTask GetUriBuilderAsync( + HttpClient httpClient) => + new(httpClient.BaseAddress!) + { + Path = "v2/options/contracts", + Query = await new QueryBuilder() + .AddParameter("underlying_symbol", UnderlyingSymbol) + .AddParameter("status", AssetStatus) + .AddParameter("expiration_date", ExpirationDateEqualTo) + .AddParameter("expiration_date_gte", ExpirationDateGreaterThanOrEqualTo) + .AddParameter("expiration_date_lte", ExpirationDateLessThanOrEqualTo) + .AddParameter("root_symbol", RootSymbol) + .AddParameter("style", OptionStyle) + .AddParameter("type", OptionType) + .AddParameter("strike_price_gte", StrikePriceGreaterThanOrEqualTo) + .AddParameter("strike_price_lte", StrikePriceLessThanOrEqualTo) + .AddParameter("page", PageNumber) + .AddParameter("limit", PageSize) + .AsStringAsync().ConfigureAwait(false) + }; + + /// + IEnumerable Validation.IRequest.GetExceptions() + { + yield return UnderlyingSymbol.TryValidateSymbolName(); + yield return RootSymbol?.TryValidateSymbolName(); + + if (ExpirationDateEqualTo.HasValue && ( + ExpirationDateGreaterThanOrEqualTo.HasValue || + ExpirationDateLessThanOrEqualTo.HasValue)) + { + yield return new RequestValidationException(nameof(ExpirationDateEqualTo), + "Inconsistent expiration date filters combination."); + } + + if (PageNumber is 0) + { + yield return new RequestValidationException(nameof(PageNumber), + "Page number should be greater than or equal to 1."); + } + + if (PageSize is 0 or > 10_000) + { + yield return new RequestValidationException(nameof(PageSize), + "Page size value should be between 1 and 10 0000."); + } + } +} diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index c06bfa21..9547f0c4 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -4,7 +4,59 @@ Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradin Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IOptionContract +Alpaca.Markets.IOptionContract.ClosePrice.get -> decimal? +Alpaca.Markets.IOptionContract.ClosePriceDate.get -> System.DateOnly? +Alpaca.Markets.IOptionContract.ContractId.get -> System.Guid +Alpaca.Markets.IOptionContract.ExpirationDate.get -> System.DateOnly +Alpaca.Markets.IOptionContract.IsTradable.get -> bool +Alpaca.Markets.IOptionContract.Name.get -> string! +Alpaca.Markets.IOptionContract.OpenInterest.get -> decimal? +Alpaca.Markets.IOptionContract.OpenInterestDate.get -> System.DateOnly? +Alpaca.Markets.IOptionContract.OptionStyle.get -> Alpaca.Markets.OptionStyle +Alpaca.Markets.IOptionContract.OptionType.get -> Alpaca.Markets.OptionType +Alpaca.Markets.IOptionContract.RootSymbol.get -> string! +Alpaca.Markets.IOptionContract.Size.get -> decimal +Alpaca.Markets.IOptionContract.Status.get -> Alpaca.Markets.AssetStatus +Alpaca.Markets.IOptionContract.StrikePrice.get -> decimal +Alpaca.Markets.IOptionContract.Symbol.get -> string! +Alpaca.Markets.IOptionContract.UnderlyingAssetId.get -> System.Guid +Alpaca.Markets.IOptionContract.UnderlyingSymbol.get -> string! +Alpaca.Markets.OptionContractsRequest +Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? +Alpaca.Markets.OptionContractsRequest.AssetStatus.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(string! underlyingSymbol) -> void +Alpaca.Markets.OptionContractsRequest.OptionStyle.get -> Alpaca.Markets.OptionStyle? +Alpaca.Markets.OptionContractsRequest.OptionStyle.set -> void +Alpaca.Markets.OptionContractsRequest.OptionType.get -> Alpaca.Markets.OptionType? +Alpaca.Markets.OptionContractsRequest.OptionType.set -> void +Alpaca.Markets.OptionContractsRequest.PageNumber.get -> uint? +Alpaca.Markets.OptionContractsRequest.PageNumber.set -> void +Alpaca.Markets.OptionContractsRequest.PageSize.get -> uint? +Alpaca.Markets.OptionContractsRequest.PageSize.set -> void +Alpaca.Markets.OptionContractsRequest.RootSymbol.get -> string? +Alpaca.Markets.OptionContractsRequest.RootSymbol.set -> void +Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.UnderlyingSymbol.get -> string! Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionStyle.American = 0 -> Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionStyle.European = 1 -> Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionType +Alpaca.Markets.OptionType.Call = 0 -> Alpaca.Markets.OptionType +Alpaca.Markets.OptionType.Put = 1 -> Alpaca.Markets.OptionType diff --git a/Alpaca.Markets/WebSocket/StreamingClientBase.cs b/Alpaca.Markets/WebSocket/StreamingClientBase.cs index 10a18eed..a367eada 100644 --- a/Alpaca.Markets/WebSocket/StreamingClientBase.cs +++ b/Alpaca.Markets/WebSocket/StreamingClientBase.cs @@ -89,7 +89,7 @@ public void Dispose() protected virtual void OnOpened() => SocketOpened?.Invoke(); - [SuppressMessage("ReSharper", "VirtualMemberNeverOverridden.Global")] + // ReSharper disable once VirtualMemberNeverOverridden.Global protected virtual void OnClosed() => SocketClosed?.Invoke(); [ExcludeFromCodeCoverage] @@ -98,7 +98,7 @@ protected virtual void OnMessageReceived( { } - [SuppressMessage("ReSharper", "VirtualMemberNeverOverridden.Global")] + // ReSharper disable once VirtualMemberNeverOverridden.Global protected virtual void Dispose( Boolean disposing) { @@ -175,7 +175,9 @@ protected ValueTask SendAsJsonStringAsync( return _webSocket.SendAsync(textWriter.ToString(), cancellationToken); } +#pragma warning disable IDE1006 // Naming Styles private void onDataReceived( +#pragma warning restore IDE1006 // Naming Styles Byte[] binaryData) => OnMessageReceived(Encoding.UTF8.GetString(binaryData)); } From e995c246cf4b5e167b5b94c8011649195ebad722 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Wed, 28 Feb 2024 12:06:51 +0100 Subject: [PATCH 058/125] Issue #728 - JSON string-to-enum converters improvements: - Added internal helper class for creating/storing string name (from attribute) to value mapping for enums. - Added internal helper extension method for converting a string into an enum value with fallback handling. - The new helper method is used for all custom JSON-to-enum converters now. --- .../AlpacaTradingClientTest.Assets.cs | 10 +++++- .../Helpers/AssetAttributesEnumConverter.cs | 4 +-- .../Helpers/CryptoExchangeEnumConverter.cs | 4 +-- .../Helpers/DictionaryExtensions.cs | 7 ++++ Alpaca.Markets/Helpers/EnumExtensions.cs | 33 ++++++++++++++++++- .../Helpers/ExchangeEnumConverter.cs | 4 +-- .../Helpers/OrderSideEnumConverter.cs | 4 +-- 7 files changed, 56 insertions(+), 10 deletions(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs index 6c9afa05..ac3e03aa 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs @@ -4,6 +4,13 @@ namespace Alpaca.Markets.Tests; public sealed partial class AlpacaTradingClientTest { + private static readonly Char[] _doubleQuotes = [ '"' ]; + + private static String toEnumString( + T enumValue) + where T : struct, Enum => + JsonConvert.SerializeObject(enumValue).Trim(_doubleQuotes); + [Fact] public async Task GetAssetAsyncWorks() { @@ -42,7 +49,8 @@ private static JObject createAsset( Guid assetId, String symbol) => new( - new JProperty("attributes", new JArray(AssetAttributes.PtpNoException)), + new JProperty("attributes", new JArray( + toEnumString(AssetAttributes.PtpNoException))), new JProperty("maintenance_margin_requirement", 100), new JProperty("status", AssetStatus.Active), new JProperty("class", AssetClass.UsEquity), diff --git a/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs index 40a55bf5..0964b635 100644 --- a/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs +++ b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs @@ -5,7 +5,7 @@ Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] internal sealed class AssetAttributesEnumConverter : StringEnumConverter { - public override Object? ReadJson( + public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, @@ -13,7 +13,7 @@ internal sealed class AssetAttributesEnumConverter : StringEnumConverter { try { - return base.ReadJson(reader, objectType, existingValue, serializer); + return AssetAttributes.Unknown.FromEnumString(reader); } catch (JsonSerializationException) { diff --git a/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs b/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs index 2da65940..be037b49 100644 --- a/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs +++ b/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs @@ -5,7 +5,7 @@ Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] internal sealed class CryptoExchangeEnumConverter : StringEnumConverter { - public override Object? ReadJson( + public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, @@ -13,7 +13,7 @@ internal sealed class CryptoExchangeEnumConverter : StringEnumConverter { try { - return base.ReadJson(reader, objectType, existingValue, serializer); + return CryptoExchange.Unknown.FromEnumString(reader); } catch (JsonSerializationException) { diff --git a/Alpaca.Markets/Helpers/DictionaryExtensions.cs b/Alpaca.Markets/Helpers/DictionaryExtensions.cs index 5602518c..cb252325 100644 --- a/Alpaca.Markets/Helpers/DictionaryExtensions.cs +++ b/Alpaca.Markets/Helpers/DictionaryExtensions.cs @@ -10,4 +10,11 @@ public static IReadOnlyDictionary> SetSymbol pair.Value.SetSymbol(pair.Key).EmptyIfNull(), StringComparer.Ordinal) ?? new Dictionary>(StringComparer.Ordinal); + +#if NETFRAMEWORK || NETSTANDARD2_0 + public static TValue GetValueOrDefault( + this IReadOnlyDictionary dictionary, + TKey key, TValue defaultValue) => + dictionary.TryGetValue(key, out var value) ? value : defaultValue; +#endif } diff --git a/Alpaca.Markets/Helpers/EnumExtensions.cs b/Alpaca.Markets/Helpers/EnumExtensions.cs index b36fc1fb..2c95ccf3 100644 --- a/Alpaca.Markets/Helpers/EnumExtensions.cs +++ b/Alpaca.Markets/Helpers/EnumExtensions.cs @@ -1,11 +1,42 @@ -namespace Alpaca.Markets; +using System.Reflection; + +namespace Alpaca.Markets; internal static class EnumExtensions { + private static class NamesHelper< +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] +#endif + T> where T : struct, Enum + { + public static readonly IReadOnlyDictionary ValuesByNames = + Enum.GetValues(typeof(T)).OfType() + .ToDictionary(getJsonName, value => value); + + private static string getJsonName( + T value) => + typeof(T).GetField(Enum.GetName(typeof(T), value) ?? value.ToString())? + .GetCustomAttribute()?.Value ?? value.ToString(); + } + private static readonly Char[] _doubleQuotes = [ '"' ]; public static String ToEnumString( this T enumValue) where T : struct, Enum => JsonConvert.SerializeObject(enumValue).Trim(_doubleQuotes); + + public static T FromEnumString< +#if NET6_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] +#endif + T>( + this T fallbackEnumValue, + JsonReader reader) + where T : struct, Enum => + reader.TokenType == JsonToken.String + ? NamesHelper.ValuesByNames.GetValueOrDefault( + reader.Value as String ?? String.Empty, fallbackEnumValue) + : fallbackEnumValue; } diff --git a/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs b/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs index 738bdc05..bd7155da 100644 --- a/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs +++ b/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs @@ -5,7 +5,7 @@ Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] internal sealed class ExchangeEnumConverter : StringEnumConverter { - public override Object? ReadJson( + public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, @@ -13,7 +13,7 @@ internal sealed class ExchangeEnumConverter : StringEnumConverter { try { - return base.ReadJson(reader, objectType, existingValue, serializer); + return Exchange.Unknown.FromEnumString(reader); } catch (JsonSerializationException) { diff --git a/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs b/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs index 768e92a6..0574ac5c 100644 --- a/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs +++ b/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs @@ -5,7 +5,7 @@ Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] internal sealed class OrderSideEnumConverter : StringEnumConverter { - public override Object? ReadJson( + public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, @@ -13,7 +13,7 @@ internal sealed class OrderSideEnumConverter : StringEnumConverter { try { - return base.ReadJson(reader, objectType, existingValue, serializer); + return OrderSide.Sell.FromEnumString(reader); } catch (JsonSerializationException) { From 56e4593c173fcf16aba06694b59a3cfb23a36ddb Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Wed, 28 Feb 2024 16:16:44 +0100 Subject: [PATCH 059/125] Issue #728 - The list of possible asset attributes extended: - Added the new `FractionalAtExtended` enumeration member into the `AssetAttributes` enumeration. (cherry picked from commit 9e49382f501b23b77969bc84cc0fb2fff5d9f6bb) --- Alpaca.Markets/Enums/AssetAttributes.cs | 9 ++++++++- Alpaca.Markets/PublicAPI.Shipped.txt | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Alpaca.Markets/Enums/AssetAttributes.cs b/Alpaca.Markets/Enums/AssetAttributes.cs index a470177c..c89365b1 100644 --- a/Alpaca.Markets/Enums/AssetAttributes.cs +++ b/Alpaca.Markets/Enums/AssetAttributes.cs @@ -39,5 +39,12 @@ public enum AssetAttributes /// [UsedImplicitly] [EnumMember(Value = "options_enabled")] - OptionsEnabled + OptionsEnabled, + + /// + /// Asset supports fractional trading at extended hours. + /// + [UsedImplicitly] + [EnumMember(Value = "fractional_eh_enabled")] + FractionalAtExtended } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 46f0662d..5f89fc80 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -120,6 +120,7 @@ Alpaca.Markets.AnnouncementsRequest.Symbol.get -> string? Alpaca.Markets.AnnouncementsRequest.Symbol.set -> void Alpaca.Markets.AnnouncementsRequest.TimeInterval.get -> Alpaca.Markets.IInclusiveTimeInterval! Alpaca.Markets.AssetAttributes +Alpaca.Markets.AssetAttributes.FractionalAtExtended = 5 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.OptionsEnabled = 4 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpNoException = 1 -> Alpaca.Markets.AssetAttributes Alpaca.Markets.AssetAttributes.PtpWithException = 2 -> Alpaca.Markets.AssetAttributes From a8331c3325d34b548fdf274713d82fc3a22d8136 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 1 Mar 2024 10:39:49 +0100 Subject: [PATCH 060/125] Bump Microsoft.Extensions.Http.Polly from 8.0.0 to 8.0.2 --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- .../Alpaca.Markets.Tests.csproj | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 9e5b3f2c..ee1da7a5 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -96,7 +96,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index ace09dc9..12bb9f76 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "UbZJib/wukyGVTvX7ZLS988su5XLrDoHDBSXp00Jxre0ONB1XW7e1zTk7vQbJq1PzmD5x7CBqdZQlH2OWte+Uw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 822faf3c..7cbf44b6 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,7 +13,7 @@ - + From 653567dcfc4031f109e548000a7fbcef9200a7a1 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 1 Mar 2024 18:36:01 +0100 Subject: [PATCH 061/125] Issue #719 - Added unit tests for the new functions/objects. --- .../AlpacaTradingClientTest.Options.cs | 118 ++++++++++++++++++ .../Helpers/AssetAttributesEnumConverter.cs | 13 +- .../Helpers/CryptoExchangeEnumConverter.cs | 13 +- Alpaca.Markets/Helpers/EnumExtensions.cs | 6 +- .../Helpers/ExchangeEnumConverter.cs | 13 +- .../Helpers/OrderSideEnumConverter.cs | 13 +- .../Messages/JsonOptionContractsPage.cs | 2 +- 7 files changed, 130 insertions(+), 48 deletions(-) create mode 100644 Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs new file mode 100644 index 00000000..d8168cce --- /dev/null +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs @@ -0,0 +1,118 @@ +using System.Diagnostics.CodeAnalysis; + +namespace Alpaca.Markets.Tests; + +public sealed partial class AlpacaTradingClientTest +{ + private static readonly DateOnly _today = DateOnly.FromDateTime(DateTime.Today); + + [Fact] + public async Task GetOptionContractByIdWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + var contractId = Guid.NewGuid(); + + mock.AddGet("/v2/options/contracts/*", createOptionContract(contractId, Stock)); + + var optionContract = await mock.Client.GetOptionContractByIdAsync(contractId); + + validateOptionContract(optionContract, contractId, Stock); + } + + [Fact] + public async Task GetOptionContractBySymbolWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + var contractId = Guid.NewGuid(); + + mock.AddGet("/v2/options/contracts/*", createOptionContract(contractId, Stock)); + + var optionContract = await mock.Client.GetOptionContractBySymbolAsync(Stock); + + validateOptionContract(optionContract, contractId, Stock); + } + + [Fact] + public async Task ListOptionContractsWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + var contractId = Guid.NewGuid(); + + mock.AddGet("/v2/options/contracts", createOptionContractsList(contractId, Stock)); + + var optionContracts = await mock.Client.ListOptionContractsAsync( + new OptionContractsRequest(Stock) + { + ExpirationDateGreaterThanOrEqualTo = _today, + ExpirationDateLessThanOrEqualTo = _today, + StrikePriceGreaterThanOrEqualTo = Price, + StrikePriceLessThanOrEqualTo = Price, + OptionStyle = OptionStyle.American, + AssetStatus = AssetStatus.Active, + OptionType = OptionType.Call, + RootSymbol = Stock, + PageNumber = 1, + PageSize = 100 + }); + + validateOptionContract(optionContracts.Single(), contractId, Stock); + } + + private static JObject createOptionContractsList( + Guid contractId, + String symbol) => + new(new JProperty("option_contracts", new JArray(createOptionContract(contractId, symbol)))); + + private static JObject createOptionContract( + Guid contractId, + String symbol) => + new( + new JProperty("open_interest_date", _today.ToString("O")), + new JProperty("close_price_date", _today.ToString("O")), + new JProperty("expiration_date", _today.ToString("O")), + new JProperty("underlying_asset_id", contractId), + new JProperty("style", OptionStyle.American), + new JProperty("status", AssetStatus.Active), + new JProperty("underlying_symbol", symbol), + new JProperty("type", OptionType.Call), + new JProperty("open_interest", Price), + new JProperty("root_symbol", symbol), + new JProperty("strike_price", Price), + new JProperty("close_price", Price), + new JProperty("tradable", true), + new JProperty("symbol", symbol), + new JProperty("id", contractId), + new JProperty("name", symbol), + new JProperty("size", 100)); + + [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")] + private static void validateOptionContract( + IOptionContract optionContract, + Guid contractId, + String symbol) + { + Assert.True(optionContract.IsTradable); + + Assert.NotNull(optionContract.ClosePrice); + Assert.NotNull(optionContract.OpenInterest); + Assert.NotNull(optionContract.ClosePriceDate); + Assert.NotNull(optionContract.OpenInterestDate); + + Assert.Equal(100, optionContract.Size); + Assert.Equal(Price, optionContract.StrikePrice); + + Assert.Equal(symbol, optionContract.Name); + Assert.Equal(symbol, optionContract.Symbol); + Assert.Equal(symbol, optionContract.RootSymbol); + Assert.Equal(symbol, optionContract.UnderlyingSymbol); + + Assert.Equal(contractId, optionContract.ContractId); + Assert.Equal(contractId, optionContract.UnderlyingAssetId); + + Assert.Equal(OptionType.Call, optionContract.OptionType); + Assert.Equal(OptionStyle.American, optionContract.OptionStyle); + } +} \ No newline at end of file diff --git a/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs index 0964b635..6d719dfe 100644 --- a/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs +++ b/Alpaca.Markets/Helpers/AssetAttributesEnumConverter.cs @@ -9,15 +9,6 @@ public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, - JsonSerializer serializer) - { - try - { - return AssetAttributes.Unknown.FromEnumString(reader); - } - catch (JsonSerializationException) - { - return AssetAttributes.Unknown; - } - } + JsonSerializer serializer) => + reader.ReadEnumString(AssetAttributes.Unknown); } diff --git a/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs b/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs index be037b49..be397eae 100644 --- a/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs +++ b/Alpaca.Markets/Helpers/CryptoExchangeEnumConverter.cs @@ -9,15 +9,6 @@ public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, - JsonSerializer serializer) - { - try - { - return CryptoExchange.Unknown.FromEnumString(reader); - } - catch (JsonSerializationException) - { - return CryptoExchange.Unknown; - } - } + JsonSerializer serializer) => + reader.ReadEnumString(CryptoExchange.Unknown); } diff --git a/Alpaca.Markets/Helpers/EnumExtensions.cs b/Alpaca.Markets/Helpers/EnumExtensions.cs index 2c95ccf3..6c086852 100644 --- a/Alpaca.Markets/Helpers/EnumExtensions.cs +++ b/Alpaca.Markets/Helpers/EnumExtensions.cs @@ -27,13 +27,13 @@ public static String ToEnumString( where T : struct, Enum => JsonConvert.SerializeObject(enumValue).Trim(_doubleQuotes); - public static T FromEnumString< + public static T ReadEnumString< #if NET6_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] #endif T>( - this T fallbackEnumValue, - JsonReader reader) + this JsonReader reader, + T fallbackEnumValue) where T : struct, Enum => reader.TokenType == JsonToken.String ? NamesHelper.ValuesByNames.GetValueOrDefault( diff --git a/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs b/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs index bd7155da..9c3e711e 100644 --- a/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs +++ b/Alpaca.Markets/Helpers/ExchangeEnumConverter.cs @@ -9,15 +9,6 @@ public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, - JsonSerializer serializer) - { - try - { - return Exchange.Unknown.FromEnumString(reader); - } - catch (JsonSerializationException) - { - return Exchange.Unknown; - } - } + JsonSerializer serializer) => + reader.ReadEnumString(Exchange.Unknown); } diff --git a/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs b/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs index 0574ac5c..a1eaed4d 100644 --- a/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs +++ b/Alpaca.Markets/Helpers/OrderSideEnumConverter.cs @@ -9,15 +9,6 @@ public override Object ReadJson( JsonReader reader, Type objectType, Object? existingValue, - JsonSerializer serializer) - { - try - { - return OrderSide.Sell.FromEnumString(reader); - } - catch (JsonSerializationException) - { - return OrderSide.Sell; // Treat all unknown order types as sell orders - } - } + JsonSerializer serializer) => + reader.ReadEnumString(OrderSide.Sell); // Treat all unknown order types as sell orders } diff --git a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs index ee80c8c1..1642956a 100644 --- a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs +++ b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs @@ -6,5 +6,5 @@ internal sealed class JsonOptionContractsPage { [JsonProperty(PropertyName = "option_contracts", Required = Required.Always)] - public List Contracts { get; set; } = []; + public List Contracts { get; [ExcludeFromCodeCoverage] set; } = []; } \ No newline at end of file From 338e00493440706627efd4660fc9ad7de8e20c49 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 3 Mar 2024 10:17:57 +0100 Subject: [PATCH 062/125] Issue #720 - Added support for the options historical data requesting: - Added the new `IAlpacaOptionDataClient` interface and related factory methods and configuration class. - Added the new `IAlpacaOptionDataClient.ListLatestQuotesAsync` and `IAlpacaOptionDataClient.ListLatestTradesAsync` methods. - Added the new `IAlpacaOptionDataClient.ListSnapshotsAsync` and `IAlpacaOptionDataClient.GetOptionChainAsync` methods. - Added the new `IAlpacaOptionDataClient.ListExchangesAsync` method for metadata requesting. --- .editorconfig | 22 +++ .../AlpacaTradingClientTest.Options.cs | 2 +- Alpaca.Markets/AlpacaCryptoDataClient.cs | 6 +- Alpaca.Markets/AlpacaDataClient.cs | 4 +- Alpaca.Markets/AlpacaOptionsDataClient.cs | 83 +++++++++++ .../Environment/EnvironmentExtensions.cs | 38 +++++ .../Helpers/DictionaryExtensions.cs | 19 ++- .../Interfaces/IAlpacaOptionsDataClient.cs | 138 ++++++++++++++++++ .../Messages/JsonHistoricalTrade.cs | 2 +- Alpaca.Markets/Messages/JsonLatestData.cs | 6 +- Alpaca.Markets/Messages/JsonOptionQuote.cs | 63 ++++++++ Alpaca.Markets/Messages/JsonOptionSnapshot.cs | 55 +++++++ Alpaca.Markets/Messages/JsonOptionTrade.cs | 61 ++++++++ .../AlpacaOptionsDataClientConfiguration.cs | 18 +++ Alpaca.Markets/PublicAPI.Unshipped.txt | 10 ++ 15 files changed, 518 insertions(+), 9 deletions(-) create mode 100644 Alpaca.Markets/AlpacaOptionsDataClient.cs create mode 100644 Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionQuote.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionSnapshot.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionTrade.cs create mode 100644 Alpaca.Markets/Parameters/AlpacaOptionsDataClientConfiguration.cs diff --git a/.editorconfig b/.editorconfig index abaa1528..cf71f7d3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,3 +8,25 @@ dotnet_style_predefined_type_for_member_access = false:silent # IDE0049: Simplify Names dotnet_style_predefined_type_for_locals_parameters_members = false:silent + +# Define the 'private_methods' symbol group: +dotnet_naming_symbols.private_methods.applicable_kinds = method +dotnet_naming_symbols.private_methods.applicable_accessibilities = private + +# Define the 'private_static_methods' symbol group +dotnet_naming_symbols.private_static_methods.applicable_kinds = method +dotnet_naming_symbols.private_static_methods.applicable_accessibilities = private +dotnet_naming_symbols.private_static_methods.required_modifiers = static + +# Define the 'private_methods_style' naming style +dotnet_naming_style.private_methods_style.capitalization = camel_case + +# Define the 'private_methods_underscored' naming rule +dotnet_naming_rule.private_methods_rule.symbols = private_methods +dotnet_naming_rule.private_methods_rule.style = private_methods_style +dotnet_naming_rule.private_methods_rule.severity = error + +# Define the 'private_static_methods_rule' naming rule +dotnet_naming_rule.private_static_methods_rule.symbols = private_static_methods +dotnet_naming_rule.private_static_methods_rule.style = private_methods_style +dotnet_naming_rule.private_static_methods_rule.severity = error \ No newline at end of file diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs index d8168cce..91ee59f1 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs @@ -115,4 +115,4 @@ private static void validateOptionContract( Assert.Equal(OptionType.Call, optionContract.OptionType); Assert.Equal(OptionStyle.American, optionContract.OptionStyle); } -} \ No newline at end of file +} diff --git a/Alpaca.Markets/AlpacaCryptoDataClient.cs b/Alpaca.Markets/AlpacaCryptoDataClient.cs index d2826fa4..f69aab85 100644 --- a/Alpaca.Markets/AlpacaCryptoDataClient.cs +++ b/Alpaca.Markets/AlpacaCryptoDataClient.cs @@ -1,5 +1,7 @@ namespace Alpaca.Markets; +using JsonLatestData = JsonLatestData; + internal sealed class AlpacaCryptoDataClient : DataHistoricalClientBase, IAlpacaCryptoDataClient @@ -115,7 +117,7 @@ public Task GetTopMarketMoversAsync( private async Task> getLatestAsync( LatestDataListRequest request, String items, - Func, Dictionary> itemsSelector, + Func> itemsSelector, CancellationToken cancellationToken) where TJson : TApi, ISymbolMutable => await getLatestAsync( @@ -125,7 +127,7 @@ await request.EnsureNotNull().Validate() private async Task> getLatestAsync( UriBuilder uriBuilder, - Func, Dictionary> itemsSelector, + Func> itemsSelector, CancellationToken cancellationToken) where TJson : TApi, ISymbolMutable => await HttpClient.GetAsync( diff --git a/Alpaca.Markets/AlpacaDataClient.cs b/Alpaca.Markets/AlpacaDataClient.cs index 1d174db0..853021c4 100644 --- a/Alpaca.Markets/AlpacaDataClient.cs +++ b/Alpaca.Markets/AlpacaDataClient.cs @@ -1,5 +1,7 @@ namespace Alpaca.Markets; +using JsonLatestData = JsonLatestData; + internal sealed class AlpacaDataClient : DataHistoricalClientBase, IAlpacaDataClient @@ -123,7 +125,7 @@ await HttpClient.GetAsync, Dictionary> getLatestAsync( LatestMarketDataListRequest request, String lastPathSegment, - Func, Dictionary> itemsSelector, + Func> itemsSelector, CancellationToken cancellationToken) where TJson : TApi, ISymbolMutable => await HttpClient.GetAsync( diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs new file mode 100644 index 00000000..3ebeea8a --- /dev/null +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -0,0 +1,83 @@ +namespace Alpaca.Markets; + +using JsonLatestData=JsonLatestData; + +internal sealed class AlpacaOptionsDataClient : IAlpacaOptionsDataClient + //where THistoricalQuotesRequest : HistoricalRequestBase, Validation.IRequest + //where THistoricalTradesRequest : HistoricalRequestBase, Validation.IRequest + //where THistoricalBarsRequest : HistoricalRequestBase, Validation.IRequest + //where THistoricalQuote : IQuote, ISymbolMutable +{ + private readonly RateLimitHandler _rateLimitHandler = new(); + + private readonly HttpClient _httpClient; + + internal AlpacaOptionsDataClient( + AlpacaOptionsDataClientConfiguration configuration) => + _httpClient = configuration.EnsureNotNull().GetConfiguredHttpClient(); + + public void Dispose() + { + _httpClient.Dispose(); + _rateLimitHandler.Dispose(); + } + + public IRateLimitValues GetRateLimitValues() => _rateLimitHandler.GetCurrent(); + public Task> ListExchangesAsync( + CancellationToken cancellationToken = default) => + _httpClient.GetAsync, Dictionary>( + "meta/exchanges", _rateLimitHandler, cancellationToken); + + public Task> ListLatestQuotesAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default) => + getLatestAsync( + symbols.EnsureNotNull(), "quotes/latest", data => data.Quotes, cancellationToken); + + public Task> ListLatestTradesAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default) => + getLatestAsync( + symbols.EnsureNotNull(), "trades/latest", data => data.Trades, cancellationToken); + + public Task> ListSnapshotsAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default) => + getLatestAsync( + symbols.EnsureNotNull(), "snapshots", data => data.Snapshots, cancellationToken); + + public Task> GetOptionChainAsync( + String underlyingSymbol, + CancellationToken cancellationToken = default) => + getLatestAsync( + [], $"snapshots/{underlyingSymbol.EnsureNotNull()}", data => data.Snapshots, cancellationToken); + + private async Task> getLatestAsync( + IEnumerable symbols, + String lastPathSegment, + Func> itemsSelector, + CancellationToken cancellationToken) + where TJson : TApi, ISymbolMutable => + await _httpClient.GetAsync( + await getUriBuilderAsync(symbols, lastPathSegment).ConfigureAwait(false), + itemsSelector, withSymbol, + _rateLimitHandler, cancellationToken).ConfigureAwait(false); + + private async ValueTask getUriBuilderAsync( + IEnumerable symbols, + String lastPathSegment) => + new UriBuilder(_httpClient.BaseAddress!) + { + Query = await new QueryBuilder() + .AddParameter("symbols", symbols.ToList()) + .AsStringAsync().ConfigureAwait(false) + }.AppendPath(lastPathSegment); + + private static TApi withSymbol( + KeyValuePair kvp) + where TJson : TApi, ISymbolMutable + { + kvp.Value.SetSymbol(kvp.Key); + return kvp.Value; + } +} diff --git a/Alpaca.Markets/Environment/EnvironmentExtensions.cs b/Alpaca.Markets/Environment/EnvironmentExtensions.cs index 2f5f5561..73cc10d3 100644 --- a/Alpaca.Markets/Environment/EnvironmentExtensions.cs +++ b/Alpaca.Markets/Environment/EnvironmentExtensions.cs @@ -270,4 +270,42 @@ public static AlpacaNewsStreamingClientConfiguration GetAlpacaNewsStreamingClien ApiEndpoint = environment.EnsureNotNull().AlpacaNewsStreamingApi, SecurityId = securityKey.EnsureNotNull() }; + + /// + /// Creates the new instance of interface + /// implementation for specific environment provided as argument. + /// + /// Target environment for new object. + /// Alpaca API security key. + /// + /// The or argument is null. + /// + /// The new instance of interface implementation. + [UsedImplicitly] + [CLSCompliant(false)] + [ExcludeFromCodeCoverage] + public static IAlpacaOptionsDataClient GetAlpacaOptionsDataClient( + this IEnvironment environment, + SecurityKey securityKey) => + new AlpacaOptionsDataClient(environment.GetAlpacaOptionsDataClientConfiguration(securityKey)); + + /// + /// Creates new instance of for specific + /// environment provided as argument. + /// + /// Target environment for new object. + /// Alpaca API security key. + /// + /// The or argument is null. + /// + /// New instance of object. + [UsedImplicitly] + public static AlpacaOptionsDataClientConfiguration GetAlpacaOptionsDataClientConfiguration( + this IEnvironment environment, + SecurityKey securityKey) => + new() + { + ApiEndpoint = environment.EnsureNotNull().AlpacaDataApi, + SecurityId = securityKey.EnsureNotNull() + }; } diff --git a/Alpaca.Markets/Helpers/DictionaryExtensions.cs b/Alpaca.Markets/Helpers/DictionaryExtensions.cs index cb252325..a3cad99c 100644 --- a/Alpaca.Markets/Helpers/DictionaryExtensions.cs +++ b/Alpaca.Markets/Helpers/DictionaryExtensions.cs @@ -1,7 +1,19 @@ -namespace Alpaca.Markets; +using Newtonsoft.Json.Linq; + +namespace Alpaca.Markets; internal static class DictionaryExtensions { + private static IEnumerable getConditions( + Object? conditions) => + conditions switch + { + JArray jArray => jArray.SelectMany(getConditions), + JValue jValue => getConditions(jValue.Value), + String value => Enumerable.Repeat(value, 1), + _ => [] + }; + public static IReadOnlyDictionary> SetSymbol( this Dictionary?>? dictionary) where TFrom : TInto, ISymbolMutable => @@ -17,4 +29,9 @@ public static TValue GetValueOrDefault( TKey key, TValue defaultValue) => dictionary.TryGetValue(key, out var value) ? value : defaultValue; #endif + + public static IEnumerable GetConditions( + this IReadOnlyDictionary extensionData) => + extensionData.TryGetValue("c", out var conditions) + ? getConditions(conditions) : []; } diff --git a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs new file mode 100644 index 00000000..68893088 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs @@ -0,0 +1,138 @@ +namespace Alpaca.Markets; + +/// +/// Provides unified type-safe access for Alpaca Options Data API via HTTP/REST. +/// +[CLSCompliant(false)] +public interface IAlpacaOptionsDataClient : + //IHistoricalQuotesClient, + //IHistoricalTradesClient, + //IHistoricalBarsClient, + IRateLimitProvider, + IDisposable +{ + /// + /// Gets dictionary with exchange code to the exchange name mappings. + /// + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// Read-only dictionary where the key is the exchange code and the value is the code's corresponding exchange name. + [UsedImplicitly] + Task> ListExchangesAsync( + CancellationToken cancellationToken = default); + + /// + /// Gets most recent quotes for several option contracts from Alpaca REST API endpoint. + /// + /// Option contracts symbol names list. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only dictionary with the latest quotes information. + [UsedImplicitly] + Task> ListLatestQuotesAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default); + + /// + /// Gets most recent trades for several option contracts from Alpaca REST API endpoint. + /// + /// Option contracts symbol names list. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only dictionary with the latest trades information. + [UsedImplicitly] + Task> ListLatestTradesAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default); + + /// + /// Gets current snapshot (latest trade/quote) for several option contracts from Alpaca REST API endpoint. + /// + /// Option contracts symbol names list. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only dictionary with the current snapshot information. + [UsedImplicitly] + Task> ListSnapshotsAsync( + IEnumerable symbols, + CancellationToken cancellationToken = default); + + /// + /// Gets option chain (snapshots list) for option contracts with same underlying symbol from Alpaca REST API endpoint. + /// + /// The financial instrument on which returned option contracts are based or derived. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only dictionary with the current snapshot information. + [UsedImplicitly] + Task> GetOptionChainAsync( + String underlyingSymbol, + CancellationToken cancellationToken = default); +} diff --git a/Alpaca.Markets/Messages/JsonHistoricalTrade.cs b/Alpaca.Markets/Messages/JsonHistoricalTrade.cs index 79d8b409..79a99384 100644 --- a/Alpaca.Markets/Messages/JsonHistoricalTrade.cs +++ b/Alpaca.Markets/Messages/JsonHistoricalTrade.cs @@ -26,7 +26,7 @@ internal sealed class JsonHistoricalTrade : ITrade, ISymbolMutable [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "c", Required = Required.Default)] - public List ConditionsList { get; } = []; + public List ConditionsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "tks", Required = Required.Default)] public TakerSide TakerSide { get; [ExcludeFromCodeCoverage] set; } = TakerSide.Unknown; diff --git a/Alpaca.Markets/Messages/JsonLatestData.cs b/Alpaca.Markets/Messages/JsonLatestData.cs index 83625a9a..4933f441 100644 --- a/Alpaca.Markets/Messages/JsonLatestData.cs +++ b/Alpaca.Markets/Messages/JsonLatestData.cs @@ -3,7 +3,7 @@ [SuppressMessage( "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] -internal sealed class JsonLatestData +internal sealed class JsonLatestData { [JsonProperty(PropertyName = "quotes", Required = Required.Default)] public Dictionary Quotes { get; [ExcludeFromCodeCoverage] set; } = new(); @@ -12,10 +12,10 @@ internal sealed class JsonLatestData public Dictionary Bars { get; [ExcludeFromCodeCoverage] set; } = new(); [JsonProperty(PropertyName = "trades", Required = Required.Default)] - public Dictionary Trades { get; [ExcludeFromCodeCoverage] set; } = new(); + public Dictionary Trades { get; [ExcludeFromCodeCoverage] set; } = new(); [JsonProperty(PropertyName = "snapshots", Required = Required.Default)] - public Dictionary Snapshots { get; [ExcludeFromCodeCoverage] set; } = new(); + public Dictionary Snapshots { get; [ExcludeFromCodeCoverage] set; } = new(); [JsonProperty(PropertyName = "orderbooks", Required = Required.Default)] public Dictionary OrderBooks { get; [ExcludeFromCodeCoverage] set; } = new(); diff --git a/Alpaca.Markets/Messages/JsonOptionQuote.cs b/Alpaca.Markets/Messages/JsonOptionQuote.cs new file mode 100644 index 00000000..ea00fd1e --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionQuote.cs @@ -0,0 +1,63 @@ +using Newtonsoft.Json.Linq; + +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IQuote))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonOptionQuote : IQuote, ISymbolMutable +{ + private readonly List _conditionsList = []; + + [JsonProperty(PropertyName = "t", Required = Required.Always)] + public DateTime TimestampUtc { get; set; } + + [JsonProperty(PropertyName = "ax", Required = Required.Always)] + public String AskExchange { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "ap", Required = Required.Default)] + public Decimal AskPrice { get; set; } + + [JsonProperty(PropertyName = "as", Required = Required.Default)] + public Decimal AskSize { get; set; } + + [JsonProperty(PropertyName = "bx", Required = Required.Always)] + public String BidExchange { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "bp", Required = Required.Default)] + public Decimal BidPrice { get; set; } + + [JsonProperty(PropertyName = "bs", Required = Required.Default)] + public Decimal BidSize { get; set; } + + [JsonIgnore] + public String Tape => String.Empty; + + [JsonIgnore] + public String Symbol { get; private set; } = String.Empty; + + [JsonIgnore] + public IReadOnlyList Conditions => _conditionsList; + + [UsedImplicitly] + [JsonExtensionData] + public Dictionary ExtensionData { get; set; } = []; + + [OnDeserialized] + internal void OnDeserializedMethod( + StreamingContext context) => + _conditionsList.AddRange(ExtensionData.GetConditions()); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void SetSymbol(String symbol) => Symbol = symbol; + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + this.ToDebuggerDisplayString(); +} diff --git a/Alpaca.Markets/Messages/JsonOptionSnapshot.cs b/Alpaca.Markets/Messages/JsonOptionSnapshot.cs new file mode 100644 index 00000000..14097845 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionSnapshot.cs @@ -0,0 +1,55 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ISnapshot))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonOptionSnapshot : ISnapshot, ISymbolMutable +{ + [JsonProperty(PropertyName = "latestQuote", Required = Required.Default)] + public JsonOptionQuote? JsonQuote { get; set; } + + [JsonProperty(PropertyName = "latestTrade", Required = Required.Default)] + public JsonOptionTrade? JsonTrade { get; set; } + + [JsonIgnore] + public String Symbol { get; private set; } = String.Empty; + + [JsonIgnore] + public IQuote? Quote => JsonQuote; + + [JsonIgnore] + public ITrade? Trade => JsonTrade; + + [JsonIgnore] + public IBar? MinuteBar => null; + + [JsonIgnore] + public IBar? CurrentDailyBar => null; + + [JsonIgnore] + public IBar? PreviousDailyBar => null; + + [OnDeserialized] + [UsedImplicitly] + internal void OnDeserializedMethod( + StreamingContext _) => + SetSymbol(Symbol); + + public void SetSymbol( + String symbol) + { + Symbol = symbol; + JsonTrade?.SetSymbol(Symbol); + JsonQuote?.SetSymbol(Symbol); + } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + this.ToDebuggerDisplayString(); +} diff --git a/Alpaca.Markets/Messages/JsonOptionTrade.cs b/Alpaca.Markets/Messages/JsonOptionTrade.cs new file mode 100644 index 00000000..ab206b29 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionTrade.cs @@ -0,0 +1,61 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ITrade))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonOptionTrade : ITrade, ISymbolMutable +{ + private readonly List _conditionsList = []; + + [JsonProperty(PropertyName = "t", Required = Required.Always)] + public DateTime TimestampUtc { get; set; } + + [JsonProperty(PropertyName = "x", Required = Required.Default)] + public String Exchange { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "p", Required = Required.Always)] + public Decimal Price { get; set; } + + [JsonProperty(PropertyName = "s", Required = Required.Always)] + public Decimal Size { get; set; } + + [JsonIgnore] + public String Symbol { get; private set; } = String.Empty; + + [JsonIgnore] + public TakerSide TakerSide => TakerSide.Unknown; + + [JsonIgnore] + public String Update => String.Empty; + + [JsonIgnore] + public String Tape => String.Empty; + + [JsonIgnore] + public UInt64 TradeId => 0; + + [JsonIgnore] + public IReadOnlyList Conditions => _conditionsList; + + [UsedImplicitly] + [JsonExtensionData] + public Dictionary ExtensionData { get; set; } = []; + + [OnDeserialized] + internal void OnDeserializedMethod( + StreamingContext context) => + _conditionsList.AddRange(ExtensionData.GetConditions()); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void SetSymbol(String symbol) => Symbol = symbol; + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + this.ToDebuggerDisplayString(); +} diff --git a/Alpaca.Markets/Parameters/AlpacaOptionsDataClientConfiguration.cs b/Alpaca.Markets/Parameters/AlpacaOptionsDataClientConfiguration.cs new file mode 100644 index 00000000..daffc411 --- /dev/null +++ b/Alpaca.Markets/Parameters/AlpacaOptionsDataClientConfiguration.cs @@ -0,0 +1,18 @@ +namespace Alpaca.Markets; + +/// +/// Configuration parameters object for instance. +/// +public sealed class AlpacaOptionsDataClientConfiguration : AlpacaClientConfigurationBase +{ + /// + /// Creates new instance of class. + /// + public AlpacaOptionsDataClientConfiguration() + : base(Environments.Live.AlpacaDataApi) + { + } + + internal override Uri GetApiEndpoint() => + new UriBuilder(ApiEndpoint) { Path = "v1beta1/options/" }.Uri; +} diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 9547f0c4..0083c654 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,9 +1,17 @@ #nullable enable +Alpaca.Markets.AlpacaOptionsDataClientConfiguration +Alpaca.Markets.AlpacaOptionsDataClientConfiguration.AlpacaOptionsDataClientConfiguration() -> void Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.IAlpacaOptionsDataClient +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(string! underlyingSymbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! @@ -60,3 +68,5 @@ Alpaca.Markets.OptionStyle.European = 1 -> Alpaca.Markets.OptionStyle Alpaca.Markets.OptionType Alpaca.Markets.OptionType.Call = 0 -> Alpaca.Markets.OptionType Alpaca.Markets.OptionType.Put = 1 -> Alpaca.Markets.OptionType +static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaOptionsDataClient! +static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaOptionsDataClientConfiguration! From 2c80bb388284d91d093f8352d638c81efc6bc068 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 3 Mar 2024 11:37:19 +0100 Subject: [PATCH 063/125] Issue #720 - More support for the options historical data requesting: - The `IAlpacaOptionDataClient` interface extended with the `IHistoricalTradesClient` and `IHistoricalBarsClient` interfaces. - The new `HistoricalOptionTradesRequest` and `HistoricalOptionBarsRequest` classes were added. --- Alpaca.Markets/AlpacaCryptoDataClient.cs | 5 +- Alpaca.Markets/AlpacaDataClient.cs | 5 +- Alpaca.Markets/AlpacaOptionsDataClient.cs | 36 ++--- Alpaca.Markets/DataHistoricalClientBase.cs | 18 ++- .../Interfaces/IAlpacaOptionsDataClient.cs | 5 +- .../Messages/JsonMultiTradesPage.cs | 7 +- Alpaca.Markets/Messages/JsonTradesPage.cs | 7 +- .../Parameters/HistoricalOptionBarsRequest.cs | 133 ++++++++++++++++++ .../HistoricalOptionTradesRequest.cs | 113 +++++++++++++++ Alpaca.Markets/PublicAPI.Unshipped.txt | 15 ++ 10 files changed, 306 insertions(+), 38 deletions(-) create mode 100644 Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs create mode 100644 Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs diff --git a/Alpaca.Markets/AlpacaCryptoDataClient.cs b/Alpaca.Markets/AlpacaCryptoDataClient.cs index f69aab85..00fbbcd2 100644 --- a/Alpaca.Markets/AlpacaCryptoDataClient.cs +++ b/Alpaca.Markets/AlpacaCryptoDataClient.cs @@ -3,7 +3,10 @@ using JsonLatestData = JsonLatestData; internal sealed class AlpacaCryptoDataClient : - DataHistoricalClientBase, + DataHistoricalClientBase< + HistoricalCryptoBarsRequest, + HistoricalCryptoQuotesRequest, JsonHistoricalCryptoQuote, + HistoricalCryptoTradesRequest, JsonHistoricalTrade>, IAlpacaCryptoDataClient { internal AlpacaCryptoDataClient( diff --git a/Alpaca.Markets/AlpacaDataClient.cs b/Alpaca.Markets/AlpacaDataClient.cs index 853021c4..b5bd8d6d 100644 --- a/Alpaca.Markets/AlpacaDataClient.cs +++ b/Alpaca.Markets/AlpacaDataClient.cs @@ -3,7 +3,10 @@ using JsonLatestData = JsonLatestData; internal sealed class AlpacaDataClient : - DataHistoricalClientBase, + DataHistoricalClientBase< + HistoricalBarsRequest, + HistoricalQuotesRequest, JsonHistoricalQuote, + HistoricalTradesRequest, JsonHistoricalTrade>, IAlpacaDataClient { internal AlpacaDataClient( diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs index 3ebeea8a..1779a6f0 100644 --- a/Alpaca.Markets/AlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -2,31 +2,25 @@ using JsonLatestData=JsonLatestData; -internal sealed class AlpacaOptionsDataClient : IAlpacaOptionsDataClient - //where THistoricalQuotesRequest : HistoricalRequestBase, Validation.IRequest - //where THistoricalTradesRequest : HistoricalRequestBase, Validation.IRequest - //where THistoricalBarsRequest : HistoricalRequestBase, Validation.IRequest - //where THistoricalQuote : IQuote, ISymbolMutable +internal sealed class AlpacaOptionsDataClient : + DataHistoricalClientBase< + HistoricalOptionBarsRequest, + HistoricalQuotesRequest, JsonHistoricalQuote, + HistoricalOptionTradesRequest, JsonOptionTrade>, + IAlpacaOptionsDataClient { - private readonly RateLimitHandler _rateLimitHandler = new(); - - private readonly HttpClient _httpClient; - internal AlpacaOptionsDataClient( - AlpacaOptionsDataClientConfiguration configuration) => - _httpClient = configuration.EnsureNotNull().GetConfiguredHttpClient(); - - public void Dispose() + AlpacaOptionsDataClientConfiguration configuration) +#pragma warning disable CA2000 + : base(configuration.EnsureNotNull().GetConfiguredHttpClient()) +#pragma warning restore CA2000 { - _httpClient.Dispose(); - _rateLimitHandler.Dispose(); } - public IRateLimitValues GetRateLimitValues() => _rateLimitHandler.GetCurrent(); public Task> ListExchangesAsync( CancellationToken cancellationToken = default) => - _httpClient.GetAsync, Dictionary>( - "meta/exchanges", _rateLimitHandler, cancellationToken); + HttpClient.GetAsync, Dictionary>( + "meta/exchanges", RateLimitHandler, cancellationToken); public Task> ListLatestQuotesAsync( IEnumerable symbols, @@ -58,15 +52,15 @@ private async Task> getLatestAsync> itemsSelector, CancellationToken cancellationToken) where TJson : TApi, ISymbolMutable => - await _httpClient.GetAsync( + await HttpClient.GetAsync( await getUriBuilderAsync(symbols, lastPathSegment).ConfigureAwait(false), itemsSelector, withSymbol, - _rateLimitHandler, cancellationToken).ConfigureAwait(false); + RateLimitHandler, cancellationToken).ConfigureAwait(false); private async ValueTask getUriBuilderAsync( IEnumerable symbols, String lastPathSegment) => - new UriBuilder(_httpClient.BaseAddress!) + new UriBuilder(HttpClient.BaseAddress!) { Query = await new QueryBuilder() .AddParameter("symbols", symbols.ToList()) diff --git a/Alpaca.Markets/DataHistoricalClientBase.cs b/Alpaca.Markets/DataHistoricalClientBase.cs index 2c814e76..172a0154 100644 --- a/Alpaca.Markets/DataHistoricalClientBase.cs +++ b/Alpaca.Markets/DataHistoricalClientBase.cs @@ -1,11 +1,15 @@ namespace Alpaca.Markets; -internal abstract class DataHistoricalClientBase(HttpClient httpClient) : IRateLimitProvider, IDisposable +internal abstract class DataHistoricalClientBase< + THistoricalBarsRequest, + THistoricalQuotesRequest, THistoricalQuote, + THistoricalTradesRequest, THistoricalTrade> + (HttpClient httpClient) : IRateLimitProvider, IDisposable where THistoricalQuotesRequest : HistoricalRequestBase, Validation.IRequest where THistoricalTradesRequest : HistoricalRequestBase, Validation.IRequest where THistoricalBarsRequest : HistoricalRequestBase, Validation.IRequest where THistoricalQuote : IQuote, ISymbolMutable + where THistoricalTrade : ITrade, ISymbolMutable { protected readonly RateLimitHandler RateLimitHandler = new(); @@ -54,13 +58,15 @@ public Task> ListHistoricalTradesAsync( CancellationToken cancellationToken = default) => request.HasSingleSymbol ? listHistoricalTradesAsync(request, cancellationToken) - : getHistoricalTradesAsync(request, cancellationToken).AsPageAsync(); + : getHistoricalTradesAsync(request, cancellationToken) + .AsPageAsync>(); public Task> GetHistoricalTradesAsync( THistoricalTradesRequest request, CancellationToken cancellationToken = default) => request.HasSingleSymbol - ? listHistoricalTradesAsync(request, cancellationToken).AsMultiPageAsync() + ? listHistoricalTradesAsync(request, cancellationToken) + .AsMultiPageAsync>() : getHistoricalTradesAsync(request, cancellationToken); public Task> ListHistoricalAuctionsAsync( @@ -112,7 +118,7 @@ await request.EnsureNotNull().Validate() private async Task> listHistoricalTradesAsync( THistoricalTradesRequest request, CancellationToken cancellationToken = default) => - await HttpClient.GetAsync, JsonTradesPage>( + await HttpClient.GetAsync, JsonTradesPage>( await request.EnsureNotNull().Validate() .GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); @@ -120,7 +126,7 @@ await request.EnsureNotNull().Validate() private async Task> getHistoricalTradesAsync( THistoricalTradesRequest request, CancellationToken cancellationToken = default) => - await HttpClient.GetAsync, JsonMultiTradesPage>( + await HttpClient.GetAsync, JsonMultiTradesPage>( await request.EnsureNotNull().Validate() .GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); diff --git a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs index 68893088..124a6a8a 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs @@ -5,9 +5,8 @@ /// [CLSCompliant(false)] public interface IAlpacaOptionsDataClient : - //IHistoricalQuotesClient, - //IHistoricalTradesClient, - //IHistoricalBarsClient, + IHistoricalTradesClient, + IHistoricalBarsClient, IRateLimitProvider, IDisposable { diff --git a/Alpaca.Markets/Messages/JsonMultiTradesPage.cs b/Alpaca.Markets/Messages/JsonMultiTradesPage.cs index 7de7c509..5bbf2bf1 100644 --- a/Alpaca.Markets/Messages/JsonMultiTradesPage.cs +++ b/Alpaca.Markets/Messages/JsonMultiTradesPage.cs @@ -1,11 +1,12 @@ namespace Alpaca.Markets; [DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IPage) + "<" + nameof(ITrade) + ">")] -internal sealed class JsonMultiTradesPage : IMultiPageMutable +internal sealed class JsonMultiTradesPage : IMultiPageMutable + where TTrade : ITrade, ISymbolMutable { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "trades", Required = Required.Default)] - public Dictionary?> ItemsDictionary { get; [ExcludeFromCodeCoverage] set; } = new(); + public Dictionary?> ItemsDictionary { get; [ExcludeFromCodeCoverage] set; } = new(); [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] public String? NextPageToken { get; set; } @@ -18,7 +19,7 @@ internal sealed class JsonMultiTradesPage : IMultiPageMutable [UsedImplicitly] internal void OnDeserializedMethod( StreamingContext _) => - Items = ItemsDictionary.SetSymbol(); + Items = ItemsDictionary.SetSymbol(); [ExcludeFromCodeCoverage] public override String ToString() => diff --git a/Alpaca.Markets/Messages/JsonTradesPage.cs b/Alpaca.Markets/Messages/JsonTradesPage.cs index c8d4ff09..3b100192 100644 --- a/Alpaca.Markets/Messages/JsonTradesPage.cs +++ b/Alpaca.Markets/Messages/JsonTradesPage.cs @@ -1,11 +1,12 @@ namespace Alpaca.Markets; [DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IPage) + "<" + nameof(ITrade) + ">")] -internal sealed class JsonTradesPage : IPageMutable, ISymbolMutable +internal sealed class JsonTradesPage : IPageMutable, ISymbolMutable + where TTrade : ITrade, ISymbolMutable { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "trades", Required = Required.Default)] - public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; + public List ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "symbol", Required = Required.Always)] public String Symbol { get; set; } = String.Empty; @@ -22,7 +23,7 @@ internal sealed class JsonTradesPage : IPageMutable, ISymbolMutable [UsedImplicitly] internal void OnDeserializedMethod( StreamingContext _) => - Items = ItemsList.SetSymbol(Symbol).EmptyIfNull(); + Items = ItemsList.SetSymbol(Symbol).EmptyIfNull(); [ExcludeFromCodeCoverage] public override String ToString() => diff --git a/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs new file mode 100644 index 00000000..e06144c6 --- /dev/null +++ b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs @@ -0,0 +1,133 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates request parameters for +/// and +/// calls. +/// +public sealed class HistoricalOptionBarsRequest : HistoricalRequestBase, IHistoricalRequest +{ + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Type of time bars for retrieval. + /// Filter data equal to or after this time. + /// Filter data equal to or before this time. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + String symbol, + DateTime from, + DateTime into, + BarTimeFrame timeFrame) + : this(new[] { symbol.EnsureNotNull() }, from, into, timeFrame) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Type of time bars for retrieval. + /// Inclusive time interval for filtering items in response. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + String symbol, + BarTimeFrame timeFrame, + Interval timeInterval) + : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Type of time bars for retrieval. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + String symbol, + BarTimeFrame timeFrame) + : this(new[] { symbol.EnsureNotNull() }, timeFrame) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbols for data retrieval. + /// Type of time bars for retrieval. + /// Filter data equal to or after this time. + /// Filter data equal to or before this time. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + IEnumerable symbols, + DateTime from, + DateTime into, + BarTimeFrame timeFrame) + : base(symbols.EnsureNotNull(), from, into) => + TimeFrame = timeFrame; + + /// + /// Creates new instance of object. + /// + /// Asset symbols for data retrieval. + /// Type of time bars for retrieval. + /// Inclusive time interval for filtering items in response. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + IEnumerable symbols, + Interval timeInterval, + BarTimeFrame timeFrame) + : base(symbols.EnsureNotNull(), timeInterval) => + TimeFrame = timeFrame; + + /// + /// Creates new instance of object. + /// + /// Asset symbols for data retrieval. + /// Type of time bars for retrieval. + /// + /// The argument is null. + /// + public HistoricalOptionBarsRequest( + IEnumerable symbols, + BarTimeFrame timeFrame) + : base(symbols.EnsureNotNull(), new Interval()) => + TimeFrame = timeFrame; + + /// + /// Gets type of time bars for retrieval. + /// + [UsedImplicitly] + public BarTimeFrame TimeFrame { get; } + + /// + protected override String LastPathSegment => "bars"; + + /// + internal override Boolean HasSingleSymbol => false; + + internal override QueryBuilder AddParameters( + QueryBuilder queryBuilder) => + queryBuilder + // ReSharper disable once StringLiteralTypo + .AddParameter("timeframe", TimeFrame.ToString()); + + HistoricalOptionBarsRequest IHistoricalRequest.GetValidatedRequestWithoutPageToken() => + new HistoricalOptionBarsRequest(Symbols, TimeInterval, TimeFrame) + { + SortDirection = SortDirection, + } + .WithPageSize(this.GetPageSize()); +} \ No newline at end of file diff --git a/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs new file mode 100644 index 00000000..4ac9e5c7 --- /dev/null +++ b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs @@ -0,0 +1,113 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates request parameters for +/// and +/// calls. +/// +[UsedImplicitly] +public sealed class HistoricalOptionTradesRequest : HistoricalRequestBase, IHistoricalRequest +{ + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Filter data equal to or after this time. + /// Filter data equal to or before this time. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + String symbol, + DateTime from, + DateTime into) + : this(new[] { symbol.EnsureNotNull() }, from, into) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Inclusive time interval for filtering items in response. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + String symbol, + Interval timeInterval) + : this(new[] { symbol.EnsureNotNull() }, timeInterval) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + String symbol) + : this(new[] { symbol.EnsureNotNull() }) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbols for data retrieval. + /// Filter data equal to or after this time. + /// Filter data equal to or before this time. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + IEnumerable symbols, + DateTime from, + DateTime into) + : base(symbols.EnsureNotNull(), from, into) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// Inclusive time interval for filtering items in response. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + IEnumerable symbols, + Interval timeInterval) + : base(symbols.EnsureNotNull(), timeInterval) + { + } + + /// + /// Creates new instance of object. + /// + /// Asset symbol for data retrieval. + /// + /// The argument is null. + /// + public HistoricalOptionTradesRequest( + IEnumerable symbols) + : base(symbols.EnsureNotNull(), new Interval()) + { + } + + /// + protected override String LastPathSegment => "trades"; + + /// + internal override Boolean HasSingleSymbol => false; + + HistoricalOptionTradesRequest IHistoricalRequest.GetValidatedRequestWithoutPageToken() => + new HistoricalOptionTradesRequest(Symbols, TimeInterval) + { + SortDirection = SortDirection, + } + .WithPageSize(this.GetPageSize()); +} \ No newline at end of file diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 0083c654..d7a66ebf 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -2,6 +2,21 @@ Alpaca.Markets.AlpacaOptionsDataClientConfiguration Alpaca.Markets.AlpacaOptionsDataClientConfiguration.AlpacaOptionsDataClientConfiguration() -> void Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass +Alpaca.Markets.HistoricalOptionBarsRequest +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.TimeFrame.get -> Alpaca.Markets.BarTimeFrame +Alpaca.Markets.HistoricalOptionTradesRequest +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, System.DateTime from, System.DateTime into) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into) -> void Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? From a2161f9b3079d3a06709c27cc045f0df3ba242f5 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 3 Mar 2024 18:16:37 +0100 Subject: [PATCH 064/125] Issue #720 - Added unit tests for the new functions/objects. --- .../Alpaca.Markets.Tests.csproj | 3 + .../AlpacaDataStreamingClientTest.cs | 22 ++++ .../AlpacaOptionsDataClientTest.Bars.cs | 94 +++++++++++++++ .../AlpacaOptionsDataClientTest.Snapshots.cs | 59 +++++++++ .../AlpacaOptionsDataClientTest.Trades.cs | 94 +++++++++++++++ .../AlpacaOptionsDataClientTest.cs | 114 ++++++++++++++++++ .../AlpacaTradingClientTest.Account.cs | 2 +- Alpaca.Markets.Tests/HistoricalDataHelpers.cs | 29 ++++- Alpaca.Markets.Tests/MockClientsFactory.cs | 5 + .../Extensions/ConfigurationExtensions.cs | 15 +++ Alpaca.Markets/PublicAPI.Unshipped.txt | 1 + 11 files changed, 433 insertions(+), 5 deletions(-) create mode 100644 Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs create mode 100644 Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs create mode 100644 Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs create mode 100644 Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 7cbf44b6..19c0b8e4 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -38,6 +38,9 @@ AlpacaCryptoDataClientTest.cs + + AlpacaOptionsDataClientTest.cs + diff --git a/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs b/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs index 9936584b..f6c7f5ef 100644 --- a/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataStreamingClientTest.cs @@ -79,6 +79,28 @@ await client.AddMessageAsync( await client.Client.DisconnectAsync(); } + [Fact] + public async Task ConnectAndSubscribeAllTradesWorks() + { + using var client = mockClientsFactory.GetAlpacaDataStreamingClientMock(); + + await client.AddAuthenticationAsync(); + + Assert.Equal(AuthStatus.Authorized, + await client.Client.ConnectAndAuthenticateAsync()); + + await using (var helper = await SubscriptionHelper.Create( + client.Client, trade => trade.Validate(Stock), + streamingClient => streamingClient.GetTradeSubscription())) + { + await client.AddMessageAsync( + new JArray(Stock.CreateStreamingTrade("t"))); + Assert.True(helper.WaitAll()); + } + + await client.Client.DisconnectAsync(); + } + [Fact] public async Task ConnectAndSubscribeStatusesWorks() { diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs new file mode 100644 index 00000000..4a6e3878 --- /dev/null +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs @@ -0,0 +1,94 @@ +namespace Alpaca.Markets.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task GetHistoricalBarsAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); + + var bars = await mock.Client.GetHistoricalBarsAsync( + new HistoricalOptionBarsRequest(_symbols, Yesterday, Today, BarTimeFrame.Hour)); + + Assert.NotNull(bars); + Assert.NotEmpty(bars.Items); + + foreach (var symbol in _symbols) + { + bars.Items[symbol].Validate(symbol); + } + } + + [Fact] + public async Task GetHistoricalBarsAsyncForSingleWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiBarsPageExpectation(PathPrefix, [ Symbol ]); + + var bars = await mock.Client.GetHistoricalBarsAsync( + new HistoricalOptionBarsRequest(Symbol, BarTimeFrame.Hour, _timeInterval)); + + Assert.NotNull(bars); + Assert.NotEmpty(bars.Items); + + bars.Items[Symbol].Validate(Symbol); + } + + [Fact] + public async Task ListHistoricalBarsAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiBarsPageExpectation(PathPrefix, [ Symbol ]); + + var bars = await mock.Client.ListHistoricalBarsAsync( + new HistoricalOptionBarsRequest(Symbol, Yesterday, Today, BarTimeFrame.Hour)); + + Assert.NotNull(bars); + Assert.NotEmpty(bars.Items); + Assert.Equal(Symbol, bars.Symbol); + + bars.Items.Validate(Symbol); + } + + [Fact] + public async Task ListHistoricalBarsAsyncForManyWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiBarsPageExpectation(PathPrefix, _symbols); + + var bars = await mock.Client.ListHistoricalBarsAsync( + new HistoricalOptionBarsRequest(_symbols, _timeInterval, BarTimeFrame.Hour)); + + Assert.NotNull(bars); + Assert.NotEmpty(bars.Items); + Assert.Equal(String.Empty, bars.Symbol); + + foreach (var symbol in _symbols) + { + bars.Items.Where(bar => bar.Symbol == symbol).Validate(symbol); + } + } + + [Fact] + public async Task ListHistoricalBarsAsyncWithoutIntervalWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + var symbol = _symbols.Take(1).ToList(); + mock.AddMultiBarsPageExpectation(PathPrefix, symbol); + + var bars = await mock.Client.ListHistoricalBarsAsync( + new HistoricalOptionBarsRequest(symbol, BarTimeFrame.Hour)); + + Assert.NotNull(bars); + Assert.NotEmpty(bars.Items); + Assert.Equal(symbol.Single(), bars.Symbol); + + bars.Items.Validate(symbol.Single()); + } +} diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs new file mode 100644 index 00000000..67f3b247 --- /dev/null +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -0,0 +1,59 @@ +namespace Alpaca.Markets.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task ListSnapshotsAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); + + var snapshots = await mock.Client.ListSnapshotsAsync(_symbols); + + Assert.NotNull(snapshots); + Assert.NotEmpty(snapshots); + + foreach (var symbol in _symbols) + { + var snapshot = snapshots[symbol]; + validate(snapshot, symbol); + } + } + + [Fact] + public async Task GetOptionChainAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddOptionChainExpectation(PathPrefix, _symbols); + + var snapshots = await mock.Client.GetOptionChainAsync("AAPL"); + + Assert.NotNull(snapshots); + Assert.NotEmpty(snapshots); + + foreach (var symbol in _symbols) + { + var snapshot = snapshots[symbol]; + validate(snapshot, symbol); + } + } + + private static void validate( + ISnapshot snapshot, + String symbol) + { + Assert.Equal(symbol, snapshot.Symbol); + + Assert.Null(snapshot.PreviousDailyBar); + Assert.Null(snapshot.CurrentDailyBar); + Assert.Null(snapshot.MinuteBar); + + Assert.NotNull(snapshot.Trade); + Assert.NotNull(snapshot.Quote); + + Assert.True(snapshot.Trade.Validate(symbol)); + Assert.True(snapshot.Quote.Validate(symbol)); + } +} diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs new file mode 100644 index 00000000..e7990081 --- /dev/null +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs @@ -0,0 +1,94 @@ +namespace Alpaca.Markets.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task GetHistoricalTradesAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); + + var trades = await mock.Client.GetHistoricalTradesAsync( + new HistoricalOptionTradesRequest(_symbols, Yesterday, Today)); + + Assert.NotNull(trades); + Assert.NotEmpty(trades.Items); + + foreach (var symbol in _symbols) + { + trades.Items[symbol].Validate(symbol); + } + } + + [Fact] + public async Task GetHistoricalTradesAsyncForSingleWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiTradesPageExpectation(PathPrefix, [ Symbol ]); + + var trades = await mock.Client.GetHistoricalTradesAsync( + new HistoricalOptionTradesRequest(Symbol, _timeInterval)); + + Assert.NotNull(trades); + Assert.NotEmpty(trades.Items); + + trades.Items[Symbol].Validate(Symbol); + } + + [Fact] + public async Task ListHistoricalTradesAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + var symbol = _symbols.Take(1).ToList(); + mock.AddMultiTradesPageExpectation(PathPrefix, symbol); + + var trades = await mock.Client.ListHistoricalTradesAsync( + new HistoricalOptionTradesRequest(symbol, Yesterday, Today)); + + Assert.NotNull(trades); + Assert.NotEmpty(trades.Items); + Assert.Equal(symbol.Single(), trades.Symbol); + + trades.Items.Validate(symbol.Single()); + } + + [Fact] + public async Task ListHistoricalTradesAsyncForManyWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiTradesPageExpectation(PathPrefix, _symbols); + + var trades = await mock.Client.ListHistoricalTradesAsync( + new HistoricalOptionTradesRequest(_symbols, _timeInterval)); + + Assert.NotNull(trades); + Assert.NotEmpty(trades.Items); + Assert.Equal(String.Empty, trades.Symbol); + + foreach (var symbol in _symbols) + { + trades.Items.Where(bar => bar.Symbol == symbol).Validate(symbol); + } + } + + [Fact] + public async Task ListHistoricalTradesAsyncWithoutIntervalWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddMultiTradesPageExpectation(PathPrefix, [ Symbol ]); + + var trades = await mock.Client.ListHistoricalTradesAsync( + new HistoricalOptionTradesRequest(Symbol)); + + Assert.NotNull(trades); + Assert.NotEmpty(trades.Items); + Assert.Equal(Symbol, trades.Symbol); + + trades.Items.Validate(Symbol); + } +} diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs new file mode 100644 index 00000000..fffd176f --- /dev/null +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs @@ -0,0 +1,114 @@ +using System.Globalization; + +namespace Alpaca.Markets.Tests; + +[Collection("MockEnvironment")] +public sealed partial class AlpacaOptionsDataClientTest( + MockClientsFactoryFixture mockClientsFactory) +{ + private static readonly String[] _symbols = [ Symbol, "AAPL240315C00225000" ]; + + private static readonly Interval _timeInterval = getTimeInterval(); + + private static DateTime Yesterday => _timeInterval.From!.Value; + + private static DateTime Today => _timeInterval.Into!.Value; + + private const String PathPrefix = "/v1beta1/options"; + + private const String Symbol = "AAPL241220C00300000"; + + [Fact] + public void AlpacaDataClientConfigurationValidationWorks() + { +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. + var nullSecurityId = new AlpacaOptionsDataClientConfiguration { SecurityId = null }; +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. + Assert.Throws(() => + mockClientsFactory.GetAlpacaOptionsDataClientMock(Environments.Paper, nullSecurityId)); + +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. + var nullApiEndpoint = new AlpacaOptionsDataClientConfiguration { ApiEndpoint = null }; +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. + Assert.Throws(() => + mockClientsFactory.GetAlpacaOptionsDataClientMock(Environments.Paper, nullApiEndpoint)); + +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. + var nullThrottleParameters = new AlpacaOptionsDataClientConfiguration { ThrottleParameters = null }; +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. + Assert.Throws(() => + mockClientsFactory.GetAlpacaOptionsDataClientMock(Environments.Paper, nullThrottleParameters)); + } + + [Fact] + public async Task ListExchangesAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddGet($"{PathPrefix}/meta/exchanges", createDictionary()); + + verifyDictionary(await mock.Client.ListExchangesAsync()); + } + + [Fact] + public async Task ListLatestQuotesAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddLatestQuotesExpectation(PathPrefix, _symbols); + + var quotes = await mock.Client.ListLatestQuotesAsync(_symbols); + + Assert.NotNull(quotes); + Assert.NotEmpty(quotes); + + foreach (var symbol in _symbols) + { + Assert.True(quotes[symbol].Validate(symbol)); + } + + Assert.NotNull(mock.Client.GetRateLimitValues()); + } + + [Fact] + public async Task ListLatestTradesAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + mock.AddLatestTradesExpectation(PathPrefix, _symbols); + + var trades = await mock.Client.ListLatestTradesAsync(_symbols); + + Assert.NotNull(trades); + Assert.NotEmpty(trades); + + foreach (var symbol in _symbols) + { + Assert.True(trades[symbol].Validate(symbol)); + } + } + + private static JObject createDictionary() => + new(Enumerable.Range(1, 10) + .Select(index => new JProperty( + index.ToString("D", CultureInfo.InvariantCulture), + Guid.NewGuid().ToString("D")))); + + private static void verifyDictionary( + IReadOnlyDictionary dictionary) + { + Assert.NotEmpty(dictionary); + foreach (var (code, name) in dictionary) + { + Assert.False(String.IsNullOrEmpty(code)); + Assert.False(String.IsNullOrWhiteSpace(name)); + } + } + + private static Interval getTimeInterval() + { + var today = DateTime.Today; + var yesterday = today.AddDays(-1); + return new Interval(yesterday, today); + } +} diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index 6e98d418..c85f135a 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -228,7 +228,7 @@ public async Task PatchAccountConfigurationAsyncWorks() private static JObject createConfiguration() => new( // ReSharper disable once StringLiteralTypo - new JProperty("max_option_trading_level", OptionsTradingLevel.LongCallPut), + new JProperty("max_options_trading_level", OptionsTradingLevel.LongCallPut), new JProperty("dtbp_check", DayTradeMarginCallProtection.Both), new JProperty("trade_confirm_email", TradeConfirmEmail.All), new JProperty("ptp_no_exception_entry", false), diff --git a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs index fb7b44d0..d6840b34 100644 --- a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs +++ b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs @@ -111,6 +111,12 @@ internal static void AddCryptoSnapshotsExpectation( new JProperty("snapshots", new JObject( symbols.Select(name => new JProperty(name, createSnapshot())))))); + internal static void AddOptionChainExpectation( + this IMock mock, String pathPrefix, IEnumerable symbols) => + mock.AddGet($"{pathPrefix}/snapshots/*", new JObject( + new JProperty("snapshots", new JObject( + symbols.Select(name => new JProperty(name, createSnapshot())))))); + internal static void AddOrderBooksExpectation( this IMock mock, String pathPrefix, IEnumerable symbols) => mock.addLatestCryptoExpectation(pathPrefix, symbols, "orderbooks", createOrderBook); @@ -202,13 +208,21 @@ public static Boolean Validate( Assert.Equal(String.Empty, trade.Update); Assert.Equal(_exchange, trade.Exchange); - Assert.Equal(_tape, trade.Tape); Assert.Equal(TakerSide.Unknown, trade.TakerSide); - Assert.Equal(TradeId, trade.TradeId); Assert.Equal(MidPrice, trade.Price); Assert.Equal(Size, trade.Size); + if (trade.TradeId != 0) + { + Assert.Equal(TradeId, trade.TradeId); + Assert.Equal(_tape, trade.Tape); + } + else + { + Assert.Equal(String.Empty, trade.Tape); + } + return true; } @@ -219,10 +233,17 @@ public static Boolean Validate( Assert.True(quote.TimestampUtc <= DateTime.UtcNow); Assert.Equal(symbol, quote.Symbol); - if (String.IsNullOrEmpty(quote.Tape)) // Crypto quote + if (String.IsNullOrEmpty(quote.Tape)) // Crypto or option quote { Assert.Equal(String.Empty, quote.Tape); - Assert.Empty(quote.Conditions); + if (quote.Conditions.Any()) // Option quote + { + Assert.Equal(_condition, quote.Conditions.Single()); + } + else + { + Assert.Empty(quote.Conditions); + } } else { diff --git a/Alpaca.Markets.Tests/MockClientsFactory.cs b/Alpaca.Markets.Tests/MockClientsFactory.cs index e52f515a..ac78ca74 100644 --- a/Alpaca.Markets.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Tests/MockClientsFactory.cs @@ -27,6 +27,11 @@ internal MockHttpClient new(configuration ?? getEnvironment(environment).GetAlpacaCryptoDataClientConfiguration(_secretKey),clientConfiguration => clientConfiguration.GetClient()); + internal MockHttpClient GetAlpacaOptionsDataClientMock( + IEnvironment? environment = null, + AlpacaOptionsDataClientConfiguration? configuration = null) => + new(configuration ?? getEnvironment(environment).GetAlpacaOptionsDataClientConfiguration(_secretKey), clientConfiguration => clientConfiguration.GetClient()); + internal MockWsClient GetAlpacaStreamingClientMock( IEnvironment? environment = null, AlpacaStreamingClientConfiguration? configuration = null) => diff --git a/Alpaca.Markets/Extensions/ConfigurationExtensions.cs b/Alpaca.Markets/Extensions/ConfigurationExtensions.cs index 91c9d51e..996d6dfe 100644 --- a/Alpaca.Markets/Extensions/ConfigurationExtensions.cs +++ b/Alpaca.Markets/Extensions/ConfigurationExtensions.cs @@ -68,6 +68,21 @@ public static IAlpacaDataClient GetClient( this AlpacaDataClientConfiguration configuration) => new AlpacaDataClient(configuration.EnsureNotNull()); + /// + /// Creates a new instance of interface + /// implementation using the argument. + /// + /// Client configuration parameters. + /// + /// The argument is null. + /// + /// A new instance of interface implementation. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAlpacaOptionsDataClient GetClient( + this AlpacaOptionsDataClientConfiguration configuration) => + new AlpacaOptionsDataClient(configuration.EnsureNotNull()); + /// /// Creates a new instance of interface /// implementation using the argument. diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index d7a66ebf..026a3d7f 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -85,3 +85,4 @@ Alpaca.Markets.OptionType.Call = 0 -> Alpaca.Markets.OptionType Alpaca.Markets.OptionType.Put = 1 -> Alpaca.Markets.OptionType static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaOptionsDataClient! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaOptionsDataClientConfiguration! +static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaOptionsDataClient! From a1ca437d5042d43d7fd167c595b24f108e5c44c5 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 4 Mar 2024 10:25:18 +0100 Subject: [PATCH 065/125] Cleaned up code a bit with help of R# solution analysis. --- .../AlpacaTradingClientTest.Account.cs | 12 +++++++----- .../AlpacaTradingClientTest.Assets.cs | 4 +++- .../AlpacaTradingClientTest.Options.cs | 2 ++ Alpaca.Markets.Tests/HistoricalDataHelpers.cs | 8 +++++--- Alpaca.Markets.Tests/MockClientsFactory.cs | 2 ++ Alpaca.Markets/Messages/JsonOptionQuote.cs | 4 +--- .../Parameters/HistoricalOptionBarsRequest.cs | 6 +++--- .../Parameters/HistoricalOptionTradesRequest.cs | 4 ++-- 8 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index c85f135a..4cf8eaf7 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -9,7 +9,9 @@ public sealed partial class AlpacaTradingClientTest private const Decimal Price = 1234.56M; [Fact] +#pragma warning disable IDE0079 // Remove unnecessary suppression [SuppressMessage("ReSharper", "StringLiteralTypo")] +#pragma warning restore IDE0079 // Remove unnecessary suppression public async Task GetAccountAsyncWorks() { const Decimal cash = 10_000M; @@ -67,11 +69,11 @@ public async Task GetAccountAsyncWorks() Assert.Equal(transfer, account.AccruedFees); Assert.Equal(cash, account.OptionsBuyingPower); - Assert.True(account.LastMaintenanceMargin != 0M); - Assert.True(account.MaintenanceMargin != 0M); - Assert.True(account.TradableCash != 0M); - Assert.True(account.LastEquity != 0M); - Assert.True(account.Sma != 0M); + Assert.NotEqual(0M, account.LastMaintenanceMargin); + Assert.NotEqual(0M, account.MaintenanceMargin); + Assert.NotEqual(0M, account.TradableCash); + Assert.NotEqual(0M, account.LastEquity); + Assert.NotEqual(0M, account.Sma); Assert.NotNull(account.AccountNumber); diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs index ac3e03aa..1c95075a 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Assets.cs @@ -67,7 +67,9 @@ private static JObject createAsset( new JProperty("name", symbol), new JProperty("id", assetId)); +#pragma warning disable IDE0079 [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")] +#pragma warning restore IDE0079 private static void validateAsset( IAsset asset, Guid assetId, @@ -91,6 +93,6 @@ private static void validateAsset( Assert.NotNull(asset.MaintenanceMarginRequirement); Assert.Single(asset.Attributes); - Assert.Equal(AssetAttributes.PtpNoException, asset.Attributes.First()); + Assert.Equal(AssetAttributes.PtpNoException, asset.Attributes[0]); } } diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs index 91ee59f1..e8a1b4b8 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs @@ -88,7 +88,9 @@ private static JObject createOptionContract( new JProperty("name", symbol), new JProperty("size", 100)); +#pragma warning disable IDE0079 [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")] +#pragma warning restore IDE0079 private static void validateOptionContract( IOptionContract optionContract, Guid contractId, diff --git a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs index d6840b34..e625f05a 100644 --- a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs +++ b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs @@ -2,8 +2,10 @@ namespace Alpaca.Markets.Tests; +#pragma warning disable IDE0079 // Remove unnecessary suppression [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Global")] [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")] +#pragma warning restore IDE0079 // Remove unnecessary suppression internal static class HistoricalDataHelpers { private static readonly String _condition = Guid.NewGuid().ToString("D"); @@ -189,9 +191,9 @@ public static Boolean Validate( Assert.InRange(bar.Open, bar.Low, bar.High); Assert.True(bar.TimeUtc <= DateTime.UtcNow); - Assert.True(bar.TradeCount != 0); - Assert.True(bar.Volume != 0M); - Assert.True(bar.Vwap != 0M); + Assert.NotEqual(0UL, bar.TradeCount); + Assert.NotEqual(0M, bar.Volume); + Assert.NotEqual(0M, bar.Vwap); return true; } diff --git a/Alpaca.Markets.Tests/MockClientsFactory.cs b/Alpaca.Markets.Tests/MockClientsFactory.cs index ac78ca74..5a20daf0 100644 --- a/Alpaca.Markets.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Tests/MockClientsFactory.cs @@ -4,7 +4,9 @@ namespace Alpaca.Markets.Tests; +#pragma warning disable IDE0079 // Remove unnecessary suppression [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] +#pragma warning restore IDE0079 // Remove unnecessary suppression public sealed class MockClientsFactoryFixture { private readonly SecurityKey _secretKey = new SecretKey( diff --git a/Alpaca.Markets/Messages/JsonOptionQuote.cs b/Alpaca.Markets/Messages/JsonOptionQuote.cs index ea00fd1e..84512abf 100644 --- a/Alpaca.Markets/Messages/JsonOptionQuote.cs +++ b/Alpaca.Markets/Messages/JsonOptionQuote.cs @@ -1,6 +1,4 @@ -using Newtonsoft.Json.Linq; - -namespace Alpaca.Markets; +namespace Alpaca.Markets; [DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IQuote))] [SuppressMessage( diff --git a/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs index e06144c6..1b6358d3 100644 --- a/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs @@ -39,7 +39,7 @@ public HistoricalOptionBarsRequest( String symbol, BarTimeFrame timeFrame, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + : this([ symbol.EnsureNotNull() ], timeInterval, timeFrame) { } @@ -127,7 +127,7 @@ internal override QueryBuilder AddParameters( HistoricalOptionBarsRequest IHistoricalRequest.GetValidatedRequestWithoutPageToken() => new HistoricalOptionBarsRequest(Symbols, TimeInterval, TimeFrame) { - SortDirection = SortDirection, + SortDirection = SortDirection } .WithPageSize(this.GetPageSize()); -} \ No newline at end of file +} diff --git a/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs index 4ac9e5c7..da18b5d1 100644 --- a/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs @@ -107,7 +107,7 @@ public HistoricalOptionTradesRequest( HistoricalOptionTradesRequest IHistoricalRequest.GetValidatedRequestWithoutPageToken() => new HistoricalOptionTradesRequest(Symbols, TimeInterval) { - SortDirection = SortDirection, + SortDirection = SortDirection } .WithPageSize(this.GetPageSize()); -} \ No newline at end of file +} From e81c3e60d7e12f94dd432989e93cd6a3371dd5b6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 4 Mar 2024 10:32:26 +0100 Subject: [PATCH 066/125] Prepare release 7.1.0-beta1 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 1f96ba92..5939b5db 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,17 +12,26 @@ - 7.0.1.0 - 7.0.1.0 - 7.0.1 + 7.1.0.0 + 7.1.0.0 + 7.1.0-beta1 -- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties +- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties. - Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. - Added the new 'AssetType.UsOption` enumeration member. - Added the new 'OptionTradingLevel` enumeration. +- Added the new `IOptionContract` interface and two related enums: `OptionType` and `OptionStyle`. +- Added the new `IAlpacaTradingClient.GetOptionContractByIdAsync` and `IAlpacaTradingClient.GetOptionContractBySymbolAsync` methods. +- Added the new `IAlpacaTradingClient.ListOptionContractsAsync` method and related `OptionContractsRequest` class. +- Added the new `IAlpacaOptionDataClient` interface and related factory methods and configuration class. +- Added the new `IAlpacaOptionDataClient.ListLatestQuotesAsync` and `IAlpacaOptionDataClient.ListLatestTradesAsync` methods. +- Added the new `IAlpacaOptionDataClient.ListSnapshotsAsync` and `IAlpacaOptionDataClient.GetOptionChainAsync` methods. +- Added the new `IAlpacaOptionDataClient.ListExchangesAsync` method for metadata requesting. +- The `IAlpacaOptionDataClient` interface extended with the `IHistoricalTradesClient` and `IHistoricalBarsClient` interfaces. +- The new `HistoricalOptionTradesRequest` and `HistoricalOptionBarsRequest` classes were added. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 6c27e63b08d4a38edfca90fffc3b56940a54f329 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 4 Mar 2024 12:59:37 +0100 Subject: [PATCH 067/125] Issue #720 - More support for the options historical data requesting: - Added factory methods for creating the strongly typed `IAlpacaOptionsDataClient` instance in dependency injection environments. - Added the new extension method `ListOptionContractsAsAsyncEnumerable` for the `IAlpacaTradingClient` interface. --- .../Alpaca.Markets.Extensions.csproj | 13 +- .../AlpacaServiceCollectionExtensions.cs | 39 ++++++ .../AlpacaTradingClientExtensions.cs | 111 +++++++++++++++++- .../PublicAPI.Unshipped.txt | 4 + Alpaca.Markets.Extensions/packages.lock.json | 72 ++++++------ 5 files changed, 194 insertions(+), 45 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index ee1da7a5..0a14b56f 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,16 +12,15 @@ - 7.0.0.4 - 7.0.0.4 - 7.0.0 + 7.1.0.0 + 7.1.0.0 + 7.1.0-beta1 -= Added sorting support into all (quotes, trades, bars, etc.) stock/crypto historical data requests. -- The obsolete attribute was removed from historical crypto quotes requesting methods. -- Fixed problem with announcement object deserialization. +- Added factory methods for creating the strongly typed `IAlpacaOptionsDataClient` instance in dependency injection environments. +- Added the new extension method `ListOptionContractsAsAsyncEnumerable` for the `IAlpacaTradingClient` interface. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp @@ -100,7 +99,7 @@ - + diff --git a/Alpaca.Markets.Extensions/IHttpClient/AlpacaServiceCollectionExtensions.cs b/Alpaca.Markets.Extensions/IHttpClient/AlpacaServiceCollectionExtensions.cs index e5db498e..2b5e0a18 100644 --- a/Alpaca.Markets.Extensions/IHttpClient/AlpacaServiceCollectionExtensions.cs +++ b/Alpaca.Markets.Extensions/IHttpClient/AlpacaServiceCollectionExtensions.cs @@ -125,6 +125,45 @@ public static IHttpClientBuilder AddAlpacaTradingClient( .withFactoryCreatedHttpClient(httpClient).GetClient()) .withConfiguredPrimaryHttpMessageHandler(configuration.EnsureNotNull()); + /// + /// Registers the concrete implementation of the + /// interface in the services catalog and make it available in constructors. + /// + /// Registered services collection. + /// Alpaca environment data. + /// Alpaca security key. + /// + /// The , , or argument is null. + /// + /// The interface for further HTTP client customization. + [UsedImplicitly] + public static IHttpClientBuilder AddAlpacaOptionsDataClient( + this IServiceCollection services, + IEnvironment environment, + SecurityKey securityKey) => + services.EnsureNotNull().AddAlpacaOptionsDataClient(environment.EnsureNotNull() + .GetAlpacaOptionsDataClientConfiguration(securityKey.EnsureNotNull())); + + /// + /// Registers the concrete implementation of the + /// interface in the services catalog and make it available in constructors. + /// + /// Registered services collection. + /// Alpaca data client configuration. + /// + /// The or argument is null. + /// + /// The interface for further HTTP client customization. + [UsedImplicitly] + public static IHttpClientBuilder AddAlpacaOptionsDataClient( + this IServiceCollection services, + AlpacaOptionsDataClientConfiguration configuration) => + services.EnsureNotNull() + .AddHttpClient() + .AddTypedClient(httpClient => configuration.EnsureNotNull() + .withFactoryCreatedHttpClient(httpClient).GetClient()) + .withConfiguredPrimaryHttpMessageHandler(configuration.EnsureNotNull()); + private static TConfiguration withFactoryCreatedHttpClient( this TConfiguration configuration, HttpClient httpClient) diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs index 441869be..6d9a8f8e 100644 --- a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs @@ -8,7 +8,7 @@ public static partial class AlpacaTradingClientExtensions /// /// Gets all account activities from Alpaca REST API endpoint as async enumerable stream. /// - /// The object instance. + /// The object instance. /// Account activities request parameters. /// /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. @@ -39,7 +39,7 @@ public static IAsyncEnumerable ListAccountActivitiesAsAsyncEnu /// /// Gets all account activities from Alpaca REST API endpoint as async enumerable stream. /// - /// The object instance. + /// The object instance. /// Account activities request parameters. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. /// @@ -70,6 +70,71 @@ public static IAsyncEnumerable ListAccountActivitiesAsAsyncEnu getAllAccountActivitiesPages(client.EnsureNotNull(), getRequestWithoutPageToken(request.EnsureNotNull()), cancellationToken); + /// + /// Gets all option contracts from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Account activity record objects obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListOptionContractsAsAsyncEnumerable( + this IAlpacaTradingClient client, + OptionContractsRequest request) => + ListOptionContractsAsAsyncEnumerable(client, request, CancellationToken.None); + + /// + /// Gets all option contracts from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Account activity record objects obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListOptionContractsAsAsyncEnumerable( + this IAlpacaTradingClient client, + OptionContractsRequest request, + CancellationToken cancellationToken) => + getAllOptionContractsPages(client.EnsureNotNull(), + getRequestForFirstPage(request.EnsureNotNull()), cancellationToken); + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static AccountActivitiesRequest getRequestWithoutPageToken( AccountActivitiesRequest request) @@ -103,4 +168,46 @@ private static async IAsyncEnumerable getAllAccountActivitiesP request.PageToken = activities.Count != 0 ? activities[^1].ActivityId : String.Empty; } while (!String.IsNullOrEmpty(request.PageToken)); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static OptionContractsRequest getRequestForFirstPage( + OptionContractsRequest request) => + new(request.UnderlyingSymbol) + { + ExpirationDateGreaterThanOrEqualTo = request.ExpirationDateGreaterThanOrEqualTo, + ExpirationDateLessThanOrEqualTo = request.ExpirationDateLessThanOrEqualTo, + StrikePriceGreaterThanOrEqualTo = request.StrikePriceGreaterThanOrEqualTo, + StrikePriceLessThanOrEqualTo = request.StrikePriceLessThanOrEqualTo, + ExpirationDateEqualTo = request.ExpirationDateEqualTo, + AssetStatus = request.AssetStatus, + OptionStyle = request.OptionStyle, + OptionType = request.OptionType, + RootSymbol = request.RootSymbol, + PageSize = request.PageSize, + PageNumber = 1 // Explicitly set this to 1 + }; + + private static async IAsyncEnumerable getAllOptionContractsPages( + IAlpacaTradingClient client, + OptionContractsRequest request, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + do + { + var contracts = await client + .ListOptionContractsAsync(request, cancellationToken).ConfigureAwait(false); + + if (contracts.Count == 0) + { + break; // The only way to check if paging completed + } + + foreach (var item in contracts) + { + yield return item; + } + + ++request.PageNumber; + } while (request.PageNumber < UInt32.MaxValue); + } } diff --git a/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt b/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt index ab058de6..f4192f67 100644 --- a/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt @@ -1 +1,5 @@ #nullable enable +static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! +static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! +static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 12bb9f76..6c5da8d4 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,12 +4,12 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", + "requested": "[7.1.0-beta1, )", + "resolved": "7.1.0-beta1", + "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.2.0", + "Polly": "8.3.0", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Net.Http.WinHttpHandler": "8.0.0", @@ -213,16 +213,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.3.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -314,12 +314,12 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", + "requested": "[7.1.0-beta1, )", + "resolved": "7.1.0-beta1", + "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.2.0", + "Polly": "8.3.0", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" @@ -519,16 +519,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.3.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -605,12 +605,12 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", + "requested": "[7.1.0-beta1, )", + "resolved": "7.1.0-beta1", + "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.2.0", + "Polly": "8.3.0", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" @@ -777,16 +777,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.3.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -863,12 +863,12 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "C+80YwrR517rxkRzKP3c1AW7sfCHjdEnVPcNEYKEsjeFBNSqQbMMdHbccBx7wSUVQskhrBee4IX6JOlpH0d5/g==", + "requested": "[7.1.0-beta1, )", + "resolved": "7.1.0-beta1", + "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.2.0", + "Polly": "8.3.0", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" } @@ -1038,16 +1038,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "KZm8iG29y6Mse7YntYYJSf5fGWuhYLliWgZaG/8NcuXS4gN7SPdtPYpjCxQlHqxvMGubkWVrGp3MvUaI7SkyKA==", + "resolved": "8.3.0", + "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", "dependencies": { - "Polly.Core": "8.2.0" + "Polly.Core": "8.3.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.2.0", - "contentHash": "gnKp3+mxGFmkFs4eHcD9aex0JOF8zS1Y18c2A5ckXXTVqbs6XLcDyLKgSa/mUFqAnH3mn9+uVIM0RhAec/d3kA==", + "resolved": "8.3.0", + "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } From dd2e2bd31778b14d308e56a4e3617c567eb9ac8a Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 4 Mar 2024 13:00:52 +0100 Subject: [PATCH 068/125] Issue #720 - Added unit tests for the new functions/objects. --- .../AlpacaTradingClientTest.cs | 51 +++++++++++++++++-- .../ServiceCollectionTest.cs | 12 +++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs index a6c6333f..ce19365e 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs @@ -4,6 +4,10 @@ namespace Alpaca.Markets.Extensions.Tests; public sealed class AlpacaTradingClientTest( MockClientsFactoryFixture mockClientsFactory) { + private const Decimal Price = 12_345.67M; + + private const String Symbol = "AAPL"; + private const Int32 Items = 5; [Fact] @@ -27,12 +31,12 @@ public async Task GetCalendarForSingleDayAsyncWorks() } [Fact] - public async Task GetNewsArticlesAsAsyncEnumerableWorks() + public async Task ListAccountActivitiesAsAsyncEnumerableWorks() { using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); - addSinglePageExpectation(mock, Items); - addSinglePageExpectation(mock); + addSinglePageExpectationOfAccountActivities(mock, Items); + addSinglePageExpectationOfAccountActivities(mock); var counter = await validateList( mock.Client.ListAccountActivitiesAsAsyncEnumerable( @@ -41,6 +45,21 @@ public async Task GetNewsArticlesAsAsyncEnumerableWorks() Assert.NotEqual(0, counter); } + [Fact] + public async Task ListOptionContractsAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + addSinglePageExpectationOfOptionContracts(mock, Items); + addSinglePageExpectationOfOptionContracts(mock); + + var counter = await validateList( + mock.Client.ListOptionContractsAsAsyncEnumerable( + new OptionContractsRequest(Symbol))); + + Assert.NotEqual(0, counter); + } + [Fact] public async Task IsMarketOpenAsyncWorks() { @@ -61,7 +80,7 @@ public async Task IsMarketOpenAsyncWorks() Assert.NotNull(await mock.Client.GetClockCachedAsync()); } - private static void addSinglePageExpectation( + private static void addSinglePageExpectationOfAccountActivities( MockClient mock, Int32 count = 0) => mock.AddGet("/v2/account/activities", new JArray( @@ -71,6 +90,30 @@ private static void addSinglePageExpectation( new JProperty("activity_type", AccountActivityType.Fill), new JProperty("id", Guid.NewGuid().ToString("D"))); + private static void addSinglePageExpectationOfOptionContracts( + MockClient mock, + Int32 count = 0) => + mock.AddGet("/v2/options/contracts", new JObject( + new JProperty("option_contracts", new JArray( + Enumerable.Repeat(createOptionContract(Guid.NewGuid()), count))))); + + private static JObject createOptionContract( + Guid contractId) => + new( + new JProperty("expiration_date", DateOnly.FromDateTime(DateTime.Today).ToString("O")), + new JProperty("underlying_asset_id", contractId), + new JProperty("style", OptionStyle.American), + new JProperty("status", AssetStatus.Active), + new JProperty("underlying_symbol", Symbol), + new JProperty("type", OptionType.Call), + new JProperty("root_symbol", Symbol), + new JProperty("strike_price", Price), + new JProperty("tradable", true), + new JProperty("symbol", Symbol), + new JProperty("id", contractId), + new JProperty("name", Symbol), + new JProperty("size", 100)); + private static async ValueTask validateList( IAsyncEnumerable trades) => await trades.CountAsync(); diff --git a/Alpaca.Markets.Extensions.Tests/ServiceCollectionTest.cs b/Alpaca.Markets.Extensions.Tests/ServiceCollectionTest.cs index d69f7652..f3b1f9e5 100644 --- a/Alpaca.Markets.Extensions.Tests/ServiceCollectionTest.cs +++ b/Alpaca.Markets.Extensions.Tests/ServiceCollectionTest.cs @@ -28,6 +28,18 @@ public void AddAlpacaDataClientWorks() Assert.NotNull(client); } + [Fact] + public void AddAlpacaOptionsDataClientWorks() + { + var collection = new ServiceCollection(); + + Assert.NotNull(collection.AddAlpacaOptionsDataClient( + Environments.Live, new SecretKey(Guid.NewGuid().ToString(), Guid.NewGuid().ToString()))); + + using var client = collection.BuildServiceProvider().GetService(); + Assert.NotNull(client); + } + [Fact] public void AddAlpacaTradingClientWorks() { From 612f76b6c40585a8bd325e4446ebdaf7e58a080d Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 4 Mar 2024 13:12:06 +0100 Subject: [PATCH 069/125] Prepare release 7.1.0-beta1 of Extensions --- .../PublicAPI.Shipped.txt | 4 + .../PublicAPI.Unshipped.txt | 4 - Alpaca.Markets/PublicAPI.Shipped.txt | 87 +++++++++++++++++++ Alpaca.Markets/PublicAPI.Unshipped.txt | 87 ------------------- 4 files changed, 91 insertions(+), 91 deletions(-) diff --git a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt index 6c219172..be587ceb 100644 --- a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt +++ b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt @@ -89,10 +89,14 @@ static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.IsMarketOpenAsync static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.IsMarketOpenAsync(this Alpaca.Markets.IAlpacaTradingClient! client, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListAccountActivitiesAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.AccountActivitiesRequest! request) -> System.Collections.Generic.IAsyncEnumerable! static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListAccountActivitiesAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.AccountActivitiesRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaCryptoDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaCryptoDataClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaCryptoDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaDataClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! +static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! +static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaTradingClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaTradingClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaTradingClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! static Alpaca.Markets.Extensions.AlpacaStreamingClientExtensions.WithReconnect(this Alpaca.Markets.IAlpacaStreamingClient! client) -> Alpaca.Markets.IAlpacaStreamingClient! diff --git a/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt b/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt index f4192f67..ab058de6 100644 --- a/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets.Extensions/PublicAPI.Unshipped.txt @@ -1,5 +1 @@ #nullable enable -static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! -static Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions.AddAlpacaOptionsDataClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder! -static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request) -> System.Collections.Generic.IAsyncEnumerable! -static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.ListOptionContractsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaTradingClient! client, Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 5f89fc80..86918599 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -100,6 +100,8 @@ Alpaca.Markets.AlpacaDataStreamingClientConfiguration Alpaca.Markets.AlpacaDataStreamingClientConfiguration.AlpacaDataStreamingClientConfiguration() -> void Alpaca.Markets.AlpacaNewsStreamingClientConfiguration Alpaca.Markets.AlpacaNewsStreamingClientConfiguration.AlpacaNewsStreamingClientConfiguration() -> void +Alpaca.Markets.AlpacaOptionsDataClientConfiguration +Alpaca.Markets.AlpacaOptionsDataClientConfiguration.AlpacaOptionsDataClientConfiguration() -> void Alpaca.Markets.AlpacaStreamingClientConfiguration Alpaca.Markets.AlpacaStreamingClientConfiguration.AlpacaStreamingClientConfiguration() -> void Alpaca.Markets.AlpacaTradingClientConfiguration @@ -146,6 +148,7 @@ Alpaca.Markets.AuthStatus Alpaca.Markets.AuthStatus.Authorized = 0 -> Alpaca.Markets.AuthStatus Alpaca.Markets.AuthStatus.TooManyConnections = 2 -> Alpaca.Markets.AuthStatus Alpaca.Markets.AuthStatus.Unauthorized = 1 -> Alpaca.Markets.AuthStatus +Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass Alpaca.Markets.BarTimeFrame Alpaca.Markets.BarTimeFrame.BarTimeFrame() -> void Alpaca.Markets.BarTimeFrame.BarTimeFrame(int value, Alpaca.Markets.BarTimeFrameUnit unit) -> void @@ -306,6 +309,21 @@ Alpaca.Markets.HistoricalCryptoTradesRequest.HistoricalCryptoTradesRequest(Syste Alpaca.Markets.HistoricalCryptoTradesRequest.HistoricalCryptoTradesRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into) -> void Alpaca.Markets.HistoricalCryptoTradesRequest.WithExchanges(params Alpaca.Markets.CryptoExchange[]! exchanges) -> Alpaca.Markets.HistoricalCryptoTradesRequest! Alpaca.Markets.HistoricalCryptoTradesRequest.WithExchanges(System.Collections.Generic.IEnumerable! exchanges) -> Alpaca.Markets.HistoricalCryptoTradesRequest! +Alpaca.Markets.HistoricalOptionBarsRequest +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void +Alpaca.Markets.HistoricalOptionBarsRequest.TimeFrame.get -> Alpaca.Markets.BarTimeFrame +Alpaca.Markets.HistoricalOptionTradesRequest +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, System.DateTime from, System.DateTime into) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval) -> void +Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into) -> void Alpaca.Markets.HistoricalQuotesRequest Alpaca.Markets.HistoricalQuotesRequest.Currency.get -> string? Alpaca.Markets.HistoricalQuotesRequest.Currency.set -> void @@ -379,6 +397,9 @@ Alpaca.Markets.IAccount.LongMarketValue.get -> decimal? Alpaca.Markets.IAccount.MaintenanceMargin.get -> decimal Alpaca.Markets.IAccount.Multiplier.get -> Alpaca.Markets.Multiplier Alpaca.Markets.IAccount.NonMarginableBuyingPower.get -> decimal? +Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradingLevel? +Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? +Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccount.PendingTransferIn.get -> decimal? Alpaca.Markets.IAccount.PendingTransferOut.get -> decimal? Alpaca.Markets.IAccount.RegulationBuyingPower.get -> decimal? @@ -417,6 +438,7 @@ Alpaca.Markets.IAccountConfiguration.IsPtpNoExceptionEntry.get -> bool Alpaca.Markets.IAccountConfiguration.IsPtpNoExceptionEntry.set -> void Alpaca.Markets.IAccountConfiguration.IsSuspendTrade.get -> bool Alpaca.Markets.IAccountConfiguration.IsSuspendTrade.set -> void +Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? Alpaca.Markets.IAccountConfiguration.TradeConfirmEmail.get -> Alpaca.Markets.TradeConfirmEmail Alpaca.Markets.IAccountConfiguration.TradeConfirmEmail.set -> void Alpaca.Markets.IActiveStock @@ -468,6 +490,12 @@ Alpaca.Markets.IAlpacaDataSubscription.Received -> System.Action? Alpaca.Markets.IAlpacaNewsStreamingClient Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription() -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription(string! symbol) -> Alpaca.Markets.IAlpacaDataSubscription! +Alpaca.Markets.IAlpacaOptionsDataClient +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(string! underlyingSymbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaScreenerClient Alpaca.Markets.IAlpacaScreenerClient.GetTopMarketMoversAsync(int? numberOfLosersAndGainersInResponse = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaStreamingClient @@ -490,6 +518,8 @@ Alpaca.Markets.IAlpacaTradingClient.GetAccountConfigurationAsync(System.Threadin Alpaca.Markets.IAlpacaTradingClient.GetAnnouncementAsync(System.Guid announcementId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetAssetAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetClockAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetOrderAsync(string! clientOrderId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetOrderAsync(System.Guid orderId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetPortfolioHistoryAsync(Alpaca.Markets.PortfolioHistoryRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! @@ -501,6 +531,7 @@ Alpaca.Markets.IAlpacaTradingClient.ListAnnouncementsAsync(Alpaca.Markets.Announ Alpaca.Markets.IAlpacaTradingClient.ListAssetsAsync(Alpaca.Markets.AssetsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListCalendarAsync(Alpaca.Markets.CalendarRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListIntervalCalendarAsync(Alpaca.Markets.CalendarRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListOrdersAsync(Alpaca.Markets.ListOrdersRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListPositionsAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListWatchListsAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! @@ -650,6 +681,24 @@ Alpaca.Markets.INewsArticle.Summary.get -> string! Alpaca.Markets.INewsArticle.Symbols.get -> System.Collections.Generic.IReadOnlyList! Alpaca.Markets.INewsArticle.ThumbImageUrl.get -> System.Uri? Alpaca.Markets.INewsArticle.UpdatedAtUtc.get -> System.DateTime +Alpaca.Markets.IOptionContract +Alpaca.Markets.IOptionContract.ClosePrice.get -> decimal? +Alpaca.Markets.IOptionContract.ClosePriceDate.get -> System.DateOnly? +Alpaca.Markets.IOptionContract.ContractId.get -> System.Guid +Alpaca.Markets.IOptionContract.ExpirationDate.get -> System.DateOnly +Alpaca.Markets.IOptionContract.IsTradable.get -> bool +Alpaca.Markets.IOptionContract.Name.get -> string! +Alpaca.Markets.IOptionContract.OpenInterest.get -> decimal? +Alpaca.Markets.IOptionContract.OpenInterestDate.get -> System.DateOnly? +Alpaca.Markets.IOptionContract.OptionStyle.get -> Alpaca.Markets.OptionStyle +Alpaca.Markets.IOptionContract.OptionType.get -> Alpaca.Markets.OptionType +Alpaca.Markets.IOptionContract.RootSymbol.get -> string! +Alpaca.Markets.IOptionContract.Size.get -> decimal +Alpaca.Markets.IOptionContract.Status.get -> Alpaca.Markets.AssetStatus +Alpaca.Markets.IOptionContract.StrikePrice.get -> decimal +Alpaca.Markets.IOptionContract.Symbol.get -> string! +Alpaca.Markets.IOptionContract.UnderlyingAssetId.get -> System.Guid +Alpaca.Markets.IOptionContract.UnderlyingSymbol.get -> string! Alpaca.Markets.IOrder Alpaca.Markets.IOrder.AssetClass.get -> Alpaca.Markets.AssetClass Alpaca.Markets.IOrder.AssetId.get -> System.Guid @@ -964,6 +1013,41 @@ Alpaca.Markets.OpenClose.CloseEst.get -> System.DateTimeOffset Alpaca.Markets.OpenClose.OpenClose() -> void Alpaca.Markets.OpenClose.OpenEst.get -> System.DateTimeOffset Alpaca.Markets.OpenClose.ToInterval() -> Alpaca.Markets.Interval +Alpaca.Markets.OptionContractsRequest +Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? +Alpaca.Markets.OptionContractsRequest.AssetStatus.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(string! underlyingSymbol) -> void +Alpaca.Markets.OptionContractsRequest.OptionStyle.get -> Alpaca.Markets.OptionStyle? +Alpaca.Markets.OptionContractsRequest.OptionStyle.set -> void +Alpaca.Markets.OptionContractsRequest.OptionType.get -> Alpaca.Markets.OptionType? +Alpaca.Markets.OptionContractsRequest.OptionType.set -> void +Alpaca.Markets.OptionContractsRequest.PageNumber.get -> uint? +Alpaca.Markets.OptionContractsRequest.PageNumber.set -> void +Alpaca.Markets.OptionContractsRequest.PageSize.get -> uint? +Alpaca.Markets.OptionContractsRequest.PageSize.set -> void +Alpaca.Markets.OptionContractsRequest.RootSymbol.get -> string? +Alpaca.Markets.OptionContractsRequest.RootSymbol.set -> void +Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.UnderlyingSymbol.get -> string! +Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionsTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionStyle.American = 0 -> Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionStyle.European = 1 -> Alpaca.Markets.OptionStyle +Alpaca.Markets.OptionType +Alpaca.Markets.OptionType.Call = 0 -> Alpaca.Markets.OptionType +Alpaca.Markets.OptionType.Put = 1 -> Alpaca.Markets.OptionType Alpaca.Markets.OrderBase Alpaca.Markets.OrderBase.ClientOrderId.get -> string? Alpaca.Markets.OrderBase.ClientOrderId.set -> void @@ -1207,6 +1291,8 @@ static Alpaca.Markets.EnvironmentExtensions.GetAlpacaDataStreamingClient(this Al static Alpaca.Markets.EnvironmentExtensions.GetAlpacaDataStreamingClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaDataStreamingClientConfiguration! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaNewsStreamingClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaNewsStreamingClient! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaNewsStreamingClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaNewsStreamingClientConfiguration! +static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaOptionsDataClient! +static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaOptionsDataClientConfiguration! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaStreamingClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaStreamingClient! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaStreamingClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaStreamingClientConfiguration! static Alpaca.Markets.EnvironmentExtensions.GetAlpacaTradingClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaTradingClient! @@ -1218,6 +1304,7 @@ static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.M static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaDataClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaDataClient! static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaDataStreamingClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaDataStreamingClient! static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaNewsStreamingClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaNewsStreamingClient! +static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaOptionsDataClient! static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaStreamingClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaStreamingClient! static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaTradingClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaTradingClient! static Alpaca.Markets.Extensions.ConfigurationExtensions.WithHttpMessageHandlerFactory(this TClientConfiguration! configuration, System.Func! httpMessageHandlerFactory) -> TClientConfiguration! diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 026a3d7f..ab058de6 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,88 +1 @@ #nullable enable -Alpaca.Markets.AlpacaOptionsDataClientConfiguration -Alpaca.Markets.AlpacaOptionsDataClientConfiguration.AlpacaOptionsDataClientConfiguration() -> void -Alpaca.Markets.AssetClass.UsOption = 2 -> Alpaca.Markets.AssetClass -Alpaca.Markets.HistoricalOptionBarsRequest -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, Alpaca.Markets.BarTimeFrame timeFrame, Alpaca.Markets.Interval timeInterval) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(string! symbol, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.BarTimeFrame timeFrame) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval, Alpaca.Markets.BarTimeFrame timeFrame) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.HistoricalOptionBarsRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into, Alpaca.Markets.BarTimeFrame timeFrame) -> void -Alpaca.Markets.HistoricalOptionBarsRequest.TimeFrame.get -> Alpaca.Markets.BarTimeFrame -Alpaca.Markets.HistoricalOptionTradesRequest -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol) -> void -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, Alpaca.Markets.Interval timeInterval) -> void -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(string! symbol, System.DateTime from, System.DateTime into) -> void -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols) -> void -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, Alpaca.Markets.Interval timeInterval) -> void -Alpaca.Markets.HistoricalOptionTradesRequest.HistoricalOptionTradesRequest(System.Collections.Generic.IEnumerable! symbols, System.DateTime from, System.DateTime into) -> void -Alpaca.Markets.IAccount.OptionsApprovedLevel.get -> Alpaca.Markets.OptionsTradingLevel? -Alpaca.Markets.IAccount.OptionsBuyingPower.get -> decimal? -Alpaca.Markets.IAccount.OptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? -Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel.get -> Alpaca.Markets.OptionsTradingLevel? -Alpaca.Markets.IAlpacaOptionsDataClient -Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(string! underlyingSymbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! -Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! -Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IOptionContract -Alpaca.Markets.IOptionContract.ClosePrice.get -> decimal? -Alpaca.Markets.IOptionContract.ClosePriceDate.get -> System.DateOnly? -Alpaca.Markets.IOptionContract.ContractId.get -> System.Guid -Alpaca.Markets.IOptionContract.ExpirationDate.get -> System.DateOnly -Alpaca.Markets.IOptionContract.IsTradable.get -> bool -Alpaca.Markets.IOptionContract.Name.get -> string! -Alpaca.Markets.IOptionContract.OpenInterest.get -> decimal? -Alpaca.Markets.IOptionContract.OpenInterestDate.get -> System.DateOnly? -Alpaca.Markets.IOptionContract.OptionStyle.get -> Alpaca.Markets.OptionStyle -Alpaca.Markets.IOptionContract.OptionType.get -> Alpaca.Markets.OptionType -Alpaca.Markets.IOptionContract.RootSymbol.get -> string! -Alpaca.Markets.IOptionContract.Size.get -> decimal -Alpaca.Markets.IOptionContract.Status.get -> Alpaca.Markets.AssetStatus -Alpaca.Markets.IOptionContract.StrikePrice.get -> decimal -Alpaca.Markets.IOptionContract.Symbol.get -> string! -Alpaca.Markets.IOptionContract.UnderlyingAssetId.get -> System.Guid -Alpaca.Markets.IOptionContract.UnderlyingSymbol.get -> string! -Alpaca.Markets.OptionContractsRequest -Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? -Alpaca.Markets.OptionContractsRequest.AssetStatus.set -> void -Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionContractsRequest.ExpirationDateEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(string! underlyingSymbol) -> void -Alpaca.Markets.OptionContractsRequest.OptionStyle.get -> Alpaca.Markets.OptionStyle? -Alpaca.Markets.OptionContractsRequest.OptionStyle.set -> void -Alpaca.Markets.OptionContractsRequest.OptionType.get -> Alpaca.Markets.OptionType? -Alpaca.Markets.OptionContractsRequest.OptionType.set -> void -Alpaca.Markets.OptionContractsRequest.PageNumber.get -> uint? -Alpaca.Markets.OptionContractsRequest.PageNumber.set -> void -Alpaca.Markets.OptionContractsRequest.PageSize.get -> uint? -Alpaca.Markets.OptionContractsRequest.PageSize.set -> void -Alpaca.Markets.OptionContractsRequest.RootSymbol.get -> string? -Alpaca.Markets.OptionContractsRequest.RootSymbol.set -> void -Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? -Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.get -> decimal? -Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.UnderlyingSymbol.get -> string! -Alpaca.Markets.OptionsTradingLevel -Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel -Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel -Alpaca.Markets.OptionsTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionsTradingLevel -Alpaca.Markets.OptionStyle -Alpaca.Markets.OptionStyle.American = 0 -> Alpaca.Markets.OptionStyle -Alpaca.Markets.OptionStyle.European = 1 -> Alpaca.Markets.OptionStyle -Alpaca.Markets.OptionType -Alpaca.Markets.OptionType.Call = 0 -> Alpaca.Markets.OptionType -Alpaca.Markets.OptionType.Put = 1 -> Alpaca.Markets.OptionType -static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClient(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.IAlpacaOptionsDataClient! -static Alpaca.Markets.EnvironmentExtensions.GetAlpacaOptionsDataClientConfiguration(this Alpaca.Markets.IEnvironment! environment, Alpaca.Markets.SecurityKey! securityKey) -> Alpaca.Markets.AlpacaOptionsDataClientConfiguration! -static Alpaca.Markets.Extensions.ConfigurationExtensions.GetClient(this Alpaca.Markets.AlpacaOptionsDataClientConfiguration! configuration) -> Alpaca.Markets.IAlpacaOptionsDataClient! From 4f7c83a96f81073ffb24b462aef65754cdde3fbf Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 11 Mar 2024 11:33:13 +0100 Subject: [PATCH 070/125] Issue #720 - Increase code coverage and cleanup code. (cherry picked from commit 217c3efcd71e61719ddbe99e0991aacfba0e212e) --- .../Alpaca.Markets.Extensions.Tests.csproj | 3 + .../AlpacaOptionsDataClientTest.Bars.cs | 89 +++++++++++++++++++ .../AlpacaOptionsDataClientTest.Trades.cs | 85 ++++++++++++++++++ .../AlpacaOptionsDataClientTest.cs | 58 ++++++++++++ .../MockClientsFactory.cs | 4 + .../AlpacaOptionsDataClientTest.Bars.cs | 9 +- .../AlpacaOptionsDataClientTest.Trades.cs | 9 +- Alpaca.Markets.Tests/ConvertersTest.cs | 61 +++++++++---- .../Parameters/HistoricalOptionBarsRequest.cs | 4 +- 9 files changed, 295 insertions(+), 27 deletions(-) create mode 100644 Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs create mode 100644 Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Trades.cs create mode 100644 Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 401092ae..3748b6f8 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -45,6 +45,9 @@ AlpacaCryptoDataClientTest.cs + + AlpacaOptionsDataClientTest.cs + AlpacaDataStreamingClientTest.cs diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs new file mode 100644 index 00000000..f53e25f5 --- /dev/null +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs @@ -0,0 +1,89 @@ +namespace Alpaca.Markets.Extensions.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task GetHistoricalBarsAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleBarsPageExpectation); + + var counter = await validateList( + mock.Client.GetHistoricalBarsAsAsyncEnumerable( + new HistoricalOptionBarsRequest(Stock, BarTimeFrame.Hour, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalBarsDictionaryOfAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addMultiBarsPageExpectation); + + var counter = await validateDictionaryOfLists( + mock.Client.GetHistoricalBarsDictionaryOfAsyncEnumerable( + new HistoricalOptionBarsRequest(_symbols, _timeInterval, BarTimeFrame.Hour))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalBarsPagesAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleBarsPageExpectation); + + var counter = await validateListOfLists( + mock.Client.GetHistoricalBarsPagesAsAsyncEnumerable( + new HistoricalOptionBarsRequest(Stock, BarTimeFrame.Hour, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalBarsMultiPagesAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addMultiBarsPageExpectation); + + var counter = await validateListOfDictionariesOfLists( + mock.Client.GetHistoricalBarsMultiPagesAsAsyncEnumerable( + new HistoricalOptionBarsRequest(_symbols, _timeInterval, BarTimeFrame.Hour))); + + Assert.NotEqual(0, counter); + } + + private static void addMultiBarsPageExpectation( + MockClient mock, + String? token = null) => + mock.AddGet("/v1beta1/options/bars", new JObject( + new JProperty("bars", new JObject( + new JProperty(Stock, createBarsList()), + new JProperty(Other, createBarsList()))), + new JProperty("next_page_token", token))); + + private static void addSingleBarsPageExpectation( + MockClient mock, + String? token = null) => + mock.AddGet("/v1beta1/options/bars", new JObject( + new JProperty("bars", new JObject( + new JProperty(Stock, createBarsList()))), + new JProperty("next_page_token", token))); + + private static JArray createBarsList() => + new(createBar(), createBar(), createBar()); + + private static JObject createBar() => new( + new JProperty("t", DateTime.UtcNow), + new JProperty("o", Price), + new JProperty("l", Price), + new JProperty("h", Price), + new JProperty("c", Price), + new JProperty("v", Volume)); + +} diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Trades.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Trades.cs new file mode 100644 index 00000000..a13e0c70 --- /dev/null +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Trades.cs @@ -0,0 +1,85 @@ +namespace Alpaca.Markets.Extensions.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task GetHistoricalTradesAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleTradesPageExpectation); + + var counter = await validateList( + mock.Client.GetHistoricalTradesAsAsyncEnumerable( + new HistoricalOptionTradesRequest(Stock, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalTradesDictionaryOfAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addMultiTradesPageExpectation); + + var counter = await validateDictionaryOfLists( + mock.Client.GetHistoricalTradesDictionaryOfAsyncEnumerable( + new HistoricalOptionTradesRequest(_symbols, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalTradesPagesAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleTradesPageExpectation); + + var counter = await validateListOfLists( + mock.Client.GetHistoricalTradesPagesAsAsyncEnumerable( + new HistoricalOptionTradesRequest(Stock, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task GetHistoricalTradesMultiPagesAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addMultiTradesPageExpectation); + + var counter = await validateListOfDictionariesOfLists( + mock.Client.GetHistoricalTradesMultiPagesAsAsyncEnumerable( + new HistoricalOptionTradesRequest(_symbols, _timeInterval))); + + Assert.NotEqual(0, counter); + } + + private static void addMultiTradesPageExpectation( + MockClient mock, + String? token = null) => + mock.AddGet("/v1beta1/options/trades", new JObject( + new JProperty("trades", new JObject( + new JProperty(Stock, createTradesList()), + new JProperty(Other, createTradesList()))), + new JProperty("next_page_token", token))); + + private static void addSingleTradesPageExpectation( + MockClient mock, + String? token = null) => + mock.AddGet("/v1beta1/options/trades", new JObject( + new JProperty("trades", new JObject( + new JProperty(Stock, createTradesList()))), + new JProperty("next_page_token", token))); + + private static JArray createTradesList() => + new(createTrade(), createTrade(), createTrade()); + + private static JObject createTrade() => new( + new JProperty("t", DateTime.UtcNow), + new JProperty("p", Price), + new JProperty("s", Size)); +} diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs new file mode 100644 index 00000000..998914bf --- /dev/null +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs @@ -0,0 +1,58 @@ +namespace Alpaca.Markets.Extensions.Tests; + +[Collection("MockEnvironment")] +public sealed partial class AlpacaOptionsDataClientTest( + MockClientsFactoryFixture mockClientsFactory) +{ + private static readonly Interval _timeInterval = getTimeInterval(); + + private static readonly String[] _symbols = [ Stock, Other ]; + + private const Decimal Volume = 1_000M; + + private const String Stock = "AAPL"; + + private const String Other = "MSFT"; + + private const Decimal Price = 100M; + + private const Decimal Size = 10M; + + private const Int32 Pages = 5; + + private static void addPaginatedResponses( + MockClient mock, + Action, String?> singleResponseFactory) + where TConfiguration : AlpacaClientConfigurationBase + where TClient : class, IDisposable + { + for (var index = 1; index <= Pages; ++index) + { + singleResponseFactory(mock, index != Pages + ? Guid.NewGuid().ToString("D") : null); + } + } + + private static async ValueTask validateList( + IAsyncEnumerable trades) => + await trades.CountAsync(); + + private static async ValueTask validateListOfLists( + IAsyncEnumerable> pages) => + await pages.SumAsync(items => items.Count); + + private static async Task validateDictionaryOfLists( + IReadOnlyDictionary> dictionary) => + (await Task.WhenAll(dictionary.Values.Select(trades => validateList(trades).AsTask()))).Sum(); + + private static async ValueTask validateListOfDictionariesOfLists( + IAsyncEnumerable>> pages) => + await pages.SumAsync(dictionary => dictionary.Values.Sum(items => items.Count)); + + private static Interval getTimeInterval() + { + var today = DateTime.Today; + var yesterday = today.AddDays(-1); + return new Interval(yesterday, today); + } +} diff --git a/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs b/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs index 4c3f7b58..49c77a29 100644 --- a/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs +++ b/Alpaca.Markets.Extensions.Tests/MockClientsFactory.cs @@ -21,6 +21,10 @@ public MockClient GetAlp public MockClient GetAlpacaCryptoDataClientMock( AlpacaCryptoDataClientConfiguration? configuration = null) => new(configuration ?? Environments.Paper.GetAlpacaCryptoDataClientConfiguration(_secretKey), clientConfiguration => clientConfiguration.GetClient()); + + public MockClient GetAlpacaOptionsDataClientMock( + AlpacaOptionsDataClientConfiguration? configuration = null) => + new(configuration ?? Environments.Paper.GetAlpacaOptionsDataClientConfiguration(_secretKey), clientConfiguration => clientConfiguration.GetClient()); } [CollectionDefinition("MockEnvironment")] diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs index 4a6e3878..602358d8 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Bars.cs @@ -79,16 +79,15 @@ public async Task ListHistoricalBarsAsyncWithoutIntervalWorks() { using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); - var symbol = _symbols.Take(1).ToList(); - mock.AddMultiBarsPageExpectation(PathPrefix, symbol); + mock.AddMultiBarsPageExpectation(PathPrefix, [ Symbol ]); var bars = await mock.Client.ListHistoricalBarsAsync( - new HistoricalOptionBarsRequest(symbol, BarTimeFrame.Hour)); + new HistoricalOptionBarsRequest(Symbol, BarTimeFrame.Hour)); Assert.NotNull(bars); Assert.NotEmpty(bars.Items); - Assert.Equal(symbol.Single(), bars.Symbol); + Assert.Equal(Symbol, bars.Symbol); - bars.Items.Validate(symbol.Single()); + bars.Items.Validate(Symbol); } } diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs index e7990081..541cac4c 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Trades.cs @@ -42,17 +42,16 @@ public async Task ListHistoricalTradesAsyncWorks() { using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); - var symbol = _symbols.Take(1).ToList(); - mock.AddMultiTradesPageExpectation(PathPrefix, symbol); + mock.AddMultiTradesPageExpectation(PathPrefix, [ Symbol ]); var trades = await mock.Client.ListHistoricalTradesAsync( - new HistoricalOptionTradesRequest(symbol, Yesterday, Today)); + new HistoricalOptionTradesRequest(Symbol, Yesterday, Today)); Assert.NotNull(trades); Assert.NotEmpty(trades.Items); - Assert.Equal(symbol.Single(), trades.Symbol); + Assert.Equal(Symbol, trades.Symbol); - trades.Items.Validate(symbol.Single()); + trades.Items.Validate(Symbol); } [Fact] diff --git a/Alpaca.Markets.Tests/ConvertersTest.cs b/Alpaca.Markets.Tests/ConvertersTest.cs index 648b3f5b..f9e949ae 100644 --- a/Alpaca.Markets.Tests/ConvertersTest.cs +++ b/Alpaca.Markets.Tests/ConvertersTest.cs @@ -2,7 +2,7 @@ public sealed class ConvertersTest { - private record struct EnumWrapper + private readonly record struct EnumWrapper { public T Item { get; init; } } @@ -13,10 +13,18 @@ public void OrderSideEnumConverterWorks() var original = new EnumWrapper { Item = (OrderSide)42 }; var json = JsonConvert.SerializeObject(original) .Replace("42", "\"SellShort\""); - var converted = JsonConvert.DeserializeObject>(json); + var converted1 = JsonConvert.DeserializeObject>(json); - Assert.NotEqual(original.Item, converted.Item); - Assert.Equal(OrderSide.Sell, converted.Item); + Assert.NotEqual(original.Item, converted1.Item); + Assert.Equal(OrderSide.Sell, converted1.Item); + + var converted2 = JsonConvert.DeserializeObject>( + json.Replace("42", "\"SellShort\"")); + + Assert.NotEqual(original.Item, converted2.Item); + Assert.Equal(OrderSide.Sell, converted2.Item); + + Assert.Equal(converted1.Item, converted2.Item); } [Fact] @@ -25,10 +33,18 @@ public void ExchangeEnumConverterWorks() var original = new EnumWrapper { Item = (Exchange)42 }; var json = JsonConvert.SerializeObject(original) .Replace("42", "\"MarsExchange\""); - var converted = JsonConvert.DeserializeObject>(json); + var converted1 = JsonConvert.DeserializeObject>(json); + + Assert.NotEqual(original.Item, converted1.Item); + Assert.Equal(Exchange.Unknown, converted1.Item); - Assert.NotEqual(original.Item, converted.Item); - Assert.Equal(Exchange.Unknown, converted.Item); + var converted2 = JsonConvert.DeserializeObject>( + json.Replace("42", "\"MarsExchange\"")); + + Assert.NotEqual(original.Item, converted2.Item); + Assert.Equal(Exchange.Unknown, converted2.Item); + + Assert.Equal(converted1.Item, converted2.Item); } [Fact] @@ -37,21 +53,36 @@ public void CryptoExchangeEnumConverterWorks() var original = new EnumWrapper { Item = (CryptoExchange)42 }; var json = JsonConvert.SerializeObject(original) .Replace("42", "\"MarsExchange\""); - var converted = JsonConvert.DeserializeObject>(json); + var converted1 = JsonConvert.DeserializeObject>(json); + + Assert.NotEqual(original.Item, converted1.Item); + Assert.Equal(CryptoExchange.Unknown, converted1.Item); - Assert.NotEqual(original.Item, converted.Item); - Assert.Equal(CryptoExchange.Unknown, converted.Item); + var converted2 = JsonConvert.DeserializeObject>( + json.Replace("42", "\"MarsExchange\"")); + + Assert.NotEqual(original.Item, converted2.Item); + Assert.Equal(CryptoExchange.Unknown, converted2.Item); + + Assert.Equal(converted1.Item, converted2.Item); } [Fact] public void AssetAttributesEnumConverterWorks() { var original = new EnumWrapper { Item = (AssetAttributes)42 }; - var json = JsonConvert.SerializeObject(original) - .Replace("42", "\"VerySpecificAsset\""); - var converted = JsonConvert.DeserializeObject>(json); + var json = JsonConvert.SerializeObject(original); + var converted1 = JsonConvert.DeserializeObject>(json); + + Assert.NotEqual(original.Item, converted1.Item); + Assert.Equal(AssetAttributes.Unknown, converted1.Item); + + var converted2 = JsonConvert.DeserializeObject>( + json.Replace("42", "\"VerySpecificAsset\"")); + + Assert.NotEqual(original.Item, converted2.Item); + Assert.Equal(AssetAttributes.Unknown, converted2.Item); - Assert.NotEqual(original.Item, converted.Item); - Assert.Equal(AssetAttributes.Unknown, converted.Item); + Assert.Equal(converted1.Item, converted2.Item); } } diff --git a/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs index 1b6358d3..8a9414bf 100644 --- a/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalOptionBarsRequest.cs @@ -22,7 +22,7 @@ public HistoricalOptionBarsRequest( DateTime from, DateTime into, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, from, into, timeFrame) + : this([ symbol.EnsureNotNull() ], from, into, timeFrame) { } @@ -54,7 +54,7 @@ public HistoricalOptionBarsRequest( public HistoricalOptionBarsRequest( String symbol, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, timeFrame) + : this([ symbol.EnsureNotNull() ], timeFrame) { } From 6405eca05c466cdf00f532541a535e4b929514c1 Mon Sep 17 00:00:00 2001 From: Michael Nero Date: Tue, 12 Mar 2024 12:08:16 +0100 Subject: [PATCH 071/125] Update OpenClose.cs - make constructor public (#735) * Update OpenClose.cs - make constructor public * added inits instead of public ctor, fixed public API (cherry picked from commit fdcb2f477ddee7c7df79f387b44ad96d188d7725) --- Alpaca.Markets/Helpers/OpenClose.cs | 4 ++-- Alpaca.Markets/PublicAPI.Shipped.txt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets/Helpers/OpenClose.cs b/Alpaca.Markets/Helpers/OpenClose.cs index 05cddc94..3d1862ec 100644 --- a/Alpaca.Markets/Helpers/OpenClose.cs +++ b/Alpaca.Markets/Helpers/OpenClose.cs @@ -32,12 +32,12 @@ internal OpenClose( /// /// Gets open time in EST time zone. /// - public DateTimeOffset OpenEst { get; } + public DateTimeOffset OpenEst { get; init; } /// /// Gets close time in EST time zone. /// - public DateTimeOffset CloseEst { get; } + public DateTimeOffset CloseEst { get; init; } /// /// Gets session open and close time as instance with UTC times. diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 86918599..670bde0c 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -1010,8 +1010,10 @@ Alpaca.Markets.OneCancelsOtherOrder.StopLoss.get -> Alpaca.Markets.IStopLoss! Alpaca.Markets.OneCancelsOtherOrder.TakeProfit.get -> Alpaca.Markets.ITakeProfit! Alpaca.Markets.OpenClose Alpaca.Markets.OpenClose.CloseEst.get -> System.DateTimeOffset +Alpaca.Markets.OpenClose.CloseEst.init -> void Alpaca.Markets.OpenClose.OpenClose() -> void Alpaca.Markets.OpenClose.OpenEst.get -> System.DateTimeOffset +Alpaca.Markets.OpenClose.OpenEst.init -> void Alpaca.Markets.OpenClose.ToInterval() -> Alpaca.Markets.Interval Alpaca.Markets.OptionContractsRequest Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? From c1fe2ac86f4fdc4611a438c35cb1b47ca752f30b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:39:59 +0100 Subject: [PATCH 072/125] Bump softprops/action-gh-release from 1 to 2 (#732) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit 1ba78c54be1859a136b29fe215902e31068839ab) --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d47edb38..95c8ea91 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -80,7 +80,7 @@ jobs: run: dotnet nuget push **.nupkg -s https://api.nuget.org/v3/index.json -k ${{ secrets.NUGET_API_KEY }} - name: Create GitHub Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: name: SDK ${{ github.ref }} draft: true @@ -101,7 +101,7 @@ jobs: run: dotnet nuget push **.nupkg -s https://api.nuget.org/v3/index.json -k ${{ secrets.NUGET_API_KEY }} - name: Create GitHub Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: name: Extensions ${{ github.ref }} draft: true From a8705af1b1c11e602babd12b91587b829590c27a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:51:02 +0100 Subject: [PATCH 073/125] Bump jetbrains.dotcover.globaltool from 2023.2.3 to 2023.2.4 (#733) Bumps jetbrains.dotcover.globaltool from 2023.2.3 to 2023.2.4. --- updated-dependencies: - dependency-name: jetbrains.dotcover.globaltool dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit a4964f93b743affa00d862e6743e5b8b9e27c2f2) --- .config/dotnet-tools.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 303423f4..2bef2c2d 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,10 +3,10 @@ "isRoot": true, "tools": { "jetbrains.dotcover.globaltool": { - "version": "2023.2.3", + "version": "2023.2.4", "commands": [ "dotnet-dotcover" ] } } -} +} \ No newline at end of file From 322fc5a1a632d2d8b7e68252539cc02484a6799d Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Wed, 13 Mar 2024 21:40:43 +0100 Subject: [PATCH 074/125] Issue #731 - The `IAlpacaTradingClient.ListOptionContractAsync` method now uses a same pagination logic as historical data. --- .../AlpacaTradingClientTest.cs | 9 +++--- .../AlpacaTradingClientTest.Options.cs | 9 +++--- Alpaca.Markets/AlpacaTradingClient.General.cs | 6 ++-- .../Interfaces/IAlpacaTradingClient.cs | 2 +- .../Messages/JsonOptionContractsPage.cs | 11 +++++-- .../Parameters/OptionContractsRequest.cs | 29 +++---------------- Alpaca.Markets/PublicAPI.Shipped.txt | 7 ++--- 7 files changed, 29 insertions(+), 44 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs index ce19365e..5d0fe76a 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs @@ -45,12 +45,12 @@ public async Task ListAccountActivitiesAsAsyncEnumerableWorks() Assert.NotEqual(0, counter); } - [Fact] + [Fact(Skip = "Disable temporary until extensions package update")] public async Task ListOptionContractsAsAsyncEnumerableWorks() { using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); - addSinglePageExpectationOfOptionContracts(mock, Items); + addSinglePageExpectationOfOptionContracts(mock, Guid.NewGuid().ToString("N")); addSinglePageExpectationOfOptionContracts(mock); var counter = await validateList( @@ -92,10 +92,11 @@ private static void addSinglePageExpectationOfAccountActivities( private static void addSinglePageExpectationOfOptionContracts( MockClient mock, - Int32 count = 0) => + String? token = null) => mock.AddGet("/v2/options/contracts", new JObject( new JProperty("option_contracts", new JArray( - Enumerable.Repeat(createOptionContract(Guid.NewGuid()), count))))); + Enumerable.Repeat(createOptionContract(Guid.NewGuid()), Items))), + new JProperty("next_page_token", token))); private static JObject createOptionContract( Guid contractId) => diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs index e8a1b4b8..5af355ac 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Options.cs @@ -53,12 +53,13 @@ public async Task ListOptionContractsWorks() OptionStyle = OptionStyle.American, AssetStatus = AssetStatus.Active, OptionType = OptionType.Call, - RootSymbol = Stock, - PageNumber = 1, - PageSize = 100 + RootSymbol = Stock }); - validateOptionContract(optionContracts.Single(), contractId, Stock); + Assert.NotNull(optionContracts.Items); + Assert.NotEmpty(optionContracts.Items); + + validateOptionContract(optionContracts.Items.Single(), contractId, Stock); } private static JObject createOptionContractsList( diff --git a/Alpaca.Markets/AlpacaTradingClient.General.cs b/Alpaca.Markets/AlpacaTradingClient.General.cs index 3138a3af..17882418 100644 --- a/Alpaca.Markets/AlpacaTradingClient.General.cs +++ b/Alpaca.Markets/AlpacaTradingClient.General.cs @@ -115,13 +115,13 @@ await request.EnsureNotNull().Validate() .GetUriBuilderAsync(_httpClient).ConfigureAwait(false), _rateLimitHandler, cancellationToken).ConfigureAwait(false); - public async Task> ListOptionContractsAsync( + public async Task> ListOptionContractsAsync( OptionContractsRequest request, CancellationToken cancellationToken = default) => - (await _httpClient.GetAsync( + await _httpClient.GetAsync, JsonOptionContractsPage>( await request.EnsureNotNull().Validate() .GetUriBuilderAsync(_httpClient).ConfigureAwait(false), - _rateLimitHandler, cancellationToken).ConfigureAwait(false)).Contracts; + _rateLimitHandler, cancellationToken).ConfigureAwait(false); public Task GetOptionContractByIdAsync( Guid contractId, diff --git a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs index 230fd3f0..cbd162a8 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs @@ -954,7 +954,7 @@ Task> ListAnnouncementsAsync( /// /// Read-only list of corporate action information objects. [UsedImplicitly] - Task> ListOptionContractsAsync( + Task> ListOptionContractsAsync( OptionContractsRequest request, CancellationToken cancellationToken = default); diff --git a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs index 1642956a..9b70dd22 100644 --- a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs +++ b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs @@ -3,8 +3,15 @@ [SuppressMessage( "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] -internal sealed class JsonOptionContractsPage +internal sealed class JsonOptionContractsPage : IPage { [JsonProperty(PropertyName = "option_contracts", Required = Required.Always)] public List Contracts { get; [ExcludeFromCodeCoverage] set; } = []; -} \ No newline at end of file + + [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] + public String? NextPageToken { get; set; } + + public String Symbol => String.Empty; + + public IReadOnlyList Items => Contracts.EmptyIfNull(); +} diff --git a/Alpaca.Markets/Parameters/OptionContractsRequest.cs b/Alpaca.Markets/Parameters/OptionContractsRequest.cs index b90a0075..53d52691 100644 --- a/Alpaca.Markets/Parameters/OptionContractsRequest.cs +++ b/Alpaca.Markets/Parameters/OptionContractsRequest.cs @@ -74,25 +74,17 @@ public OptionContractsRequest( public Decimal? StrikePriceLessThanOrEqualTo { get; set; } /// - /// Gets or sets the desired page number. The null treated as 1st page. + /// Gets the pagination parameters for the request (page size and token). /// [UsedImplicitly] - [CLSCompliant(false)] - public UInt32? PageNumber { get; set; } - - /// - /// Gets or sets the number of contracts to limit per page (default = 10000). - /// - [UsedImplicitly] - [CLSCompliant(false)] - public UInt32? PageSize { get; set; } + public Pagination Pagination { get; } = new(); internal async ValueTask GetUriBuilderAsync( HttpClient httpClient) => new(httpClient.BaseAddress!) { Path = "v2/options/contracts", - Query = await new QueryBuilder() + Query = await Pagination.QueryBuilder .AddParameter("underlying_symbol", UnderlyingSymbol) .AddParameter("status", AssetStatus) .AddParameter("expiration_date", ExpirationDateEqualTo) @@ -103,14 +95,13 @@ internal async ValueTask GetUriBuilderAsync( .AddParameter("type", OptionType) .AddParameter("strike_price_gte", StrikePriceGreaterThanOrEqualTo) .AddParameter("strike_price_lte", StrikePriceLessThanOrEqualTo) - .AddParameter("page", PageNumber) - .AddParameter("limit", PageSize) .AsStringAsync().ConfigureAwait(false) }; /// IEnumerable Validation.IRequest.GetExceptions() { + yield return Pagination.TryValidatePageSize(Pagination.MaxPageSize); yield return UnderlyingSymbol.TryValidateSymbolName(); yield return RootSymbol?.TryValidateSymbolName(); @@ -121,17 +112,5 @@ internal async ValueTask GetUriBuilderAsync( yield return new RequestValidationException(nameof(ExpirationDateEqualTo), "Inconsistent expiration date filters combination."); } - - if (PageNumber is 0) - { - yield return new RequestValidationException(nameof(PageNumber), - "Page number should be greater than or equal to 1."); - } - - if (PageSize is 0 or > 10_000) - { - yield return new RequestValidationException(nameof(PageSize), - "Page size value should be between 1 and 10 0000."); - } } } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 670bde0c..c7f17ffa 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -531,7 +531,7 @@ Alpaca.Markets.IAlpacaTradingClient.ListAnnouncementsAsync(Alpaca.Markets.Announ Alpaca.Markets.IAlpacaTradingClient.ListAssetsAsync(Alpaca.Markets.AssetsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListCalendarAsync(Alpaca.Markets.CalendarRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListIntervalCalendarAsync(Alpaca.Markets.CalendarRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListOrdersAsync(Alpaca.Markets.ListOrdersRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListPositionsAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaTradingClient.ListWatchListsAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! @@ -1029,10 +1029,7 @@ Alpaca.Markets.OptionContractsRequest.OptionStyle.get -> Alpaca.Markets.OptionSt Alpaca.Markets.OptionContractsRequest.OptionStyle.set -> void Alpaca.Markets.OptionContractsRequest.OptionType.get -> Alpaca.Markets.OptionType? Alpaca.Markets.OptionContractsRequest.OptionType.set -> void -Alpaca.Markets.OptionContractsRequest.PageNumber.get -> uint? -Alpaca.Markets.OptionContractsRequest.PageNumber.set -> void -Alpaca.Markets.OptionContractsRequest.PageSize.get -> uint? -Alpaca.Markets.OptionContractsRequest.PageSize.set -> void +Alpaca.Markets.OptionContractsRequest.Pagination.get -> Alpaca.Markets.Pagination! Alpaca.Markets.OptionContractsRequest.RootSymbol.get -> string? Alpaca.Markets.OptionContractsRequest.RootSymbol.set -> void Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? From ad0b42ea43d61ee9c8e8324a92d828bd6bb03afd Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 15 Mar 2024 11:27:04 +0100 Subject: [PATCH 075/125] Issue #737 - Maked `IAuction.Closings` and `IAuction.Openings` properties implementation optional. --- Alpaca.Markets/Messages/JsonAuction.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets/Messages/JsonAuction.cs b/Alpaca.Markets/Messages/JsonAuction.cs index 113a1f84..b4441fc6 100644 --- a/Alpaca.Markets/Messages/JsonAuction.cs +++ b/Alpaca.Markets/Messages/JsonAuction.cs @@ -12,12 +12,12 @@ internal sealed class JsonAuction : IAuction, ISymbolMutable [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [JsonProperty(PropertyName = "o", Required = Required.Always)] + [JsonProperty(PropertyName = "o", Required = Required.Default)] internal List OpeningsList { get; set; } = []; [ExcludeFromCodeCoverage] [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [JsonProperty(PropertyName = "c", Required = Required.Always)] + [JsonProperty(PropertyName = "c", Required = Required.Default)] internal List ClosingsList { get; set; } = []; [JsonIgnore] From a8c5713adb6d0f6793606fb803c3193c6fd992fe Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 25 Mar 2024 11:29:53 +0100 Subject: [PATCH 076/125] Issue #731 - The `OptionsContractRequest.UnderlyingSymbol` mandatory property was replaced with the `OptionsContractRequest.UnderlyingSymbols` optional property. --- .../Parameters/OptionContractsRequest.cs | 29 +++++++++++++++---- Alpaca.Markets/PublicAPI.Shipped.txt | 1 - Alpaca.Markets/PublicAPI.Unshipped.txt | 3 ++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Alpaca.Markets/Parameters/OptionContractsRequest.cs b/Alpaca.Markets/Parameters/OptionContractsRequest.cs index 53d52691..fc940e4e 100644 --- a/Alpaca.Markets/Parameters/OptionContractsRequest.cs +++ b/Alpaca.Markets/Parameters/OptionContractsRequest.cs @@ -5,19 +5,36 @@ /// public sealed class OptionContractsRequest : Validation.IRequest { + private readonly HashSet _underlyingSymbols = new(StringComparer.Ordinal); + + /// + /// Creates new instance of object. + /// + public OptionContractsRequest() + { + } + /// /// Creates new instance of object. /// /// The symbol of the underlying asset for filtering. public OptionContractsRequest( String underlyingSymbol) => - UnderlyingSymbol = underlyingSymbol.EnsureNotNull(); - + _underlyingSymbols.Add(underlyingSymbol.EnsureNotNull()); + + /// + /// Creates new instance of object. + /// + /// The symbols list of the underlying asset for filtering. + public OptionContractsRequest( + IEnumerable underlyingSymbols) => + _underlyingSymbols.UnionWith(underlyingSymbols.EnsureNotNull()); + /// - /// Gets the symbol of the underlying asset for filtering. + /// Gets the symbols list of the underlying asset for filtering. /// [UsedImplicitly] - public String UnderlyingSymbol { get; } + public IReadOnlyCollection UnderlyingSymbols => _underlyingSymbols; /// /// Gets or sets filter by the asset status. By default, only active contracts are returned. @@ -85,7 +102,7 @@ internal async ValueTask GetUriBuilderAsync( { Path = "v2/options/contracts", Query = await Pagination.QueryBuilder - .AddParameter("underlying_symbol", UnderlyingSymbol) + .AddParameter("underlying_symbols", UnderlyingSymbols) .AddParameter("status", AssetStatus) .AddParameter("expiration_date", ExpirationDateEqualTo) .AddParameter("expiration_date_gte", ExpirationDateGreaterThanOrEqualTo) @@ -102,7 +119,7 @@ internal async ValueTask GetUriBuilderAsync( IEnumerable Validation.IRequest.GetExceptions() { yield return Pagination.TryValidatePageSize(Pagination.MaxPageSize); - yield return UnderlyingSymbol.TryValidateSymbolName(); + yield return UnderlyingSymbols.TryValidateSymbolName(); yield return RootSymbol?.TryValidateSymbolName(); if (ExpirationDateEqualTo.HasValue && ( diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index c7f17ffa..0781aa53 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -1036,7 +1036,6 @@ Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> dec Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.set -> void Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.get -> decimal? Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.set -> void -Alpaca.Markets.OptionContractsRequest.UnderlyingSymbol.get -> string! Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index ab058de6..8e352f53 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1 +1,4 @@ #nullable enable +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest() -> void +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(System.Collections.Generic.IEnumerable! underlyingSymbols) -> void +Alpaca.Markets.OptionContractsRequest.UnderlyingSymbols.get -> System.Collections.Generic.IReadOnlyCollection! From bdce3fd7a46eff133320d875fe0623487a5bb40b Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Tue, 26 Mar 2024 16:20:20 +0100 Subject: [PATCH 077/125] Issue #731 - The `OptionFeed` enum added and now it can be specified for latest/snapshot requests. --- .editorconfig | 2 +- .../AlpacaOptionsDataClientTest.Snapshots.cs | 6 ++- .../AlpacaOptionsDataClientTest.cs | 6 ++- Alpaca.Markets.sln.DotSettings | 1 + Alpaca.Markets/AlpacaOptionsDataClient.cs | 40 +++++++-------- Alpaca.Markets/Enums/OptionsFeed.cs | 22 ++++++++ Alpaca.Markets/Helpers/OpenClose.cs | 2 + .../Interfaces/IAlpacaOptionsDataClient.cs | 36 ++++++++----- .../Parameters/LatestOptionsDataRequest.cs | 50 +++++++++++++++++++ .../Parameters/OptionChainRequest.cs | 46 +++++++++++++++++ Alpaca.Markets/PublicAPI.Shipped.txt | 8 +-- Alpaca.Markets/PublicAPI.Unshipped.txt | 13 +++++ 12 files changed, 190 insertions(+), 42 deletions(-) create mode 100644 Alpaca.Markets/Enums/OptionsFeed.cs create mode 100644 Alpaca.Markets/Parameters/LatestOptionsDataRequest.cs create mode 100644 Alpaca.Markets/Parameters/OptionChainRequest.cs diff --git a/.editorconfig b/.editorconfig index cf71f7d3..0d123b48 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,7 +21,7 @@ dotnet_naming_symbols.private_static_methods.required_modifiers = static # Define the 'private_methods_style' naming style dotnet_naming_style.private_methods_style.capitalization = camel_case -# Define the 'private_methods_underscored' naming rule +# Define the 'private_methods_rule' naming rule dotnet_naming_rule.private_methods_rule.symbols = private_methods dotnet_naming_rule.private_methods_rule.style = private_methods_style dotnet_naming_rule.private_methods_rule.severity = error diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs index 67f3b247..ecf9decc 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -9,7 +9,8 @@ public async Task ListSnapshotsAsyncWorks() mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); - var snapshots = await mock.Client.ListSnapshotsAsync(_symbols); + var snapshots = await mock.Client.ListSnapshotsAsync( + new LatestOptionsDataRequest(_symbols)); Assert.NotNull(snapshots); Assert.NotEmpty(snapshots); @@ -28,7 +29,8 @@ public async Task GetOptionChainAsyncWorks() mock.AddOptionChainExpectation(PathPrefix, _symbols); - var snapshots = await mock.Client.GetOptionChainAsync("AAPL"); + var snapshots = await mock.Client.GetOptionChainAsync( + new OptionChainRequest("AAPL")); Assert.NotNull(snapshots); Assert.NotEmpty(snapshots); diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs index fffd176f..3b505506 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.cs @@ -57,7 +57,8 @@ public async Task ListLatestQuotesAsyncWorks() mock.AddLatestQuotesExpectation(PathPrefix, _symbols); - var quotes = await mock.Client.ListLatestQuotesAsync(_symbols); + var quotes = await mock.Client.ListLatestQuotesAsync( + new LatestOptionsDataRequest(_symbols)); Assert.NotNull(quotes); Assert.NotEmpty(quotes); @@ -77,7 +78,8 @@ public async Task ListLatestTradesAsyncWorks() mock.AddLatestTradesExpectation(PathPrefix, _symbols); - var trades = await mock.Client.ListLatestTradesAsync(_symbols); + var trades = await mock.Client.ListLatestTradesAsync( + new LatestOptionsDataRequest(_symbols)); Assert.NotNull(trades); Assert.NotEmpty(trades); diff --git a/Alpaca.Markets.sln.DotSettings b/Alpaca.Markets.sln.DotSettings index aa26790b..fe4c46bd 100644 --- a/Alpaca.Markets.sln.DotSettings +++ b/Alpaca.Markets.sln.DotSettings @@ -27,6 +27,7 @@ True True True + True True True True diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs index 1779a6f0..51945f88 100644 --- a/Alpaca.Markets/AlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -23,49 +23,47 @@ public Task> ListExchangesAsync( "meta/exchanges", RateLimitHandler, cancellationToken); public Task> ListLatestQuotesAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default) => getLatestAsync( - symbols.EnsureNotNull(), "quotes/latest", data => data.Quotes, cancellationToken); + request.EnsureNotNull().Validate(), "quotes/latest", data => data.Quotes, cancellationToken); public Task> ListLatestTradesAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default) => getLatestAsync( - symbols.EnsureNotNull(), "trades/latest", data => data.Trades, cancellationToken); + request.EnsureNotNull().Validate(), "trades/latest", data => data.Trades, cancellationToken); public Task> ListSnapshotsAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default) => getLatestAsync( - symbols.EnsureNotNull(), "snapshots", data => data.Snapshots, cancellationToken); + request.EnsureNotNull().Validate(), "snapshots", data => data.Snapshots, cancellationToken); public Task> GetOptionChainAsync( - String underlyingSymbol, + OptionChainRequest request, CancellationToken cancellationToken = default) => getLatestAsync( - [], $"snapshots/{underlyingSymbol.EnsureNotNull()}", data => data.Snapshots, cancellationToken); + request.EnsureNotNull().Validate(), data => data.Snapshots, cancellationToken); private async Task> getLatestAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, String lastPathSegment, Func> itemsSelector, CancellationToken cancellationToken) where TJson : TApi, ISymbolMutable => await HttpClient.GetAsync( - await getUriBuilderAsync(symbols, lastPathSegment).ConfigureAwait(false), - itemsSelector, withSymbol, - RateLimitHandler, cancellationToken).ConfigureAwait(false); + await request.GetUriBuilderAsync(HttpClient, lastPathSegment).ConfigureAwait(false), + itemsSelector, withSymbol, RateLimitHandler, cancellationToken).ConfigureAwait(false); - private async ValueTask getUriBuilderAsync( - IEnumerable symbols, - String lastPathSegment) => - new UriBuilder(HttpClient.BaseAddress!) - { - Query = await new QueryBuilder() - .AddParameter("symbols", symbols.ToList()) - .AsStringAsync().ConfigureAwait(false) - }.AppendPath(lastPathSegment); + private async Task> getLatestAsync( + OptionChainRequest request, + Func> itemsSelector, + CancellationToken cancellationToken) + where TJson : TApi, ISymbolMutable => + await HttpClient.GetAsync( + await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + itemsSelector, withSymbol, RateLimitHandler, cancellationToken).ConfigureAwait(false); private static TApi withSymbol( KeyValuePair kvp) diff --git a/Alpaca.Markets/Enums/OptionsFeed.cs b/Alpaca.Markets/Enums/OptionsFeed.cs new file mode 100644 index 00000000..dd5cb0dd --- /dev/null +++ b/Alpaca.Markets/Enums/OptionsFeed.cs @@ -0,0 +1,22 @@ +namespace Alpaca.Markets; + +/// +/// Supported options feed for Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum OptionsFeed +{ + /// + /// Options Price Reporting Authority. + /// + [UsedImplicitly] + [EnumMember(Value = "opra")] + Opra, + + /// + /// Indicative options data. + /// + [UsedImplicitly] + [EnumMember(Value = "indicative")] + Indicative +} diff --git a/Alpaca.Markets/Helpers/OpenClose.cs b/Alpaca.Markets/Helpers/OpenClose.cs index 3d1862ec..058b4256 100644 --- a/Alpaca.Markets/Helpers/OpenClose.cs +++ b/Alpaca.Markets/Helpers/OpenClose.cs @@ -32,11 +32,13 @@ internal OpenClose( /// /// Gets open time in EST time zone. /// + // ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global public DateTimeOffset OpenEst { get; init; } /// /// Gets close time in EST time zone. /// + // ReSharper disable once AutoPropertyCanBeMadeGetOnly.Global public DateTimeOffset CloseEst { get; init; } /// diff --git a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs index 124a6a8a..367159e7 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs @@ -34,8 +34,11 @@ Task> ListExchangesAsync( /// /// Gets most recent quotes for several option contracts from Alpaca REST API endpoint. /// - /// Option contracts symbol names list. + /// Option contracts latest data request. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// /// /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. /// @@ -49,19 +52,22 @@ Task> ListExchangesAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// - /// The argument is null. + /// The argument is null. /// /// Read-only dictionary with the latest quotes information. [UsedImplicitly] Task> ListLatestQuotesAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default); /// /// Gets most recent trades for several option contracts from Alpaca REST API endpoint. /// - /// Option contracts symbol names list. + /// Option contracts latest data request. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// /// /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. /// @@ -75,19 +81,22 @@ Task> ListLatestQuotesAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// - /// The argument is null. + /// The argument is null. /// /// Read-only dictionary with the latest trades information. [UsedImplicitly] Task> ListLatestTradesAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default); /// /// Gets current snapshot (latest trade/quote) for several option contracts from Alpaca REST API endpoint. /// - /// Option contracts symbol names list. + /// Option contracts latest data request. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// /// /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. /// @@ -101,19 +110,22 @@ Task> ListLatestTradesAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// - /// The argument is null. + /// The argument is null. /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] Task> ListSnapshotsAsync( - IEnumerable symbols, + LatestOptionsDataRequest request, CancellationToken cancellationToken = default); /// /// Gets option chain (snapshots list) for option contracts with same underlying symbol from Alpaca REST API endpoint. /// - /// The financial instrument on which returned option contracts are based or derived. + /// Option contracts latest data request. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// /// /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. /// @@ -127,11 +139,11 @@ Task> ListSnapshotsAsync( /// .NET Core and .NET 5 and later only: The request failed due to timeout. /// /// - /// The argument is null. + /// The argument is null. /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] Task> GetOptionChainAsync( - String underlyingSymbol, + OptionChainRequest request, CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Parameters/LatestOptionsDataRequest.cs b/Alpaca.Markets/Parameters/LatestOptionsDataRequest.cs new file mode 100644 index 00000000..2a414bb8 --- /dev/null +++ b/Alpaca.Markets/Parameters/LatestOptionsDataRequest.cs @@ -0,0 +1,50 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates data for latest options data requests on Alpaca Data API v2. +/// +public sealed class LatestOptionsDataRequest : Validation.IRequest +{ + private readonly HashSet _symbols = new(StringComparer.Ordinal); + + /// + /// Creates new instance of object. + /// + /// Options symbols list for data retrieval. + /// + /// The argument is null. + /// + public LatestOptionsDataRequest( + IEnumerable symbols) => + _symbols.UnionWith(symbols.EnsureNotNull()); + + /// + /// Gets options symbols list for data retrieval. + /// + [UsedImplicitly] + public IReadOnlyCollection Symbols => _symbols; + + /// + /// Gets options feed for data retrieval. + /// + [UsedImplicitly] + [ExcludeFromCodeCoverage] + public OptionsFeed? OptionsFeed { get; set; } + + internal async ValueTask GetUriBuilderAsync( + HttpClient httpClient, + String lastPathSegment) => + new UriBuilder(httpClient.BaseAddress!) + { + Query = await new QueryBuilder() + .AddParameter("symbols", Symbols.ToList()) + .AddParameter("feed", OptionsFeed) + .AsStringAsync().ConfigureAwait(false) + }.AppendPath(lastPathSegment); + + IEnumerable Validation.IRequest.GetExceptions() + { + yield return Symbols.TryValidateSymbolsList(); + yield return Symbols.TryValidateSymbolName(); + } +} diff --git a/Alpaca.Markets/Parameters/OptionChainRequest.cs b/Alpaca.Markets/Parameters/OptionChainRequest.cs new file mode 100644 index 00000000..eda4ac52 --- /dev/null +++ b/Alpaca.Markets/Parameters/OptionChainRequest.cs @@ -0,0 +1,46 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates data for latest options data requests on Alpaca Data API v2. +/// +public sealed class OptionChainRequest : Validation.IRequest +{ + /// + /// Creates new instance of object. + /// + /// Option underlying symbol for data retrieval. + /// + /// The argument is null. + /// + public OptionChainRequest( + String underlyingSymbol) => + UnderlyingSymbol = underlyingSymbol.EnsureNotNull(); + + /// + /// Gets options symbols list for data retrieval. + /// + [UsedImplicitly] + + public String UnderlyingSymbol { get; } + + /// + /// Gets options feed for data retrieval. + /// + [UsedImplicitly] + [ExcludeFromCodeCoverage] + public OptionsFeed? OptionsFeed { get; set; } + + internal async ValueTask GetUriBuilderAsync( + HttpClient httpClient) => + new UriBuilder(httpClient.BaseAddress!) + { + Query = await new QueryBuilder() + .AddParameter("feed", OptionsFeed) + .AsStringAsync().ConfigureAwait(false) + }.AppendPath($"snapshots/{UnderlyingSymbol}"); + + IEnumerable Validation.IRequest.GetExceptions() + { + yield return UnderlyingSymbol.TryValidateSymbolName(); + } +} diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 0781aa53..90eae0eb 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -491,11 +491,11 @@ Alpaca.Markets.IAlpacaNewsStreamingClient Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription() -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription(string! symbol) -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaOptionsDataClient -Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(string! underlyingSymbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(System.Collections.Generic.IEnumerable! symbols, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaScreenerClient Alpaca.Markets.IAlpacaScreenerClient.GetTopMarketMoversAsync(int? numberOfLosersAndGainersInResponse = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaStreamingClient diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 8e352f53..314f8f91 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,4 +1,17 @@ #nullable enable +Alpaca.Markets.LatestOptionsDataRequest +Alpaca.Markets.LatestOptionsDataRequest.LatestOptionsDataRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.set -> void +Alpaca.Markets.LatestOptionsDataRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! +Alpaca.Markets.OptionChainRequest +Alpaca.Markets.OptionChainRequest.OptionChainRequest(string! underlyingSymbol) -> void +Alpaca.Markets.OptionChainRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.OptionChainRequest.OptionsFeed.set -> void +Alpaca.Markets.OptionChainRequest.UnderlyingSymbol.get -> string! Alpaca.Markets.OptionContractsRequest.OptionContractsRequest() -> void Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(System.Collections.Generic.IEnumerable! underlyingSymbols) -> void Alpaca.Markets.OptionContractsRequest.UnderlyingSymbols.get -> System.Collections.Generic.IReadOnlyCollection! +Alpaca.Markets.OptionsFeed +Alpaca.Markets.OptionsFeed.Indicative = 1 -> Alpaca.Markets.OptionsFeed +Alpaca.Markets.OptionsFeed.Opra = 0 -> Alpaca.Markets.OptionsFeed From 2ec1decbfe91e23d30d3f7b28006c1c45c51eac2 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 5 Apr 2024 11:01:18 +0200 Subject: [PATCH 078/125] Issue #731 - The `IAlpacaTradingClient` interface was extended with two new `ExerciseOptionsContractBy...Async` methods. --- .../AlpacaTradingClientTest.Positions.cs | 20 +++++++++ Alpaca.Markets/AlpacaTradingClient.Orders.cs | 12 ++++++ Alpaca.Markets/CompatibilitySuppressions.xml | 42 ++++++++++++++++++ .../Helpers/HttpClientExtensions.Post.cs | 16 +++++++ .../Interfaces/IAlpacaTradingClient.cs | 43 +++++++++++++++++++ .../Parameters/OptionChainRequest.cs | 2 +- Alpaca.Markets/PublicAPI.Unshipped.txt | 2 + 7 files changed, 136 insertions(+), 1 deletion(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs index b7988a68..01d00539 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs @@ -93,6 +93,26 @@ public async Task DeleteAllPositionsWithOrdersAsyncWorks() Assert.NotEmpty(statuses); } + [Fact] + public async Task ExerciseOptionsPositionByIdAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + mock.AddPost("/v2/positions/*/exercise", new JObject()); + + Assert.True(await mock.Client.ExerciseOptionsPositionByIdAsync(Guid.NewGuid())); + } + + [Fact] + public async Task ExerciseOptionsPositionBySymbolAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); + + mock.AddPost("/v2/positions/*/exercise", new JObject()); + + Assert.True(await mock.Client.ExerciseOptionsPositionBySymbolAsync(Stock)); + } + [SuppressMessage("ReSharper", "StringLiteralTypo")] private static JObject createPosition() => new( diff --git a/Alpaca.Markets/AlpacaTradingClient.Orders.cs b/Alpaca.Markets/AlpacaTradingClient.Orders.cs index 441f5404..a5e1dc5e 100644 --- a/Alpaca.Markets/AlpacaTradingClient.Orders.cs +++ b/Alpaca.Markets/AlpacaTradingClient.Orders.cs @@ -62,4 +62,16 @@ public Task> CancelAllOrdersAsync( CancellationToken cancellationToken = default) => _httpClient.DeleteAsync, List>( "v2/orders", _rateLimitHandler, cancellationToken); + + public Task ExerciseOptionsPositionByIdAsync( + Guid contractId, + CancellationToken cancellationToken = default) => + _httpClient.TryPostAsync( + $"v2/positions/{contractId:D}/exercise", _rateLimitHandler, cancellationToken); + + public Task ExerciseOptionsPositionBySymbolAsync( + String symbol, + CancellationToken cancellationToken = default) => + _httpClient.TryPostAsync( + $"v2/positions/{symbol.EnsureNotNull()}/exercise", _rateLimitHandler, cancellationToken); } diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index 461aeee6..32eebfaf 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -1,6 +1,20 @@  + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + CP0006 M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) @@ -50,6 +64,20 @@ lib/net6.0/Alpaca.Markets.dll true + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + CP0006 M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) @@ -99,6 +127,20 @@ lib/netstandard2.0/Alpaca.Markets.dll true + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + CP0006 M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) diff --git a/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs b/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs index e14e6f53..482a615e 100644 --- a/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs +++ b/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs @@ -2,6 +2,22 @@ internal static partial class HttpClientExtensions { + public static Task TryPostAsync( + this HttpClient httpClient, + UriBuilder uriBuilder, + RateLimitHandler rateLimitHandler, + CancellationToken cancellationToken) => + callAndReturnSuccessCodeAsync( + httpClient, HttpMethod.Post, uriBuilder.Uri, rateLimitHandler, cancellationToken); + + public static Task TryPostAsync( + this HttpClient httpClient, + String endpointUri, + RateLimitHandler rateLimitHandler, + CancellationToken cancellationToken) => + callAndReturnSuccessCodeAsync( + httpClient, HttpMethod.Post, asUri(endpointUri), rateLimitHandler, cancellationToken); + public static Task PostAsync( this HttpClient httpClient, String endpointUri, diff --git a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs index cbd162a8..6c3b8938 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs @@ -1003,4 +1003,47 @@ Task GetOptionContractByIdAsync( Task GetOptionContractBySymbolAsync( String symbol, CancellationToken cancellationToken = default); + + /// + /// Exercises a held option contract, converting it into the underlying asset based on the specified terms. + /// + /// Option contract unique identifier. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// Returns true if operation completed successfully. + [UsedImplicitly] + Task ExerciseOptionsPositionByIdAsync( + Guid contractId, + CancellationToken cancellationToken = default); + + /// + /// Exercises a held option contract, converting it into the underlying asset based on the specified terms. + /// + /// Option contract unique symbol name. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Returns true if operation completed successfully. + [UsedImplicitly] + Task ExerciseOptionsPositionBySymbolAsync( + String symbol, + CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Parameters/OptionChainRequest.cs b/Alpaca.Markets/Parameters/OptionChainRequest.cs index eda4ac52..eefbc308 100644 --- a/Alpaca.Markets/Parameters/OptionChainRequest.cs +++ b/Alpaca.Markets/Parameters/OptionChainRequest.cs @@ -6,7 +6,7 @@ public sealed class OptionChainRequest : Validation.IRequest { /// - /// Creates new instance of object. + /// Creates new instance of object. /// /// Option underlying symbol for data retrieval. /// diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 314f8f91..487fdb67 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,4 +1,6 @@ #nullable enable +Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.LatestOptionsDataRequest Alpaca.Markets.LatestOptionsDataRequest.LatestOptionsDataRequest(System.Collections.Generic.IEnumerable! symbols) -> void Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? From cb251fa965ca9bcc0ca7886470b62f0787c97dbc Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 5 Apr 2024 11:38:08 +0200 Subject: [PATCH 079/125] Prepare release 7.1.0-beta2 of SDK --- .../AlpacaTradingClientTest.Positions.cs | 24 ++++++++++--------- Alpaca.Markets/Alpaca.Markets.csproj | 23 ++++++------------ .../Helpers/HttpClientExtensions.Post.cs | 8 ------- Alpaca.Markets/PublicAPI.Shipped.txt | 18 ++++++++++++++ Alpaca.Markets/PublicAPI.Unshipped.txt | 18 -------------- 5 files changed, 38 insertions(+), 53 deletions(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs index 01d00539..ec0e954e 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Positions.cs @@ -113,7 +113,9 @@ public async Task ExerciseOptionsPositionBySymbolAsyncWorks() Assert.True(await mock.Client.ExerciseOptionsPositionBySymbolAsync(Stock)); } +#pragma warning disable IDE0079 // Remove unnecessary suppression [SuppressMessage("ReSharper", "StringLiteralTypo")] +#pragma warning restore IDE0079 // Remove unnecessary suppression private static JObject createPosition() => new( new JProperty("unrealized_intraday_plpc", ProfitLossPercent), @@ -145,17 +147,17 @@ private static void validatePosition( Assert.NotEqual(Guid.Empty, position.AssetId); - Assert.True(position.AssetChangePercent != 0M); - Assert.True(position.AverageEntryPrice != 0M); - Assert.True(position.AssetCurrentPrice!= 0M); - Assert.True(position.AssetLastPrice != 0M); - Assert.True(position.MarketValue != 0M); - Assert.True(position.CostBasis != 0M); - - Assert.True(position.UnrealizedProfitLoss != 0M); - Assert.True(position.UnrealizedProfitLossPercent != 0M); - Assert.True(position.IntradayUnrealizedProfitLoss != 0M); - Assert.True(position.IntradayUnrealizedProfitLossPercent != 0M); + Assert.NotEqual(0M, position.AssetChangePercent); + Assert.NotEqual(0M, position.AverageEntryPrice); + Assert.NotEqual(0M, position.AssetCurrentPrice); + Assert.NotEqual(0M, position.AssetLastPrice); + Assert.NotEqual(0M, position.MarketValue); + Assert.NotEqual(0M, position.CostBasis); + + Assert.NotEqual(0M, position.UnrealizedProfitLoss); + Assert.NotEqual(0M, position.UnrealizedProfitLossPercent); + Assert.NotEqual(0M, position.IntradayUnrealizedProfitLoss); + Assert.NotEqual(0M, position.IntradayUnrealizedProfitLossPercent); } private static JArray getDeletePositionsResponse() => diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 5939b5db..ad7c067a 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,26 +12,17 @@ - 7.1.0.0 - 7.1.0.0 - 7.1.0-beta1 + 7.1.0.1 + 7.1.0.1 + 7.1.0-beta2 -- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties. -- Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. -- Added the new 'AssetType.UsOption` enumeration member. -- Added the new 'OptionTradingLevel` enumeration. -- Added the new `IOptionContract` interface and two related enums: `OptionType` and `OptionStyle`. -- Added the new `IAlpacaTradingClient.GetOptionContractByIdAsync` and `IAlpacaTradingClient.GetOptionContractBySymbolAsync` methods. -- Added the new `IAlpacaTradingClient.ListOptionContractsAsync` method and related `OptionContractsRequest` class. -- Added the new `IAlpacaOptionDataClient` interface and related factory methods and configuration class. -- Added the new `IAlpacaOptionDataClient.ListLatestQuotesAsync` and `IAlpacaOptionDataClient.ListLatestTradesAsync` methods. -- Added the new `IAlpacaOptionDataClient.ListSnapshotsAsync` and `IAlpacaOptionDataClient.GetOptionChainAsync` methods. -- Added the new `IAlpacaOptionDataClient.ListExchangesAsync` method for metadata requesting. -- The `IAlpacaOptionDataClient` interface extended with the `IHistoricalTradesClient` and `IHistoricalBarsClient` interfaces. -- The new `HistoricalOptionTradesRequest` and `HistoricalOptionBarsRequest` classes were added. +- The `OptionsContractRequest.UnderlyingSymbol` mandatory property was replaced with the `OptionsContractRequest.UnderlyingSymbols` optional property. +- The `IAlpacaTradingClient` interface was extended with the `ExerciseOptionsContractByIdAsync` and `ExerciseOptionsContractBySymbolAsync` methods. +- The `IAlpacaTradingClient.ListOptionContractAsync` method now uses a same pagination logic as historical data. +- The `OptionFeed` enum added and now it can be specified for latest/snapshot requests. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp diff --git a/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs b/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs index 482a615e..ac0a2a85 100644 --- a/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs +++ b/Alpaca.Markets/Helpers/HttpClientExtensions.Post.cs @@ -2,14 +2,6 @@ internal static partial class HttpClientExtensions { - public static Task TryPostAsync( - this HttpClient httpClient, - UriBuilder uriBuilder, - RateLimitHandler rateLimitHandler, - CancellationToken cancellationToken) => - callAndReturnSuccessCodeAsync( - httpClient, HttpMethod.Post, uriBuilder.Uri, rateLimitHandler, cancellationToken); - public static Task TryPostAsync( this HttpClient httpClient, String endpointUri, diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 90eae0eb..f79b7a43 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -513,6 +513,8 @@ Alpaca.Markets.IAlpacaTradingClient.DeleteAssetFromWatchListByNameAsync(Alpaca.M Alpaca.Markets.IAlpacaTradingClient.DeletePositionAsync(Alpaca.Markets.DeletePositionRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.DeleteWatchListByIdAsync(System.Guid watchListId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.DeleteWatchListByNameAsync(string! name, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetAccountAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetAccountConfigurationAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaTradingClient.GetAnnouncementAsync(System.Guid announcementId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! @@ -921,6 +923,11 @@ Alpaca.Markets.LatestMarketDataRequest.Feed.get -> Alpaca.Markets.MarketDataFeed Alpaca.Markets.LatestMarketDataRequest.Feed.set -> void Alpaca.Markets.LatestMarketDataRequest.LatestMarketDataRequest(string! symbol) -> void Alpaca.Markets.LatestMarketDataRequest.Symbol.get -> string! +Alpaca.Markets.LatestOptionsDataRequest +Alpaca.Markets.LatestOptionsDataRequest.LatestOptionsDataRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.set -> void +Alpaca.Markets.LatestOptionsDataRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! Alpaca.Markets.LatestOrderBooksRequest Alpaca.Markets.LatestOrderBooksRequest.Exchanges.get -> System.Collections.Generic.IReadOnlyCollection! Alpaca.Markets.LatestOrderBooksRequest.LatestOrderBooksRequest(System.Collections.Generic.IEnumerable! symbols) -> void @@ -1015,6 +1022,11 @@ Alpaca.Markets.OpenClose.OpenClose() -> void Alpaca.Markets.OpenClose.OpenEst.get -> System.DateTimeOffset Alpaca.Markets.OpenClose.OpenEst.init -> void Alpaca.Markets.OpenClose.ToInterval() -> Alpaca.Markets.Interval +Alpaca.Markets.OptionChainRequest +Alpaca.Markets.OptionChainRequest.OptionChainRequest(string! underlyingSymbol) -> void +Alpaca.Markets.OptionChainRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.OptionChainRequest.OptionsFeed.set -> void +Alpaca.Markets.OptionChainRequest.UnderlyingSymbol.get -> string! Alpaca.Markets.OptionContractsRequest Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? Alpaca.Markets.OptionContractsRequest.AssetStatus.set -> void @@ -1024,7 +1036,9 @@ Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.get -> Alpaca.Markets.OptionContractsRequest.ExpirationDateGreaterThanOrEqualTo.set -> void Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? Alpaca.Markets.OptionContractsRequest.ExpirationDateLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest() -> void Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(string! underlyingSymbol) -> void +Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(System.Collections.Generic.IEnumerable! underlyingSymbols) -> void Alpaca.Markets.OptionContractsRequest.OptionStyle.get -> Alpaca.Markets.OptionStyle? Alpaca.Markets.OptionContractsRequest.OptionStyle.set -> void Alpaca.Markets.OptionContractsRequest.OptionType.get -> Alpaca.Markets.OptionType? @@ -1036,6 +1050,10 @@ Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.get -> dec Alpaca.Markets.OptionContractsRequest.StrikePriceGreaterThanOrEqualTo.set -> void Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.get -> decimal? Alpaca.Markets.OptionContractsRequest.StrikePriceLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionContractsRequest.UnderlyingSymbols.get -> System.Collections.Generic.IReadOnlyCollection! +Alpaca.Markets.OptionsFeed +Alpaca.Markets.OptionsFeed.Indicative = 1 -> Alpaca.Markets.OptionsFeed +Alpaca.Markets.OptionsFeed.Opra = 0 -> Alpaca.Markets.OptionsFeed Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 487fdb67..ab058de6 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,19 +1 @@ #nullable enable -Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid contractId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! -Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(string! symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! -Alpaca.Markets.LatestOptionsDataRequest -Alpaca.Markets.LatestOptionsDataRequest.LatestOptionsDataRequest(System.Collections.Generic.IEnumerable! symbols) -> void -Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? -Alpaca.Markets.LatestOptionsDataRequest.OptionsFeed.set -> void -Alpaca.Markets.LatestOptionsDataRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! -Alpaca.Markets.OptionChainRequest -Alpaca.Markets.OptionChainRequest.OptionChainRequest(string! underlyingSymbol) -> void -Alpaca.Markets.OptionChainRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? -Alpaca.Markets.OptionChainRequest.OptionsFeed.set -> void -Alpaca.Markets.OptionChainRequest.UnderlyingSymbol.get -> string! -Alpaca.Markets.OptionContractsRequest.OptionContractsRequest() -> void -Alpaca.Markets.OptionContractsRequest.OptionContractsRequest(System.Collections.Generic.IEnumerable! underlyingSymbols) -> void -Alpaca.Markets.OptionContractsRequest.UnderlyingSymbols.get -> System.Collections.Generic.IReadOnlyCollection! -Alpaca.Markets.OptionsFeed -Alpaca.Markets.OptionsFeed.Indicative = 1 -> Alpaca.Markets.OptionsFeed -Alpaca.Markets.OptionsFeed.Opra = 0 -> Alpaca.Markets.OptionsFeed From c064e9b79b87c6140bad5cb5402fac665c9748a3 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 7 Apr 2024 15:16:50 +0200 Subject: [PATCH 080/125] Issue #731 - The `ListOptionContractsAsAsyncEnumerable` extensions method uses page token now. --- .../AlpacaTradingClientTest.cs | 5 ++-- .../Alpaca.Markets.Extensions.csproj | 2 +- .../AlpacaTradingClientExtensions.cs | 18 +++++--------- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- .../Interfaces/IHistoricalRequest.cs | 2 ++ .../Messages/JsonOptionContractsPage.cs | 2 ++ .../Parameters/HistoricalBarsRequest.cs | 6 ++--- 7 files changed, 28 insertions(+), 31 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs index 5d0fe76a..206327f1 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs @@ -45,7 +45,7 @@ public async Task ListAccountActivitiesAsAsyncEnumerableWorks() Assert.NotEqual(0, counter); } - [Fact(Skip = "Disable temporary until extensions package update")] + [Fact] public async Task ListOptionContractsAsAsyncEnumerableWorks() { using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); @@ -54,8 +54,7 @@ public async Task ListOptionContractsAsAsyncEnumerableWorks() addSinglePageExpectationOfOptionContracts(mock); var counter = await validateList( - mock.Client.ListOptionContractsAsAsyncEnumerable( - new OptionContractsRequest(Symbol))); + mock.Client.ListOptionContractsAsAsyncEnumerable(new OptionContractsRequest())); Assert.NotEqual(0, counter); } diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 0a14b56f..6a035c22 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -99,7 +99,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs index 6d9a8f8e..31c43a5a 100644 --- a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs @@ -172,19 +172,18 @@ private static async IAsyncEnumerable getAllAccountActivitiesP [MethodImpl(MethodImplOptions.AggressiveInlining)] private static OptionContractsRequest getRequestForFirstPage( OptionContractsRequest request) => - new(request.UnderlyingSymbol) + new(request.UnderlyingSymbols) { ExpirationDateGreaterThanOrEqualTo = request.ExpirationDateGreaterThanOrEqualTo, ExpirationDateLessThanOrEqualTo = request.ExpirationDateLessThanOrEqualTo, StrikePriceGreaterThanOrEqualTo = request.StrikePriceGreaterThanOrEqualTo, StrikePriceLessThanOrEqualTo = request.StrikePriceLessThanOrEqualTo, ExpirationDateEqualTo = request.ExpirationDateEqualTo, + Pagination = { Size = Pagination.MaxPageSize }, AssetStatus = request.AssetStatus, OptionStyle = request.OptionStyle, OptionType = request.OptionType, - RootSymbol = request.RootSymbol, - PageSize = request.PageSize, - PageNumber = 1 // Explicitly set this to 1 + RootSymbol = request.RootSymbol }; private static async IAsyncEnumerable getAllOptionContractsPages( @@ -197,17 +196,12 @@ private static async IAsyncEnumerable getAllOptionContractsPage var contracts = await client .ListOptionContractsAsync(request, cancellationToken).ConfigureAwait(false); - if (contracts.Count == 0) - { - break; // The only way to check if paging completed - } - - foreach (var item in contracts) + foreach (var item in contracts.Items) { yield return item; } - ++request.PageNumber; - } while (request.PageNumber < UInt32.MaxValue); + request.Pagination.Token = contracts.NextPageToken ?? String.Empty; + } while (!String.IsNullOrEmpty(request.Pagination.Token)); } } diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 6c5da8d4..be88a480 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,9 +4,9 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta1, )", - "resolved": "7.1.0-beta1", - "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", + "requested": "[7.1.0-beta2, )", + "resolved": "7.1.0-beta2", + "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.0", @@ -314,9 +314,9 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta1, )", - "resolved": "7.1.0-beta1", - "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", + "requested": "[7.1.0-beta2, )", + "resolved": "7.1.0-beta2", + "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.0", @@ -605,9 +605,9 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta1, )", - "resolved": "7.1.0-beta1", - "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", + "requested": "[7.1.0-beta2, )", + "resolved": "7.1.0-beta2", + "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.0", @@ -863,9 +863,9 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta1, )", - "resolved": "7.1.0-beta1", - "contentHash": "DKGJ828sdwjDTfU9dNvq7L6ZODqgvxfbjko5pnB/RSEoQeEqJx0uz6Sate+7GLm3tTLsRteuG3UxLrnQJ69iUQ==", + "requested": "[7.1.0-beta2, )", + "resolved": "7.1.0-beta2", + "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.0", diff --git a/Alpaca.Markets/Interfaces/IHistoricalRequest.cs b/Alpaca.Markets/Interfaces/IHistoricalRequest.cs index df81edb4..05b2cb28 100644 --- a/Alpaca.Markets/Interfaces/IHistoricalRequest.cs +++ b/Alpaca.Markets/Interfaces/IHistoricalRequest.cs @@ -1,5 +1,7 @@ namespace Alpaca.Markets; +// TODO: olegra - rename this interface into IRequestWithPagination + /// /// Provides unified type-safe access to the historical data request parameters. /// diff --git a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs index 9b70dd22..6462038c 100644 --- a/Alpaca.Markets/Messages/JsonOptionContractsPage.cs +++ b/Alpaca.Markets/Messages/JsonOptionContractsPage.cs @@ -11,6 +11,8 @@ internal sealed class JsonOptionContractsPage : IPage [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] public String? NextPageToken { get; set; } + [JsonIgnore] + [ExcludeFromCodeCoverage] public String Symbol => String.Empty; public IReadOnlyList Items => Contracts.EmptyIfNull(); diff --git a/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs index 9e0e3721..cbe50ff5 100644 --- a/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs @@ -39,7 +39,7 @@ public HistoricalBarsRequest( String symbol, BarTimeFrame timeFrame, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + : this([ symbol.EnsureNotNull() ], timeInterval, timeFrame) { } @@ -54,7 +54,7 @@ public HistoricalBarsRequest( public HistoricalBarsRequest( String symbol, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, timeFrame) + : this([ symbol.EnsureNotNull() ], timeFrame) { } @@ -121,7 +121,7 @@ public HistoricalBarsRequest( String symbol, BarTimeFrame timeFrame, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + : this([ symbol.EnsureNotNull() ], timeInterval, timeFrame) { } From 16a840d261cde39be86758a772867362a8f9340d Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 7 Apr 2024 15:21:46 +0200 Subject: [PATCH 081/125] Prepare release 7.1.0-beta2 of Extensions --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- .../Alpaca.Markets.Extensions.csproj | 13 +++-- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++----- .../Alpaca.Markets.Tests.csproj | 2 +- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 48 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 7 files changed, 46 insertions(+), 47 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 3748b6f8..8e7b9e58 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 6a035c22..a6959646 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,19 +12,18 @@ - 7.1.0.0 - 7.1.0.0 - 7.1.0-beta1 + 7.1.0.1 + 7.1.0.1 + 7.1.0-beta2 -- Added factory methods for creating the strongly typed `IAlpacaOptionsDataClient` instance in dependency injection environments. -- Added the new extension method `ListOptionContractsAsAsyncEnumerable` for the `IAlpacaTradingClient` interface. +- The `ListOptionContractsAsAsyncEnumerable` extensions method uses page token now. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp - © 2018-2023 Alpaca Securities LLC. All rights reserved. + © 2018-2024 Alpaca Securities LLC. All rights reserved. false Aplaca API SDK REST WebSocket trading Extansions for .NET SDK for Alpaca Trade API @@ -95,7 +94,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index be88a480..e200b4ef 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "blVL0IanVAjc6u30U1eRVgvyGynvAuTTXONDzZYxYYbFJwuziptuxNFjsWe0Yw0L3ScC/SfvokVDdM+yKpZIQA==", + "requested": "[8.0.3, )", + "resolved": "8.0.3", + "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 19c0b8e4..fad3e609 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,7 +13,7 @@ - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index ad7c067a..f95c8dc1 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -109,7 +109,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 9af06966..732dfd85 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "requested": "[8.3.1, )", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Portable.System.DateTimeOnly": { @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "requested": "[8.3.1, )", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "requested": "[8.3.1, )", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.0, )", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "requested": "[8.3.1, )", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index bcf31f5c..3efa5f1a 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,7 +24,7 @@ - + From 53f0a90296dba113bc6cad67e6d67a98ad38ab11 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 7 Apr 2024 16:31:07 +0200 Subject: [PATCH 082/125] Issue #741 - Added the `PositionIntent` enum and related properties into the `NewOrderRequest` and `OrderBase` classes. (cherry picked from commit 7b21663c468fbe59daa7198e8162e73568e5fb75) --- Alpaca.Markets/Enums/PositionIntent.cs | 36 ++++++++++++++++++++ Alpaca.Markets/Messages/JsonNewOrder.cs | 3 ++ Alpaca.Markets/Orders/AdvancedOrderBase.cs | 1 + Alpaca.Markets/Orders/OrderBase.cs | 7 ++++ Alpaca.Markets/Orders/OrderBaseExtensions.cs | 20 +++++++++++ Alpaca.Markets/Parameters/NewOrderRequest.cs | 7 ++++ Alpaca.Markets/PublicAPI.Shipped.txt | 10 ++++++ 7 files changed, 84 insertions(+) create mode 100644 Alpaca.Markets/Enums/PositionIntent.cs diff --git a/Alpaca.Markets/Enums/PositionIntent.cs b/Alpaca.Markets/Enums/PositionIntent.cs new file mode 100644 index 00000000..85a032d2 --- /dev/null +++ b/Alpaca.Markets/Enums/PositionIntent.cs @@ -0,0 +1,36 @@ +namespace Alpaca.Markets; + +/// +/// Position intent for order placement in Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum PositionIntent +{ + /// + /// Buy to open a long position. + /// + [UsedImplicitly] + [EnumMember(Value = "buy_to_open")] + BuyToOpen, + + /// + /// Buy to close a short position. + /// + [UsedImplicitly] + [EnumMember(Value = "buy_to_close")] + BuyToClose, + + /// + /// Sell to open a short position. + /// + [UsedImplicitly] + [EnumMember(Value = "sell_to_open")] + SellToOpen, + + /// + /// Sell to close a long position. + /// + [UsedImplicitly] + [EnumMember(Value = "sell_to_close")] + SellToClose, +} diff --git a/Alpaca.Markets/Messages/JsonNewOrder.cs b/Alpaca.Markets/Messages/JsonNewOrder.cs index dd4e6289..86d259f3 100644 --- a/Alpaca.Markets/Messages/JsonNewOrder.cs +++ b/Alpaca.Markets/Messages/JsonNewOrder.cs @@ -46,4 +46,7 @@ internal sealed class JsonNewOrder [JsonProperty(PropertyName = "stop_loss", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)] public JsonNewOrderAdvancedAttributes? StopLoss { get; set; } + + [JsonProperty(PropertyName = "position_intent", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)] + public PositionIntent? PositionIntent { get; set; } } diff --git a/Alpaca.Markets/Orders/AdvancedOrderBase.cs b/Alpaca.Markets/Orders/AdvancedOrderBase.cs index 7faf9a85..8311a36a 100644 --- a/Alpaca.Markets/Orders/AdvancedOrderBase.cs +++ b/Alpaca.Markets/Orders/AdvancedOrderBase.cs @@ -33,6 +33,7 @@ protected internal AdvancedOrderBase( internal override JsonNewOrder GetJsonRequest() { + BaseOrder.PositionIntent = PositionIntent; BaseOrder.ClientOrderId = ClientOrderId; BaseOrder.ExtendedHours = ExtendedHours; BaseOrder.Duration = Duration; diff --git a/Alpaca.Markets/Orders/OrderBase.cs b/Alpaca.Markets/Orders/OrderBase.cs index 6d73e010..2468f79e 100644 --- a/Alpaca.Markets/Orders/OrderBase.cs +++ b/Alpaca.Markets/Orders/OrderBase.cs @@ -85,6 +85,12 @@ protected internal OrderBase( /// Gets or sets flag indicating that order should be allowed to execute during extended hours trading. /// public Boolean? ExtendedHours { get; set; } + + /// + /// Gets or sets the optional position intent for order placement. + /// + [UsedImplicitly] + public PositionIntent? PositionIntent { get; set; } IEnumerable Validation.IRequest.GetExceptions() { @@ -106,6 +112,7 @@ internal virtual JsonNewOrder GetJsonRequest() => TimeInForce = Duration, ExtendedHours = ExtendedHours, ClientOrderId = ClientOrderId, + PositionIntent = PositionIntent, Notional = Quantity.AsNotional(), Quantity = Quantity.AsFractional() }; diff --git a/Alpaca.Markets/Orders/OrderBaseExtensions.cs b/Alpaca.Markets/Orders/OrderBaseExtensions.cs index 0bf19263..9f099894 100644 --- a/Alpaca.Markets/Orders/OrderBaseExtensions.cs +++ b/Alpaca.Markets/Orders/OrderBaseExtensions.cs @@ -65,4 +65,24 @@ public static TOrder WithExtendedHours( order.EnsureNotNull().ExtendedHours = extendedHours; return order; } + + /// + /// Sets the new value for the property of the target order. + /// + /// Target order for changing property. + /// The new property value. + /// Type of target order for altering. + /// + /// The argument is null. + /// + /// Fluent interface - returns the object. + [UsedImplicitly] + public static TOrder WithPositionIntent( + this TOrder order, + PositionIntent positionIntent) + where TOrder : OrderBase + { + order.EnsureNotNull().PositionIntent = positionIntent; + return order; + } } diff --git a/Alpaca.Markets/Parameters/NewOrderRequest.cs b/Alpaca.Markets/Parameters/NewOrderRequest.cs index faf0d10c..0c6eb237 100644 --- a/Alpaca.Markets/Parameters/NewOrderRequest.cs +++ b/Alpaca.Markets/Parameters/NewOrderRequest.cs @@ -121,6 +121,12 @@ public NewOrderRequest( [UsedImplicitly] public Decimal? StopLossLimitPrice { get; set; } + /// + /// Gets or sets the optional position intent for order placement. + /// + [UsedImplicitly] + public PositionIntent? PositionIntent { get; set; } + IEnumerable Validation.IRequest.GetExceptions() { ClientOrderId = ClientOrderId?.TrimClientOrderId(); @@ -139,6 +145,7 @@ internal JsonNewOrder GetJsonRequest() => OrderClass = OrderClass, ClientOrderId = ClientOrderId, ExtendedHours = ExtendedHours, + PositionIntent = PositionIntent, Notional = Quantity.AsNotional(), Quantity = Quantity.AsFractional(), TrailOffsetInDollars = TrailOffsetInDollars, diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index f79b7a43..1ad4d901 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -976,6 +976,8 @@ Alpaca.Markets.NewOrderRequest.LimitPrice.set -> void Alpaca.Markets.NewOrderRequest.NewOrderRequest(string! symbol, Alpaca.Markets.OrderQuantity quantity, Alpaca.Markets.OrderSide side, Alpaca.Markets.OrderType type, Alpaca.Markets.TimeInForce duration) -> void Alpaca.Markets.NewOrderRequest.OrderClass.get -> Alpaca.Markets.OrderClass? Alpaca.Markets.NewOrderRequest.OrderClass.set -> void +Alpaca.Markets.NewOrderRequest.PositionIntent.get -> Alpaca.Markets.PositionIntent? +Alpaca.Markets.NewOrderRequest.PositionIntent.set -> void Alpaca.Markets.NewOrderRequest.Quantity.get -> Alpaca.Markets.OrderQuantity Alpaca.Markets.NewOrderRequest.Side.get -> Alpaca.Markets.OrderSide Alpaca.Markets.NewOrderRequest.StopLossLimitPrice.get -> decimal? @@ -1073,6 +1075,8 @@ Alpaca.Markets.OrderBase.ExtendedHours.get -> bool? Alpaca.Markets.OrderBase.ExtendedHours.set -> void Alpaca.Markets.OrderBase.OrderBase(Alpaca.Markets.OrderBase! baseOrder) -> void Alpaca.Markets.OrderBase.OrderBase(string! symbol, Alpaca.Markets.OrderQuantity quantity, Alpaca.Markets.OrderSide side, Alpaca.Markets.OrderType type) -> void +Alpaca.Markets.OrderBase.PositionIntent.get -> Alpaca.Markets.PositionIntent? +Alpaca.Markets.OrderBase.PositionIntent.set -> void Alpaca.Markets.OrderBase.Quantity.get -> Alpaca.Markets.OrderQuantity Alpaca.Markets.OrderBase.Side.get -> Alpaca.Markets.OrderSide Alpaca.Markets.OrderBase.Symbol.get -> string! @@ -1141,6 +1145,11 @@ Alpaca.Markets.PortfolioHistoryRequest.TimeFrame.set -> void Alpaca.Markets.PortfolioHistoryRequest.TimeInterval.get -> Alpaca.Markets.Interval Alpaca.Markets.PortfolioHistoryRequest.WithInterval(Alpaca.Markets.Interval value) -> Alpaca.Markets.PortfolioHistoryRequest! Alpaca.Markets.PortfolioHistoryRequest.WithInterval(Alpaca.Markets.Interval value) -> Alpaca.Markets.PortfolioHistoryRequest! +Alpaca.Markets.PositionIntent +Alpaca.Markets.PositionIntent.BuyToClose = 1 -> Alpaca.Markets.PositionIntent +Alpaca.Markets.PositionIntent.BuyToOpen = 0 -> Alpaca.Markets.PositionIntent +Alpaca.Markets.PositionIntent.SellToClose = 3 -> Alpaca.Markets.PositionIntent +Alpaca.Markets.PositionIntent.SellToOpen = 2 -> Alpaca.Markets.PositionIntent Alpaca.Markets.PositionSide Alpaca.Markets.PositionSide.Long = 0 -> Alpaca.Markets.PositionSide Alpaca.Markets.PositionSide.Short = 1 -> Alpaca.Markets.PositionSide @@ -1347,6 +1356,7 @@ static Alpaca.Markets.OpenClose.implicit operator Alpaca.Markets.Interval(this TOrder! order, string! clientOrderId) -> TOrder! static Alpaca.Markets.OrderBaseExtensions.WithDuration(this TOrder! order, Alpaca.Markets.TimeInForce duration) -> TOrder! static Alpaca.Markets.OrderBaseExtensions.WithExtendedHours(this TOrder! order, bool extendedHours) -> TOrder! +static Alpaca.Markets.OrderBaseExtensions.WithPositionIntent(this TOrder! order, Alpaca.Markets.PositionIntent positionIntent) -> TOrder! static Alpaca.Markets.OrderExtensions.GetOrderQuantity(this Alpaca.Markets.IOrder! order) -> Alpaca.Markets.OrderQuantity static Alpaca.Markets.OrderSideExtensions.Limit(this Alpaca.Markets.OrderSide orderSide, string! symbol, Alpaca.Markets.OrderQuantity quantity, decimal limitPrice) -> Alpaca.Markets.LimitOrder! static Alpaca.Markets.OrderSideExtensions.Market(this Alpaca.Markets.OrderSide orderSide, string! symbol, Alpaca.Markets.OrderQuantity quantity) -> Alpaca.Markets.MarketOrder! From 361e0f0db2692cc0b817a6cdc08a7f587908dfb7 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 12 Apr 2024 09:33:35 +0200 Subject: [PATCH 083/125] Issue #472 - Added support for the new portfolio history endpoint using the existing `IAlpacaTradingClient.GetPortfolioHistoryAsync` method. --- .../AlpacaTradingClientTest.Account.cs | 6 +-- Alpaca.Markets.sln.DotSettings | 2 + Alpaca.Markets/AlpacaTradingClient.General.cs | 2 +- Alpaca.Markets/Enums/IntradayProfitLoss.cs | 22 ++++++++ Alpaca.Markets/Enums/IntradayReporting.cs | 31 +++++++++++ .../Interfaces/IAlpacaTradingClient.cs | 3 ++ .../Parameters/PortfolioHistoryRequest.cs | 53 +++++++++++++++---- Alpaca.Markets/PublicAPI.Shipped.txt | 12 +++++ 8 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 Alpaca.Markets/Enums/IntradayProfitLoss.cs create mode 100644 Alpaca.Markets/Enums/IntradayReporting.cs diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index 4cf8eaf7..e87d4b3e 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -167,7 +167,6 @@ public async Task GetPortfolioHistoryAsyncWorks() using var mock = mockClientsFactory.GetAlpacaTradingClientMock(); var today = DateTime.UtcNow.Date; - var todayDateOnly = DateOnly.FromDateTime(today); mock.AddGet("/v2/account/portfolio/history", new JObject( new JProperty("timestamp", new JArray( @@ -183,9 +182,8 @@ public async Task GetPortfolioHistoryAsyncWorks() new PortfolioHistoryRequest { Period = new HistoryPeriod(5, HistoryPeriodUnit.Day), - TimeFrame = TimeFrame.FifteenMinutes, - ExtendedHours = true - }.WithInterval(new Interval(todayDateOnly, todayDateOnly))); + TimeFrame = TimeFrame.FifteenMinutes + }.WithInterval(new Interval(today, today))); Assert.Equal(Price, history.BaseValue); diff --git a/Alpaca.Markets.sln.DotSettings b/Alpaca.Markets.sln.DotSettings index fe4c46bd..fe6abfa7 100644 --- a/Alpaca.Markets.sln.DotSettings +++ b/Alpaca.Markets.sln.DotSettings @@ -1,7 +1,9 @@  False <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy> <Policy><Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="Private methods"><ElementKinds><Kind Name="METHOD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /></Policy> + True False True True diff --git a/Alpaca.Markets/AlpacaTradingClient.General.cs b/Alpaca.Markets/AlpacaTradingClient.General.cs index 17882418..ab531ce4 100644 --- a/Alpaca.Markets/AlpacaTradingClient.General.cs +++ b/Alpaca.Markets/AlpacaTradingClient.General.cs @@ -31,7 +31,7 @@ public async Task GetPortfolioHistoryAsync( PortfolioHistoryRequest request, CancellationToken cancellationToken = default) => await _httpClient.GetAsync( - await request.EnsureNotNull() + await request.EnsureNotNull().Validate() .GetUriBuilderAsync(_httpClient).ConfigureAwait(false), _rateLimitHandler, cancellationToken).ConfigureAwait(false); diff --git a/Alpaca.Markets/Enums/IntradayProfitLoss.cs b/Alpaca.Markets/Enums/IntradayProfitLoss.cs new file mode 100644 index 00000000..d0cb00ed --- /dev/null +++ b/Alpaca.Markets/Enums/IntradayProfitLoss.cs @@ -0,0 +1,22 @@ +namespace Alpaca.Markets; + +/// +/// Intraday profit/loss calculation for portfolio history in the Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum IntradayProfitLoss +{ + /// + /// Don't reset the profit/los value to the previous day's closing equity for each trading day. + /// + [UsedImplicitly] + [EnumMember(Value = "no_reset")] + NoReset, + + /// + /// Reset the profit/los value to the previous day's closing equity for each trading day. + /// + [UsedImplicitly] + [EnumMember(Value = "per_day")] + PerDay +} diff --git a/Alpaca.Markets/Enums/IntradayReporting.cs b/Alpaca.Markets/Enums/IntradayReporting.cs new file mode 100644 index 00000000..fc278bc0 --- /dev/null +++ b/Alpaca.Markets/Enums/IntradayReporting.cs @@ -0,0 +1,31 @@ +namespace Alpaca.Markets; + +/// +/// Intraday reporting styles for portfolio history in the Alpaca REST API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum IntradayReporting +{ + /// + /// Only timestamps for the core equity trading hours are returned (usually 9:30am to 4:00pm, trading days only). + /// + [UsedImplicitly] + [EnumMember(Value = "market_hours")] + MarketHours, + + /// + /// Returns timestamps for the whole session including extended hours (usually 4:00am to 8:00pm, trading days only). + /// + [UsedImplicitly] + [EnumMember(Value = "extended_hours")] + ExtendedHours, + + /// + /// Returns price data points 24/7 (for off-session times too). To calculate the equity values we are using the following prices: + /// - Between 4:00am and 10:00pm on trading days the valuation will be calculated based on the last trade (extended hours and normal hours respectively). + /// - After 10:00pm, until the next session open the equities will be valued at their official closing price on the primary exchange. + /// + [UsedImplicitly] + [EnumMember(Value = "continuous")] + Continuous +} diff --git a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs index 6c3b8938..b2be1bc9 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaTradingClient.cs @@ -607,6 +607,9 @@ Task> ListAccountActivitiesAsync( /// /// Portfolio history request parameters. /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// /// /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. /// diff --git a/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs b/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs index a72bdc9a..d25073d8 100644 --- a/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs +++ b/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs @@ -4,21 +4,29 @@ /// Encapsulates request parameters for call. /// [UsedImplicitly] -public sealed class PortfolioHistoryRequest +public sealed class PortfolioHistoryRequest : Validation.IRequest { /// /// Gets inclusive date interval for filtering items in response. /// [UsedImplicitly] [ExcludeFromCodeCoverage] - [Obsolete("Use the DateInterval property instead of this one.", true)] - public Interval TimeInterval => DateInterval.AsTimeInterval(); + [Obsolete("Use the Interval property instead of this one.", true)] + public Interval TimeInterval => Interval; /// /// Gets inclusive date interval for filtering items in response. /// [UsedImplicitly] - public Interval DateInterval { get; private set; } + [ExcludeFromCodeCoverage] + [Obsolete("Use the Interval property instead of this one.", false)] + public Interval DateInterval => Interval.AsDateInterval(); + + /// + /// Gets inclusive date interval for filtering items in response. + /// + [UsedImplicitly] + public Interval Interval { get; private set; } /// /// Gets or sets the time frame value for desired history. Default value (if null) is 1 minute @@ -33,11 +41,24 @@ public sealed class PortfolioHistoryRequest [UsedImplicitly] public HistoryPeriod? Period { get; set; } + /// + /// Gets or sets intraday reporting style. Make sense only if are equal to . + /// + [UsedImplicitly] + public IntradayReporting? IntradayReporting { get; set; } + + /// + /// Gets or sets intraday profit/loss reset. Make sense only if are equal to . + /// + [UsedImplicitly] + public IntradayProfitLoss? IntradayProfitLoss { get; set; } + /// /// Gets or sets flags, indicating that include extended hours included in the result. /// This is effective only for time frame less than 1 day. /// [UsedImplicitly] + [Obsolete("Use the DateInterval property instead of this one.", false)] public Boolean? ExtendedHours { get; set; } internal async ValueTask GetUriBuilderAsync( @@ -46,12 +67,13 @@ internal async ValueTask GetUriBuilderAsync( { Path = "v2/account/portfolio/history", Query = await new QueryBuilder() - .AddParameter("start_date", DateInterval.From) - .AddParameter("end_date", DateInterval.Into) + .AddParameter("intraday_reporting", IntradayReporting) .AddParameter("period", Period?.ToString()) + .AddParameter("start", Interval.From, "O") + .AddParameter("end", Interval.Into, "O") + .AddParameter("pnl_reset", IntradayProfitLoss) // ReSharper disable once StringLiteralTypo .AddParameter("timeframe", TimeFrame) - .AddParameter("extended_hours", ExtendedHours) .AsStringAsync().ConfigureAwait(false) }; @@ -61,13 +83,11 @@ internal async ValueTask GetUriBuilderAsync( /// New filtering interval. /// Request with applied filtering. [UsedImplicitly] - [ExcludeFromCodeCoverage] [MethodImpl(MethodImplOptions.AggressiveInlining)] - [Obsolete("Use the override that gets Interval instead of this one.", true)] public PortfolioHistoryRequest WithInterval( Interval value) { - DateInterval = value.AsDateInterval(); + Interval = value; return this; } @@ -78,10 +98,21 @@ public PortfolioHistoryRequest WithInterval( /// Request with applied filtering. [UsedImplicitly] [MethodImpl(MethodImplOptions.AggressiveInlining)] + [Obsolete("Use the override that gets Interval instead of this one.", false)] public PortfolioHistoryRequest WithInterval( Interval value) { - DateInterval = value; + Interval = value.AsTimeInterval(); return this; } + + IEnumerable Validation.IRequest.GetExceptions() + { + yield return Interval.TryValidateInterval(); + if (Period.HasValue && !Interval.IsEmpty()) + { + yield return new RequestValidationException( + "Both `Period` and `Interval` are set.", nameof(Period)); + } + } } diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 1ad4d901..e7156270 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -683,6 +683,13 @@ Alpaca.Markets.INewsArticle.Summary.get -> string! Alpaca.Markets.INewsArticle.Symbols.get -> System.Collections.Generic.IReadOnlyList! Alpaca.Markets.INewsArticle.ThumbImageUrl.get -> System.Uri? Alpaca.Markets.INewsArticle.UpdatedAtUtc.get -> System.DateTime +Alpaca.Markets.IntradayProfitLoss +Alpaca.Markets.IntradayProfitLoss.NoReset = 0 -> Alpaca.Markets.IntradayProfitLoss +Alpaca.Markets.IntradayProfitLoss.PerDay = 1 -> Alpaca.Markets.IntradayProfitLoss +Alpaca.Markets.IntradayReporting +Alpaca.Markets.IntradayReporting.Continuous = 2 -> Alpaca.Markets.IntradayReporting +Alpaca.Markets.IntradayReporting.ExtendedHours = 1 -> Alpaca.Markets.IntradayReporting +Alpaca.Markets.IntradayReporting.MarketHours = 0 -> Alpaca.Markets.IntradayReporting Alpaca.Markets.IOptionContract Alpaca.Markets.IOptionContract.ClosePrice.get -> decimal? Alpaca.Markets.IOptionContract.ClosePriceDate.get -> System.DateOnly? @@ -1137,6 +1144,11 @@ Alpaca.Markets.PortfolioHistoryRequest Alpaca.Markets.PortfolioHistoryRequest.ExtendedHours.get -> bool? Alpaca.Markets.PortfolioHistoryRequest.ExtendedHours.set -> void Alpaca.Markets.PortfolioHistoryRequest.DateInterval.get -> Alpaca.Markets.Interval +Alpaca.Markets.PortfolioHistoryRequest.Interval.get -> Alpaca.Markets.Interval +Alpaca.Markets.PortfolioHistoryRequest.IntradayProfitLoss.get -> Alpaca.Markets.IntradayProfitLoss? +Alpaca.Markets.PortfolioHistoryRequest.IntradayProfitLoss.set -> void +Alpaca.Markets.PortfolioHistoryRequest.IntradayReporting.get -> Alpaca.Markets.IntradayReporting? +Alpaca.Markets.PortfolioHistoryRequest.IntradayReporting.set -> void Alpaca.Markets.PortfolioHistoryRequest.Period.get -> Alpaca.Markets.HistoryPeriod? Alpaca.Markets.PortfolioHistoryRequest.Period.set -> void Alpaca.Markets.PortfolioHistoryRequest.PortfolioHistoryRequest() -> void From ca07d558ac284e8406b8e9996cd46f68d38d850b Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 12 Apr 2024 10:26:31 +0200 Subject: [PATCH 084/125] Fixed many issues found by the latest version of the R# tool. --- .../AlpacaCryptoStreamingClientTest.cs | 3 +-- .../AlpacaDataStreamingClientTest.Bars.cs | 3 --- ...caDataStreamingClientTest.Cancellations.cs | 1 - ...pacaDataStreamingClientTest.Corrections.cs | 1 - .../AlpacaDataStreamingClientTest.Lulds.cs | 1 - .../AlpacaDataStreamingClientTest.Quotes.cs | 1 - .../AlpacaDataStreamingClientTest.Statuses.cs | 1 - .../AlpacaDataStreamingClientTest.Trades.cs | 1 - .../AlpacaNewsStreamingClientTest.cs | 1 - .../AlpacaTradingClientTest.Account.cs | 1 - Alpaca.Markets/Enums/PositionIntent.cs | 2 +- Alpaca.Markets/Helpers/Validation.cs | 22 +++++++++---------- 12 files changed, 13 insertions(+), 25 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs index 9bd9e7cc..05b95c09 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoStreamingClientTest.cs @@ -14,7 +14,7 @@ public sealed class AlpacaCryptoStreamingClientTest private const String Other = "ETHUSD"; - [Fact(Skip = "Temporary until Extensions package upgrade")] + [Fact] public async Task WithReconnectWorks() { var client = createMockClient( @@ -57,7 +57,6 @@ public async Task SubscribeOrderBookAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Bars.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Bars.cs index 213acf6c..7c5cdb19 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Bars.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Bars.cs @@ -31,7 +31,6 @@ public async Task SubscribeDailyBarAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } @@ -64,7 +63,6 @@ public async Task SubscribeMinuteBarAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } @@ -97,7 +95,6 @@ public async Task SubscribeUpdatedBarAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Cancellations.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Cancellations.cs index 68d598cd..9cad9cb5 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Cancellations.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Cancellations.cs @@ -31,7 +31,6 @@ public async Task SubscribeCancellationAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Corrections.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Corrections.cs index a32769eb..2139ff9c 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Corrections.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Corrections.cs @@ -31,7 +31,6 @@ public async Task SubscribeCorrectionAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Lulds.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Lulds.cs index 06dbe42a..92ff8732 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Lulds.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Lulds.cs @@ -31,7 +31,6 @@ public async Task SubscribeLimitUpLimitDownAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Quotes.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Quotes.cs index 75c02f8d..63be52fd 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Quotes.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Quotes.cs @@ -31,7 +31,6 @@ public async Task SubscribeQuoteAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Statuses.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Statuses.cs index ecdfa263..9c5d3e36 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Statuses.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Statuses.cs @@ -31,7 +31,6 @@ public async Task SubscribeStatusAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Trades.cs b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Trades.cs index ac72e231..434441e7 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Trades.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaDataStreamingClientTest.Trades.cs @@ -31,7 +31,6 @@ public async Task SubscribeTradeAsyncWorks() verifySubscriptions(subscriptionOne, subscriptionTwo); verifySubscriptionEvents(subscription, ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs index 311c0a97..df81b689 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaNewsStreamingClientTest.cs @@ -142,7 +142,6 @@ public async Task SubscribeNewsAsyncWorks() _symbols.VerifySubscriptionsStreams(subscriptionOne, subscriptionTwo); subscription.VerifySubscriptionEventsNumber(ExpectedNumberOfEventsForOneSymbol); - await subscriptionOne.DisposeAsync(); client.VerifyAll(); } diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index e87d4b3e..9c85c365 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -181,7 +181,6 @@ public async Task GetPortfolioHistoryAsyncWorks() var history = await mock.Client.GetPortfolioHistoryAsync( new PortfolioHistoryRequest { - Period = new HistoryPeriod(5, HistoryPeriodUnit.Day), TimeFrame = TimeFrame.FifteenMinutes }.WithInterval(new Interval(today, today))); diff --git a/Alpaca.Markets/Enums/PositionIntent.cs b/Alpaca.Markets/Enums/PositionIntent.cs index 85a032d2..081e14e7 100644 --- a/Alpaca.Markets/Enums/PositionIntent.cs +++ b/Alpaca.Markets/Enums/PositionIntent.cs @@ -32,5 +32,5 @@ public enum PositionIntent /// [UsedImplicitly] [EnumMember(Value = "sell_to_close")] - SellToClose, + SellToClose } diff --git a/Alpaca.Markets/Helpers/Validation.cs b/Alpaca.Markets/Helpers/Validation.cs index 02461d19..a49f4957 100644 --- a/Alpaca.Markets/Helpers/Validation.cs +++ b/Alpaca.Markets/Helpers/Validation.cs @@ -55,28 +55,28 @@ public static TRequest Validate( public static RequestValidationException? TryValidateSymbolName( this String symbolName, - [CallerArgumentExpression("symbolName")] String propertyName = "") => + [CallerArgumentExpression(nameof(symbolName))] String propertyName = "") => String.IsNullOrWhiteSpace(symbolName) ? new RequestValidationException(SymbolShouldNotBeEmptyMessage, propertyName) : null; public static RequestValidationException? TryValidateSymbolName( this IEnumerable symbolNames, - [CallerArgumentExpression("symbolNames")] String propertyName = "") => + [CallerArgumentExpression(nameof(symbolNames))] String propertyName = "") => symbolNames.Any(String.IsNullOrWhiteSpace) ? new RequestValidationException(SymbolShouldNotBeEmptyMessage, propertyName) : null; public static RequestValidationException? TryValidateQuantity( this OrderQuantity quantity, - [CallerArgumentExpression("quantity")] String propertyName = "") => + [CallerArgumentExpression(nameof(quantity))] String propertyName = "") => quantity.Value <= 0M ? new RequestValidationException(OrderQuantityShouldBePositiveMessage, propertyName) : null; public static RequestValidationException? TryValidateQuantity( this Int64? quantity, - [CallerArgumentExpression("quantity")] String propertyName = "") => + [CallerArgumentExpression(nameof(quantity))] String propertyName = "") => quantity <= 0M ? new RequestValidationException(OrderQuantityShouldBePositiveMessage, propertyName) : null; @@ -84,42 +84,42 @@ public static TRequest Validate( public static RequestValidationException? TryValidatePageSize( this Pagination pagination, UInt32 maxPageSize, - [CallerArgumentExpression("pagination")] String propertyName = "") => + [CallerArgumentExpression(nameof(pagination))] String propertyName = "") => pagination.Size < Pagination.MinPageSize || pagination.Size > maxPageSize ? new RequestValidationException(RequestPageSizeTooBigOrTooSmallMessage, propertyName) : null; public static RequestValidationException? TryValidateSymbolsList( this IReadOnlyCollection symbolNames, - [CallerArgumentExpression("symbolNames")] String propertyName = "") => + [CallerArgumentExpression(nameof(symbolNames))] String propertyName = "") => symbolNames.Count == 0 ? new RequestValidationException(ListShouldContainsAtLeastOneItemMessage, propertyName) : null; public static RequestValidationException? TryValidateWatchListName( this String? watchListName, - [CallerArgumentExpression("watchListName")] String propertyName = "") => + [CallerArgumentExpression(nameof(watchListName))] String propertyName = "") => isWatchListNameInvalid(watchListName) ? new RequestValidationException(WatchListNameShouldBe64CharactersLengthMessage, propertyName) : null; public static RequestValidationException? TryValidateWatchListName( this TKey watchListName, - [CallerArgumentExpression("watchListName")] String propertyName = "") => + [CallerArgumentExpression(nameof(watchListName))] String propertyName = "") => watchListName is String stringKey && isWatchListNameInvalid(stringKey) ? new RequestValidationException(WatchListNameShouldBe64CharactersLengthMessage, propertyName) : null; public static RequestValidationException? TryValidateCollection( this IReadOnlyCollection collection, - [CallerArgumentExpression("collection")] String propertyName = "") => + [CallerArgumentExpression(nameof(collection))] String propertyName = "") => collection.Count == 0 ? new RequestValidationException(CollectionShouldNotBeEmptyMessage, propertyName) : null; public static RequestValidationException? TryValidateInterval( this Interval interval, - [CallerArgumentExpression("interval")] String propertyName = "") + [CallerArgumentExpression(nameof(interval))] String propertyName = "") where TItem : struct, IComparable => interval.IsOpen() ? new RequestValidationException(IntervalShouldNotBeOpenMessage, propertyName) @@ -127,7 +127,7 @@ public static TRequest Validate( public static String? ValidateWatchListName( this String? watchListName, - [CallerArgumentExpression("watchListName")] String propertyName = "") => + [CallerArgumentExpression(nameof(watchListName))] String propertyName = "") => isWatchListNameInvalid(watchListName) ? throw new ArgumentException(WatchListNameShouldBe64CharactersLengthMessage, propertyName) : watchListName; From 2e4dd434a1dfefe1402928ba9bd066557466c9ee Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 14 Apr 2024 15:10:18 +0200 Subject: [PATCH 085/125] Issue #472 - Code coverage increased for after latest changes in code. --- Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs | 5 ++++- Alpaca.Markets.Tests/RequestValidationTest.cs | 8 ++++++++ Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs index 9c85c365..f56b5b02 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Account.cs @@ -181,8 +181,11 @@ public async Task GetPortfolioHistoryAsyncWorks() var history = await mock.Client.GetPortfolioHistoryAsync( new PortfolioHistoryRequest { + Period = new HistoryPeriod(1, HistoryPeriodUnit.Week), + IntradayReporting = IntradayReporting.Continuous, + IntradayProfitLoss = IntradayProfitLoss.PerDay, TimeFrame = TimeFrame.FifteenMinutes - }.WithInterval(new Interval(today, today))); + }); Assert.Equal(Price, history.BaseValue); diff --git a/Alpaca.Markets.Tests/RequestValidationTest.cs b/Alpaca.Markets.Tests/RequestValidationTest.cs index 9946a5fa..e51b6aad 100644 --- a/Alpaca.Markets.Tests/RequestValidationTest.cs +++ b/Alpaca.Markets.Tests/RequestValidationTest.cs @@ -91,6 +91,14 @@ public void OrderBaseNegativeQuantityValidationWorks() => public void ListOrdersRequestEmptySymbolValidationWorks() => validate(new ListOrdersRequest().WithSymbol(String.Empty)); + [Fact] + public void PortfolioHistoryRequestEmptySymbolValidationWorks() => + validate(new PortfolioHistoryRequest + { + Period = new HistoryPeriod(1, HistoryPeriodUnit.Week) + } + .WithInterval(new Interval(DateTime.Today, DateTime.Today))); + [Fact] public void CalendarRequestConstructorWorks() { diff --git a/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs b/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs index d25073d8..d0a7bcd6 100644 --- a/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs +++ b/Alpaca.Markets/Parameters/PortfolioHistoryRequest.cs @@ -58,6 +58,7 @@ public sealed class PortfolioHistoryRequest : Validation.IRequest /// This is effective only for time frame less than 1 day. /// [UsedImplicitly] + [ExcludeFromCodeCoverage] [Obsolete("Use the DateInterval property instead of this one.", false)] public Boolean? ExtendedHours { get; set; } @@ -97,6 +98,7 @@ public PortfolioHistoryRequest WithInterval( /// New filtering interval. /// Request with applied filtering. [UsedImplicitly] + [ExcludeFromCodeCoverage] [MethodImpl(MethodImplOptions.AggressiveInlining)] [Obsolete("Use the override that gets Interval instead of this one.", false)] public PortfolioHistoryRequest WithInterval( From 6caf2499548f5f0b44f1a893515fe1bf8349e2cc Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 14 Apr 2024 15:12:46 +0200 Subject: [PATCH 086/125] Update dependencies before implementing the new feature. --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 ++-- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- .../Alpaca.Markets.Tests.csproj | 6 ++--- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 8e7b9e58..fef8fec3 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,8 +19,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index a6959646..56bff70b 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -94,7 +94,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index e200b4ef..efe6affc 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", + "requested": "[8.0.4, )", + "resolved": "8.0.4", + "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", + "requested": "[8.0.4, )", + "resolved": "8.0.4", + "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", + "requested": "[8.0.4, )", + "resolved": "8.0.4", + "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "Lvg7rbvC0jgkf9t0FqDR4XJ8ZmvRQlGXHqQQUsj8vyvm4pyNwLWOEtMxZI6X5kHAaM5/bMS2CXvoWU8YMMyHbw==", + "requested": "[8.0.4, )", + "resolved": "8.0.4", + "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index fad3e609..ca1ba8cc 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,12 +13,12 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all From 99409cec5f30ec6b5846a44dad5bf01fceef479b Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 26 Apr 2024 08:42:13 +0200 Subject: [PATCH 087/125] Issue #745 - The `OptionChainRequest` extended class with new (optional) filtering properties and initial client-side validation. --- .../Parameters/OptionChainRequest.cs | 66 ++++++++++++++++++- .../Parameters/OptionContractsRequest.cs | 11 ++-- Alpaca.Markets/PublicAPI.Unshipped.txt | 15 +++++ 3 files changed, 85 insertions(+), 7 deletions(-) diff --git a/Alpaca.Markets/Parameters/OptionChainRequest.cs b/Alpaca.Markets/Parameters/OptionChainRequest.cs index eefbc308..2d4fc038 100644 --- a/Alpaca.Markets/Parameters/OptionChainRequest.cs +++ b/Alpaca.Markets/Parameters/OptionChainRequest.cs @@ -30,17 +30,81 @@ public OptionChainRequest( [ExcludeFromCodeCoverage] public OptionsFeed? OptionsFeed { get; set; } + /// + /// Gets or sets filter by the exact option contract expiration date. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateEqualTo { get; set; } + + /// + /// Gets or sets filter by the expiration date greater than or equal to the specified value. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateGreaterThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter by the expiration date less than or equal to the specified value. + /// + [UsedImplicitly] + public DateOnly? ExpirationDateLessThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter ty the root symbol. + /// + [UsedImplicitly] + public String? RootSymbol { get; set; } + + /// + /// Gets or sets filter the option contract type. + /// + [UsedImplicitly] + public OptionType? OptionType { get; set; } + + /// + /// Gets or sets filter by the strike price greater than or equal to the specified value. + /// + [UsedImplicitly] + public Decimal? StrikePriceGreaterThanOrEqualTo { get; set; } + + /// + /// Gets or sets filter by the strike price less than or equal to the specified value. + /// + [UsedImplicitly] + public Decimal? StrikePriceLessThanOrEqualTo { get; set; } + + /// + /// Gets the pagination parameters for the request (page size and token). + /// + [UsedImplicitly] + public Pagination Pagination { get; } = new(); + internal async ValueTask GetUriBuilderAsync( HttpClient httpClient) => new UriBuilder(httpClient.BaseAddress!) { - Query = await new QueryBuilder() + Query = await Pagination.QueryBuilder + .AddParameter("expiration_date_gte", ExpirationDateGreaterThanOrEqualTo) + .AddParameter("expiration_date_lte", ExpirationDateLessThanOrEqualTo) + .AddParameter("strike_price_gte", StrikePriceGreaterThanOrEqualTo) + .AddParameter("strike_price_lte", StrikePriceLessThanOrEqualTo) + .AddParameter("expiration_date", ExpirationDateEqualTo) + .AddParameter("root_symbol", RootSymbol) .AddParameter("feed", OptionsFeed) + .AddParameter("type", OptionType) .AsStringAsync().ConfigureAwait(false) }.AppendPath($"snapshots/{UnderlyingSymbol}"); IEnumerable Validation.IRequest.GetExceptions() { + yield return Pagination.TryValidatePageSize(Pagination.MaxPageSize); yield return UnderlyingSymbol.TryValidateSymbolName(); + + if (ExpirationDateEqualTo.HasValue && ( + ExpirationDateGreaterThanOrEqualTo.HasValue || + ExpirationDateLessThanOrEqualTo.HasValue)) + { + yield return new RequestValidationException(nameof(ExpirationDateEqualTo), + "Inconsistent expiration date filters combination."); + } } } diff --git a/Alpaca.Markets/Parameters/OptionContractsRequest.cs b/Alpaca.Markets/Parameters/OptionContractsRequest.cs index fc940e4e..8edb10f8 100644 --- a/Alpaca.Markets/Parameters/OptionContractsRequest.cs +++ b/Alpaca.Markets/Parameters/OptionContractsRequest.cs @@ -102,16 +102,16 @@ internal async ValueTask GetUriBuilderAsync( { Path = "v2/options/contracts", Query = await Pagination.QueryBuilder - .AddParameter("underlying_symbols", UnderlyingSymbols) - .AddParameter("status", AssetStatus) - .AddParameter("expiration_date", ExpirationDateEqualTo) .AddParameter("expiration_date_gte", ExpirationDateGreaterThanOrEqualTo) .AddParameter("expiration_date_lte", ExpirationDateLessThanOrEqualTo) + .AddParameter("strike_price_gte", StrikePriceGreaterThanOrEqualTo) + .AddParameter("strike_price_lte", StrikePriceLessThanOrEqualTo) + .AddParameter("expiration_date", ExpirationDateEqualTo) + .AddParameter("underlying_symbols", UnderlyingSymbols) .AddParameter("root_symbol", RootSymbol) + .AddParameter("status", AssetStatus) .AddParameter("style", OptionStyle) .AddParameter("type", OptionType) - .AddParameter("strike_price_gte", StrikePriceGreaterThanOrEqualTo) - .AddParameter("strike_price_lte", StrikePriceLessThanOrEqualTo) .AsStringAsync().ConfigureAwait(false) }; @@ -120,7 +120,6 @@ internal async ValueTask GetUriBuilderAsync( { yield return Pagination.TryValidatePageSize(Pagination.MaxPageSize); yield return UnderlyingSymbols.TryValidateSymbolName(); - yield return RootSymbol?.TryValidateSymbolName(); if (ExpirationDateEqualTo.HasValue && ( ExpirationDateGreaterThanOrEqualTo.HasValue || diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index ab058de6..fc91bc24 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1 +1,16 @@ #nullable enable +Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.OptionType.get -> Alpaca.Markets.OptionType? +Alpaca.Markets.OptionChainRequest.OptionType.set -> void +Alpaca.Markets.OptionChainRequest.Pagination.get -> Alpaca.Markets.Pagination! +Alpaca.Markets.OptionChainRequest.RootSymbol.get -> string? +Alpaca.Markets.OptionChainRequest.RootSymbol.set -> void +Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.set -> void From be7b14e183537f62796f8d07e9a3fdc56a1357ca Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 26 Apr 2024 10:26:42 +0200 Subject: [PATCH 088/125] Issue #745 - The new `OptionSnapshotRequest` class added and used for the `ListSnapshotsAsync` method (breaking change). --- .../AlpacaOptionsDataClientTest.Snapshots.cs | 12 +++-- Alpaca.Markets/AlpacaOptionsDataClient.cs | 25 ++++------ .../Helpers/DebuggerDisplayExtensions.cs | 4 ++ .../Interfaces/IAlpacaOptionsDataClient.cs | 6 +-- Alpaca.Markets/Interfaces/IDictionaryPage.cs | 20 ++++++++ .../Messages/JsonOptionSnapshotsData.cs | 45 +++++++++++++++++ .../Parameters/OptionSnapshotRequest.cs | 49 +++++++++++++++++++ Alpaca.Markets/PublicAPI.Shipped.txt | 2 - Alpaca.Markets/PublicAPI.Unshipped.txt | 10 ++++ 9 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 Alpaca.Markets/Interfaces/IDictionaryPage.cs create mode 100644 Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs create mode 100644 Alpaca.Markets/Parameters/OptionSnapshotRequest.cs diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs index ecf9decc..0449986d 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -10,14 +10,15 @@ public async Task ListSnapshotsAsyncWorks() mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); var snapshots = await mock.Client.ListSnapshotsAsync( - new LatestOptionsDataRequest(_symbols)); + new OptionSnapshotRequest(_symbols)); Assert.NotNull(snapshots); - Assert.NotEmpty(snapshots); + Assert.NotNull(snapshots.Items); + Assert.NotEmpty(snapshots.Items); foreach (var symbol in _symbols) { - var snapshot = snapshots[symbol]; + var snapshot = snapshots.Items[symbol]; validate(snapshot, symbol); } } @@ -33,11 +34,12 @@ public async Task GetOptionChainAsyncWorks() new OptionChainRequest("AAPL")); Assert.NotNull(snapshots); - Assert.NotEmpty(snapshots); + Assert.NotNull(snapshots.Items); + Assert.NotEmpty(snapshots.Items); foreach (var symbol in _symbols) { - var snapshot = snapshots[symbol]; + var snapshot = snapshots.Items[symbol]; validate(snapshot, symbol); } } diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs index 51945f88..9896eb03 100644 --- a/Alpaca.Markets/AlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -34,17 +34,19 @@ public Task> ListLatestTradesAsync( getLatestAsync( request.EnsureNotNull().Validate(), "trades/latest", data => data.Trades, cancellationToken); - public Task> ListSnapshotsAsync( - LatestOptionsDataRequest request, + public async Task> ListSnapshotsAsync( + OptionSnapshotRequest request, CancellationToken cancellationToken = default) => - getLatestAsync( - request.EnsureNotNull().Validate(), "snapshots", data => data.Snapshots, cancellationToken); + await HttpClient.GetAsync, JsonOptionsSnapshotData>( + await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + RateLimitHandler, cancellationToken).ConfigureAwait(false); - public Task> GetOptionChainAsync( + public async Task> GetOptionChainAsync( OptionChainRequest request, CancellationToken cancellationToken = default) => - getLatestAsync( - request.EnsureNotNull().Validate(), data => data.Snapshots, cancellationToken); + await HttpClient.GetAsync, JsonOptionsSnapshotData>( + await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + RateLimitHandler, cancellationToken).ConfigureAwait(false); private async Task> getLatestAsync( LatestOptionsDataRequest request, @@ -56,15 +58,6 @@ await HttpClient.GetAsync( await request.GetUriBuilderAsync(HttpClient, lastPathSegment).ConfigureAwait(false), itemsSelector, withSymbol, RateLimitHandler, cancellationToken).ConfigureAwait(false); - private async Task> getLatestAsync( - OptionChainRequest request, - Func> itemsSelector, - CancellationToken cancellationToken) - where TJson : TApi, ISymbolMutable => - await HttpClient.GetAsync( - await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), - itemsSelector, withSymbol, RateLimitHandler, cancellationToken).ConfigureAwait(false); - private static TApi withSymbol( KeyValuePair kvp) where TJson : TApi, ISymbolMutable diff --git a/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs b/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs index ebbab89e..98ea1dfd 100644 --- a/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs +++ b/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs @@ -11,6 +11,10 @@ internal static String ToDebuggerDisplayString( this IMultiPage page) => $"{nameof(IPage)}<{typeof(TItem).Name}> {{ Count = {page.Items.Count}, NextPageToken = \"{page.NextPageToken}\" }}"; + internal static String ToDebuggerDisplayString( + this IDictionaryPage page) => + $"{nameof(IDictionaryPage)}<{typeof(TItem).Name}> {{ Count = {page.Items.Count}, NextPageToken = \"{page.NextPageToken}\" }}"; + internal static String ToDebuggerDisplayString( this IBar bar) => $"{nameof(IBar)} {{ TimeUtc = {bar.TimeUtc:O}, Symbol = \"{bar.Symbol}\", Open = {bar.Open}, High = {bar.High}, Low = {bar.Low}, Close = {bar.Close} }}"; diff --git a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs index 367159e7..a20444c8 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs @@ -114,8 +114,8 @@ Task> ListLatestTradesAsync( /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] - Task> ListSnapshotsAsync( - LatestOptionsDataRequest request, + Task> ListSnapshotsAsync( + OptionSnapshotRequest request, CancellationToken cancellationToken = default); /// @@ -143,7 +143,7 @@ Task> ListSnapshotsAsync( /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] - Task> GetOptionChainAsync( + Task> GetOptionChainAsync( OptionChainRequest request, CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Interfaces/IDictionaryPage.cs b/Alpaca.Markets/Interfaces/IDictionaryPage.cs new file mode 100644 index 00000000..74944fd8 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IDictionaryPage.cs @@ -0,0 +1,20 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates single page response in Alpaca Data API v2. +/// +/// Type of paged item (bar, trade or quote) +public interface IDictionaryPage +{ + /// + /// Gets the next page token for continuation. If value of this property + /// equals to null this page is the last one and no more data is available. + /// + [UsedImplicitly] + public String? NextPageToken { get; } + + /// + /// Gets list of items for this response grouped by asset symbols. + /// + public IReadOnlyDictionary Items { get; } +} diff --git a/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs new file mode 100644 index 00000000..49b38ac8 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs @@ -0,0 +1,45 @@ +namespace Alpaca.Markets; + +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IDictionaryPage) + "<" + nameof(ISnapshot) + ">")] +internal sealed class JsonOptionsSnapshotData : IDictionaryPage +{ + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + [JsonProperty(PropertyName = "snapshots", Required = Required.Default)] + public Dictionary ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + + [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] + public String? NextPageToken { get; set; } + + [JsonIgnore] + public IReadOnlyDictionary Items { get; [ExcludeFromCodeCoverage] private set; } + = new Dictionary(); + + [OnDeserialized] + [UsedImplicitly] + internal void OnDeserializedMethod( + StreamingContext _) => + Items = (ItemsList ?? []).ToDictionary( + kvp => kvp.Key, + withSymbol, + StringComparer.Ordinal); + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + this.ToDebuggerDisplayString(); + + private static TApi withSymbol( + KeyValuePair kvp) + where TJson : TApi, ISymbolMutable + { + kvp.Value.SetSymbol(kvp.Key); + return kvp.Value; + } +} diff --git a/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs b/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs new file mode 100644 index 00000000..e93984e0 --- /dev/null +++ b/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs @@ -0,0 +1,49 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates data for latest options data requests on Alpaca Data API v2. +/// +public sealed class OptionSnapshotRequest : Validation.IRequest +{ + private readonly HashSet _symbols = new(StringComparer.Ordinal); + + /// + /// Creates new instance of object. + /// + /// Options symbols list for data retrieval. + /// + /// The argument is null. + /// + public OptionSnapshotRequest( + IEnumerable symbols) => + _symbols.UnionWith(symbols.EnsureNotNull()); + + /// + /// Gets options symbols list for data retrieval. + /// + [UsedImplicitly] + public IReadOnlyCollection Symbols => _symbols; + + /// + /// Gets options feed for data retrieval. + /// + [UsedImplicitly] + [ExcludeFromCodeCoverage] + public OptionsFeed? OptionsFeed { get; set; } + + internal async ValueTask GetUriBuilderAsync( + HttpClient httpClient) => + new UriBuilder(httpClient.BaseAddress!) + { + Query = await new QueryBuilder() + .AddParameter("symbols", Symbols.ToList()) + .AddParameter("feed", OptionsFeed) + .AsStringAsync().ConfigureAwait(false) + }.AppendPath("snapshots"); + + IEnumerable Validation.IRequest.GetExceptions() + { + yield return Symbols.TryValidateSymbolsList(); + yield return Symbols.TryValidateSymbolName(); + } +} diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index e7156270..1c50ca05 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -491,11 +491,9 @@ Alpaca.Markets.IAlpacaNewsStreamingClient Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription() -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription(string! symbol) -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaOptionsDataClient -Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaScreenerClient Alpaca.Markets.IAlpacaScreenerClient.GetTopMarketMoversAsync(int? numberOfLosersAndGainersInResponse = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaStreamingClient diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index fc91bc24..7a9fb493 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,4 +1,9 @@ #nullable enable +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IDictionaryPage +Alpaca.Markets.IDictionaryPage.Items.get -> System.Collections.Generic.IReadOnlyDictionary! +Alpaca.Markets.IDictionaryPage.NextPageToken.get -> string? Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.get -> System.DateOnly? Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.set -> void Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? @@ -14,3 +19,8 @@ Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.set -> void Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.get -> decimal? Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.set -> void +Alpaca.Markets.OptionSnapshotRequest +Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.set -> void +Alpaca.Markets.OptionSnapshotRequest.OptionSnapshotRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.OptionSnapshotRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! From c44e47beb8482bcb9e4243ab540ca9f6a9ee24a6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 26 Apr 2024 11:30:06 +0200 Subject: [PATCH 089/125] Issue #745 - The new `IOptionSnapshot` interface with Greeks and IV added and used instead of `ISnapshot` for options. --- .../AlpacaOptionsDataClientTest.Snapshots.cs | 10 ++--- Alpaca.Markets/AlpacaOptionsDataClient.cs | 8 ++-- .../Helpers/DebuggerDisplayExtensions.cs | 4 ++ .../Interfaces/IAlpacaOptionsDataClient.cs | 4 +- Alpaca.Markets/Interfaces/IGreeks.cs | 38 +++++++++++++++++++ Alpaca.Markets/Interfaces/IOptionSnapshot.cs | 38 +++++++++++++++++++ Alpaca.Markets/Messages/JsonGreeks.cs | 32 ++++++++++++++++ Alpaca.Markets/Messages/JsonOptionSnapshot.cs | 22 ++++------- .../Messages/JsonOptionSnapshotsData.cs | 12 +++--- Alpaca.Markets/PublicAPI.Unshipped.txt | 16 +++++++- 10 files changed, 151 insertions(+), 33 deletions(-) create mode 100644 Alpaca.Markets/Interfaces/IGreeks.cs create mode 100644 Alpaca.Markets/Interfaces/IOptionSnapshot.cs create mode 100644 Alpaca.Markets/Messages/JsonGreeks.cs diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs index 0449986d..59bed032 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -7,6 +7,7 @@ public async Task ListSnapshotsAsyncWorks() { using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + // TODO: olegra - create special method for option snapshots mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); var snapshots = await mock.Client.ListSnapshotsAsync( @@ -28,6 +29,7 @@ public async Task GetOptionChainAsyncWorks() { using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + // TODO: olegra - create special method for option snapshots mock.AddOptionChainExpectation(PathPrefix, _symbols); var snapshots = await mock.Client.GetOptionChainAsync( @@ -45,19 +47,17 @@ public async Task GetOptionChainAsyncWorks() } private static void validate( - ISnapshot snapshot, + IOptionSnapshot snapshot, String symbol) { Assert.Equal(symbol, snapshot.Symbol); - Assert.Null(snapshot.PreviousDailyBar); - Assert.Null(snapshot.CurrentDailyBar); - Assert.Null(snapshot.MinuteBar); - Assert.NotNull(snapshot.Trade); Assert.NotNull(snapshot.Quote); Assert.True(snapshot.Trade.Validate(symbol)); Assert.True(snapshot.Quote.Validate(symbol)); + + // TODO: add validation for greeks and IV } } diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs index 9896eb03..a6253711 100644 --- a/Alpaca.Markets/AlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -34,17 +34,17 @@ public Task> ListLatestTradesAsync( getLatestAsync( request.EnsureNotNull().Validate(), "trades/latest", data => data.Trades, cancellationToken); - public async Task> ListSnapshotsAsync( + public async Task> ListSnapshotsAsync( OptionSnapshotRequest request, CancellationToken cancellationToken = default) => - await HttpClient.GetAsync, JsonOptionsSnapshotData>( + await HttpClient.GetAsync, JsonOptionsSnapshotData>( await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); - public async Task> GetOptionChainAsync( + public async Task> GetOptionChainAsync( OptionChainRequest request, CancellationToken cancellationToken = default) => - await HttpClient.GetAsync, JsonOptionsSnapshotData>( + await HttpClient.GetAsync, JsonOptionsSnapshotData>( await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); diff --git a/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs b/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs index 98ea1dfd..5606f11e 100644 --- a/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs +++ b/Alpaca.Markets/Helpers/DebuggerDisplayExtensions.cs @@ -30,4 +30,8 @@ internal static String ToDebuggerDisplayString( internal static String ToDebuggerDisplayString( this ISnapshot snapshot) => $"{nameof(ISnapshot)} {{ Symbol = \"{snapshot.Symbol}\", {snapshot.Quote?.ToDebuggerDisplayString()}, {snapshot.Trade?.ToDebuggerDisplayString()} }}"; + + internal static String ToDebuggerDisplayString( + this IOptionSnapshot snapshot) => + $"{nameof(IOptionSnapshot)} {{ Symbol = \"{snapshot.Symbol}\", {snapshot.Quote?.ToDebuggerDisplayString()}, {snapshot.Trade?.ToDebuggerDisplayString()} }}"; } diff --git a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs index a20444c8..efc9e133 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaOptionsDataClient.cs @@ -114,7 +114,7 @@ Task> ListLatestTradesAsync( /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] - Task> ListSnapshotsAsync( + Task> ListSnapshotsAsync( OptionSnapshotRequest request, CancellationToken cancellationToken = default); @@ -143,7 +143,7 @@ Task> ListSnapshotsAsync( /// /// Read-only dictionary with the current snapshot information. [UsedImplicitly] - Task> GetOptionChainAsync( + Task> GetOptionChainAsync( OptionChainRequest request, CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Interfaces/IGreeks.cs b/Alpaca.Markets/Interfaces/IGreeks.cs new file mode 100644 index 00000000..b34819bd --- /dev/null +++ b/Alpaca.Markets/Interfaces/IGreeks.cs @@ -0,0 +1,38 @@ +namespace Alpaca.Markets; + +/// +/// Options Greeks are a set of risk measures that are used in the options market to evaluate the risk and reward of an option. +/// +[CLSCompliant(false)] +public interface IGreeks +{ + /// + /// Gets the rate of change of an option's price relative to a change in the price of the underlying asset. + /// + [UsedImplicitly] + Decimal? Delta { get; } + + /// + /// Gets the rate of change in an option's delta relative to a change in the price of the underlying asset. + /// + [UsedImplicitly] + Decimal? Gamma { get; } + + /// + /// Gets the rate of change in an option's price relative to a change in the risk-free rate of interest. + /// + [UsedImplicitly] + Decimal? Rho { get; } + + /// + /// Gets the rate of change in an option's price relative to a change in time. + /// + [UsedImplicitly] + Decimal? Theta { get; } + + /// + /// Gets the rate of change in an option's price relative to a change in the volatility of the underlying asset. + /// + [UsedImplicitly] + Decimal? Vega { get; } +} \ No newline at end of file diff --git a/Alpaca.Markets/Interfaces/IOptionSnapshot.cs b/Alpaca.Markets/Interfaces/IOptionSnapshot.cs new file mode 100644 index 00000000..a8707257 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IOptionSnapshot.cs @@ -0,0 +1,38 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates option snapshot information from the Alpaca REST API. +/// +[CLSCompliant(false)] +public interface IOptionSnapshot +{ + /// + /// Gets the snapshot's option symbol. + /// + [UsedImplicitly] + String Symbol { get; } + + /// + /// Gets the latest quote information. + /// + [UsedImplicitly] + IQuote? Quote { get; } + + /// + /// Gets the latest trade information. + /// + [UsedImplicitly] + ITrade? Trade { get; } + + /// + /// Gets the option greeks data. + /// + [UsedImplicitly] + IGreeks? Greeks { get; } + + /// + /// Gets the implied volatility of the option. + /// + [UsedImplicitly] + Decimal? ImpliedVolatility { get; } +} diff --git a/Alpaca.Markets/Messages/JsonGreeks.cs b/Alpaca.Markets/Messages/JsonGreeks.cs new file mode 100644 index 00000000..124d88f1 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonGreeks.cs @@ -0,0 +1,32 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IGreeks))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonGreeks : IGreeks +{ + [JsonProperty(PropertyName = "delta", Required = Required.Default)] + public Decimal? Delta { get; set; } + + [JsonProperty(PropertyName = "gamma", Required = Required.Default)] + public Decimal? Gamma { get; set; } + + [JsonProperty(PropertyName = "rho", Required = Required.Default)] + public Decimal? Rho { get; set; } + + [JsonProperty(PropertyName = "theta", Required = Required.Default)] + public Decimal? Theta { get; set; } + + [JsonProperty(PropertyName = "vega", Required = Required.Default)] + public Decimal? Vega { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IGreeks)} {{ Delta = {Delta}, Gamma = {Gamma}, Rho = {Rho}, Theta = {Theta}, Vega = {Vega} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonOptionSnapshot.cs b/Alpaca.Markets/Messages/JsonOptionSnapshot.cs index 14097845..400c9db1 100644 --- a/Alpaca.Markets/Messages/JsonOptionSnapshot.cs +++ b/Alpaca.Markets/Messages/JsonOptionSnapshot.cs @@ -4,7 +4,7 @@ [SuppressMessage( "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] -internal sealed class JsonOptionSnapshot : ISnapshot, ISymbolMutable +internal sealed class JsonOptionSnapshot : IOptionSnapshot, ISymbolMutable { [JsonProperty(PropertyName = "latestQuote", Required = Required.Default)] public JsonOptionQuote? JsonQuote { get; set; } @@ -12,6 +12,12 @@ internal sealed class JsonOptionSnapshot : ISnapshot, ISymbolMutable [JsonProperty(PropertyName = "latestTrade", Required = Required.Default)] public JsonOptionTrade? JsonTrade { get; set; } + [JsonProperty(PropertyName = "greeks", Required = Required.Default)] + public JsonGreeks? JsonGreeks { get; set; } + + [JsonProperty(PropertyName = "impliedVolatility", Required = Required.Default)] + public Decimal? ImpliedVolatility { get; set; } + [JsonIgnore] public String Symbol { get; private set; } = String.Empty; @@ -22,19 +28,7 @@ internal sealed class JsonOptionSnapshot : ISnapshot, ISymbolMutable public ITrade? Trade => JsonTrade; [JsonIgnore] - public IBar? MinuteBar => null; - - [JsonIgnore] - public IBar? CurrentDailyBar => null; - - [JsonIgnore] - public IBar? PreviousDailyBar => null; - - [OnDeserialized] - [UsedImplicitly] - internal void OnDeserializedMethod( - StreamingContext _) => - SetSymbol(Symbol); + public IGreeks? Greeks => JsonGreeks; public void SetSymbol( String symbol) diff --git a/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs index 49b38ac8..c09b4ad7 100644 --- a/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs +++ b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs @@ -3,8 +3,8 @@ [SuppressMessage( "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] -[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IDictionaryPage) + "<" + nameof(ISnapshot) + ">")] -internal sealed class JsonOptionsSnapshotData : IDictionaryPage +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IDictionaryPage) + "<" + nameof(IOptionSnapshot) + ">")] +internal sealed class JsonOptionsSnapshotData : IDictionaryPage { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "snapshots", Required = Required.Default)] @@ -14,16 +14,16 @@ internal sealed class JsonOptionsSnapshotData : IDictionaryPage public String? NextPageToken { get; set; } [JsonIgnore] - public IReadOnlyDictionary Items { get; [ExcludeFromCodeCoverage] private set; } - = new Dictionary(); + public IReadOnlyDictionary Items { get; [ExcludeFromCodeCoverage] private set; } + = new Dictionary(); [OnDeserialized] [UsedImplicitly] internal void OnDeserializedMethod( StreamingContext _) => - Items = (ItemsList ?? []).ToDictionary( + Items = ItemsList.ToDictionary( kvp => kvp.Key, - withSymbol, + withSymbol, StringComparer.Ordinal); [ExcludeFromCodeCoverage] diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 7a9fb493..30b96a7a 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,9 +1,21 @@ #nullable enable -Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IDictionaryPage Alpaca.Markets.IDictionaryPage.Items.get -> System.Collections.Generic.IReadOnlyDictionary! Alpaca.Markets.IDictionaryPage.NextPageToken.get -> string? +Alpaca.Markets.IGreeks +Alpaca.Markets.IGreeks.Delta.get -> decimal? +Alpaca.Markets.IGreeks.Gamma.get -> decimal? +Alpaca.Markets.IGreeks.Rho.get -> decimal? +Alpaca.Markets.IGreeks.Theta.get -> decimal? +Alpaca.Markets.IGreeks.Vega.get -> decimal? +Alpaca.Markets.IOptionSnapshot +Alpaca.Markets.IOptionSnapshot.Greeks.get -> Alpaca.Markets.IGreeks? +Alpaca.Markets.IOptionSnapshot.ImpliedVolatility.get -> decimal? +Alpaca.Markets.IOptionSnapshot.Quote.get -> Alpaca.Markets.IQuote? +Alpaca.Markets.IOptionSnapshot.Symbol.get -> string! +Alpaca.Markets.IOptionSnapshot.Trade.get -> Alpaca.Markets.ITrade? Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.get -> System.DateOnly? Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.set -> void Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? From 238c83417b3e2f6164c5d553e497599c620e4b5e Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 26 Apr 2024 19:07:48 +0200 Subject: [PATCH 090/125] Prepare release 7.1.0-beta3 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 14 +++++----- Alpaca.Markets/PublicAPI.Shipped.txt | 37 ++++++++++++++++++++++++++ Alpaca.Markets/PublicAPI.Unshipped.txt | 37 -------------------------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index f95c8dc1..64def21b 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,17 +12,17 @@ - 7.1.0.1 - 7.1.0.1 - 7.1.0-beta2 + 7.1.0.2 + 7.1.0.2 + 7.1.0-beta3 -- The `OptionsContractRequest.UnderlyingSymbol` mandatory property was replaced with the `OptionsContractRequest.UnderlyingSymbols` optional property. -- The `IAlpacaTradingClient` interface was extended with the `ExerciseOptionsContractByIdAsync` and `ExerciseOptionsContractBySymbolAsync` methods. -- The `IAlpacaTradingClient.ListOptionContractAsync` method now uses a same pagination logic as historical data. -- The `OptionFeed` enum added and now it can be specified for latest/snapshot requests. +- Added support for the new portfolio history endpoint using the existing `IAlpacaTradingClient.GetPortfolioHistoryAsync` method. +- The `OptionChainRequest` class extended with new (optional) filtering properties and initial client-side validation. +- The new `OptionSnapshotRequest` class added and used for the `ListSnapshotsAsync` method (breaking change). +- The new `IOptionSnapshot` interface with Greeks and IV added and used instead of `ISnapshot` for options. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 1c50ca05..c8765edb 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -491,9 +491,11 @@ Alpaca.Markets.IAlpacaNewsStreamingClient Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription() -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaNewsStreamingClient.GetNewsSubscription(string! symbol) -> Alpaca.Markets.IAlpacaDataSubscription! Alpaca.Markets.IAlpacaOptionsDataClient +Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestQuotesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaOptionsDataClient.ListLatestTradesAsync(Alpaca.Markets.LatestOptionsDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! +Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaScreenerClient Alpaca.Markets.IAlpacaScreenerClient.GetTopMarketMoversAsync(int? numberOfLosersAndGainersInResponse = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaStreamingClient @@ -606,6 +608,9 @@ Alpaca.Markets.IClock.TimestampUtc.get -> System.DateTime Alpaca.Markets.ICorrection Alpaca.Markets.ICorrection.CorrectedTrade.get -> Alpaca.Markets.ITrade! Alpaca.Markets.ICorrection.OriginalTrade.get -> Alpaca.Markets.ITrade! +Alpaca.Markets.IDictionaryPage +Alpaca.Markets.IDictionaryPage.Items.get -> System.Collections.Generic.IReadOnlyDictionary! +Alpaca.Markets.IDictionaryPage.NextPageToken.get -> string? Alpaca.Markets.IEnvironment Alpaca.Markets.IEnvironment.AlpacaCryptoStreamingApi.get -> System.Uri! Alpaca.Markets.IEnvironment.AlpacaDataApi.get -> System.Uri! @@ -621,6 +626,12 @@ Alpaca.Markets.IErrorInformation.OpenOrdersCount.get -> int? Alpaca.Markets.IErrorInformation.Symbol.get -> string! Alpaca.Markets.IExclusiveTimeInterval Alpaca.Markets.IInclusiveTimeInterval +Alpaca.Markets.IGreeks +Alpaca.Markets.IGreeks.Delta.get -> decimal? +Alpaca.Markets.IGreeks.Gamma.get -> decimal? +Alpaca.Markets.IGreeks.Rho.get -> decimal? +Alpaca.Markets.IGreeks.Theta.get -> decimal? +Alpaca.Markets.IGreeks.Vega.get -> decimal? Alpaca.Markets.IIntervalCalendar Alpaca.Markets.IIntervalCalendar.Session.get -> Alpaca.Markets.OpenClose Alpaca.Markets.IIntervalCalendar.Trading.get -> Alpaca.Markets.OpenClose @@ -706,6 +717,12 @@ Alpaca.Markets.IOptionContract.StrikePrice.get -> decimal Alpaca.Markets.IOptionContract.Symbol.get -> string! Alpaca.Markets.IOptionContract.UnderlyingAssetId.get -> System.Guid Alpaca.Markets.IOptionContract.UnderlyingSymbol.get -> string! +Alpaca.Markets.IOptionSnapshot +Alpaca.Markets.IOptionSnapshot.Greeks.get -> Alpaca.Markets.IGreeks? +Alpaca.Markets.IOptionSnapshot.ImpliedVolatility.get -> decimal? +Alpaca.Markets.IOptionSnapshot.Quote.get -> Alpaca.Markets.IQuote? +Alpaca.Markets.IOptionSnapshot.Symbol.get -> string! +Alpaca.Markets.IOptionSnapshot.Trade.get -> Alpaca.Markets.ITrade? Alpaca.Markets.IOrder Alpaca.Markets.IOrder.AssetClass.get -> Alpaca.Markets.AssetClass Alpaca.Markets.IOrder.AssetId.get -> System.Guid @@ -1030,9 +1047,24 @@ Alpaca.Markets.OpenClose.OpenEst.get -> System.DateTimeOffset Alpaca.Markets.OpenClose.OpenEst.init -> void Alpaca.Markets.OpenClose.ToInterval() -> Alpaca.Markets.Interval Alpaca.Markets.OptionChainRequest +Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? +Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.set -> void Alpaca.Markets.OptionChainRequest.OptionChainRequest(string! underlyingSymbol) -> void Alpaca.Markets.OptionChainRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? Alpaca.Markets.OptionChainRequest.OptionsFeed.set -> void +Alpaca.Markets.OptionChainRequest.OptionType.get -> Alpaca.Markets.OptionType? +Alpaca.Markets.OptionChainRequest.OptionType.set -> void +Alpaca.Markets.OptionChainRequest.Pagination.get -> Alpaca.Markets.Pagination! +Alpaca.Markets.OptionChainRequest.RootSymbol.get -> string? +Alpaca.Markets.OptionChainRequest.RootSymbol.set -> void +Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.set -> void +Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.get -> decimal? +Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.set -> void Alpaca.Markets.OptionChainRequest.UnderlyingSymbol.get -> string! Alpaca.Markets.OptionContractsRequest Alpaca.Markets.OptionContractsRequest.AssetStatus.get -> Alpaca.Markets.AssetStatus? @@ -1065,6 +1097,11 @@ Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.CoveredCallCashSecuredPut = 1 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.Disabled = 0 -> Alpaca.Markets.OptionsTradingLevel Alpaca.Markets.OptionsTradingLevel.LongCallPut = 2 -> Alpaca.Markets.OptionsTradingLevel +Alpaca.Markets.OptionSnapshotRequest +Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? +Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.set -> void +Alpaca.Markets.OptionSnapshotRequest.OptionSnapshotRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.OptionSnapshotRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! Alpaca.Markets.OptionStyle Alpaca.Markets.OptionStyle.American = 0 -> Alpaca.Markets.OptionStyle Alpaca.Markets.OptionStyle.European = 1 -> Alpaca.Markets.OptionStyle diff --git a/Alpaca.Markets/PublicAPI.Unshipped.txt b/Alpaca.Markets/PublicAPI.Unshipped.txt index 30b96a7a..ab058de6 100644 --- a/Alpaca.Markets/PublicAPI.Unshipped.txt +++ b/Alpaca.Markets/PublicAPI.Unshipped.txt @@ -1,38 +1 @@ #nullable enable -Alpaca.Markets.IAlpacaOptionsDataClient.GetOptionChainAsync(Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IAlpacaOptionsDataClient.ListSnapshotsAsync(Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! -Alpaca.Markets.IDictionaryPage -Alpaca.Markets.IDictionaryPage.Items.get -> System.Collections.Generic.IReadOnlyDictionary! -Alpaca.Markets.IDictionaryPage.NextPageToken.get -> string? -Alpaca.Markets.IGreeks -Alpaca.Markets.IGreeks.Delta.get -> decimal? -Alpaca.Markets.IGreeks.Gamma.get -> decimal? -Alpaca.Markets.IGreeks.Rho.get -> decimal? -Alpaca.Markets.IGreeks.Theta.get -> decimal? -Alpaca.Markets.IGreeks.Vega.get -> decimal? -Alpaca.Markets.IOptionSnapshot -Alpaca.Markets.IOptionSnapshot.Greeks.get -> Alpaca.Markets.IGreeks? -Alpaca.Markets.IOptionSnapshot.ImpliedVolatility.get -> decimal? -Alpaca.Markets.IOptionSnapshot.Quote.get -> Alpaca.Markets.IQuote? -Alpaca.Markets.IOptionSnapshot.Symbol.get -> string! -Alpaca.Markets.IOptionSnapshot.Trade.get -> Alpaca.Markets.ITrade? -Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionChainRequest.ExpirationDateEqualTo.set -> void -Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionChainRequest.ExpirationDateGreaterThanOrEqualTo.set -> void -Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.get -> System.DateOnly? -Alpaca.Markets.OptionChainRequest.ExpirationDateLessThanOrEqualTo.set -> void -Alpaca.Markets.OptionChainRequest.OptionType.get -> Alpaca.Markets.OptionType? -Alpaca.Markets.OptionChainRequest.OptionType.set -> void -Alpaca.Markets.OptionChainRequest.Pagination.get -> Alpaca.Markets.Pagination! -Alpaca.Markets.OptionChainRequest.RootSymbol.get -> string? -Alpaca.Markets.OptionChainRequest.RootSymbol.set -> void -Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.get -> decimal? -Alpaca.Markets.OptionChainRequest.StrikePriceGreaterThanOrEqualTo.set -> void -Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.get -> decimal? -Alpaca.Markets.OptionChainRequest.StrikePriceLessThanOrEqualTo.set -> void -Alpaca.Markets.OptionSnapshotRequest -Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? -Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.set -> void -Alpaca.Markets.OptionSnapshotRequest.OptionSnapshotRequest(System.Collections.Generic.IEnumerable! symbols) -> void -Alpaca.Markets.OptionSnapshotRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! From b88bf9a26015c934f65a1be61c3abab1ade42185 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 28 Apr 2024 13:56:53 +0200 Subject: [PATCH 091/125] Issue #745 - The new `OptionSnapshotRequest` class now has a proper pagination support logic. --- .../AlpacaOptionsDataClientTest.Snapshots.cs | 12 +++++++-- Alpaca.Markets.Tests/HistoricalDataHelpers.cs | 27 ++++++++++++++++++- Alpaca.Markets.Tests/RequestValidationTest.cs | 20 +++++++++++++- Alpaca.Markets/AlpacaOptionsDataClient.cs | 4 +-- .../Parameters/OptionSnapshotRequest.cs | 8 +++++- Alpaca.Markets/PublicAPI.Shipped.txt | 1 + 6 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs index 59bed032..f46a0b84 100644 --- a/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs +++ b/Alpaca.Markets.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -8,7 +8,7 @@ public async Task ListSnapshotsAsyncWorks() using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); // TODO: olegra - create special method for option snapshots - mock.AddCryptoSnapshotsExpectation(PathPrefix, _symbols); + mock.AddOptionSnapshotsExpectation(PathPrefix, _symbols); var snapshots = await mock.Client.ListSnapshotsAsync( new OptionSnapshotRequest(_symbols)); @@ -58,6 +58,14 @@ private static void validate( Assert.True(snapshot.Trade.Validate(symbol)); Assert.True(snapshot.Quote.Validate(symbol)); - // TODO: add validation for greeks and IV + Assert.NotNull(snapshot.ImpliedVolatility); + Assert.True(snapshot.ImpliedVolatility > 0.0M); + + Assert.NotNull(snapshot.Greeks); + Assert.NotNull(snapshot.Greeks.Delta); + Assert.NotNull(snapshot.Greeks.Gamma); + Assert.NotNull(snapshot.Greeks.Theta); + Assert.NotNull(snapshot.Greeks.Vega); + Assert.NotNull(snapshot.Greeks.Rho); } } diff --git a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs index e625f05a..e2635870 100644 --- a/Alpaca.Markets.Tests/HistoricalDataHelpers.cs +++ b/Alpaca.Markets.Tests/HistoricalDataHelpers.cs @@ -6,6 +6,7 @@ namespace Alpaca.Markets.Tests; [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Global")] [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Local")] #pragma warning restore IDE0079 // Remove unnecessary suppression +[SuppressMessage("Usage", "xUnit1047:Avoid using TheoryDataRow arguments that might not be serializable")] internal static class HistoricalDataHelpers { private static readonly String _condition = Guid.NewGuid().ToString("D"); @@ -34,6 +35,8 @@ internal static class HistoricalDataHelpers private const Decimal Volume = 1_000M; + private const Decimal Greeks = 0.01M; + private const String Bars = "bars"; private const Decimal Size = 42M; @@ -113,11 +116,17 @@ internal static void AddCryptoSnapshotsExpectation( new JProperty("snapshots", new JObject( symbols.Select(name => new JProperty(name, createSnapshot())))))); + internal static void AddOptionSnapshotsExpectation( + this IMock mock, String pathPrefix, IEnumerable symbols) => + mock.AddGet($"{pathPrefix}/snapshots", new JObject( + new JProperty("snapshots", new JObject( + symbols.Select(name => new JProperty(name, createOptionSnapshot())))))); + internal static void AddOptionChainExpectation( this IMock mock, String pathPrefix, IEnumerable symbols) => mock.AddGet($"{pathPrefix}/snapshots/*", new JObject( new JProperty("snapshots", new JObject( - symbols.Select(name => new JProperty(name, createSnapshot())))))); + symbols.Select(name => new JProperty(name, createOptionSnapshot())))))); internal static void AddOrderBooksExpectation( this IMock mock, String pathPrefix, IEnumerable symbols) => @@ -439,4 +448,20 @@ private static JObject createSnapshot( new JProperty("minuteBar", CreateBar()), new JProperty("dailyBar", CreateBar()), new JProperty("symbol", symbol)); + + private static JObject createOptionSnapshot() => + new( + new JProperty("latestQuote", CreateQuote()), + new JProperty("latestTrade", CreateTrade()), + new JProperty("impliedVolatility", Volume), + new JProperty("greeks", createGreeks()), + new JProperty("symbol", String.Empty)); + + private static JObject createGreeks() => + new( + new JProperty("delta", Greeks), + new JProperty("gamma", Greeks), + new JProperty("theta", Greeks), + new JProperty("vega", Greeks), + new JProperty("rho", Greeks)); } diff --git a/Alpaca.Markets.Tests/RequestValidationTest.cs b/Alpaca.Markets.Tests/RequestValidationTest.cs index e51b6aad..036e95fe 100644 --- a/Alpaca.Markets.Tests/RequestValidationTest.cs +++ b/Alpaca.Markets.Tests/RequestValidationTest.cs @@ -99,6 +99,24 @@ public void PortfolioHistoryRequestEmptySymbolValidationWorks() => } .WithInterval(new Interval(DateTime.Today, DateTime.Today))); + [Fact] + public void OptionContactsRequestExpirationDateValidationWorks() => + validate(new OptionContractsRequest + { + ExpirationDateGreaterThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateLessThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today), + }); + + [Fact] + public void OptionChainRequestExpirationDateValidationWorks() => + validate(new OptionChainRequest(Symbol) + { + ExpirationDateGreaterThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateLessThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today), + }); + [Fact] public void CalendarRequestConstructorWorks() { @@ -134,7 +152,7 @@ public void ListOrdersRequestWithSymbolsWorks() Assert.NotNull(request.Symbols); Assert.Empty(request.Symbols); - request.WithSymbols(new[] { Symbol }); + request.WithSymbols([Symbol]); Assert.NotNull(request.Symbols); Assert.NotEmpty(request.Symbols); diff --git a/Alpaca.Markets/AlpacaOptionsDataClient.cs b/Alpaca.Markets/AlpacaOptionsDataClient.cs index a6253711..eb86fcd4 100644 --- a/Alpaca.Markets/AlpacaOptionsDataClient.cs +++ b/Alpaca.Markets/AlpacaOptionsDataClient.cs @@ -38,14 +38,14 @@ public async Task> ListSnapshotsAsync( OptionSnapshotRequest request, CancellationToken cancellationToken = default) => await HttpClient.GetAsync, JsonOptionsSnapshotData>( - await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + await request.EnsureNotNull().Validate().GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); public async Task> GetOptionChainAsync( OptionChainRequest request, CancellationToken cancellationToken = default) => await HttpClient.GetAsync, JsonOptionsSnapshotData>( - await request.GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + await request.EnsureNotNull().Validate().GetUriBuilderAsync(HttpClient).ConfigureAwait(false), RateLimitHandler, cancellationToken).ConfigureAwait(false); private async Task> getLatestAsync( diff --git a/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs b/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs index e93984e0..6bb41ae6 100644 --- a/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs +++ b/Alpaca.Markets/Parameters/OptionSnapshotRequest.cs @@ -31,11 +31,17 @@ public OptionSnapshotRequest( [ExcludeFromCodeCoverage] public OptionsFeed? OptionsFeed { get; set; } + /// + /// Gets the pagination parameters for the request (page size and token). + /// + [UsedImplicitly] + public Pagination Pagination { get; } = new(); + internal async ValueTask GetUriBuilderAsync( HttpClient httpClient) => new UriBuilder(httpClient.BaseAddress!) { - Query = await new QueryBuilder() + Query = await Pagination.QueryBuilder .AddParameter("symbols", Symbols.ToList()) .AddParameter("feed", OptionsFeed) .AsStringAsync().ConfigureAwait(false) diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index c8765edb..8598c6b6 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -1101,6 +1101,7 @@ Alpaca.Markets.OptionSnapshotRequest Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.get -> Alpaca.Markets.OptionsFeed? Alpaca.Markets.OptionSnapshotRequest.OptionsFeed.set -> void Alpaca.Markets.OptionSnapshotRequest.OptionSnapshotRequest(System.Collections.Generic.IEnumerable! symbols) -> void +Alpaca.Markets.OptionSnapshotRequest.Pagination.get -> Alpaca.Markets.Pagination! Alpaca.Markets.OptionSnapshotRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! Alpaca.Markets.OptionStyle Alpaca.Markets.OptionStyle.American = 0 -> Alpaca.Markets.OptionStyle From f7334b0f649bb49ffcaabc732906da70ec919b93 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 28 Apr 2024 13:58:35 +0200 Subject: [PATCH 092/125] Prepare release 7.1.0-beta4 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 64def21b..25270b8b 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,17 +12,14 @@ - 7.1.0.2 - 7.1.0.2 - 7.1.0-beta3 + 7.1.0.3 + 7.1.0.3 + 7.1.0-beta4 -- Added support for the new portfolio history endpoint using the existing `IAlpacaTradingClient.GetPortfolioHistoryAsync` method. -- The `OptionChainRequest` class extended with new (optional) filtering properties and initial client-side validation. -- The new `OptionSnapshotRequest` class added and used for the `ListSnapshotsAsync` method (breaking change). -- The new `IOptionSnapshot` interface with Greeks and IV added and used instead of `ISnapshot` for options. +- The `OptionSnapshotRequest` class now has a proper pagination support logic. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 476e681fcc918acade1a7c4890007381509116a8 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 28 Apr 2024 18:10:18 +0200 Subject: [PATCH 093/125] Issue #745 - Added new methods `GetOptionChainAsyncAsAsyncEnumerable` and `ListSnapshotsAsAsyncEnumerable` into the Extensions package. --- .../AlpacaOptionsDataClientTest.Bars.cs | 1 - .../AlpacaOptionsDataClientTest.Snapshots.cs | 54 +++++ .../AlpacaOptionsDataClientTest.cs | 3 + .../Alpaca.Markets.Extensions.csproj | 2 +- .../AlpacaOptionsDataClientExtensions.cs | 197 ++++++++++++++++++ .../PublicAPI.Shipped.txt | 5 + Alpaca.Markets.Extensions/packages.lock.json | 72 +++---- .../AlpacaTradingClientTest.Orders.cs | 1 + Alpaca.Markets.Tests/RequestValidationTest.cs | 4 +- 9 files changed, 299 insertions(+), 40 deletions(-) create mode 100644 Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Snapshots.cs create mode 100644 Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs index f53e25f5..1aadad05 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Bars.cs @@ -85,5 +85,4 @@ private static JArray createBarsList() => new JProperty("h", Price), new JProperty("c", Price), new JProperty("v", Volume)); - } diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Snapshots.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Snapshots.cs new file mode 100644 index 00000000..0e4eff5c --- /dev/null +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.Snapshots.cs @@ -0,0 +1,54 @@ +namespace Alpaca.Markets.Extensions.Tests; + +public sealed partial class AlpacaOptionsDataClientTest +{ + [Fact] + public async Task GetOptionChainAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleContractPageExpectation); + + var counter = await validateList( + mock.Client.GetOptionChainAsyncAsAsyncEnumerable( + new OptionChainRequest(Stock))); + + Assert.NotEqual(0, counter); + } + + [Fact] + public async Task ListSnapshotsAsAsyncEnumerableWorks() + { + using var mock = mockClientsFactory.GetAlpacaOptionsDataClientMock(); + + addPaginatedResponses(mock, addSingleSnapshotPageExpectation); + + var counter = await validateList( + mock.Client.ListSnapshotsAsAsyncEnumerable( + new OptionSnapshotRequest(_symbols))); + + Assert.NotEqual(0, counter); + } + + private static void addSingleContractPageExpectation( + MockClient mock, + String? token = null) => + addSingleContractOrSnapshotPageExpectation(mock, "/*", token); + + private static void addSingleSnapshotPageExpectation( + MockClient mock, + String? token = null) => + addSingleContractOrSnapshotPageExpectation(mock, String.Empty, token); + + private static void addSingleContractOrSnapshotPageExpectation( + MockClient mock, + String urlPathLastSegment, + String? token = null) => + mock.AddGet($"/v1beta1/options/snapshots{urlPathLastSegment}", new JObject( + new JProperty("snapshots", new JObject( + _symbols.Select(symbol => new JProperty(symbol, createSnapshot())).OfType().ToArray())), + new JProperty("next_page_token", token))); + + private static JObject createSnapshot() => new( + new JProperty("impliedVolatility", Price)); +} \ No newline at end of file diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs index 998914bf..c42ce2a6 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaOptionsDataClientTest.cs @@ -1,6 +1,9 @@ +using System.Diagnostics.CodeAnalysis; + namespace Alpaca.Markets.Extensions.Tests; [Collection("MockEnvironment")] +[SuppressMessage("Usage", "xUnit1047:Avoid using TheoryDataRow arguments that might not be serializable")] public sealed partial class AlpacaOptionsDataClientTest( MockClientsFactoryFixture mockClientsFactory) { diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 56bff70b..d69a4fc8 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -98,7 +98,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs new file mode 100644 index 00000000..cf366a33 --- /dev/null +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs @@ -0,0 +1,197 @@ +namespace Alpaca.Markets.Extensions; + +/// +/// Set of extension methods for the interface. +/// +public static class AlpacaOptionsDataClientExtensions +{ + /// + /// Gets all option snapshots from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Option contacts' snapshots obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListSnapshotsAsAsyncEnumerable( + this IAlpacaOptionsDataClient client, + OptionSnapshotRequest request) => + ListSnapshotsAsAsyncEnumerable(client, request, CancellationToken.None); + + /// + /// Gets all option snapshots from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Option contacts' snapshots obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListSnapshotsAsAsyncEnumerable( + this IAlpacaOptionsDataClient client, + OptionSnapshotRequest request, + CancellationToken cancellationToken) => + getAllOptionSnapshotsPages(client.EnsureNotNull(), + getRequestWithoutPageToken(request.EnsureNotNull()), cancellationToken); + + /// + /// Gets all option snapshots from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Option contacts' snapshots obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable GetOptionChainAsyncAsAsyncEnumerable( + this IAlpacaOptionsDataClient client, + OptionChainRequest request) => + GetOptionChainAsyncAsAsyncEnumerable(client, request, CancellationToken.None); + + /// + /// Gets all option snapshots from Alpaca REST API endpoint as async enumerable stream. + /// + /// The object instance. + /// Account activities request parameters. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + /// Option contacts' snapshots obtained page by page. + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable GetOptionChainAsyncAsAsyncEnumerable( + this IAlpacaOptionsDataClient client, + OptionChainRequest request, + CancellationToken cancellationToken) => + getAllOptionSnapshotsPages(client.EnsureNotNull(), + getRequestWithoutPageToken(request.EnsureNotNull()), cancellationToken); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static OptionSnapshotRequest getRequestWithoutPageToken( + OptionSnapshotRequest request) => + new(request.Symbols) + { + //Pagination = { Size = Pagination.MaxPageSize }, + OptionsFeed = request.OptionsFeed + }; + + private static async IAsyncEnumerable getAllOptionSnapshotsPages( + IAlpacaOptionsDataClient client, + OptionSnapshotRequest request, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + do + { + var page = await client.ListSnapshotsAsync(request, cancellationToken).ConfigureAwait(false); + + foreach (var item in page.Items) + { + yield return item.Value; + } + + request.Pagination.Token = page.NextPageToken ?? String.Empty; + } while (!String.IsNullOrEmpty(request.Pagination.Token)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static OptionChainRequest getRequestWithoutPageToken( + OptionChainRequest request) => + new(request.UnderlyingSymbol) + { + ExpirationDateGreaterThanOrEqualTo = request.ExpirationDateGreaterThanOrEqualTo, + ExpirationDateLessThanOrEqualTo = request.ExpirationDateLessThanOrEqualTo, + StrikePriceGreaterThanOrEqualTo = request.StrikePriceGreaterThanOrEqualTo, + StrikePriceLessThanOrEqualTo = request.StrikePriceLessThanOrEqualTo, + ExpirationDateEqualTo = request.ExpirationDateEqualTo, + Pagination = { Size = Pagination.MaxPageSize }, + OptionType = request.OptionType, + RootSymbol = request.RootSymbol + }; + + private static async IAsyncEnumerable getAllOptionSnapshotsPages( + IAlpacaOptionsDataClient client, + OptionChainRequest request, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + do + { + var page = await client.GetOptionChainAsync(request, cancellationToken).ConfigureAwait(false); + + foreach (var item in page.Items) + { + yield return item.Value; + } + + request.Pagination.Token = page.NextPageToken ?? String.Empty; + } while (!String.IsNullOrEmpty(request.Pagination.Token)); + } +} diff --git a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt index be587ceb..393b01cb 100644 --- a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt +++ b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt @@ -4,6 +4,7 @@ Alpaca.Markets.Extensions.AlpacaDataClientExtensions Alpaca.Markets.Extensions.AlpacaDataStreamingClientExtensions Alpaca.Markets.Extensions.AlpacaDataSubscriptionExtensions Alpaca.Markets.Extensions.AlpacaNewsStreamingClientExtensions +Alpaca.Markets.Extensions.AlpacaOptionsDataClientExtensions Alpaca.Markets.Extensions.AlpacaServiceCollectionExtensions Alpaca.Markets.Extensions.AlpacaStreamingClientExtensions Alpaca.Markets.Extensions.AlpacaTradingClientExtensions @@ -81,6 +82,10 @@ static Alpaca.Markets.Extensions.AlpacaNewsStreamingClientExtensions.SubscribeNe static Alpaca.Markets.Extensions.AlpacaNewsStreamingClientExtensions.SubscribeNewsAsync(this Alpaca.Markets.IAlpacaNewsStreamingClient! client, System.Collections.Generic.IEnumerable! symbols) -> System.Threading.Tasks.ValueTask!> static Alpaca.Markets.Extensions.AlpacaNewsStreamingClientExtensions.WithReconnect(this Alpaca.Markets.IAlpacaNewsStreamingClient! client) -> Alpaca.Markets.IAlpacaNewsStreamingClient! static Alpaca.Markets.Extensions.AlpacaNewsStreamingClientExtensions.WithReconnect(this Alpaca.Markets.IAlpacaNewsStreamingClient! client, Alpaca.Markets.Extensions.ReconnectionParameters! parameters) -> Alpaca.Markets.IAlpacaNewsStreamingClient! +static Alpaca.Markets.Extensions.AlpacaOptionsDataClientExtensions.GetOptionChainAsyncAsAsyncEnumerable(this Alpaca.Markets.IAlpacaOptionsDataClient! client, Alpaca.Markets.OptionChainRequest! request) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaOptionsDataClientExtensions.GetOptionChainAsyncAsAsyncEnumerable(this Alpaca.Markets.IAlpacaOptionsDataClient! client, Alpaca.Markets.OptionChainRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaOptionsDataClientExtensions.ListSnapshotsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaOptionsDataClient! client, Alpaca.Markets.OptionSnapshotRequest! request) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaOptionsDataClientExtensions.ListSnapshotsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaOptionsDataClient! client, Alpaca.Markets.OptionSnapshotRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.GetCalendarForSingleDayAsync(this Alpaca.Markets.IAlpacaTradingClient! client, System.DateOnly date, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.GetCalendarForSingleDayAsync(this Alpaca.Markets.IAlpacaTradingClient! client, System.DateTime date, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! static Alpaca.Markets.Extensions.AlpacaTradingClientExtensions.GetClockCachedAsync(this Alpaca.Markets.IAlpacaTradingClient! client) -> System.Threading.Tasks.ValueTask diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index efe6affc..3401cda2 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,12 +4,12 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta2, )", - "resolved": "7.1.0-beta2", - "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", + "requested": "[7.1.0-beta4, )", + "resolved": "7.1.0-beta4", + "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.0", + "Polly": "8.3.1", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Net.Http.WinHttpHandler": "8.0.0", @@ -213,16 +213,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -314,12 +314,12 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta2, )", - "resolved": "7.1.0-beta2", - "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", + "requested": "[7.1.0-beta4, )", + "resolved": "7.1.0-beta4", + "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.0", + "Polly": "8.3.1", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" @@ -519,16 +519,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -605,12 +605,12 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta2, )", - "resolved": "7.1.0-beta2", - "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", + "requested": "[7.1.0-beta4, )", + "resolved": "7.1.0-beta4", + "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.0", + "Polly": "8.3.1", "Portable.System.DateTimeOnly": "8.0.0", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" @@ -777,16 +777,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -863,12 +863,12 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta2, )", - "resolved": "7.1.0-beta2", - "contentHash": "RXGBzIgj1ZgiUejxBQzOqjBOLhVW1I2AtI+9QXhhSdPHoZDHCdHnhO4awxq/hymkfgT5XtsFPpXhewH3Wkvuqw==", + "requested": "[7.1.0-beta4, )", + "resolved": "7.1.0-beta4", + "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.0", + "Polly": "8.3.1", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" } @@ -1038,16 +1038,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "vqAQmLO1gZcS8Ox9Ky+hrq0HxYrYVSBS1vzv6o6RZH3vvECutngIxkUHw9YijbG0QrycxvHo0Hbx0/D7MGgdow==", + "resolved": "8.3.1", + "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", "dependencies": { - "Polly.Core": "8.3.0" + "Polly.Core": "8.3.1" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.0", - "contentHash": "A3r4xkWasffyrIJGjA3jWQi86ZGcR9BEbpIIoP9xYRAKYwiaGbKpqpsHdWv5sCeLZdaWpVs7pc4EM8Tei+LluA==", + "resolved": "8.3.1", + "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs index ed9ccd47..9939d9e4 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Orders.cs @@ -97,6 +97,7 @@ public async Task PostBuyOrderAsyncWorks() var order = await mock.Client.PostOrderAsync( MarketOrder.Buy(Stock, OrderQuantity.Fractional(FractionalQuantity)) .WithClientOrderId(Guid.NewGuid().ToString("D")) + .WithPositionIntent(PositionIntent.BuyToOpen) .WithDuration(TimeInForce.Gtc) .WithExtendedHours(true)); diff --git a/Alpaca.Markets.Tests/RequestValidationTest.cs b/Alpaca.Markets.Tests/RequestValidationTest.cs index 036e95fe..17ea3965 100644 --- a/Alpaca.Markets.Tests/RequestValidationTest.cs +++ b/Alpaca.Markets.Tests/RequestValidationTest.cs @@ -105,7 +105,7 @@ public void OptionContactsRequestExpirationDateValidationWorks() => { ExpirationDateGreaterThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), ExpirationDateLessThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), - ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today) }); [Fact] @@ -114,7 +114,7 @@ public void OptionChainRequestExpirationDateValidationWorks() => { ExpirationDateGreaterThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), ExpirationDateLessThanOrEqualTo = DateOnly.FromDateTime(DateTime.Today), - ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today), + ExpirationDateEqualTo = DateOnly.FromDateTime(DateTime.Today) }); [Fact] From c3b469af2075d88e89af8db7093c715c42840dff Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 28 Apr 2024 19:18:15 +0200 Subject: [PATCH 094/125] Prepare release 7.1.0-beta3 of Extensions --- .../AlpacaTradingClientTest.cs | 3 +++ .../Alpaca.Markets.Extensions.csproj | 8 ++++---- .../Pagination/AlpacaOptionsDataClientExtensions.cs | 4 ++-- .../Pagination/AlpacaTradingClientExtensions.cs | 2 +- Alpaca.Markets/Helpers/HttpClientExtensions.Get.cs | 2 +- Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs | 2 +- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs index 206327f1..b4867457 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaTradingClientTest.cs @@ -1,6 +1,9 @@ +using System.Diagnostics.CodeAnalysis; + namespace Alpaca.Markets.Extensions.Tests; [Collection("MockEnvironment")] +[SuppressMessage("Usage", "xUnit1047:Avoid using TheoryDataRow arguments that might not be serializable")] public sealed class AlpacaTradingClientTest( MockClientsFactoryFixture mockClientsFactory) { diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index d69a4fc8..d2b6dc31 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,14 +12,14 @@ - 7.1.0.1 - 7.1.0.1 - 7.1.0-beta2 + 7.1.0.2 + 7.1.0.2 + 7.1.0-beta3 -- The `ListOptionContractsAsAsyncEnumerable` extensions method uses page token now. +- Added new methods `GetOptionChainAsyncAsAsyncEnumerable` and `ListSnapshotsAsAsyncEnumerable` into the Extensions package. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs index cf366a33..2d7b3335 100644 --- a/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaOptionsDataClientExtensions.cs @@ -140,7 +140,7 @@ private static OptionSnapshotRequest getRequestWithoutPageToken( OptionSnapshotRequest request) => new(request.Symbols) { - //Pagination = { Size = Pagination.MaxPageSize }, + Pagination = { Size = request.Pagination.Size }, OptionsFeed = request.OptionsFeed }; @@ -172,7 +172,7 @@ private static OptionChainRequest getRequestWithoutPageToken( StrikePriceGreaterThanOrEqualTo = request.StrikePriceGreaterThanOrEqualTo, StrikePriceLessThanOrEqualTo = request.StrikePriceLessThanOrEqualTo, ExpirationDateEqualTo = request.ExpirationDateEqualTo, - Pagination = { Size = Pagination.MaxPageSize }, + Pagination = { Size = request.Pagination.Size }, OptionType = request.OptionType, RootSymbol = request.RootSymbol }; diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs index 31c43a5a..d98a7022 100644 --- a/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaTradingClientExtensions.cs @@ -179,7 +179,7 @@ private static OptionContractsRequest getRequestForFirstPage( StrikePriceGreaterThanOrEqualTo = request.StrikePriceGreaterThanOrEqualTo, StrikePriceLessThanOrEqualTo = request.StrikePriceLessThanOrEqualTo, ExpirationDateEqualTo = request.ExpirationDateEqualTo, - Pagination = { Size = Pagination.MaxPageSize }, + Pagination = { Size = request.Pagination.Size }, AssetStatus = request.AssetStatus, OptionStyle = request.OptionStyle, OptionType = request.OptionType, diff --git a/Alpaca.Markets/Helpers/HttpClientExtensions.Get.cs b/Alpaca.Markets/Helpers/HttpClientExtensions.Get.cs index 05c66c3e..87340f54 100644 --- a/Alpaca.Markets/Helpers/HttpClientExtensions.Get.cs +++ b/Alpaca.Markets/Helpers/HttpClientExtensions.Get.cs @@ -51,7 +51,7 @@ public static async Task> GetAsync uriBuilder, rateLimitHandler, cancellationToken) .ConfigureAwait(false)), elementSelector, StringComparer.Ordinal); - private static IReadOnlyDictionary getReadOnlyDictionary( + private static Dictionary getReadOnlyDictionary( Dictionary response, Func, TValueApi> elementSelector, IEqualityComparer comparer) diff --git a/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs index c09b4ad7..9966b747 100644 --- a/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs +++ b/Alpaca.Markets/Messages/JsonOptionSnapshotsData.cs @@ -8,7 +8,7 @@ internal sealed class JsonOptionsSnapshotData : IDictionaryPage { [DebuggerBrowsable(DebuggerBrowsableState.Never)] [JsonProperty(PropertyName = "snapshots", Required = Required.Default)] - public Dictionary ItemsList { get; [ExcludeFromCodeCoverage] set; } = new(); + public Dictionary ItemsList { get; [ExcludeFromCodeCoverage] set; } = []; [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] public String? NextPageToken { get; set; } From 5a5b37600ebd460d34e78319202583b7c95806d3 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 10 May 2024 13:39:01 +0200 Subject: [PATCH 095/125] Upgrade dependencies --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 ++-- .../AlpacaCryptoDataClientTest.cs | 2 +- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 18 +++++++++--------- .../Alpaca.Markets.Tests.csproj | 4 ++-- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 18 +++++++++--------- UsageExamples/UsageExamples.csproj | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index fef8fec3..9c88ff3b 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,8 +19,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs index 4af0a40b..2f84b6a0 100644 --- a/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs +++ b/Alpaca.Markets.Extensions.Tests/AlpacaCryptoDataClientTest.cs @@ -25,7 +25,7 @@ public async Task GetAverageDailyTradeVolumeAsyncWithIntervalWorks() Crypto, _timeInterval.AsDateInterval()); Assert.Equal(Volume, adtv); - Assert.True(count != 0); + Assert.NotEqual(0u, count); } private static void addPaginatedResponses( diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index d2b6dc31..be76ffb1 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -106,7 +106,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 3401cda2..88641b33 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -79,9 +79,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", "dependencies": { "System.Memory": "4.5.5" } @@ -388,9 +388,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", "dependencies": { "System.Memory": "4.5.5" } @@ -670,9 +670,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==" }, "System.Linq.Async": { "type": "Direct", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index ca1ba8cc..109277d0 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,8 +17,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 25270b8b..75b94699 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -116,7 +116,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 732dfd85..dbccbfe3 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -56,9 +56,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", "dependencies": { "System.Memory": "4.5.5" } @@ -236,9 +236,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==", + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", "dependencies": { "System.Memory": "4.5.5" } @@ -390,9 +390,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "2yoASdfgXvlB4ObVHc7I2zbuGPr2ZBH0aEd7TrWzuKugXteACnKARMOv7L8z967MV0n0JYbXNM/o+NIJDb1fDQ==" + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==" }, "System.IO.Pipelines": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 3efa5f1a..55a7c856 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -20,7 +20,7 @@ - + From 7ac5bbdcc18c66d12e9a6a88bdd5c4564dcd97b2 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 May 2024 17:23:33 +0200 Subject: [PATCH 096/125] Prepare release 7.1.0 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 75b94699..c86f0878 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,14 +12,35 @@ - 7.1.0.3 - 7.1.0.3 - 7.1.0-beta4 + 7.1.0.4 + 7.1.0.4 + 7.1.0 +- The `OptionsContractRequest.UnderlyingSymbol` mandatory property was replaced with the `OptionsContractRequest.UnderlyingSymbols` optional property. +- The `IAlpacaTradingClient` interface was extended with the `ExerciseOptionsContractByIdAsync` and `ExerciseOptionsContractBySymbolAsync` methods. +- Added the new `IAlpacaTradingClient.GetOptionContractByIdAsync` and `IAlpacaTradingClient.GetOptionContractBySymbolAsync` methods. +- Added support for the new portfolio history endpoint using the existing `IAlpacaTradingClient.GetPortfolioHistoryAsync` method. +- The `IAlpacaOptionDataClient` interface extended with the `IHistoricalTradesClient` and `IHistoricalBarsClient` interfaces. +- Added the new `IAlpacaOptionDataClient.ListLatestQuotesAsync` and `IAlpacaOptionDataClient.ListLatestTradesAsync` methods. +- Added the new `IAlpacaOptionDataClient.ListSnapshotsAsync` and `IAlpacaOptionDataClient.GetOptionChainAsync` methods. +- The `OptionChainRequest` class extended with new (optional) filtering properties and initial client-side validation. +- Added the new `IAlpacaTradingClient.ListOptionContractsAsync` method and related `OptionContractsRequest` class. +- The `IAlpacaTradingClient.ListOptionContractAsync` method now uses a same pagination logic as historical data. +- The new `OptionSnapshotRequest` class added and used for the `ListSnapshotsAsync` method (breaking change). +- The new `IOptionSnapshot` interface with Greeks and IV added and used instead of `ISnapshot` for options. +- Added the new `IAlpacaOptionDataClient` interface and related factory methods and configuration class. +- Added the new `IOptionContract` interface and two related enums: `OptionType` and `OptionStyle`. +- The new `HistoricalOptionTradesRequest` and `HistoricalOptionBarsRequest` classes were added. +- Added the new `IAlpacaOptionDataClient.ListExchangesAsync` method for metadata requesting. +- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties. +- The `OptionFeed` enum added and now it can be specified for latest/snapshot requests. - The `OptionSnapshotRequest` class now has a proper pagination support logic. +- Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. +- Added the new 'AssetType.UsOption` enumeration member. +- Added the new 'OptionTradingLevel` enumeration. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 8e2e8c30f961d74dcb716445ea7fc298a1e42e87 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 May 2024 18:20:25 +0200 Subject: [PATCH 097/125] Prepare release 7.1.0 of Extensions --- .../Alpaca.Markets.Extensions.csproj | 11 ++++--- Alpaca.Markets.Extensions/packages.lock.json | 30 +++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index be76ffb1..9d7aa5e0 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,14 +12,17 @@ - 7.1.0.2 - 7.1.0.2 - 7.1.0-beta3 + 7.1.0.3 + 7.1.0.3 + 7.1.0 +- Added factory methods for creating the strongly typed `IAlpacaOptionsDataClient` instance in dependency injection environments. - Added new methods `GetOptionChainAsyncAsAsyncEnumerable` and `ListSnapshotsAsAsyncEnumerable` into the Extensions package. +- Added the new extension method `ListOptionContractsAsAsyncEnumerable` for the `IAlpacaTradingClient` interface. +- The `ListOptionContractsAsAsyncEnumerable` extensions method uses page token now. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp @@ -98,7 +101,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 88641b33..12a30a7d 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,13 +4,13 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta4, )", - "resolved": "7.1.0-beta4", - "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", + "requested": "[7.1.0, )", + "resolved": "7.1.0", + "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.0", + "Portable.System.DateTimeOnly": "8.0.1", "System.IO.Pipelines": "8.0.0", "System.Net.Http.WinHttpHandler": "8.0.0", "System.Threading.Channels": "8.0.0" @@ -314,13 +314,13 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta4, )", - "resolved": "7.1.0-beta4", - "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", + "requested": "[7.1.0, )", + "resolved": "7.1.0", + "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.0", + "Portable.System.DateTimeOnly": "8.0.1", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" } @@ -605,13 +605,13 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta4, )", - "resolved": "7.1.0-beta4", - "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", + "requested": "[7.1.0, )", + "resolved": "7.1.0", + "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.0", + "Portable.System.DateTimeOnly": "8.0.1", "System.IO.Pipelines": "8.0.0", "System.Threading.Channels": "8.0.0" } @@ -863,9 +863,9 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0-beta4, )", - "resolved": "7.1.0-beta4", - "contentHash": "UiY1xDurD1iL9nVi4IbEJ+XjfsO054BkirNd5Y7SGbUKkW5xdU+HT8iynHu18+TzStCvBwNnk137SMH2XnzB3w==", + "requested": "[7.1.0, )", + "resolved": "7.1.0", + "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.3.1", From 5074175c26a6b687527a8b63c6ae36dc60de6a47 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 10 Jun 2024 11:32:48 +0200 Subject: [PATCH 098/125] Upgrade NuGet dependencies before future development. --- .../Alpaca.Markets.Extensions.Tests.csproj | 8 +-- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 36 +++++------ .../Alpaca.Markets.Tests.csproj | 8 +-- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 60 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 7 files changed, 59 insertions(+), 59 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 9c88ff3b..be1e51ec 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -15,19 +15,19 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 9d7aa5e0..85e8f542 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -97,7 +97,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 12a30a7d..3d5fed82 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", + "requested": "[8.0.6, )", + "resolved": "8.0.6", + "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", + "requested": "[8.0.6, )", + "resolved": "8.0.6", + "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", + "requested": "[8.0.6, )", + "resolved": "8.0.6", + "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.4, )", - "resolved": "8.0.4", - "contentHash": "XkAHw4SObEv8P6g83loTrCSVDkeac61KDb/4wbEgOWDLqyFwmVTb0hMuwf02SFU7uitdAzkCtAu2qu0pVx1WIg==", + "requested": "[8.0.6, )", + "resolved": "8.0.6", + "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -917,15 +917,15 @@ }, "Microsoft.NET.ILLink.Analyzers": { "type": "Direct", - "requested": "[7.0.100-1.23211.1, )", - "resolved": "7.0.100-1.23211.1", - "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" + "requested": "[7.0.100-1.23401.1, )", + "resolved": "7.0.100-1.23401.1", + "contentHash": "XirkjOLc5Vc3HsXRc2Z6ZbQv6l0RvWgJa/31w7XqZ914MoSi3H3OCNRMWFw7H2EYfsnKbokFfhCcysAmUcEOgw==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[7.0.100-1.23211.1, )", - "resolved": "7.0.100-1.23211.1", - "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" + "requested": "[7.0.100-1.23401.1, )", + "resolved": "7.0.100-1.23401.1", + "contentHash": "mI6vCdPEhluLtMn/GV0texEWg5oAPQWCCE4LWspM+Bmy75Nd4EQsziQXrdOFqNeSBQMrxDX9C/O5Xi3kpKSMIw==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 109277d0..5be3efb0 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,12 +13,12 @@ - - + + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index c86f0878..c5299995 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -127,7 +127,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index dbccbfe3..32d9d457 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.1, )", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "requested": "[8.4.0, )", + "resolved": "8.4.0", + "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.4.0" } }, "Portable.System.DateTimeOnly": { @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.4.0", + "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.1, )", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "requested": "[8.4.0, )", + "resolved": "8.4.0", + "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.4.0" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.4.0", + "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.1, )", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "requested": "[8.4.0, )", + "resolved": "8.4.0", + "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.4.0" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.4.0", + "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -505,15 +505,15 @@ }, "Microsoft.NET.ILLink.Analyzers": { "type": "Direct", - "requested": "[7.0.100-1.23211.1, )", - "resolved": "7.0.100-1.23211.1", - "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" + "requested": "[7.0.100-1.23401.1, )", + "resolved": "7.0.100-1.23401.1", + "contentHash": "XirkjOLc5Vc3HsXRc2Z6ZbQv6l0RvWgJa/31w7XqZ914MoSi3H3OCNRMWFw7H2EYfsnKbokFfhCcysAmUcEOgw==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[7.0.100-1.23211.1, )", - "resolved": "7.0.100-1.23211.1", - "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" + "requested": "[7.0.100-1.23401.1, )", + "resolved": "7.0.100-1.23401.1", + "contentHash": "mI6vCdPEhluLtMn/GV0texEWg5oAPQWCCE4LWspM+Bmy75Nd4EQsziQXrdOFqNeSBQMrxDX9C/O5Xi3kpKSMIw==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.3.1, )", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "requested": "[8.4.0, )", + "resolved": "8.4.0", + "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.4.0" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.4.0", + "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 55a7c856..0aae0489 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,7 +24,7 @@ - + From 1454dc5b8ddb86d2c262e67766f56dfea35855f6 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 8 Jul 2024 12:47:59 +0200 Subject: [PATCH 099/125] Upgrade NuGet dependencies before future development. --- .config/dotnet-tools.json | 2 +- .../Alpaca.Markets.Extensions.Tests.csproj | 6 +- .../Alpaca.Markets.Extensions.csproj | 4 +- Alpaca.Markets.Extensions/packages.lock.json | 48 ++++++------ .../Alpaca.Markets.Tests.csproj | 6 +- Alpaca.Markets/Alpaca.Markets.csproj | 6 +- Alpaca.Markets/DataStreamingClientBase.cs | 2 +- Alpaca.Markets/packages.lock.json | 78 +++++++++---------- UsageExamples/UsageExamples.csproj | 4 +- 9 files changed, 78 insertions(+), 78 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 2bef2c2d..b42b36d8 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "jetbrains.dotcover.globaltool": { - "version": "2023.2.4", + "version": "2023.2.5", "commands": [ "dotnet-dotcover" ] diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index be1e51ec..c1d3613f 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,15 +19,15 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 85e8f542..56413e2b 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -85,7 +85,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers @@ -97,7 +97,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 3d5fed82..e248941d 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -24,9 +24,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.6, )", - "resolved": "8.0.6", - "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -333,9 +333,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.6, )", - "resolved": "8.0.6", - "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -624,9 +624,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.6, )", - "resolved": "8.0.6", - "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -881,9 +881,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.6, )", - "resolved": "8.0.6", - "contentHash": "vehhL2uDlr2ovIFMuYcQwXgOCu7QECXnjcRD37luN40Fjqm0C4PDiN0t0dHoyfJp6OgJ+sOYDev5jVMGz4lJnQ==", + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 5be3efb0..4e90a866 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,12 +13,12 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index c5299995..7d073004 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -112,7 +112,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers @@ -127,12 +127,12 @@ - + - + diff --git a/Alpaca.Markets/DataStreamingClientBase.cs b/Alpaca.Markets/DataStreamingClientBase.cs index c058f3ad..5b48b4a0 100644 --- a/Alpaca.Markets/DataStreamingClientBase.cs +++ b/Alpaca.Markets/DataStreamingClientBase.cs @@ -399,7 +399,7 @@ private void handleRealtimeNewsUpdate( try { var channel = token["T"]?.ToString() ?? String.Empty; - var symbols = token["symbols"]?.Values() ?? Enumerable.Empty(); + var symbols = token["symbols"]?.Values() ?? []; foreach (var symbol in symbols.Where(value => !String.IsNullOrEmpty(value))) { diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 32d9d457..c1e1c68b 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -10,9 +10,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", + "requested": "[8.4.1, )", + "resolved": "8.4.1", + "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", "dependencies": { - "Polly.Core": "8.4.0" + "Polly.Core": "8.4.1" } }, "Portable.System.DateTimeOnly": { @@ -76,9 +76,9 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==", + "requested": "[8.0.1, )", + "resolved": "8.0.1", + "contentHash": "xftE9w7kEH2GuOJV+X8zjAzsRE7NZgGy5i8ayGJZia2b69ymYq3tbGhoxnZJO8rsu7ERwtv3TmKdiglk9wTn9A==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.0", - "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", + "resolved": "8.4.1", + "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -190,9 +190,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", + "requested": "[8.4.1, )", + "resolved": "8.4.1", + "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", "dependencies": { - "Polly.Core": "8.4.0" + "Polly.Core": "8.4.1" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.0", - "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", + "resolved": "8.4.1", + "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -353,9 +353,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", + "requested": "[8.4.1, )", + "resolved": "8.4.1", + "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", "dependencies": { - "Polly.Core": "8.4.0" + "Polly.Core": "8.4.1" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.0", - "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", + "resolved": "8.4.1", + "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -493,9 +493,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2023.3.0, )", - "resolved": "2023.3.0", - "contentHash": "PHfnvdBUdGaTVG9bR/GEfxgTwWM0Z97Y6X3710wiljELBISipSfF5okn/vz+C2gfO+ihoEyVPjaJwn8ZalVukA==" + "requested": "[2024.2.0, )", + "resolved": "2024.2.0", + "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.0, )", - "resolved": "8.4.0", - "contentHash": "z2EeUutuy49jBQyZ5s2FUuTCGx3GCzJ0cJ2HbjWwks94TsC6bKTtAHKBkMZOa/DyYRl5yIX7MshvMTWl1J6RNg==", + "requested": "[8.4.1, )", + "resolved": "8.4.1", + "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", "dependencies": { - "Polly.Core": "8.4.0" + "Polly.Core": "8.4.1" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.0", - "contentHash": "3AZxuP//pxOeBo9tQs7/tz4Z5TTbu4BYfjpaXZD0JYKJo98ngN9TMUz1nybh4k0ykWkMBpGZALV/AmVIE3ew7A==", + "resolved": "8.4.1", + "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 0aae0489..7fd9440e 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,12 +24,12 @@ - + - + From c39372580af0d0a49feef7526182698da82d6900 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 16 Sep 2024 14:07:35 +0300 Subject: [PATCH 100/125] Dependencies update (Dependabot) (#751) * Bump System.Net.Http.WinHttpHandler from 8.0.1 to 8.0.2 (#349) * Bump System.Net.Http.WinHttpHandler from 8.0.1 to 8.0.2 Bumps [System.Net.Http.WinHttpHandler](https://github.com/dotnet/runtime) from 8.0.1 to 8.0.2. - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v8.0.1...v8.0.2) --- updated-dependencies: - dependency-name: System.Net.Http.WinHttpHandler dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] * Bump Microsoft.Extensions.Http.Polly from 8.0.7 to 8.0.8 (#350) Bumps [Microsoft.Extensions.Http.Polly](https://github.com/dotnet/aspnetcore) from 8.0.7 to 8.0.8. - [Release notes](https://github.com/dotnet/aspnetcore/releases) - [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md) - [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http.Polly dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump Microsoft.NET.Test.Sdk from 17.10.0 to 17.11.1 (#353) Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.10.0 to 17.11.1. - [Release notes](https://github.com/microsoft/vstest/releases) - [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md) - [Commits](https://github.com/microsoft/vstest/compare/v17.10.0...v17.11.1) --- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump Moq from 4.20.70 to 4.20.72 (#354) Bumps [Moq](https://github.com/moq/moq) from 4.20.70 to 4.20.72. - [Release notes](https://github.com/moq/moq/releases) - [Changelog](https://github.com/devlooped/moq/blob/main/changelog.md) - [Commits](https://github.com/moq/moq/compare/v4.20.70...v4.20.72) --- updated-dependencies: - dependency-name: Moq dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] (cherry picked from commit d546f111504436532b96d5b4d8b77255bb783f58) --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 ++-- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 6 +++--- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 6 +++--- UsageExamples/UsageExamples.csproj | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index c1d3613f..c59bad13 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 4e90a866..de09a188 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 7d073004..32944949 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -132,7 +132,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index c1e1c68b..566b9a91 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -76,9 +76,9 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "xftE9w7kEH2GuOJV+X8zjAzsRE7NZgGy5i8ayGJZia2b69ymYq3tbGhoxnZJO8rsu7ERwtv3TmKdiglk9wTn9A==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 7fd9440e..95b95362 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -29,7 +29,7 @@ - + From 56ad7490cc6e4d3105c5393812e79abec6ad4fe4 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 28 Sep 2024 15:47:09 +0200 Subject: [PATCH 101/125] Bump xunit from 2.9.0 to 2.9.2 (#356) (#754) Bumps [xunit](https://github.com/xunit/xunit) from 2.9.0 to 2.9.2. - [Commits](https://github.com/xunit/xunit/compare/2.9.0...2.9.2) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commit fe2553943ab8c8d7714fca584cc0b1f0667a8e20) --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index c59bad13..92ed6414 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -19,7 +19,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index de09a188..ea509c9b 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -17,7 +17,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From c208f21f9c1aa442f73b8e361b2da9300b7aeb95 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 28 Sep 2024 17:12:36 +0200 Subject: [PATCH 102/125] Upgrade NuGet dependencies before future development. --- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++----- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 48 +++++++++---------- UsageExamples/UsageExamples.csproj | 2 +- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 92ed6414..7992d9f5 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -27,7 +27,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 56413e2b..876370c8 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -97,7 +97,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index e248941d..d08c21dd 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -49,9 +49,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -358,9 +358,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -649,9 +649,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", @@ -906,9 +906,9 @@ }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "Sdsed6CqGrHNbjRAu3ECppuzLaleudsyJsJuo8HB3CTUvaPw32aS/YyqgKOfUccY5uVfoICnYaC7vhzVvOQR3w==", + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", "dependencies": { "Microsoft.Extensions.Http": "8.0.0", "Polly": "7.2.4", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 32944949..1183d443 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -127,7 +127,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 566b9a91..c3823545 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,11 +47,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.1, )", - "resolved": "8.4.1", - "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", "dependencies": { - "Polly.Core": "8.4.1" + "Polly.Core": "8.4.2" } }, "Portable.System.DateTimeOnly": { @@ -127,8 +127,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.1", - "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", + "resolved": "8.4.2", + "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -227,11 +227,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.1, )", - "resolved": "8.4.1", - "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", "dependencies": { - "Polly.Core": "8.4.1" + "Polly.Core": "8.4.2" } }, "Portable.System.DateTimeOnly": { @@ -296,8 +296,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.1", - "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", + "resolved": "8.4.2", + "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -381,11 +381,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.1, )", - "resolved": "8.4.1", - "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", "dependencies": { - "Polly.Core": "8.4.1" + "Polly.Core": "8.4.2" } }, "Portable.System.DateTimeOnly": { @@ -436,8 +436,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.1", - "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", + "resolved": "8.4.2", + "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -533,11 +533,11 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.1, )", - "resolved": "8.4.1", - "contentHash": "kBxql53peR0bjxeEuuY114GD2rmC0tkUwE1xuKUlnd74ULEsGu3OwcLH56KkwxBPUbOysPa7stT9SJ6pKGTzlg==", + "requested": "[8.4.2, )", + "resolved": "8.4.2", + "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", "dependencies": { - "Polly.Core": "8.4.1" + "Polly.Core": "8.4.2" } }, "System.IO.Pipelines": { @@ -577,8 +577,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.1", - "contentHash": "bg4kE7mFwXc6FJ8NLknTgVgLAMlbToWC7vpdqAITv8lPzKpp9v7aWJPc04GRoZQaJhVY/tdr8K2/VW2aTmaA1Q==", + "resolved": "8.4.2", + "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 95b95362..c660ddc4 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -24,7 +24,7 @@ - + From 82ca236bdc443d0d1dacf31ad0e433b100412df2 Mon Sep 17 00:00:00 2001 From: Franklin Moormann Date: Sun, 29 Sep 2024 10:33:19 -0400 Subject: [PATCH 103/125] Update AccountActivitiesRequest.cs (#755) Changed request model to match API documentation (cherry picked from commit 1808100fa62930a214eccc13078712e0d78acc85) --- Alpaca.Markets/Parameters/AccountActivitiesRequest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs index 13b64e04..d6900af6 100644 --- a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs +++ b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs @@ -99,13 +99,13 @@ internal async ValueTask GetUriBuilderAsync( { Path = "v2/account/activities", Query = await new QueryBuilder() - .AddParameter("activity_types", ActivityTypes) + .AddParameter("activity_type", ActivityTypes) .AddParameter("date", Date) .AddParameter("until", TimeInterval.Into, "O") .AddParameter("after", TimeInterval.From, "O") .AddParameter("direction", Direction) - .AddParameter("pageSize", PageSize) - .AddParameter("pageToken", PageToken) + .AddParameter("page_size", PageSize) + .AddParameter("page_token", PageToken) .AsStringAsync().ConfigureAwait(false) }; From 1ffeed097df26841eb75e367b1be4c5ffdaed3e4 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 30 Sep 2024 20:20:05 +0200 Subject: [PATCH 104/125] Prepare release 7.1.1 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 29 ++++------------------------ 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 1183d443..254eac7a 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,35 +12,14 @@ - 7.1.0.4 - 7.1.0.4 - 7.1.0 + 7.1.1.0 + 7.1.1.0 + 7.1.1 -- The `OptionsContractRequest.UnderlyingSymbol` mandatory property was replaced with the `OptionsContractRequest.UnderlyingSymbols` optional property. -- The `IAlpacaTradingClient` interface was extended with the `ExerciseOptionsContractByIdAsync` and `ExerciseOptionsContractBySymbolAsync` methods. -- Added the new `IAlpacaTradingClient.GetOptionContractByIdAsync` and `IAlpacaTradingClient.GetOptionContractBySymbolAsync` methods. -- Added support for the new portfolio history endpoint using the existing `IAlpacaTradingClient.GetPortfolioHistoryAsync` method. -- The `IAlpacaOptionDataClient` interface extended with the `IHistoricalTradesClient` and `IHistoricalBarsClient` interfaces. -- Added the new `IAlpacaOptionDataClient.ListLatestQuotesAsync` and `IAlpacaOptionDataClient.ListLatestTradesAsync` methods. -- Added the new `IAlpacaOptionDataClient.ListSnapshotsAsync` and `IAlpacaOptionDataClient.GetOptionChainAsync` methods. -- The `OptionChainRequest` class extended with new (optional) filtering properties and initial client-side validation. -- Added the new `IAlpacaTradingClient.ListOptionContractsAsync` method and related `OptionContractsRequest` class. -- The `IAlpacaTradingClient.ListOptionContractAsync` method now uses a same pagination logic as historical data. -- The new `OptionSnapshotRequest` class added and used for the `ListSnapshotsAsync` method (breaking change). -- The new `IOptionSnapshot` interface with Greeks and IV added and used instead of `ISnapshot` for options. -- Added the new `IAlpacaOptionDataClient` interface and related factory methods and configuration class. -- Added the new `IOptionContract` interface and two related enums: `OptionType` and `OptionStyle`. -- The new `HistoricalOptionTradesRequest` and `HistoricalOptionBarsRequest` classes were added. -- Added the new `IAlpacaOptionDataClient.ListExchangesAsync` method for metadata requesting. -- Added the new `IAccount.OptionApprovedLevel` and `IAccount.OptionTradingLevel` properties. -- The `OptionFeed` enum added and now it can be specified for latest/snapshot requests. -- The `OptionSnapshotRequest` class now has a proper pagination support logic. -- Added the new `IAccountConfiguration.MaxOptionTradingLevel` property. -- Added the new 'AssetType.UsOption` enumeration member. -- Added the new 'OptionTradingLevel` enumeration. +- The `AccountActivitiesRequest` class has been updated and now provides the correct URL query parameters for the API endpoint. Thanks, @ooples, for this contribution. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 824caca4e1d0467ce26afd142eb8805ad8349dc8 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Thu, 17 Oct 2024 11:29:20 +0200 Subject: [PATCH 105/125] Bump Microsoft.Extensions.Http, Microsoft.Extensions.DependencyInjection, and Polly (#759) * Bump Microsoft.Extensions.Http and Microsoft.Extensions.DependencyInjection (#357) * Bump Microsoft.Extensions.Http and Microsoft.Extensions.DependencyInjection Bumps [Microsoft.Extensions.Http](https://github.com/dotnet/runtime) and [Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/runtime). These dependencies needed to be updated together. Updates `Microsoft.Extensions.Http` from 8.0.0 to 8.0.1 - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1) Updates `Microsoft.Extensions.DependencyInjection` from 8.0.0 to 8.0.1 - [Release notes](https://github.com/dotnet/runtime/releases) - [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1) --- updated-dependencies: - dependency-name: Microsoft.Extensions.Http dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: Microsoft.Extensions.DependencyInjection dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] * Bump Polly from 8.4.1 to 8.4.2 (#358) * Bump Polly from 8.4.1 to 8.4.2 Bumps [Polly](https://github.com/App-vNext/Polly) from 8.4.1 to 8.4.2. - [Release notes](https://github.com/App-vNext/Polly/releases) - [Changelog](https://github.com/App-vNext/Polly/blob/main/CHANGELOG.md) - [Commits](https://github.com/App-vNext/Polly/compare/8.4.1...8.4.2) --- updated-dependencies: - dependency-name: Polly dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] (cherry picked from commit 23f025bffdffefbd209e6ea651484cddf5a6e52d) --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 7992d9f5..53f1a2cf 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -13,8 +13,8 @@ - - + + From 2f9df061641a1d5fecf4cc91a76a80ec70cff182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1zaro=20Armando?= <2146818+uranio-235@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:10:47 +0100 Subject: [PATCH 106/125] fix: binding for option type response (#756) (cherry picked from commit 8137296ceafb503b5712d2fd99f5d35de7153c28) --- Alpaca.Markets/Messages/JsonOptionContract.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets/Messages/JsonOptionContract.cs b/Alpaca.Markets/Messages/JsonOptionContract.cs index dd00fb8e..1e108165 100644 --- a/Alpaca.Markets/Messages/JsonOptionContract.cs +++ b/Alpaca.Markets/Messages/JsonOptionContract.cs @@ -25,7 +25,7 @@ internal sealed class JsonOptionContract : IOptionContract public Decimal Size { get; set; } [JsonProperty(PropertyName = "type", Required = Required.Always)] - public OptionType OptionType { get; } + public OptionType OptionType { get; set; } [JsonProperty(PropertyName = "strike_price", Required = Required.Always)] public Decimal StrikePrice { get; set; } From 55a70c80e418aeffec8590a7c611011718a3f72e Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 20 Oct 2024 11:16:45 +0200 Subject: [PATCH 107/125] Prepare release 7.1.2 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 254eac7a..b6ae939b 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,14 +12,14 @@ - 7.1.1.0 - 7.1.1.0 - 7.1.1 + 7.1.2.0 + 7.1.2.0 + 7.1.2 -- The `AccountActivitiesRequest` class has been updated and now provides the correct URL query parameters for the API endpoint. Thanks, @ooples, for this contribution. +- The `OptionType` property in the `IOptionContract` deserialization is fixed. Thanks, @uranio-235, for this contribution. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From d7d2d431e12be8aa0d63af335b36968ec4504b61 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 10 Nov 2024 17:33:09 +0100 Subject: [PATCH 108/125] The R# issues fixed in the source code --- .../AlpacaTradingClientTest.Watchlists.cs | 4 ++-- Alpaca.Markets.Tests/AlpacaTradingClientTest.cs | 13 ++++++------- Alpaca.Markets.Tests/RequestValidationTest.cs | 8 ++++---- .../Parameters/HistoricalAuctionsRequest.cs | 8 ++++---- Alpaca.Markets/Parameters/HistoricalBarsRequest.cs | 2 +- .../Parameters/HistoricalCryptoBarsRequest.cs | 8 ++++---- .../Parameters/HistoricalCryptoQuotesRequest.cs | 8 ++++---- .../Parameters/HistoricalCryptoTradesRequest.cs | 8 ++++---- .../Parameters/HistoricalOptionTradesRequest.cs | 6 +++--- .../Parameters/HistoricalQuotesRequest.cs | 8 ++++---- .../Parameters/HistoricalTradesRequest.cs | 8 ++++---- Alpaca.Markets/Throttling/ThrottleParameters.cs | 12 ++++++++---- 12 files changed, 48 insertions(+), 45 deletions(-) diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs index 21073b7b..9e8182ab 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.Watchlists.cs @@ -55,7 +55,7 @@ public async Task CreateWatchListAsyncWorks() mock.AddPost(WatchlistsUrl, createWatchList()); var watchList = await mock.Client.CreateWatchListAsync(new NewWatchListRequest( - Guid.NewGuid().ToString("D"), new [] { Stock, Crypto })); + Guid.NewGuid().ToString("D"), [Stock, Crypto])); validateWatchList(watchList); } @@ -68,7 +68,7 @@ public async Task UpdateWatchListByIdAsyncWorks() mock.AddPut(WatchListsWildcardUrl, createWatchList()); var watchList = await mock.Client.UpdateWatchListByIdAsync(new UpdateWatchListRequest( - Guid.NewGuid(), Guid.NewGuid().ToString("D"), new [] { Stock, Crypto })); + Guid.NewGuid(), Guid.NewGuid().ToString("D"), [Stock, Crypto])); validateWatchList(watchList); } diff --git a/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs b/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs index 965fa60a..77814504 100644 --- a/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaTradingClientTest.cs @@ -126,12 +126,11 @@ public async Task GetRateLimitValuesWorks() return; IEnumerable> GetHeaders() => - new KeyValuePair[] - { - new("X-Ratelimit-Limit", "100"), - new("X-Ratelimit-Remaining", "99"), - new("X-Ratelimit-Reset", - resetTime.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)) - }; + [ + new("X-Ratelimit-Limit", "100"), + new("X-Ratelimit-Remaining", "99"), + new("X-Ratelimit-Reset", + resetTime.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)) + ]; } } diff --git a/Alpaca.Markets.Tests/RequestValidationTest.cs b/Alpaca.Markets.Tests/RequestValidationTest.cs index 17ea3965..4d21418e 100644 --- a/Alpaca.Markets.Tests/RequestValidationTest.cs +++ b/Alpaca.Markets.Tests/RequestValidationTest.cs @@ -16,7 +16,7 @@ public void HistoricalRequestBaseNoSymbolsValidationWorks() => [Fact] public void HistoricalRequestBaseEmptySymbolValidationWorks() => - validate(new HistoricalCryptoBarsRequest(new [] { String.Empty }, _interval, BarTimeFrame.Day)); + validate(new HistoricalCryptoBarsRequest([String.Empty], _interval, BarTimeFrame.Day)); [Fact] public void HistoricalRequestBaseEmptyPageValidationWorks() => @@ -25,7 +25,7 @@ public void HistoricalRequestBaseEmptyPageValidationWorks() => [Fact] public void NewsArticlesRequestEmptySymbolValidationWorks() => - validate(new NewsArticlesRequest(new [] { String.Empty })); + validate(new NewsArticlesRequest([String.Empty])); [Fact] public void NewsArticlesRequestBigPageValidationWorks() => @@ -46,7 +46,7 @@ public void NewWatchListRequestEmptyNameValidationWorks() => [Fact] public void NewWatchListRequestEmptySymbolValidationWorks() => - validate(new NewWatchListRequest(Guid.NewGuid().ToString("D"), new [] { String.Empty})); + validate(new NewWatchListRequest(Guid.NewGuid().ToString("D"), [String.Empty])); [Fact] public void UpdateWatchListRequestEmptyNameValidationWorks() => @@ -55,7 +55,7 @@ public void UpdateWatchListRequestEmptyNameValidationWorks() => [Fact] public void UpdateWatchListRequestEmptySymbolValidationWorks() => validate(new UpdateWatchListRequest(Guid.NewGuid(), - Guid.NewGuid().ToString("D"), new [] { String.Empty})); + Guid.NewGuid().ToString("D"), [String.Empty])); [Fact] public void ChangeWatchListRequestEmptyNameValidationWorks() => diff --git a/Alpaca.Markets/Parameters/HistoricalAuctionsRequest.cs b/Alpaca.Markets/Parameters/HistoricalAuctionsRequest.cs index f0665e00..4511e3a4 100644 --- a/Alpaca.Markets/Parameters/HistoricalAuctionsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalAuctionsRequest.cs @@ -21,7 +21,7 @@ public HistoricalAuctionsRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalAuctionsRequest( public HistoricalAuctionsRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalAuctionsRequest( /// public HistoricalAuctionsRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } @@ -111,7 +111,7 @@ public HistoricalAuctionsRequest( public HistoricalAuctionsRequest( String symbol, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } diff --git a/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs index cbe50ff5..071b3b03 100644 --- a/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalBarsRequest.cs @@ -22,7 +22,7 @@ public HistoricalBarsRequest( DateTime from, DateTime into, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, from, into, timeFrame) + : this([symbol.EnsureNotNull()], from, into, timeFrame) { } diff --git a/Alpaca.Markets/Parameters/HistoricalCryptoBarsRequest.cs b/Alpaca.Markets/Parameters/HistoricalCryptoBarsRequest.cs index 37f04b17..bcc728fc 100644 --- a/Alpaca.Markets/Parameters/HistoricalCryptoBarsRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalCryptoBarsRequest.cs @@ -22,7 +22,7 @@ public HistoricalCryptoBarsRequest( DateTime from, DateTime into, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, from, into, timeFrame) + : this([symbol.EnsureNotNull()], from, into, timeFrame) { } @@ -39,7 +39,7 @@ public HistoricalCryptoBarsRequest( String symbol, BarTimeFrame timeFrame, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + : this([symbol.EnsureNotNull()], timeInterval, timeFrame) { } @@ -54,7 +54,7 @@ public HistoricalCryptoBarsRequest( public HistoricalCryptoBarsRequest( String symbol, BarTimeFrame timeFrame) - : this(new[] { symbol.EnsureNotNull() }, timeFrame) + : this([symbol.EnsureNotNull()], timeFrame) { } @@ -121,7 +121,7 @@ public HistoricalCryptoBarsRequest( String symbol, BarTimeFrame timeFrame, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval, timeFrame) + : this([symbol.EnsureNotNull()], timeInterval, timeFrame) { } diff --git a/Alpaca.Markets/Parameters/HistoricalCryptoQuotesRequest.cs b/Alpaca.Markets/Parameters/HistoricalCryptoQuotesRequest.cs index 58c6febb..91ada458 100644 --- a/Alpaca.Markets/Parameters/HistoricalCryptoQuotesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalCryptoQuotesRequest.cs @@ -21,7 +21,7 @@ public HistoricalCryptoQuotesRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalCryptoQuotesRequest( public HistoricalCryptoQuotesRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalCryptoQuotesRequest( /// public HistoricalCryptoQuotesRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } @@ -111,7 +111,7 @@ public HistoricalCryptoQuotesRequest( public HistoricalCryptoQuotesRequest( String symbol, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } diff --git a/Alpaca.Markets/Parameters/HistoricalCryptoTradesRequest.cs b/Alpaca.Markets/Parameters/HistoricalCryptoTradesRequest.cs index cc58b338..b0e558ac 100644 --- a/Alpaca.Markets/Parameters/HistoricalCryptoTradesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalCryptoTradesRequest.cs @@ -21,7 +21,7 @@ public HistoricalCryptoTradesRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalCryptoTradesRequest( public HistoricalCryptoTradesRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalCryptoTradesRequest( /// public HistoricalCryptoTradesRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } @@ -111,7 +111,7 @@ public HistoricalCryptoTradesRequest( public HistoricalCryptoTradesRequest( String symbol, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } diff --git a/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs index da18b5d1..1657f9a8 100644 --- a/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalOptionTradesRequest.cs @@ -21,7 +21,7 @@ public HistoricalOptionTradesRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalOptionTradesRequest( public HistoricalOptionTradesRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalOptionTradesRequest( /// public HistoricalOptionTradesRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } diff --git a/Alpaca.Markets/Parameters/HistoricalQuotesRequest.cs b/Alpaca.Markets/Parameters/HistoricalQuotesRequest.cs index 05ce7ea8..a86cc0bd 100644 --- a/Alpaca.Markets/Parameters/HistoricalQuotesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalQuotesRequest.cs @@ -21,7 +21,7 @@ public HistoricalQuotesRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalQuotesRequest( public HistoricalQuotesRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalQuotesRequest( /// public HistoricalQuotesRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } @@ -111,7 +111,7 @@ public HistoricalQuotesRequest( public HistoricalQuotesRequest( String symbol, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } diff --git a/Alpaca.Markets/Parameters/HistoricalTradesRequest.cs b/Alpaca.Markets/Parameters/HistoricalTradesRequest.cs index ea7d2834..472e8206 100644 --- a/Alpaca.Markets/Parameters/HistoricalTradesRequest.cs +++ b/Alpaca.Markets/Parameters/HistoricalTradesRequest.cs @@ -21,7 +21,7 @@ public HistoricalTradesRequest( String symbol, DateTime from, DateTime into) - : this(new[] { symbol.EnsureNotNull() }, from, into) + : this([symbol.EnsureNotNull()], from, into) { } @@ -36,7 +36,7 @@ public HistoricalTradesRequest( public HistoricalTradesRequest( String symbol, Interval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } @@ -49,7 +49,7 @@ public HistoricalTradesRequest( /// public HistoricalTradesRequest( String symbol) - : this(new[] { symbol.EnsureNotNull() }) + : this([symbol.EnsureNotNull()]) { } @@ -111,7 +111,7 @@ public HistoricalTradesRequest( public HistoricalTradesRequest( String symbol, IInclusiveTimeInterval timeInterval) - : this(new[] { symbol.EnsureNotNull() }, timeInterval) + : this([symbol.EnsureNotNull()], timeInterval) { } diff --git a/Alpaca.Markets/Throttling/ThrottleParameters.cs b/Alpaca.Markets/Throttling/ThrottleParameters.cs index 825fe5c5..ab450a94 100644 --- a/Alpaca.Markets/Throttling/ThrottleParameters.cs +++ b/Alpaca.Markets/Throttling/ThrottleParameters.cs @@ -128,12 +128,16 @@ public ThrottleParameters( IEnumerable retryHttpStatuses) { MaxRetryAttempts = maxRetryAttempts; - _retrySocketErrorCodes = new HashSet( + _retrySocketErrorCodes = + [ // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract - retrySocketErrorCodes ?? _defaultSocketErrorCodes); - _retryHttpStatuses = new HashSet( + ..retrySocketErrorCodes ?? _defaultSocketErrorCodes + ]; + _retryHttpStatuses = + [ // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract - retryHttpStatuses ?? _defaultHttpStatuses); + ..retryHttpStatuses ?? _defaultHttpStatuses + ]; } /// From aca75d834697fe45cccf5eadc31e7b5685e4a6dc Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Wed, 30 Oct 2024 11:14:33 +0100 Subject: [PATCH 109/125] Bump JetBrains.Annotations from 2024.2.0 to 2024.3.0 (#359) (#762) * Bump JetBrains.Annotations from 2024.2.0 to 2024.3.0 Bumps [JetBrains.Annotations](https://github.com/JetBrains/JetBrains.Annotations) from 2024.2.0 to 2024.3.0. - [Commits](https://github.com/JetBrains/JetBrains.Annotations/compare/2024.2...2024.3) --- updated-dependencies: - dependency-name: JetBrains.Annotations dependency-type: direct:production update-type: version-update:semver-minor ... * Update NuGet lock files after Dependabot dependency update. --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] (cherry picked from commit 35197de8fe9cf8b5c0fb360defd8d963c10c7172) --- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 24 +++++++++---------- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 24 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 876370c8..4d185ce4 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -85,7 +85,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index d08c21dd..770e0057 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -24,9 +24,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -333,9 +333,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -624,9 +624,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -881,9 +881,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index b6ae939b..74d1dd99 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -91,7 +91,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all compile; analyzers diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index c3823545..acf2179d 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -10,9 +10,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -190,9 +190,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -353,9 +353,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", @@ -493,9 +493,9 @@ }, "JetBrains.Annotations": { "type": "Direct", - "requested": "[2024.2.0, )", - "resolved": "2024.2.0", - "contentHash": "GNnqCFW/163p1fOehKx0CnAqjmpPrUSqrgfHM6qca+P+RN39C9rhlfZHQpJhxmQG/dkOYe/b3Z0P8b6Kv5m1qw==" + "requested": "[2024.3.0, )", + "resolved": "2024.3.0", + "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug==" }, "Microsoft.CodeAnalysis.PublicApiAnalyzers": { "type": "Direct", From f6bde3f0a3be75de42d1e64daa5b60d2f53d8283 Mon Sep 17 00:00:00 2001 From: Zizheng Zhang <92221220+Chacoon3@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:27:54 -0500 Subject: [PATCH 110/125] adding a previously unmapped activity type (#765) * adding a previously unmapped activity type * Fixed compilation issues before merging changes to the origin repository. --------- Co-authored-by: Oleg Rakhmatulin (cherry picked from commit 30af5fd30735ffeebcbbb2c88a82a9cc268e5f24) --- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/CompatibilitySuppressions.xml | 189 +++---------------- Alpaca.Markets/Enums/AccountActivityType.cs | 9 + Alpaca.Markets/PublicAPI.Shipped.txt | 5 +- 4 files changed, 41 insertions(+), 164 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 74d1dd99..b98593d0 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -49,7 +49,7 @@ true - 7.0.0 + 7.1.0 true true AllEnabledByDefault diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index 32eebfaf..f0ae7013 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -2,204 +2,71 @@ - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true + CP0008 + T:Alpaca.Markets.RequestValidationException + lib/netstandard2.0/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll - true + CP0008 + T:Alpaca.Markets.RestClientErrorException + lib/netstandard2.0/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll - CP0006 - P:Alpaca.Markets.IAccount.OptionsApprovedLevel - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll + CP0011 + F:Alpaca.Markets.AccountActivityType.CryptoFee + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll true - CP0006 - P:Alpaca.Markets.IAccount.OptionsBuyingPower - lib/net6.0/Alpaca.Markets.dll - lib/net6.0/Alpaca.Markets.dll + CP0011 + F:Alpaca.Markets.AccountActivityType.FeeInUsd + lib/net462/Alpaca.Markets.dll + lib/net462/Alpaca.Markets.dll true - CP0006 - P:Alpaca.Markets.IAccount.OptionsTradingLevel + CP0011 + F:Alpaca.Markets.AccountActivityType.CryptoFee lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true - CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel + CP0011 + F:Alpaca.Markets.AccountActivityType.FeeInUsd lib/net6.0/Alpaca.Markets.dll lib/net6.0/Alpaca.Markets.dll true - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) + CP0011 + F:Alpaca.Markets.AccountActivityType.CryptoFee lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) + CP0011 + F:Alpaca.Markets.AccountActivityType.FeeInUsd lib/netstandard2.0/Alpaca.Markets.dll lib/netstandard2.0/Alpaca.Markets.dll true - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccount.OptionsApprovedLevel - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccount.OptionsBuyingPower - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccount.OptionsTradingLevel - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel - lib/netstandard2.0/Alpaca.Markets.dll - lib/netstandard2.0/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionByIdAsync(System.Guid,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ExerciseOptionsPositionBySymbolAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractByIdAsync(System.Guid,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.GetOptionContractBySymbolAsync(System.String,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - M:Alpaca.Markets.IAlpacaTradingClient.ListOptionContractsAsync(Alpaca.Markets.OptionContractsRequest,System.Threading.CancellationToken) - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccount.OptionsApprovedLevel + CP0011 + F:Alpaca.Markets.AccountActivityType.CryptoFee lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true - CP0006 - P:Alpaca.Markets.IAccount.OptionsBuyingPower + CP0011 + F:Alpaca.Markets.AccountActivityType.FeeInUsd lib/netstandard2.1/Alpaca.Markets.dll lib/netstandard2.1/Alpaca.Markets.dll true - - CP0006 - P:Alpaca.Markets.IAccount.OptionsTradingLevel - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0006 - P:Alpaca.Markets.IAccountConfiguration.MaxOptionsTradingLevel - lib/netstandard2.1/Alpaca.Markets.dll - lib/netstandard2.1/Alpaca.Markets.dll - true - - - CP0008 - T:Alpaca.Markets.RequestValidationException - lib/netstandard2.0/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - - - CP0008 - T:Alpaca.Markets.RestClientErrorException - lib/netstandard2.0/Alpaca.Markets.dll - lib/net462/Alpaca.Markets.dll - \ No newline at end of file diff --git a/Alpaca.Markets/Enums/AccountActivityType.cs b/Alpaca.Markets/Enums/AccountActivityType.cs index 5937aa13..7bb26653 100644 --- a/Alpaca.Markets/Enums/AccountActivityType.cs +++ b/Alpaca.Markets/Enums/AccountActivityType.cs @@ -8,6 +8,8 @@ [SuppressMessage("ReSharper", "IdentifierTypo")] [SuppressMessage("ReSharper", "StringLiteralTypo")] [SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("Design", "CA1027:Mark enums with FlagsAttribute", + Justification = "This enum is not flags-based so we shouldn't mark it with this attribute.")] public enum AccountActivityType { /// @@ -250,6 +252,13 @@ public enum AccountActivityType [EnumMember(Value = "OPXRC")] OptionExercise, + /// + /// Option trade + /// + [UsedImplicitly] + [EnumMember(Value = "OPTRD")] + OptionTrade, + /// /// Fee denominated in USD /// diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 8598c6b6..f88884e6 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -21,7 +21,7 @@ Alpaca.Markets.AccountActivityType.ACATCash = 3 -> Alpaca.Markets.AccountActivit Alpaca.Markets.AccountActivityType.ACATSecurities = 4 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.CashDeposit = 5 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.CashWithdrawal = 6 -> Alpaca.Markets.AccountActivityType -Alpaca.Markets.AccountActivityType.CryptoFee = 35 -> Alpaca.Markets.AccountActivityType +Alpaca.Markets.AccountActivityType.CryptoFee = 36 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.Dividend = 7 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.DividendCapitalGainsLongTerm = 8 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.DividendCapitalGainsShortTerm = 9 -> Alpaca.Markets.AccountActivityType @@ -31,7 +31,7 @@ Alpaca.Markets.AccountActivityType.DividendNRAWithheld = 12 -> Alpaca.Markets.Ac Alpaca.Markets.AccountActivityType.DividendReturnOfCapital = 13 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.DividendTaxExempt = 15 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.DividendTefraWithheld = 14 -> Alpaca.Markets.AccountActivityType -Alpaca.Markets.AccountActivityType.FeeInUsd = 34 -> Alpaca.Markets.AccountActivityType +Alpaca.Markets.AccountActivityType.FeeInUsd = 35 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.Fill = 0 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.Interest = 16 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.InterestNRAWithheld = 17 -> Alpaca.Markets.AccountActivityType @@ -45,6 +45,7 @@ Alpaca.Markets.AccountActivityType.NameChange = 23 -> Alpaca.Markets.AccountActi Alpaca.Markets.AccountActivityType.OptionAssignment = 31 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.OptionExercise = 33 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.OptionExpiration = 32 -> Alpaca.Markets.AccountActivityType +Alpaca.Markets.AccountActivityType.OptionTrade = 34 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.PassThruCharge = 24 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.PassThruRebate = 25 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.RefTafFee = 30 -> Alpaca.Markets.AccountActivityType From da5e3070390ef75ffc5fbd88622f0e65085ec93f Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 10 Nov 2024 19:36:33 +0100 Subject: [PATCH 111/125] Issue #764 - Added custom string-to-enum converter for the `AccountActivityType` enum with fallback value. --- Alpaca.Markets/Enums/AccountActivityType.cs | 11 +++++++++-- .../Helpers/AccountActivityTypeEnumConverter.cs | 14 ++++++++++++++ Alpaca.Markets/PublicAPI.Shipped.txt | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 Alpaca.Markets/Helpers/AccountActivityTypeEnumConverter.cs diff --git a/Alpaca.Markets/Enums/AccountActivityType.cs b/Alpaca.Markets/Enums/AccountActivityType.cs index 7bb26653..adc9d719 100644 --- a/Alpaca.Markets/Enums/AccountActivityType.cs +++ b/Alpaca.Markets/Enums/AccountActivityType.cs @@ -3,7 +3,7 @@ /// /// Types of account activities /// -[JsonConverter(typeof(StringEnumConverter))] +[JsonConverter(typeof(AccountActivityTypeEnumConverter))] [SuppressMessage("ReSharper", "CommentTypo")] [SuppressMessage("ReSharper", "IdentifierTypo")] [SuppressMessage("ReSharper", "StringLiteralTypo")] @@ -271,5 +271,12 @@ public enum AccountActivityType /// [UsedImplicitly] [EnumMember(Value = "CFEE")] - CryptoFee + CryptoFee, + + /// + /// Unknown account activity type (i.e. one not supported by this version of SDK). + /// + [UsedImplicitly] + [EnumMember(Value = "UNKNOWN")] + Unknown } diff --git a/Alpaca.Markets/Helpers/AccountActivityTypeEnumConverter.cs b/Alpaca.Markets/Helpers/AccountActivityTypeEnumConverter.cs new file mode 100644 index 00000000..47b6b814 --- /dev/null +++ b/Alpaca.Markets/Helpers/AccountActivityTypeEnumConverter.cs @@ -0,0 +1,14 @@ +namespace Alpaca.Markets; + +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class AccountActivityTypeEnumConverter : StringEnumConverter +{ + public override Object ReadJson( + JsonReader reader, + Type objectType, + Object? existingValue, + JsonSerializer serializer) => + reader.ReadEnumString(AccountActivityType.Unknown); +} diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index f88884e6..0bddb1cd 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -54,6 +54,7 @@ Alpaca.Markets.AccountActivityType.StockSpinoff = 28 -> Alpaca.Markets.AccountAc Alpaca.Markets.AccountActivityType.StockSplit = 29 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.SymbolChange = 27 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountActivityType.Transaction = 1 -> Alpaca.Markets.AccountActivityType +Alpaca.Markets.AccountActivityType.Unknown = 37 -> Alpaca.Markets.AccountActivityType Alpaca.Markets.AccountStatus Alpaca.Markets.AccountStatus.AccountClosed = 13 -> Alpaca.Markets.AccountStatus Alpaca.Markets.AccountStatus.AccountUpdated = 3 -> Alpaca.Markets.AccountStatus From d0dc24560f1317dde6a4c5e79fc83b8c1bd91752 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 10 Nov 2024 19:44:55 +0100 Subject: [PATCH 112/125] Changes from PR #755 were partially rolled back. We always use the list of account activity types, not a single one. --- Alpaca.Markets/Parameters/AccountActivitiesRequest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs index d6900af6..bacc6214 100644 --- a/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs +++ b/Alpaca.Markets/Parameters/AccountActivitiesRequest.cs @@ -99,7 +99,7 @@ internal async ValueTask GetUriBuilderAsync( { Path = "v2/account/activities", Query = await new QueryBuilder() - .AddParameter("activity_type", ActivityTypes) + .AddParameter("activity_types", ActivityTypes) .AddParameter("date", Date) .AddParameter("until", TimeInterval.Into, "O") .AddParameter("after", TimeInterval.From, "O") From 2f4993aa046e7f4c6bddb659fa5d259aee56cb3e Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 10 Nov 2024 20:01:22 +0100 Subject: [PATCH 113/125] Prepare release 7.1.3 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index b98593d0..d83caf6c 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,14 +12,16 @@ - 7.1.2.0 - 7.1.2.0 - 7.1.2 + 7.1.3.0 + 7.1.3.0 + 7.1.3 -- The `OptionType` property in the `IOptionContract` deserialization is fixed. Thanks, @uranio-235, for this contribution. +- The `OptionTrade` item was added to the `AccountActivityType` enum. Thanks, @Chacoon3, for this contribution. +- Changes from PR #755 were partially rolled back. The `ListAccountActivitiesAsync` should work fine again. +- The custom string-to-enum converter was added for the `AccountActivityType` enum with a fallback value. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 5671cd60a87b38c0e72fdaaec033e487949e2ea1 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Fri, 15 Nov 2024 09:22:35 +0100 Subject: [PATCH 114/125] Upgrade dependencies and prepare for build using .NET SDK 9.0 for future releases --- .../Alpaca.Markets.Extensions.Tests.csproj | 11 +- .../Alpaca.Markets.Extensions.csproj | 11 +- .../CompatibilitySuppressions.xml | 28 -- Alpaca.Markets.Extensions/packages.lock.json | 435 ++++++++++-------- .../Alpaca.Markets.Tests.csproj | 3 +- Alpaca.Markets/Alpaca.Markets.csproj | 11 +- Alpaca.Markets/packages.lock.json | 198 ++++---- UsageExamples/UsageExamples.csproj | 13 +- 8 files changed, 372 insertions(+), 338 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 53f1a2cf..a181a329 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -3,6 +3,7 @@ net6.0 ..\Alpaca.Markets.snk + true true enable latest @@ -13,8 +14,8 @@ - - + + @@ -24,10 +25,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + - + diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 4d185ce4..b7dbd651 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -52,8 +52,9 @@ true - 6.2.2 + 7.0.0 true + true true AllEnabledByDefault true @@ -97,9 +98,9 @@ - - - + + + @@ -109,7 +110,7 @@ - + diff --git a/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml b/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml index 096125f6..063a2450 100644 --- a/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml +++ b/Alpaca.Markets.Extensions/CompatibilitySuppressions.xml @@ -1,32 +1,4 @@  - - CP0001 - T:Alpaca.Markets.Extensions.ConfigurationExtensions - lib/net462/Alpaca.Markets.Extensions.dll - lib/net462/Alpaca.Markets.Extensions.dll - true - - - CP0001 - T:Alpaca.Markets.Extensions.ConfigurationExtensions - lib/net6.0/Alpaca.Markets.Extensions.dll - lib/net6.0/Alpaca.Markets.Extensions.dll - true - - - CP0001 - T:Alpaca.Markets.Extensions.ConfigurationExtensions - lib/netstandard2.0/Alpaca.Markets.Extensions.dll - lib/netstandard2.0/Alpaca.Markets.Extensions.dll - true - - - CP0001 - T:Alpaca.Markets.Extensions.ConfigurationExtensions - lib/netstandard2.1/Alpaca.Markets.Extensions.dll - lib/netstandard2.1/Alpaca.Markets.Extensions.dll - true - \ No newline at end of file diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 770e0057..2c736c66 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -36,24 +36,24 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "DqI4q54U4hH7bIAq9M5a/hl5Odr/KBAoaZ0dcT4OgutD8dook34CbkvAfAIzkMVjYXiL+E5ul9etwwqiX4PHGw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" } }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.8, )", - "resolved": "8.0.8", - "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "c9cq28bSsycDoHzeIrNODdnZap/Un1B6A7M2QVRlPaIaWAtKcswkDDelhco9NwOdhhkFeVDqk5MrmAbYdfgBTw==", "dependencies": { - "Microsoft.Extensions.Http": "8.0.0", + "Microsoft.Extensions.Http": "9.0.0", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } @@ -79,11 +79,11 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", "dependencies": { - "System.Memory": "4.5.5" + "System.Memory": "4.6.0" } }, "System.Linq.Async": { @@ -97,17 +97,18 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==", "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "resolved": "9.0.0", + "contentHash": "owmu2Cr3IQ8yQiBleBHlGk8dSQ12oaF2e7TpzwJKEl4m84kkZJjEY1n33L67Y3zM5jPOjmmbdHjbfiL0RqcMRQ==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -128,69 +129,70 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "resolved": "9.0.0", + "contentHash": "lqvd7W3FGKUO1+ZoUEMaZ5XDJeWvjpy2/M/ptCGz3tXLD4HWVaSzjufsAsjemasBEg+2SxXVtYVvGt5r2nKDlg==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", "System.ValueTuple": "4.5.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "9.0.0", + "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", + "resolved": "9.0.0", + "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "9.0.0", + "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0", + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0", + "System.Diagnostics.DiagnosticSource": "9.0.0", "System.ValueTuple": "4.5.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "9.0.0", + "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "System.Buffers": "4.5.1", + "System.Diagnostics.DiagnosticSource": "9.0.0", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "9.0.0", + "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", "System.ValueTuple": "4.5.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "resolved": "9.0.0", + "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -241,8 +243,8 @@ }, "System.Buffers": { "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -251,8 +253,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", + "resolved": "9.0.0", + "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -270,12 +272,12 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "resolved": "4.6.0", + "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" + "System.Buffers": "4.6.0", + "System.Numerics.Vectors": "4.6.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" } }, "System.Net.Http.WinHttpHandler": { @@ -289,13 +291,13 @@ }, "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + "resolved": "4.6.0", + "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -345,24 +347,24 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "DqI4q54U4hH7bIAq9M5a/hl5Odr/KBAoaZ0dcT4OgutD8dook34CbkvAfAIzkMVjYXiL+E5ul9etwwqiX4PHGw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" } }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.8, )", - "resolved": "8.0.8", - "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "c9cq28bSsycDoHzeIrNODdnZap/Un1B6A7M2QVRlPaIaWAtKcswkDDelhco9NwOdhhkFeVDqk5MrmAbYdfgBTw==", "dependencies": { - "Microsoft.Extensions.Http": "8.0.0", + "Microsoft.Extensions.Http": "9.0.0", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } @@ -388,11 +390,11 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", "dependencies": { - "System.Memory": "4.5.5" + "System.Memory": "4.6.0" } }, "System.Linq.Async": { @@ -406,17 +408,18 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==", "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", + "resolved": "9.0.0", + "contentHash": "owmu2Cr3IQ8yQiBleBHlGk8dSQ12oaF2e7TpzwJKEl4m84kkZJjEY1n33L67Y3zM5jPOjmmbdHjbfiL0RqcMRQ==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -436,67 +439,68 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "resolved": "9.0.0", + "contentHash": "lqvd7W3FGKUO1+ZoUEMaZ5XDJeWvjpy2/M/ptCGz3tXLD4HWVaSzjufsAsjemasBEg+2SxXVtYVvGt5r2nKDlg==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "9.0.0", + "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", + "resolved": "9.0.0", + "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "9.0.0", + "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0", + "System.Diagnostics.DiagnosticSource": "9.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "9.0.0", + "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "System.Buffers": "4.5.1", + "System.Diagnostics.DiagnosticSource": "9.0.0", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "9.0.0", + "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", "System.ComponentModel.Annotations": "5.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "resolved": "9.0.0", + "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -546,8 +550,8 @@ }, "System.Buffers": { "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -556,8 +560,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", + "resolved": "9.0.0", + "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -575,23 +579,23 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "resolved": "4.6.0", + "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" + "System.Buffers": "4.6.0", + "System.Numerics.Vectors": "4.6.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" } }, "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" + "resolved": "4.6.0", + "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -636,24 +640,24 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "DqI4q54U4hH7bIAq9M5a/hl5Odr/KBAoaZ0dcT4OgutD8dook34CbkvAfAIzkMVjYXiL+E5ul9etwwqiX4PHGw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" } }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.8, )", - "resolved": "8.0.8", - "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "c9cq28bSsycDoHzeIrNODdnZap/Un1B6A7M2QVRlPaIaWAtKcswkDDelhco9NwOdhhkFeVDqk5MrmAbYdfgBTw==", "dependencies": { - "Microsoft.Extensions.Http": "8.0.0", + "Microsoft.Extensions.Http": "9.0.0", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } @@ -670,9 +674,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==" }, "System.Linq.Async": { "type": "Direct", @@ -682,9 +686,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -706,60 +710,61 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "resolved": "9.0.0", + "contentHash": "lqvd7W3FGKUO1+ZoUEMaZ5XDJeWvjpy2/M/ptCGz3tXLD4HWVaSzjufsAsjemasBEg+2SxXVtYVvGt5r2nKDlg==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "9.0.0", + "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + "resolved": "9.0.0", + "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "9.0.0", + "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0", + "System.Diagnostics.DiagnosticSource": "9.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "9.0.0", + "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "System.Buffers": "4.5.1", + "System.Diagnostics.DiagnosticSource": "9.0.0", "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "9.0.0", + "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", "System.ComponentModel.Annotations": "5.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "resolved": "9.0.0", + "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -814,8 +819,8 @@ }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", + "resolved": "9.0.0", + "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==", "dependencies": { "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" @@ -893,24 +898,24 @@ }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "DqI4q54U4hH7bIAq9M5a/hl5Odr/KBAoaZ0dcT4OgutD8dook34CbkvAfAIzkMVjYXiL+E5ul9etwwqiX4PHGw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" } }, "Microsoft.Extensions.Http.Polly": { "type": "Direct", - "requested": "[8.0.8, )", - "resolved": "8.0.8", - "contentHash": "pGdr4TNLLHLRT5PVZaNdcgBIKN1lQQAFcbnNV7P7qcS6WazGXT2ijMsuhUcNtm2ZxEVB7pZDRDJKR6J9m2bVaA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "c9cq28bSsycDoHzeIrNODdnZap/Un1B6A7M2QVRlPaIaWAtKcswkDDelhco9NwOdhhkFeVDqk5MrmAbYdfgBTw==", "dependencies": { - "Microsoft.Extensions.Http": "8.0.0", + "Microsoft.Extensions.Http": "9.0.0", "Polly": "7.2.4", "Polly.Extensions.Http": "3.0.0" } @@ -948,9 +953,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -972,57 +977,63 @@ }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "resolved": "9.0.0", + "contentHash": "lqvd7W3FGKUO1+ZoUEMaZ5XDJeWvjpy2/M/ptCGz3tXLD4HWVaSzjufsAsjemasBEg+2SxXVtYVvGt5r2nKDlg==", "dependencies": { - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.Primitives": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "resolved": "9.0.0", + "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + "resolved": "9.0.0", + "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", + "resolved": "9.0.0", + "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0", + "System.Diagnostics.DiagnosticSource": "9.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "resolved": "9.0.0", + "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "System.Buffers": "4.5.1", + "System.Diagnostics.DiagnosticSource": "9.0.0", + "System.Memory": "4.5.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", + "resolved": "9.0.0", + "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", + "System.ComponentModel.Annotations": "5.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "resolved": "9.0.0", + "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg==", "dependencies": { + "System.Memory": "4.5.5", "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, @@ -1060,11 +1071,35 @@ "Polly": "7.1.0" } }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "ddppcFpnbohLWdYKr/ZeLZHmmI+DXFgZ3Snq+/E7SwcdW4UnvxmaugkwGywvGVWkHPGCSZjCP+MLzu23AL5SDw==", + "dependencies": { + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, "System.IO.Pipelines": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index ea509c9b..2c4d92c8 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -3,6 +3,7 @@ net6.0 ..\Alpaca.Markets.snk + true true enable latest @@ -13,7 +14,7 @@ - + diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index d83caf6c..4e0a0047 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -53,6 +53,7 @@ 7.1.0 true + true true AllEnabledByDefault true @@ -105,20 +106,20 @@ - - + + - + - + - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index acf2179d..54bd39e8 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -47,27 +47,27 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.2, )", - "resolved": "8.4.2", - "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", + "requested": "[8.5.0, )", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.4.2" + "Polly.Core": "8.5.0" } }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", "dependencies": { - "System.Memory": "4.5.5" + "System.Memory": "4.6.0" } }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -76,9 +76,9 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "H7UZoctQ2xFQgU6eGFRavMDJQGebLaqG9OqWg5dm3WFpPJ8mhdTDcJhz/ihxzUZm1I+wiykzp+tu3hYtQ0omMQ==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" @@ -86,17 +86,18 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==", "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "resolved": "9.0.0", + "contentHash": "owmu2Cr3IQ8yQiBleBHlGk8dSQ12oaF2e7TpzwJKEl4m84kkZJjEY1n33L67Y3zM5jPOjmmbdHjbfiL0RqcMRQ==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -127,8 +128,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.2", - "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -139,8 +140,8 @@ }, "System.Buffers": { "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -149,23 +150,23 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "resolved": "4.6.0", + "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" + "System.Buffers": "4.6.0", + "System.Numerics.Vectors": "4.6.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" } }, "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + "resolved": "4.6.0", + "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "4.5.3", - "contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==" + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -227,27 +228,27 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.2, )", - "resolved": "8.4.2", - "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", + "requested": "[8.5.0, )", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.4.2" + "Polly.Core": "8.5.0" } }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", "dependencies": { - "System.Memory": "4.5.5" + "System.Memory": "4.6.0" } }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -256,17 +257,18 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==", "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "9.0.0", "System.Threading.Tasks.Extensions": "4.5.4" } }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "resolved": "9.0.0", + "contentHash": "owmu2Cr3IQ8yQiBleBHlGk8dSQ12oaF2e7TpzwJKEl4m84kkZJjEY1n33L67Y3zM5jPOjmmbdHjbfiL0RqcMRQ==", "dependencies": { "System.Threading.Tasks.Extensions": "4.5.4" } @@ -296,8 +298,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.2", - "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -307,8 +309,8 @@ }, "System.Buffers": { "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -317,23 +319,23 @@ }, "System.Memory": { "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "resolved": "4.6.0", + "contentHash": "OEkbBQoklHngJ8UD8ez2AERSk2g+/qpAaSWWCBFbpH727HxDq5ydVkuncBaKcKfwRqXGWx64dS6G1SUScMsitg==", "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" + "System.Buffers": "4.6.0", + "System.Numerics.Vectors": "4.6.0", + "System.Runtime.CompilerServices.Unsafe": "6.1.0" } }, "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" + "resolved": "4.6.0", + "contentHash": "t+SoieZsRuEyiw/J+qXUbolyO219tKQQI0+2/YI+Qv7YdGValA6WiuokrNKqjrTNsy5ABWU11bdKOzUdheteXg==" }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "4.5.3", - "contentHash": "3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==" + "resolved": "6.1.0", + "contentHash": "5o/HZxx6RVqYlhKSq8/zronDkALJZUT2Vz0hx43f0gwe8mwlM0y2nYlqdBwLMzr262Bwvpikeb/yEwkAa5PADg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -381,24 +383,24 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.2, )", - "resolved": "8.4.2", - "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", + "requested": "[8.5.0, )", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.4.2" + "Polly.Core": "8.5.0" } }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.1, )", - "resolved": "8.0.1", - "contentHash": "+oPPKv2hHVRJTcaxK33BD1HNKqZjVvhLBqMamCK4MkOnlLcbj1Ja0ROnPeavvWNxeLiThiFpMnvQ0OJtFkwPxw==" + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==" }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -407,9 +409,9 @@ }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -436,8 +438,8 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.2", - "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -533,24 +535,29 @@ }, "Polly": { "type": "Direct", - "requested": "[8.4.2, )", - "resolved": "8.4.2", - "contentHash": "/qfe/eoHQ9tJOGVmJ/y+fUvK5nHDrS0EZ/DguwYXGN8gnDwlUWdmPqUqoj0PJvg8awELac+9YL7W0GOd1vTORg==", + "requested": "[8.5.0, )", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.4.2" + "Polly.Core": "8.5.0" } }, "System.IO.Pipelines": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Threading.Tasks.Extensions": "4.5.4" + } }, "System.Threading.Channels": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "CMaFr7v+57RW7uZfZkPExsPB6ljwzhjACWW1gfU35Y56rk72B/Wu+sTqxVmGSk4SFUlPc3cjeKND0zktziyjBA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "hzACdIf1C+4Dqos5ijV404b94+LqfIC8nfS3mNpCDFWowb1N3PNfJPopneq32ahWlDeyaPZJqjBk76YFR69Rpg==" }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", @@ -577,11 +584,26 @@ }, "Polly.Core": { "type": "Transitive", - "resolved": "8.4.2", - "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" } } } diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index c660ddc4..42d5c099 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -10,6 +10,7 @@ + true true @@ -18,18 +19,18 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + + + - + - + From 78fa9142091820e7306df3ac0ef35d63885e6feb Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 16 Nov 2024 22:31:50 +0100 Subject: [PATCH 115/125] Apply some R# suggestions and disable other (in backported code). --- .../Reconnection/ClientWithReconnectBase.cs | 18 +++++++++++++-- .../DisposableAlpacaDataSubscription.cs | 20 +++++++++++++--- Alpaca.Markets/AlpacaStreamingClient.cs | 23 ++++++++++++++----- global.json | 5 ++++ 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 global.json diff --git a/Alpaca.Markets.Extensions/Reconnection/ClientWithReconnectBase.cs b/Alpaca.Markets.Extensions/Reconnection/ClientWithReconnectBase.cs index 73188f03..5bb001c3 100644 --- a/Alpaca.Markets.Extensions/Reconnection/ClientWithReconnectBase.cs +++ b/Alpaca.Markets.Extensions/Reconnection/ClientWithReconnectBase.cs @@ -92,8 +92,21 @@ protected virtual ValueTask OnReconnection( CancellationToken cancellationToken) => new(); // DO nothing by default for auto-resubscribed clients. - private async void handleSocketClosed() => - await handleSocketClosedAsync().ConfigureAwait(false); + + [SuppressMessage( + "Design", "CA1031:Do not catch general exception types", + Justification = "Expected behavior - we report exceptions via OnError event.")] + private async void handleSocketClosed() + { + try + { + await handleSocketClosedAsync().ConfigureAwait(false); + } + catch (Exception exception) + { + handleOnError(exception); + } + } [SuppressMessage( "Design", "CA1031:Do not catch general exception types", @@ -174,6 +187,7 @@ await OnReconnection(_cancellationTokenSource.Token) [SuppressMessage( "Design", "CA1031:Do not catch general exception types", Justification = "Expected behavior - we report exceptions via OnError event.")] + // ReSharper disable once AsyncVoidMethod private async void handleOnError( Exception exception) { diff --git a/Alpaca.Markets.Extensions/Subscriptions/DisposableAlpacaDataSubscription.cs b/Alpaca.Markets.Extensions/Subscriptions/DisposableAlpacaDataSubscription.cs index 3b6f39f2..1cb74a17 100644 --- a/Alpaca.Markets.Extensions/Subscriptions/DisposableAlpacaDataSubscription.cs +++ b/Alpaca.Markets.Extensions/Subscriptions/DisposableAlpacaDataSubscription.cs @@ -1,4 +1,6 @@ -namespace Alpaca.Markets.Extensions; +using System.Diagnostics; + +namespace Alpaca.Markets.Extensions; internal sealed class DisposableAlpacaDataSubscription : IDisposableAlpacaDataSubscription @@ -39,8 +41,20 @@ public event Action? Received remove => _subscription.Received -= value; } - public async void Dispose() => - await DisposeAsync().ConfigureAwait(false); + [SuppressMessage( + "Design", "CA1031:Do not catch general exception types", + Justification = "Expected behavior - we report exceptions via OnError event.")] + public async void Dispose() + { + try + { + await DisposeAsync().ConfigureAwait(false); + } + catch (Exception exception) + { + Trace.TraceInformation(exception.Message); + } + } public async ValueTask DisposeAsync() { diff --git a/Alpaca.Markets/AlpacaStreamingClient.cs b/Alpaca.Markets/AlpacaStreamingClient.cs index 1828749c..198c2755 100644 --- a/Alpaca.Markets/AlpacaStreamingClient.cs +++ b/Alpaca.Markets/AlpacaStreamingClient.cs @@ -31,16 +31,27 @@ internal AlpacaStreamingClient( /// public event Action? OnTradeUpdate; + + [SuppressMessage( + "Design", "CA1031:Do not catch general exception types", + Justification = "Expected behavior - we report exceptions via OnError event.")] protected override async void OnOpened() { - await SendAsJsonStringAsync(new JsonAuthRequest + try { - Action = JsonAction.Authenticate, - Data = Configuration.SecurityId - .GetAuthenticationData() - }).ConfigureAwait(false); + await SendAsJsonStringAsync(new JsonAuthRequest + { + Action = JsonAction.Authenticate, + Data = Configuration.SecurityId + .GetAuthenticationData() + }).ConfigureAwait(false); - base.OnOpened(); + base.OnOpened(); + } + catch (Exception exception) + { + HandleError(exception); + } } [SuppressMessage( diff --git a/global.json b/global.json new file mode 100644 index 00000000..7e8c0276 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "8.0.404" + } +} \ No newline at end of file From 41f3861684e9ef6f18d296adb9a327f4fe2d1768 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sat, 16 Nov 2024 22:51:51 +0100 Subject: [PATCH 116/125] Prepare release 7.1.4 of SDK --- .../Alpaca.Markets.Extensions.csproj | 11 ++++------- Alpaca.Markets/Alpaca.Markets.csproj | 10 ++++------ 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index b7dbd651..a228150d 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,17 +12,14 @@ - 7.1.0.3 - 7.1.0.3 - 7.1.0 + 7.1.1.0 + 7.1.1.0 + 7.1.1 -- Added factory methods for creating the strongly typed `IAlpacaOptionsDataClient` instance in dependency injection environments. -- Added new methods `GetOptionChainAsyncAsAsyncEnumerable` and `ListSnapshotsAsAsyncEnumerable` into the Extensions package. -- Added the new extension method `ListOptionContractsAsAsyncEnumerable` for the `IAlpacaTradingClient` interface. -- The `ListOptionContractsAsAsyncEnumerable` extensions method uses page token now. +- Service release - the dependencies upgraded to be more up-to-date with the latest fixes. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 4e0a0047..652b6371 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,16 +12,14 @@ - 7.1.3.0 - 7.1.3.0 - 7.1.3 + 7.1.4.0 + 7.1.4.0 + 7.1.4 -- The `OptionTrade` item was added to the `AccountActivityType` enum. Thanks, @Chacoon3, for this contribution. -- Changes from PR #755 were partially rolled back. The `ListAccountActivitiesAsync` should work fine again. -- The custom string-to-enum converter was added for the `AccountActivityType` enum with a fallback value. +- Service release - the dependencies upgraded to be more up-to-date with the latest fixes. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp From 72a1986a063a51d26d895b83cad79711a8ef6269 Mon Sep 17 00:00:00 2001 From: Keeton Date: Sun, 5 Jan 2025 06:25:00 -0600 Subject: [PATCH 117/125] Update README.md (#769) fix spelling of Program.cs Co-authored-by: Lyle Keeton (cherry picked from commit 525a5230b0ad4d6f5628ea440f29f3bd40418a44) --- Alpaca.Markets.Extensions/README.md | 2 +- Alpaca.Markets/README.md | 2 +- README.md | 17 ++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Alpaca.Markets.Extensions/README.md b/Alpaca.Markets.Extensions/README.md index 36a6b496..f782584c 100644 --- a/Alpaca.Markets.Extensions/README.md +++ b/Alpaca.Markets.Extensions/README.md @@ -13,7 +13,7 @@ See full online documentation [here](https://olegra.github.io/Alpaca.Markets/api 1. Create a new console application in a new, empty folder by running `dotnet new console`. 2. Add a reference for Alpaca .NET SDK with `dotnet add package Alpaca.Markets`. -3. Replace content of the auto-generated `Programm.cs` file with this code snippet: +3. Replace content of the auto-generated `Program.cs` file with this code snippet: ```cs using System; using Alpaca.Markets; diff --git a/Alpaca.Markets/README.md b/Alpaca.Markets/README.md index dbec7cab..866dca7a 100644 --- a/Alpaca.Markets/README.md +++ b/Alpaca.Markets/README.md @@ -12,7 +12,7 @@ This package contains C#/.NET SDK for [Alpaca Trade API](https://docs.alpaca.mar 1. Create a new console application in a new, empty folder by running `dotnet new console`. 2. Add a reference for Alpaca .NET SDK with `dotnet add package Alpaca.Markets`. -3. Replace content of the auto-generated `Programm.cs` file with this code snippet: +3. Replace content of the auto-generated `Program.cs` file with this code snippet: ```cs using System; using Alpaca.Markets; diff --git a/README.md b/README.md index a64928d3..b14940c6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ 1. Create a new console application in a new, empty folder by running `dotnet new console`. 2. Add a reference for Alpaca .NET SDK with `dotnet add package Alpaca.Markets`. -3. Replace content of the auto-generated `Programm.cs` file with this code snippet: +3. Replace the content of the auto-generated `Program.cs` file with this code snippet: ```cs using System; using Alpaca.Markets; @@ -47,7 +47,7 @@ namespace AlpacaExample } } ``` -4. Replace `KEY_ID` and `SECRET_KEY` values with your own data from the Alpaca dashboard. +4. Replace `KEY_ID` and `SECRET_KEY` values with your data from the Alpaca dashboard. 5. Run the sample application using `dotnet run` command and check the output. You should see information about the current market timestamp and the times that the market will open and close next. See the [UsageExamples](../../tree/develop/UsageExamples) project for near-to-real-world strategy implementation using this SDK and the [Alpaca.Markets.Tests](https://github.com/OlegRa/Alpaca.Markets.Tests) repository for SDK usage examples. The [Wiki](https://github.com/alpacahq/alpaca-trade-api-csharp/wiki) pages contain a lot of additional information about different aspects of this SDK (environments handling, authentication types, different order placement approaches, streaming client subscriptions handling, etc.). @@ -56,22 +56,21 @@ See the [UsageExamples](../../tree/develop/UsageExamples) project for near-to-re Alpaca provides 3 different subscription plans for the Data API v2 real-time streaming data: Free, Unlimited, and Business. The first one provides only IEX data and has some subscription limits. Other plans provide full SIP data without data subscription limits. The `IAlpacaDataStreamingClient` interface and its implementation from SDK provide unified access for both streams. -Use the `Environments.Paper.GetAlpacaDataStreamingClient(...)` factory method for creating client connected to the Free IEX data stream. For the Unlimited and Business SIP data stream use the `Environments.Live.GetAlpacaDataStreamingClient(...)` code. So _Paper_ environment for free data tier and _Live_ for paid subscriptions. +Use the `Environments.Paper.GetAlpacaDataStreamingClient(...)` factory method for creating a client connected to the Free IEX data stream. For the Unlimited and Business SIP data stream use the `Environments.Live.GetAlpacaDataStreamingClient(...)` code. So _Paper_ environment for free data tier and _Live_ for paid subscriptions. ## Mapping between branches and SDK versions | Branch | Version | Description | Milestone | | -------------------------------------------- | ------- | -------------------------------------------- |--------------------------| -| [develop](../../tree/develop) | 8.x | Unstable - experimental, can contain bugs | [SDK 8.x STS (WIP)](https://github.com/alpacahq/alpaca-trade-api-csharp/milestone/18) | -| [master](../../tree/develop) | 7.x | STS - good choice for the new development | [SDK 7.x LTS](https://github.com/alpacahq/alpaca-trade-api-csharp/milestone/17) | -| [support/6.x](../../tree/support/6.x) | 6.x | LTS - good choice for the new development | [SDK 6.x STS](https://github.com/alpacahq/alpaca-trade-api-csharp/milestone/16) | +| [develop](../../tree/develop) | 8.x | Unstable - experimental, can contain bugs | [SDK 8.x WIP](https://github.com/alpacahq/alpaca-trade-api-csharp/milestone/18) | +| [master](../../tree/develop) | 7.x | LTS - good choice for the new development | [SDK 7.x LTS](https://github.com/alpacahq/alpaca-trade-api-csharp/milestone/17) | ### Build instructions -1. Install the latest version of the [.NET 7.0 SDK](https://dotnet.microsoft.com/download) for your OS. -2. Clone the local version of this repository or your own fork (if you want to make changes). +1. Install the latest version of the [.NET 9.0 SDK](https://dotnet.microsoft.com/download) for your OS. +2. Clone the local version of this repository or your fork (if you want to make changes). 3. Build the packages using the `dotnet build` command running in the root directory of the cloned repo. ## Contributors -Thanks a lot for all contributors. See the full list of project supporters in the [CONTRIBUTORS](https://github.com/alpacahq/alpaca-trade-api-csharp/blob/develop/CONTRIBUTORS.md) file. +Thanks a lot for all the contributors. See the full list of project supporters in the [CONTRIBUTORS](https://github.com/alpacahq/alpaca-trade-api-csharp/blob/develop/CONTRIBUTORS.md) file. From c3f731594de047d816009c42f304e1ce3a1232b4 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 5 Jan 2025 22:51:50 +0100 Subject: [PATCH 118/125] Issue #740 - The low-level function for reading one page of historical corporate action data was added. --- Alpaca.Markets.sln.DotSettings | 1 + Alpaca.Markets/AlpacaDataClient.cs | 8 + Alpaca.Markets/CompatibilitySuppressions.xml | 21 +++ .../Enums/CorporateActionFilterType.cs | 99 ++++++++++++ .../Interfaces/IAlpacaDataClient.cs | 29 ++++ Alpaca.Markets/Interfaces/ICashDividend.cs | 57 +++++++ Alpaca.Markets/Interfaces/ICashMerger.cs | 37 +++++ .../Interfaces/ICorporateActionsResponse.cs | 79 ++++++++++ Alpaca.Markets/Interfaces/IForwardSplit.cs | 47 ++++++ Alpaca.Markets/Interfaces/INameChange.cs | 22 +++ Alpaca.Markets/Interfaces/IRedemption.cs | 27 ++++ Alpaca.Markets/Interfaces/IReverseSplit.cs | 42 +++++ .../Interfaces/IRightsDistribution.cs | 47 ++++++ Alpaca.Markets/Interfaces/ISpinOff.cs | 52 +++++++ .../Interfaces/IStockAndCashMerger.cs | 47 ++++++ Alpaca.Markets/Interfaces/IStockDividend.cs | 37 +++++ Alpaca.Markets/Interfaces/IStockMerger.cs | 42 +++++ Alpaca.Markets/Interfaces/IUnitSplit.cs | 52 +++++++ .../Interfaces/IWorthlessRemoval.cs | 17 +++ Alpaca.Markets/Messages/JsonCashDividend.cs | 53 +++++++ Alpaca.Markets/Messages/JsonCashMerger.cs | 38 +++++ .../Messages/JsonCorporateActionsResponse.cs | 104 +++++++++++++ Alpaca.Markets/Messages/JsonForwardSplit.cs | 46 ++++++ Alpaca.Markets/Messages/JsonNameChange.cs | 27 ++++ Alpaca.Markets/Messages/JsonRedemption.cs | 31 ++++ Alpaca.Markets/Messages/JsonReverseSplit.cs | 42 +++++ .../Messages/JsonRightsDistribution.cs | 46 ++++++ Alpaca.Markets/Messages/JsonSpinOff.cs | 49 ++++++ .../Messages/JsonStockAndCashMerger.cs | 44 ++++++ Alpaca.Markets/Messages/JsonStockDividend.cs | 39 +++++ Alpaca.Markets/Messages/JsonStockMerger.cs | 41 +++++ Alpaca.Markets/Messages/JsonUnitSplit.cs | 47 ++++++ .../Messages/JsonWorthlessRemoval.cs | 24 +++ .../Parameters/AnnouncementsRequest.cs | 2 +- .../Parameters/CorporateActionsRequest.cs | 129 ++++++++++++++++ Alpaca.Markets/Parameters/Pagination.cs | 5 + Alpaca.Markets/PublicAPI.Shipped.txt | 143 ++++++++++++++++++ 37 files changed, 1672 insertions(+), 1 deletion(-) create mode 100644 Alpaca.Markets/Enums/CorporateActionFilterType.cs create mode 100644 Alpaca.Markets/Interfaces/ICashDividend.cs create mode 100644 Alpaca.Markets/Interfaces/ICashMerger.cs create mode 100644 Alpaca.Markets/Interfaces/ICorporateActionsResponse.cs create mode 100644 Alpaca.Markets/Interfaces/IForwardSplit.cs create mode 100644 Alpaca.Markets/Interfaces/INameChange.cs create mode 100644 Alpaca.Markets/Interfaces/IRedemption.cs create mode 100644 Alpaca.Markets/Interfaces/IReverseSplit.cs create mode 100644 Alpaca.Markets/Interfaces/IRightsDistribution.cs create mode 100644 Alpaca.Markets/Interfaces/ISpinOff.cs create mode 100644 Alpaca.Markets/Interfaces/IStockAndCashMerger.cs create mode 100644 Alpaca.Markets/Interfaces/IStockDividend.cs create mode 100644 Alpaca.Markets/Interfaces/IStockMerger.cs create mode 100644 Alpaca.Markets/Interfaces/IUnitSplit.cs create mode 100644 Alpaca.Markets/Interfaces/IWorthlessRemoval.cs create mode 100644 Alpaca.Markets/Messages/JsonCashDividend.cs create mode 100644 Alpaca.Markets/Messages/JsonCashMerger.cs create mode 100644 Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs create mode 100644 Alpaca.Markets/Messages/JsonForwardSplit.cs create mode 100644 Alpaca.Markets/Messages/JsonNameChange.cs create mode 100644 Alpaca.Markets/Messages/JsonRedemption.cs create mode 100644 Alpaca.Markets/Messages/JsonReverseSplit.cs create mode 100644 Alpaca.Markets/Messages/JsonRightsDistribution.cs create mode 100644 Alpaca.Markets/Messages/JsonSpinOff.cs create mode 100644 Alpaca.Markets/Messages/JsonStockAndCashMerger.cs create mode 100644 Alpaca.Markets/Messages/JsonStockDividend.cs create mode 100644 Alpaca.Markets/Messages/JsonStockMerger.cs create mode 100644 Alpaca.Markets/Messages/JsonUnitSplit.cs create mode 100644 Alpaca.Markets/Messages/JsonWorthlessRemoval.cs create mode 100644 Alpaca.Markets/Parameters/CorporateActionsRequest.cs diff --git a/Alpaca.Markets.sln.DotSettings b/Alpaca.Markets.sln.DotSettings index fe6abfa7..412d57f3 100644 --- a/Alpaca.Markets.sln.DotSettings +++ b/Alpaca.Markets.sln.DotSettings @@ -8,6 +8,7 @@ True True True + True True True True diff --git a/Alpaca.Markets/AlpacaDataClient.cs b/Alpaca.Markets/AlpacaDataClient.cs index b5bd8d6d..3c795ba7 100644 --- a/Alpaca.Markets/AlpacaDataClient.cs +++ b/Alpaca.Markets/AlpacaDataClient.cs @@ -112,6 +112,14 @@ public Task> ListMostActiveStocksByTradeCountAsync( HttpClient.ListMostActiveStocksAsync(RateLimitHandler, "trades", numberOfTopMostActiveStocks, cancellationToken); + public async Task ListCorporateActionsAsync( + CorporateActionsRequest request, + CancellationToken cancellationToken = default) => + await HttpClient.GetAsync( + await request.EnsureNotNull().Validate() + .GetUriBuilderAsync(HttpClient).ConfigureAwait(false), + RateLimitHandler, cancellationToken).ConfigureAwait(false); + private async Task> listConditionsAsync( Tape tape, String tickType, diff --git a/Alpaca.Markets/CompatibilitySuppressions.xml b/Alpaca.Markets/CompatibilitySuppressions.xml index f0ae7013..79b2c786 100644 --- a/Alpaca.Markets/CompatibilitySuppressions.xml +++ b/Alpaca.Markets/CompatibilitySuppressions.xml @@ -1,6 +1,27 @@  + + CP0006 + M:Alpaca.Markets.IAlpacaDataClient.ListCorporateActionsAsync(Alpaca.Markets.CorporateActionsRequest,System.Threading.CancellationToken) + lib/net6.0/Alpaca.Markets.dll + lib/net6.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaDataClient.ListCorporateActionsAsync(Alpaca.Markets.CorporateActionsRequest,System.Threading.CancellationToken) + lib/netstandard2.0/Alpaca.Markets.dll + lib/netstandard2.0/Alpaca.Markets.dll + true + + + CP0006 + M:Alpaca.Markets.IAlpacaDataClient.ListCorporateActionsAsync(Alpaca.Markets.CorporateActionsRequest,System.Threading.CancellationToken) + lib/netstandard2.1/Alpaca.Markets.dll + lib/netstandard2.1/Alpaca.Markets.dll + true + CP0008 T:Alpaca.Markets.RequestValidationException diff --git a/Alpaca.Markets/Enums/CorporateActionFilterType.cs b/Alpaca.Markets/Enums/CorporateActionFilterType.cs new file mode 100644 index 00000000..428cbfb8 --- /dev/null +++ b/Alpaca.Markets/Enums/CorporateActionFilterType.cs @@ -0,0 +1,99 @@ +namespace Alpaca.Markets; + +/// +/// Supported bar corporate action adjustment types for Alpaca Data API. +/// +[JsonConverter(typeof(StringEnumConverter))] +public enum CorporateActionFilterType +{ + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "reverse_split")] + ReverseSplit, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "forward_split")] + ForwardSplit, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "unit_split")] + UnitSplit, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "cash_dividend")] + CashDividend, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "stock_dividend")] + StockDividend, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "spin_off")] + SpinOff, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "cash_merger")] + CashMerger, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "stock_merger")] + StockMerger, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "stock_and_cash_merger")] + StockAndCashMerger, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "redemption")] + Redemption, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "name_change")] + NameChange, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "worthless_removal")] + WorthlessRemoval, + + /// + /// + /// + [UsedImplicitly] + [EnumMember(Value = "rights_distribution")] + RightsDistribution +} diff --git a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs index 44db9516..8220cd5a 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs @@ -447,4 +447,33 @@ Task> ListMostActiveStocksByVolumeAsync( Task> ListMostActiveStocksByTradeCountAsync( Int32? numberOfTopMostActiveStocks = default, CancellationToken cancellationToken = default); + + /// + /// Returns the historical corporate actions for the current trading session according to request parameters. + /// + /// Historical auctions request parameters. + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The argument is null. + /// + /// Read-only list of most active stocks ranked by trade count. + [UsedImplicitly] + Task ListCorporateActionsAsync( + CorporateActionsRequest request, + CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Interfaces/ICashDividend.cs b/Alpaca.Markets/Interfaces/ICashDividend.cs new file mode 100644 index 00000000..122983c0 --- /dev/null +++ b/Alpaca.Markets/Interfaces/ICashDividend.cs @@ -0,0 +1,57 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the cash dividend information from Alpaca APIs. +/// +public interface ICashDividend +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the dividend rate + /// + public Decimal Rate { get; } + + /// + /// Gets the foreign flag + /// + public Boolean IsForeign { get; } + + /// + /// Gets te special flag + /// + public Boolean IsSpecial { get; } + + /// + /// Gets the cash dividend process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the cash dividend execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the cash dividend record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the cash dividend payable date + /// + public DateOnly? PayableDate { get; } + + /// + /// Gets the cash dividend due bill off date + /// + public DateOnly? DueBillOffDate { get; } + + /// + /// Gets the cash dividend due bill on date + /// + public DateOnly? DueBillOnDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/ICashMerger.cs b/Alpaca.Markets/Interfaces/ICashMerger.cs new file mode 100644 index 00000000..7980400b --- /dev/null +++ b/Alpaca.Markets/Interfaces/ICashMerger.cs @@ -0,0 +1,37 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the cash merger information from Alpaca APIs. +/// +public interface ICashMerger +{ + /// + /// Gets the acquirer symbol + /// + public String? AcquirerSymbol { get; } + + /// + /// Gets the acquiree symbol + /// + public String AcquireeSymbol { get; } + + /// + /// Gets the cash merger rate + /// + public Decimal Rate { get; } + + /// + /// Gets the cash merger process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the cash merger effective date + /// + public DateOnly EffectiveDate { get; } + + /// + /// Gets the cash merger payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/ICorporateActionsResponse.cs b/Alpaca.Markets/Interfaces/ICorporateActionsResponse.cs new file mode 100644 index 00000000..f24dd28a --- /dev/null +++ b/Alpaca.Markets/Interfaces/ICorporateActionsResponse.cs @@ -0,0 +1,79 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the historical corporate action response page with different corporate action types inside. +/// +public interface ICorporateActionsResponse +{ + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList StockAndCashMergers { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList RightsDistributions { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList WorthlessRemovals { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList StockDividends { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList CashDividends { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList ReverseSplits { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList ForwardSplits { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList StockMergers { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList NameChanges { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList CashMergers { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList Redemptions { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList UnitSplits { get; } + + /// + /// Gets list of items from the response page. + /// + public IReadOnlyList SpinOffs { get; } + + /// + /// Gets the next page token for continuation. If value of this property + /// equals to null this page is the last one and no more data is available. + /// + [UsedImplicitly] + public String? NextPageToken { get; } +} diff --git a/Alpaca.Markets/Interfaces/IForwardSplit.cs b/Alpaca.Markets/Interfaces/IForwardSplit.cs new file mode 100644 index 00000000..9d02f596 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IForwardSplit.cs @@ -0,0 +1,47 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the forward split information from Alpaca APIs. +/// +public interface IForwardSplit +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the forward split new rate + /// + public Decimal NewRate { get; } + + /// + /// Gets the forward split old rate + /// + public Decimal OldRate { get; } + + /// + /// Gets the forward split process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the forward split execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the forward split record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the forward split payable date + /// + public DateOnly? PayableDate { get; } + + /// + /// Gets the forward split due bill redemption date + /// + public DateOnly? DueBillRedemptionDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/INameChange.cs b/Alpaca.Markets/Interfaces/INameChange.cs new file mode 100644 index 00000000..f3fff450 --- /dev/null +++ b/Alpaca.Markets/Interfaces/INameChange.cs @@ -0,0 +1,22 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the name change information from Alpaca APIs. +/// +public interface INameChange +{ + /// + /// Gets the old symbol + /// + public String OldSymbol { get; } + + /// + /// Gets the new symbol + /// + public String NewSymbol { get; } + + /// + /// Gets the name change process date + /// + public DateOnly ProcessDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IRedemption.cs b/Alpaca.Markets/Interfaces/IRedemption.cs new file mode 100644 index 00000000..f0a75685 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IRedemption.cs @@ -0,0 +1,27 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the redemption information from Alpaca APIs. +/// +public interface IRedemption +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the dividend rate + /// + public Decimal Rate { get; } + + /// + /// Gets the redemption process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the redemption payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IReverseSplit.cs b/Alpaca.Markets/Interfaces/IReverseSplit.cs new file mode 100644 index 00000000..03167ee3 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IReverseSplit.cs @@ -0,0 +1,42 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the reverse split information from Alpaca APIs. +/// +public interface IReverseSplit +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the reverse split new rate + /// + public Decimal NewRate { get; } + + /// + /// Gets the reverse split old rate + /// + public Decimal OldRate { get; } + + /// + /// Gets the reverse split process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the reverse split execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the reverse split record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the reverse split payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IRightsDistribution.cs b/Alpaca.Markets/Interfaces/IRightsDistribution.cs new file mode 100644 index 00000000..7ae869f9 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IRightsDistribution.cs @@ -0,0 +1,47 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the right distribution information from Alpaca APIs. +/// +public interface IRightsDistribution +{ + /// + /// Gets the source symbol + /// + public String SourceSymbol { get; } + + /// + /// Gets the new symbol + /// + public String NewSymbol { get; } + + /// + /// Gets the right distribution rate + /// + public Decimal Rate { get; } + + /// + /// Gets the right distribution process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the right distribution execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the right distribution payable date + /// + public DateOnly? PayableDate { get; } + + /// + /// Gets the right distribution record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the right distribution expiration date + /// + public DateOnly? ExpirationDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/ISpinOff.cs b/Alpaca.Markets/Interfaces/ISpinOff.cs new file mode 100644 index 00000000..a787a22f --- /dev/null +++ b/Alpaca.Markets/Interfaces/ISpinOff.cs @@ -0,0 +1,52 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the spin-off information from Alpaca APIs. +/// +public interface ISpinOff +{ + /// + /// Gets the source symbol + /// + public String SourceSymbol { get; } + + /// + /// Gets the new symbol + /// + public String NewSymbol { get; } + + /// + /// Gets the spin-off source rate + /// + public Decimal SourceRate { get; } + + /// + /// Gets the spin-off new rate + /// + public Decimal NewRate { get; } + + /// + /// Gets the spin-off process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the spin-off execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the spin-off payable date + /// + public DateOnly? PayableDate { get; } + + /// + /// Gets the spin-off record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the spin-off due bill redemption date + /// + public DateOnly? DueBillRedemptionDate { get; } +} \ No newline at end of file diff --git a/Alpaca.Markets/Interfaces/IStockAndCashMerger.cs b/Alpaca.Markets/Interfaces/IStockAndCashMerger.cs new file mode 100644 index 00000000..6a7893fc --- /dev/null +++ b/Alpaca.Markets/Interfaces/IStockAndCashMerger.cs @@ -0,0 +1,47 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the stock and cash merger information from Alpaca APIs. +/// +public interface IStockAndCashMerger +{ + /// + /// Gets the acquirer symbol + /// + public String AcquirerSymbol { get; } + + /// + /// Gets the acquiree symbol + /// + public String AcquireeSymbol { get; } + + /// + /// Gets the acquirer rate + /// + public Decimal AcquirerRate { get; } + + /// + /// Gets the acquiree rate + /// + public Decimal AcquireeRate { get; } + + /// + /// Gets the cash rate + /// + public Decimal CashRate { get; } + + /// + /// Gets the stock and cash merger process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the stock and cash merger effective date + /// + public DateOnly EffectiveDate { get; } + + /// + /// Gets the stock and cash merger payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IStockDividend.cs b/Alpaca.Markets/Interfaces/IStockDividend.cs new file mode 100644 index 00000000..1741b322 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IStockDividend.cs @@ -0,0 +1,37 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the stock dividend information from Alpaca APIs. +/// +public interface IStockDividend +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the dividend rate + /// + public Decimal Rate { get; } + + /// + /// Gets the stock dividend process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the stock dividend execution date + /// + public DateOnly ExecutionDate { get; } + + /// + /// Gets the stock dividend record date + /// + public DateOnly? RecordDate { get; } + + /// + /// Gets the stock dividend payable date + /// + public DateOnly? PayableDate { get; } +} \ No newline at end of file diff --git a/Alpaca.Markets/Interfaces/IStockMerger.cs b/Alpaca.Markets/Interfaces/IStockMerger.cs new file mode 100644 index 00000000..5e0102e5 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IStockMerger.cs @@ -0,0 +1,42 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the stock merger information from Alpaca APIs. +/// +public interface IStockMerger +{ + /// + /// Gets the acquirer symbol + /// + public String AcquirerSymbol { get; } + + /// + /// Gets the acquiree symbol + /// + public String AcquireeSymbol { get; } + + /// + /// Gets the acquirer rate + /// + public Decimal AcquirerRate { get; } + + /// + /// Gets the acquiree rate + /// + public Decimal AcquireeRate { get; } + + /// + /// Gets the stock merger process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the stock merger effective date + /// + public DateOnly EffectiveDate { get; } + + /// + /// Gets the stock merger payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IUnitSplit.cs b/Alpaca.Markets/Interfaces/IUnitSplit.cs new file mode 100644 index 00000000..d8b2b0bf --- /dev/null +++ b/Alpaca.Markets/Interfaces/IUnitSplit.cs @@ -0,0 +1,52 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the unit split information from Alpaca APIs. +/// +public interface IUnitSplit +{ + /// + /// Gets the new symbol + /// + public String NewSymbol { get; } + + /// + /// Gets the old symbol + /// + public String OldSymbol { get; } + + /// + /// Gets the alternate symbol + /// + public String AlternateSymbol { get; } + + /// + /// Gets the unit split new rate + /// + public Decimal NewRate { get; } + + /// + /// Gets the unit split old rate + /// + public Decimal OldRate { get; } + + /// + /// Gets the unit split alternate rate + /// + public Decimal AlternateRate { get; } + + /// + /// Gets the unit split process date + /// + public DateOnly ProcessDate { get; } + + /// + /// Gets the unit split effective date + /// + public DateOnly EffectiveDate { get; } + + /// + /// Gets the unit split payable date + /// + public DateOnly? PayableDate { get; } +} diff --git a/Alpaca.Markets/Interfaces/IWorthlessRemoval.cs b/Alpaca.Markets/Interfaces/IWorthlessRemoval.cs new file mode 100644 index 00000000..54e350d2 --- /dev/null +++ b/Alpaca.Markets/Interfaces/IWorthlessRemoval.cs @@ -0,0 +1,17 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates the worthless removal information from Alpaca APIs. +/// +public interface IWorthlessRemoval +{ + /// + /// Gets the symbol + /// + public String Symbol { get; } + + /// + /// Gets the worthless removal process date + /// + public DateOnly ProcessDate { get; } +} diff --git a/Alpaca.Markets/Messages/JsonCashDividend.cs b/Alpaca.Markets/Messages/JsonCashDividend.cs new file mode 100644 index 00000000..ad3a751b --- /dev/null +++ b/Alpaca.Markets/Messages/JsonCashDividend.cs @@ -0,0 +1,53 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ICashDividend))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonCashDividend : ICashDividend +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "rate", Required = Required.Always)] + public Decimal Rate { get; set; } + + [JsonProperty(PropertyName = "foreign", Required = Required.Always)] + public Boolean IsForeign { get; set; } + + [JsonProperty(PropertyName = "special", Required = Required.Always)] + public Boolean IsSpecial { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "due_bill_off_date", Required = Required.Default)] + public DateOnly? DueBillOffDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "due_bill_on_date", Required = Required.Default)] + public DateOnly? DueBillOnDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(ICashDividend)} {{ Symbol = {Symbol}, Rate = {Rate} }}"; +} \ No newline at end of file diff --git a/Alpaca.Markets/Messages/JsonCashMerger.cs b/Alpaca.Markets/Messages/JsonCashMerger.cs new file mode 100644 index 00000000..52e44da1 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonCashMerger.cs @@ -0,0 +1,38 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ICashMerger))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonCashMerger : ICashMerger +{ + [JsonProperty(PropertyName = "acquirer_symbol", Required = Required.Default)] + public String? AcquirerSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "acquiree_symbol", Required = Required.Always)] + public String AcquireeSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "rate", Required = Required.Always)] + public Decimal Rate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "effective_date", Required = Required.Always)] + public DateOnly EffectiveDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(ICashMerger)} {{ AcquirerSymbol = {AcquirerSymbol}, AcquireeSymbol = {AcquireeSymbol} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs b/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs new file mode 100644 index 00000000..97f13cf1 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs @@ -0,0 +1,104 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ICorporateActionsResponse))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonCorporateActionsResponse : ICorporateActionsResponse +{ + public sealed class JsonCorporateActionsDictionary + { + [JsonProperty(PropertyName = "stock_and_cash_mergers", Required = Required.Default)] + public List StockAndCashMergersList { get; set; } = []; + + [JsonProperty(PropertyName = "rights_distributions", Required = Required.Default)] + public List RightsDistributionsList { get; set; } = []; + + [JsonProperty(PropertyName = "worthless_removals", Required = Required.Default)] + public List WorthlessRemovalsList { get; set; } = []; + + [JsonProperty(PropertyName = "stock_dividends", Required = Required.Default)] + public List StockDividendsList { get; set; } = []; + + [JsonProperty(PropertyName = "cash_dividends", Required = Required.Default)] + public List CashDividendsList { get; set; } = []; + + [JsonProperty(PropertyName = "reverse_splits", Required = Required.Default)] + public List ReverseSplitsList { get; set; } = []; + + [JsonProperty(PropertyName = "forward_splits", Required = Required.Default)] + public List ForwardSplitsList { get; set; } = []; + + [JsonProperty(PropertyName = "stock_mergers", Required = Required.Default)] + public List StockMergersList { get; set; } = []; + + [JsonProperty(PropertyName = "cash_mergers", Required = Required.Default)] + public List CashMergersList { get; set; } = []; + + [JsonProperty(PropertyName = "name_changes", Required = Required.Default)] + public List NameChangesList { get; set; } = []; + + [JsonProperty(PropertyName = "redemptions", Required = Required.Default)] + public List RedemptionsList { get; set; } = []; + + [JsonProperty(PropertyName = "unit_splits", Required = Required.Default)] + public List UnitSplitsList { get; set; } = []; + + [JsonProperty(PropertyName = "spin_offs", Required = Required.Default)] + public List SpinOffsList { get; set; } = []; + } + + [JsonProperty(PropertyName = "corporate_actions", Required = Required.Default)] + public JsonCorporateActionsDictionary Nested { get; set; } = new(); + + [JsonIgnore] + public IReadOnlyList StockAndCashMergers => Nested.StockAndCashMergersList; + + [JsonIgnore] + public IReadOnlyList RightsDistributions => Nested.RightsDistributionsList; + + [JsonIgnore] + public IReadOnlyList WorthlessRemovals => Nested.WorthlessRemovalsList; + + [JsonIgnore] + public IReadOnlyList StockDividends => Nested.StockDividendsList; + + [JsonIgnore] + public IReadOnlyList CashDividends => Nested.CashDividendsList; + + [JsonIgnore] + public IReadOnlyList ReverseSplits => Nested.ReverseSplitsList; + + [JsonIgnore] + public IReadOnlyList ForwardSplits => Nested.ForwardSplitsList; + + [JsonIgnore] + public IReadOnlyList StockMergers => Nested.StockMergersList; + + [JsonIgnore] + public IReadOnlyList NameChanges => Nested.NameChangesList; + + [JsonIgnore] + public IReadOnlyList CashMergers => Nested.CashMergersList; + + [JsonIgnore] + public IReadOnlyList Redemptions => Nested.RedemptionsList; + + [JsonIgnore] + public IReadOnlyList UnitSplits => Nested.UnitSplitsList; + + [JsonIgnore] + public IReadOnlyList SpinOffs => Nested.SpinOffsList; + + [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] + public String? NextPageToken { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(ICorporateActionsResponse)} {{ NextPageToken = {NextPageToken} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonForwardSplit.cs b/Alpaca.Markets/Messages/JsonForwardSplit.cs new file mode 100644 index 00000000..8ea865a2 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonForwardSplit.cs @@ -0,0 +1,46 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IForwardSplit))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonForwardSplit : IForwardSplit +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_rate", Required = Required.Always)] + public Decimal NewRate { get; set; } + + [JsonProperty(PropertyName = "old_rate", Required = Required.Always)] + public Decimal OldRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "due_bill_redemption_date", Required = Required.Default)] + public DateOnly? DueBillRedemptionDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IForwardSplit)} {{ Symbol = {Symbol}, NewRate = {NewRate}, OldRate = {OldRate} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonNameChange.cs b/Alpaca.Markets/Messages/JsonNameChange.cs new file mode 100644 index 00000000..e768078a --- /dev/null +++ b/Alpaca.Markets/Messages/JsonNameChange.cs @@ -0,0 +1,27 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(INameChange))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonNameChange : INameChange +{ + [JsonProperty(PropertyName = "old_symbol", Required = Required.Always)] + public String OldSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_symbol", Required = Required.Always)] + public String NewSymbol { get; set; } = String.Empty; + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(INameChange)} {{ OldSymbol = {OldSymbol}, NewSymbol = {NewSymbol} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonRedemption.cs b/Alpaca.Markets/Messages/JsonRedemption.cs new file mode 100644 index 00000000..ead14a2f --- /dev/null +++ b/Alpaca.Markets/Messages/JsonRedemption.cs @@ -0,0 +1,31 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IRedemption))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonRedemption : IRedemption +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "rate", Required = Required.Always)] + public Decimal Rate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IRedemption)} {{ Symbol = {Symbol}, Rate = {Rate} }}"; +} \ No newline at end of file diff --git a/Alpaca.Markets/Messages/JsonReverseSplit.cs b/Alpaca.Markets/Messages/JsonReverseSplit.cs new file mode 100644 index 00000000..62b9df82 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonReverseSplit.cs @@ -0,0 +1,42 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IReverseSplit))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonReverseSplit : IReverseSplit +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_rate", Required = Required.Always)] + public Decimal NewRate { get; set; } + + [JsonProperty(PropertyName = "old_rate", Required = Required.Always)] + public Decimal OldRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IReverseSplit)} {{ Symbol = {Symbol}, NewRate = {NewRate}, OldRate = {OldRate} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonRightsDistribution.cs b/Alpaca.Markets/Messages/JsonRightsDistribution.cs new file mode 100644 index 00000000..7224c7db --- /dev/null +++ b/Alpaca.Markets/Messages/JsonRightsDistribution.cs @@ -0,0 +1,46 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IRightsDistribution))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonRightsDistribution : IRightsDistribution +{ + [JsonProperty(PropertyName = "source_symbol", Required = Required.Always)] + public String SourceSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_symbol", Required = Required.Always)] + public String NewSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "rate", Required = Required.Always)] + public Decimal Rate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "expiration_date", Required = Required.Default)] + public DateOnly? ExpirationDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IRightsDistribution)} {{ SourceSymbol = {SourceSymbol}, NewSymbol = {NewSymbol}, Rate = {Rate} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonSpinOff.cs b/Alpaca.Markets/Messages/JsonSpinOff.cs new file mode 100644 index 00000000..6c8762dc --- /dev/null +++ b/Alpaca.Markets/Messages/JsonSpinOff.cs @@ -0,0 +1,49 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(ISpinOff))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonSpinOff : ISpinOff +{ + [JsonProperty(PropertyName = "source_symbol", Required = Required.Always)] + public String SourceSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_symbol", Required = Required.Always)] + public String NewSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "source_rate", Required = Required.Always)] + public Decimal SourceRate { get; set; } + + [JsonProperty(PropertyName = "new_rate", Required = Required.Always)] + public Decimal NewRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "due_bill_redemption_date", Required = Required.Default)] + public DateOnly? DueBillRedemptionDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(ISpinOff)} {{ SourceSymbol = {SourceSymbol}, SourceRate = {SourceRate}, NewSymbol = {NewSymbol}, NewRate = {NewRate} }}"; +} \ No newline at end of file diff --git a/Alpaca.Markets/Messages/JsonStockAndCashMerger.cs b/Alpaca.Markets/Messages/JsonStockAndCashMerger.cs new file mode 100644 index 00000000..c4916da2 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonStockAndCashMerger.cs @@ -0,0 +1,44 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IStockAndCashMerger))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonStockAndCashMerger : IStockAndCashMerger +{ + [JsonProperty(PropertyName = "acquirer_symbol", Required = Required.Always)] + public String AcquirerSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "acquiree_symbol", Required = Required.Always)] + public String AcquireeSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "acquirer_rate", Required = Required.Always)] + public Decimal AcquirerRate { get; set; } + + [JsonProperty(PropertyName = "acquiree_rate", Required = Required.Always)] + public Decimal AcquireeRate { get; set; } + + [JsonProperty(PropertyName = "cash_rate", Required = Required.Always)] + public Decimal CashRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "effective_date", Required = Required.Always)] + public DateOnly EffectiveDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IStockAndCashMerger)} {{ AcquirerSymbol = {AcquirerSymbol}, AcquireeSymbol = {AcquireeSymbol} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonStockDividend.cs b/Alpaca.Markets/Messages/JsonStockDividend.cs new file mode 100644 index 00000000..9ebb98f1 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonStockDividend.cs @@ -0,0 +1,39 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IStockDividend))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonStockDividend : IStockDividend +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "rate", Required = Required.Always)] + public Decimal Rate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "ex_date", Required = Required.Always)] + public DateOnly ExecutionDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "record_date", Required = Required.Default)] + public DateOnly? RecordDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IStockDividend)} {{ Symbol = {Symbol}, Rate = {Rate} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonStockMerger.cs b/Alpaca.Markets/Messages/JsonStockMerger.cs new file mode 100644 index 00000000..b7e8909d --- /dev/null +++ b/Alpaca.Markets/Messages/JsonStockMerger.cs @@ -0,0 +1,41 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IStockMerger))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonStockMerger : IStockMerger +{ + [JsonProperty(PropertyName = "acquirer_symbol", Required = Required.Always)] + public String AcquirerSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "acquiree_symbol", Required = Required.Always)] + public String AcquireeSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "acquirer_rate", Required = Required.Always)] + public Decimal AcquirerRate { get; set; } + + [JsonProperty(PropertyName = "acquiree_rate", Required = Required.Always)] + public Decimal AcquireeRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "effective_date", Required = Required.Always)] + public DateOnly EffectiveDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IStockMerger)} {{ AcquirerSymbol = {AcquirerSymbol}, AcquireeSymbol = {AcquireeSymbol} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonUnitSplit.cs b/Alpaca.Markets/Messages/JsonUnitSplit.cs new file mode 100644 index 00000000..e83d269d --- /dev/null +++ b/Alpaca.Markets/Messages/JsonUnitSplit.cs @@ -0,0 +1,47 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IUnitSplit))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal sealed class JsonUnitSplit : IUnitSplit +{ + [JsonProperty(PropertyName = "new_symbol", Required = Required.Always)] + public String NewSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "old_symbol", Required = Required.Always)] + public String OldSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "alternate_symbol", Required = Required.Always)] + public String AlternateSymbol { get; set; } = String.Empty; + + [JsonProperty(PropertyName = "new_rate", Required = Required.Always)] + public Decimal NewRate { get; set; } + + [JsonProperty(PropertyName = "old_rate", Required = Required.Always)] + public Decimal OldRate { get; set; } + + [JsonProperty(PropertyName = "alternate_rate", Required = Required.Always)] + public Decimal AlternateRate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "effective_date", Required = Required.Always)] + public DateOnly EffectiveDate { get; set; } + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "payable_date", Required = Required.Default)] + public DateOnly? PayableDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IUnitSplit)} {{ NewSymbol = {NewSymbol}, NewRate = {NewRate}, OldSymbol = {OldSymbol}, OldRate = {OldRate} }}"; +} diff --git a/Alpaca.Markets/Messages/JsonWorthlessRemoval.cs b/Alpaca.Markets/Messages/JsonWorthlessRemoval.cs new file mode 100644 index 00000000..043cb9f0 --- /dev/null +++ b/Alpaca.Markets/Messages/JsonWorthlessRemoval.cs @@ -0,0 +1,24 @@ +namespace Alpaca.Markets; + +[DebuggerDisplay("{DebuggerDisplay,nq}", Type = nameof(IWorthlessRemoval))] +[SuppressMessage( + "Microsoft.Performance", "CA1812:Avoid uninstantiated internal classes", + Justification = "Object instances of this class will be created by Newtonsoft.JSON library.")] +internal class JsonWorthlessRemoval : IWorthlessRemoval +{ + [JsonProperty(PropertyName = "symbol", Required = Required.Always)] + public String Symbol { get; set; } = String.Empty; + + [JsonConverter(typeof(DateOnlyConverter))] + [JsonProperty(PropertyName = "process_date", Required = Required.Always)] + public DateOnly ProcessDate { get; set; } + + [ExcludeFromCodeCoverage] + public override String ToString() => + JsonConvert.SerializeObject(this); + + [ExcludeFromCodeCoverage] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private String DebuggerDisplay => + $"{nameof(IWorthlessRemoval)} {{ Symbol = {Symbol}, ProcessDate = {ProcessDate} }}"; +} diff --git a/Alpaca.Markets/Parameters/AnnouncementsRequest.cs b/Alpaca.Markets/Parameters/AnnouncementsRequest.cs index 1db414c5..fbbba7b0 100644 --- a/Alpaca.Markets/Parameters/AnnouncementsRequest.cs +++ b/Alpaca.Markets/Parameters/AnnouncementsRequest.cs @@ -1,7 +1,7 @@ namespace Alpaca.Markets; /// -/// Encapsulates request parameters for call. +/// Encapsulates request parameters for call. /// public sealed class AnnouncementsRequest : Validation.IRequest { diff --git a/Alpaca.Markets/Parameters/CorporateActionsRequest.cs b/Alpaca.Markets/Parameters/CorporateActionsRequest.cs new file mode 100644 index 00000000..8c0fc7cd --- /dev/null +++ b/Alpaca.Markets/Parameters/CorporateActionsRequest.cs @@ -0,0 +1,129 @@ +namespace Alpaca.Markets; + +/// +/// Encapsulates request parameters for call. +/// +public sealed class CorporateActionsRequest : Validation.IRequest, IHistoricalRequest +{ + private readonly HashSet _symbols = new(StringComparer.Ordinal); + + private readonly HashSet _types = []; + + /// + /// Gets asset symbols list for data retrieval (all symbols if list is empty). + /// + [UsedImplicitly] + public IReadOnlyCollection Symbols => _symbols; + + /// + /// Gets corporate action types list for data retrieval (all types if list is empty). + /// + [UsedImplicitly] + public IReadOnlyCollection Types => _types; + + /// + /// Gets the date range when searching corporate actions history (current day if empty). + /// + [UsedImplicitly] + public Interval DateInterval { get; private set; } + + /// + /// Gets the pagination parameters for the request (page size and token). + /// + public Pagination Pagination { get; } = new(); + + /// + /// Gets or sets the result sorting direction (sort fields is timestamp). + /// + [UsedImplicitly] + public SortDirection? SortDirection { get; set; } + + /// + /// Adds several symbols into the filter list. + /// + /// Asset symbols for data retrieval. + /// Fluent interface - returns the modified request object. + public CorporateActionsRequest WithSymbols( + IEnumerable symbols) + { + _symbols.UnionWith(symbols.EnsureNotNull()); + return this; + } + + /// + /// Adds a single symbol into the filter list. + /// + /// Asset symbol for data retrieval. + /// Fluent interface - returns the modified request object. + public CorporateActionsRequest WithSymbol( + String symbol) + { + _symbols.Add(symbol.EnsureNotNull()); + return this; + } + + /// + /// Adds several items into the filter list. + /// + /// Corporate action types for data retrieval. + /// Fluent interface - returns the modified request object. + public CorporateActionsRequest WithTypes( + IEnumerable types) + { + _types.UnionWith(types.EnsureNotNull()); + return this; + } + + /// + /// Adds a single item into the filter list. + /// + /// Corporate action type for data retrieval. + /// Fluent interface - returns the modified request object. + public CorporateActionsRequest WithType( + CorporateActionFilterType type) + { + _types.Add(type); + return this; + } + + /// + /// Sets the filter value for the request. + /// + /// The inclusive date interval for data retrieval. + /// Fluent interface - returns the modified request object. + public CorporateActionsRequest WithDateInterval( + Interval dateInterval) + { + DateInterval = dateInterval; + return this; + } + + internal async ValueTask GetUriBuilderAsync( + HttpClient httpClient) => + new(httpClient.BaseAddress!) + { + Path = "../v1/corporate-actions", + Query = await Pagination.QueryBuilder + .AddParameter("symbols", Symbols) + .AddParameter("types", Types) + .AddParameter("start", DateInterval.From) + .AddParameter("end", DateInterval.Into) + .AddParameter("sort", SortDirection) + .AsStringAsync().ConfigureAwait(false) + }; + + IEnumerable Validation.IRequest.GetExceptions() + { + yield return Pagination.TryValidatePageSize(Pagination.MaxPageSize); + yield return Symbols.TryValidateSymbolName(); + } + + CorporateActionsRequest IHistoricalRequest.GetValidatedRequestWithoutPageToken() => + new CorporateActionsRequest + { + SortDirection = SortDirection, + DateInterval = DateInterval + } + .WithTypes(Types).WithSymbols(Symbols) + .WithPageSize(Pagination.MaxCorporateActionsPageSize); +} diff --git a/Alpaca.Markets/Parameters/Pagination.cs b/Alpaca.Markets/Parameters/Pagination.cs index a32076a8..1485cff6 100644 --- a/Alpaca.Markets/Parameters/Pagination.cs +++ b/Alpaca.Markets/Parameters/Pagination.cs @@ -18,6 +18,11 @@ public sealed class Pagination /// internal static UInt32 MaxNewsPageSize => 50; + /// + /// Gets the maximum valid page size for corporate actions requests supported by Alpaca Data API v2. + /// + internal static UInt32 MaxCorporateActionsPageSize => 1_000; + /// /// Gets and sets the request page size. If equals to null default size will be used. /// diff --git a/Alpaca.Markets/PublicAPI.Shipped.txt b/Alpaca.Markets/PublicAPI.Shipped.txt index 0bddb1cd..a8d477b2 100644 --- a/Alpaca.Markets/PublicAPI.Shipped.txt +++ b/Alpaca.Markets/PublicAPI.Shipped.txt @@ -195,6 +195,33 @@ Alpaca.Markets.CorporateActionDateType.DeclarationDate = 0 -> Alpaca.Markets.Cor Alpaca.Markets.CorporateActionDateType.ExecutionDate = 1 -> Alpaca.Markets.CorporateActionDateType Alpaca.Markets.CorporateActionDateType.PayableDate = 3 -> Alpaca.Markets.CorporateActionDateType Alpaca.Markets.CorporateActionDateType.RecordDate = 2 -> Alpaca.Markets.CorporateActionDateType +Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.CashDividend = 3 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.CashMerger = 6 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.ForwardSplit = 1 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.NameChange = 10 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.Redemption = 9 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.ReverseSplit = 0 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.RightsDistribution = 12 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.SpinOff = 5 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.StockAndCashMerger = 8 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.StockDividend = 4 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.StockMerger = 7 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.UnitSplit = 2 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionFilterType.WorthlessRemoval = 11 -> Alpaca.Markets.CorporateActionFilterType +Alpaca.Markets.CorporateActionsRequest +Alpaca.Markets.CorporateActionsRequest.CorporateActionsRequest() -> void +Alpaca.Markets.CorporateActionsRequest.DateInterval.get -> Alpaca.Markets.Interval +Alpaca.Markets.CorporateActionsRequest.Pagination.get -> Alpaca.Markets.Pagination! +Alpaca.Markets.CorporateActionsRequest.SortDirection.get -> Alpaca.Markets.SortDirection? +Alpaca.Markets.CorporateActionsRequest.SortDirection.set -> void +Alpaca.Markets.CorporateActionsRequest.Symbols.get -> System.Collections.Generic.IReadOnlyCollection! +Alpaca.Markets.CorporateActionsRequest.Types.get -> System.Collections.Generic.IReadOnlyCollection! +Alpaca.Markets.CorporateActionsRequest.WithDateInterval(Alpaca.Markets.Interval dateInterval) -> Alpaca.Markets.CorporateActionsRequest! +Alpaca.Markets.CorporateActionsRequest.WithSymbol(string! symbol) -> Alpaca.Markets.CorporateActionsRequest! +Alpaca.Markets.CorporateActionsRequest.WithSymbols(System.Collections.Generic.IEnumerable! symbols) -> Alpaca.Markets.CorporateActionsRequest! +Alpaca.Markets.CorporateActionsRequest.WithType(Alpaca.Markets.CorporateActionFilterType type) -> Alpaca.Markets.CorporateActionsRequest! +Alpaca.Markets.CorporateActionsRequest.WithTypes(System.Collections.Generic.IEnumerable! types) -> Alpaca.Markets.CorporateActionsRequest! Alpaca.Markets.CorporateActionSubType Alpaca.Markets.CorporateActionSubType.DividendCash = 0 -> Alpaca.Markets.CorporateActionSubType Alpaca.Markets.CorporateActionSubType.DividendStock = 1 -> Alpaca.Markets.CorporateActionSubType @@ -467,6 +494,7 @@ Alpaca.Markets.IAlpacaDataClient.GetLatestBarAsync(Alpaca.Markets.LatestMarketDa Alpaca.Markets.IAlpacaDataClient.GetLatestQuoteAsync(Alpaca.Markets.LatestMarketDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaDataClient.GetLatestTradeAsync(Alpaca.Markets.LatestMarketDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaDataClient.GetSnapshotAsync(Alpaca.Markets.LatestMarketDataRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +Alpaca.Markets.IAlpacaDataClient.ListCorporateActionsAsync(Alpaca.Markets.CorporateActionsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Alpaca.Markets.IAlpacaDataClient.ListExchangesAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaDataClient.ListHistoricalAuctionsAsync(Alpaca.Markets.HistoricalAuctionsRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! Alpaca.Markets.IAlpacaDataClient.ListNewsArticlesAsync(Alpaca.Markets.NewsArticlesRequest! request, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!>! @@ -602,11 +630,44 @@ Alpaca.Markets.ICalendar.TradingDateEst.get -> System.DateTime Alpaca.Markets.ICalendar.TradingDateUtc.get -> System.DateTime Alpaca.Markets.ICalendar.TradingOpenTimeEst.get -> System.DateTime Alpaca.Markets.ICalendar.TradingOpenTimeUtc.get -> System.DateTime +Alpaca.Markets.ICashDividend +Alpaca.Markets.ICashDividend.DueBillOffDate.get -> System.DateOnly? +Alpaca.Markets.ICashDividend.DueBillOnDate.get -> System.DateOnly? +Alpaca.Markets.ICashDividend.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.ICashDividend.IsForeign.get -> bool +Alpaca.Markets.ICashDividend.IsSpecial.get -> bool +Alpaca.Markets.ICashDividend.PayableDate.get -> System.DateOnly? +Alpaca.Markets.ICashDividend.ProcessDate.get -> System.DateOnly +Alpaca.Markets.ICashDividend.Rate.get -> decimal +Alpaca.Markets.ICashDividend.RecordDate.get -> System.DateOnly? +Alpaca.Markets.ICashDividend.Symbol.get -> string! +Alpaca.Markets.ICashMerger +Alpaca.Markets.ICashMerger.AcquireeSymbol.get -> string! +Alpaca.Markets.ICashMerger.AcquirerSymbol.get -> string? +Alpaca.Markets.ICashMerger.EffectiveDate.get -> System.DateOnly +Alpaca.Markets.ICashMerger.PayableDate.get -> System.DateOnly? +Alpaca.Markets.ICashMerger.ProcessDate.get -> System.DateOnly +Alpaca.Markets.ICashMerger.Rate.get -> decimal Alpaca.Markets.IClock Alpaca.Markets.IClock.IsOpen.get -> bool Alpaca.Markets.IClock.NextCloseUtc.get -> System.DateTime Alpaca.Markets.IClock.NextOpenUtc.get -> System.DateTime Alpaca.Markets.IClock.TimestampUtc.get -> System.DateTime +Alpaca.Markets.ICorporateActionsResponse +Alpaca.Markets.ICorporateActionsResponse.CashDividends.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.CashMergers.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.ForwardSplits.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.NameChanges.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.NextPageToken.get -> string? +Alpaca.Markets.ICorporateActionsResponse.Redemptions.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.ReverseSplits.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.RightsDistributions.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.SpinOffs.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.StockAndCashMergers.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.StockDividends.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.StockMergers.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.UnitSplits.get -> System.Collections.Generic.IReadOnlyList! +Alpaca.Markets.ICorporateActionsResponse.WorthlessRemovals.get -> System.Collections.Generic.IReadOnlyList! Alpaca.Markets.ICorrection Alpaca.Markets.ICorrection.CorrectedTrade.get -> Alpaca.Markets.ITrade! Alpaca.Markets.ICorrection.OriginalTrade.get -> Alpaca.Markets.ITrade! @@ -628,6 +689,15 @@ Alpaca.Markets.IErrorInformation.OpenOrdersCount.get -> int? Alpaca.Markets.IErrorInformation.Symbol.get -> string! Alpaca.Markets.IExclusiveTimeInterval Alpaca.Markets.IInclusiveTimeInterval +Alpaca.Markets.IForwardSplit +Alpaca.Markets.IForwardSplit.DueBillRedemptionDate.get -> System.DateOnly? +Alpaca.Markets.IForwardSplit.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.IForwardSplit.NewRate.get -> decimal +Alpaca.Markets.IForwardSplit.OldRate.get -> decimal +Alpaca.Markets.IForwardSplit.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IForwardSplit.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IForwardSplit.RecordDate.get -> System.DateOnly? +Alpaca.Markets.IForwardSplit.Symbol.get -> string! Alpaca.Markets.IGreeks Alpaca.Markets.IGreeks.Delta.get -> decimal? Alpaca.Markets.IGreeks.Gamma.get -> decimal? @@ -680,6 +750,10 @@ Alpaca.Markets.Interval.WithFrom(TItem from) -> Alpaca.Markets.Interval.WithInto(TItem into) -> Alpaca.Markets.Interval Alpaca.Markets.IntervalCalenderExtensions Alpaca.Markets.IntervalExtensions +Alpaca.Markets.INameChange +Alpaca.Markets.INameChange.NewSymbol.get -> string! +Alpaca.Markets.INameChange.OldSymbol.get -> string! +Alpaca.Markets.INameChange.ProcessDate.get -> System.DateOnly Alpaca.Markets.INewsArticle Alpaca.Markets.INewsArticle.ArticleUrl.get -> System.Uri? Alpaca.Markets.INewsArticle.Author.get -> string! @@ -813,8 +887,30 @@ Alpaca.Markets.IRateLimitValues Alpaca.Markets.IRateLimitValues.Limit.get -> int Alpaca.Markets.IRateLimitValues.Remaining.get -> int Alpaca.Markets.IRateLimitValues.ResetTimeUtc.get -> System.DateTime +Alpaca.Markets.IRedemption +Alpaca.Markets.IRedemption.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IRedemption.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IRedemption.Rate.get -> decimal +Alpaca.Markets.IRedemption.Symbol.get -> string! Alpaca.Markets.IRequestWithTimeInterval Alpaca.Markets.IRequestWithTimeInterval.SetInterval(TInterval value) -> void +Alpaca.Markets.IReverseSplit +Alpaca.Markets.IReverseSplit.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.IReverseSplit.NewRate.get -> decimal +Alpaca.Markets.IReverseSplit.OldRate.get -> decimal +Alpaca.Markets.IReverseSplit.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IReverseSplit.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IReverseSplit.RecordDate.get -> System.DateOnly? +Alpaca.Markets.IReverseSplit.Symbol.get -> string! +Alpaca.Markets.IRightsDistribution +Alpaca.Markets.IRightsDistribution.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.IRightsDistribution.ExpirationDate.get -> System.DateOnly? +Alpaca.Markets.IRightsDistribution.NewSymbol.get -> string! +Alpaca.Markets.IRightsDistribution.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IRightsDistribution.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IRightsDistribution.Rate.get -> decimal +Alpaca.Markets.IRightsDistribution.RecordDate.get -> System.DateOnly? +Alpaca.Markets.IRightsDistribution.SourceSymbol.get -> string! Alpaca.Markets.ITimeInterval Alpaca.Markets.ITimeInterval.From.get -> System.DateTime? Alpaca.Markets.ITimeInterval.Into.get -> System.DateTime? @@ -836,6 +932,16 @@ Alpaca.Markets.ISnapshot.PreviousDailyBar.get -> Alpaca.Markets.IBar? Alpaca.Markets.ISnapshot.Quote.get -> Alpaca.Markets.IQuote? Alpaca.Markets.ISnapshot.Symbol.get -> string! Alpaca.Markets.ISnapshot.Trade.get -> Alpaca.Markets.ITrade? +Alpaca.Markets.ISpinOff +Alpaca.Markets.ISpinOff.DueBillRedemptionDate.get -> System.DateOnly? +Alpaca.Markets.ISpinOff.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.ISpinOff.NewRate.get -> decimal +Alpaca.Markets.ISpinOff.NewSymbol.get -> string! +Alpaca.Markets.ISpinOff.PayableDate.get -> System.DateOnly? +Alpaca.Markets.ISpinOff.ProcessDate.get -> System.DateOnly +Alpaca.Markets.ISpinOff.RecordDate.get -> System.DateOnly? +Alpaca.Markets.ISpinOff.SourceRate.get -> decimal +Alpaca.Markets.ISpinOff.SourceSymbol.get -> string! Alpaca.Markets.IStatus Alpaca.Markets.IStatus.ReasonCode.get -> string! Alpaca.Markets.IStatus.ReasonMessage.get -> string! @@ -844,6 +950,30 @@ Alpaca.Markets.IStatus.StatusMessage.get -> string! Alpaca.Markets.IStatus.Symbol.get -> string! Alpaca.Markets.IStatus.Tape.get -> string! Alpaca.Markets.IStatus.TimestampUtc.get -> System.DateTime +Alpaca.Markets.IStockAndCashMerger +Alpaca.Markets.IStockAndCashMerger.AcquireeRate.get -> decimal +Alpaca.Markets.IStockAndCashMerger.AcquireeSymbol.get -> string! +Alpaca.Markets.IStockAndCashMerger.AcquirerRate.get -> decimal +Alpaca.Markets.IStockAndCashMerger.AcquirerSymbol.get -> string! +Alpaca.Markets.IStockAndCashMerger.CashRate.get -> decimal +Alpaca.Markets.IStockAndCashMerger.EffectiveDate.get -> System.DateOnly +Alpaca.Markets.IStockAndCashMerger.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IStockAndCashMerger.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IStockDividend +Alpaca.Markets.IStockDividend.ExecutionDate.get -> System.DateOnly +Alpaca.Markets.IStockDividend.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IStockDividend.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IStockDividend.Rate.get -> decimal +Alpaca.Markets.IStockDividend.RecordDate.get -> System.DateOnly? +Alpaca.Markets.IStockDividend.Symbol.get -> string! +Alpaca.Markets.IStockMerger +Alpaca.Markets.IStockMerger.AcquireeRate.get -> decimal +Alpaca.Markets.IStockMerger.AcquireeSymbol.get -> string! +Alpaca.Markets.IStockMerger.AcquirerRate.get -> decimal +Alpaca.Markets.IStockMerger.AcquirerSymbol.get -> string! +Alpaca.Markets.IStockMerger.EffectiveDate.get -> System.DateOnly +Alpaca.Markets.IStockMerger.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IStockMerger.ProcessDate.get -> System.DateOnly Alpaca.Markets.IStopLoss Alpaca.Markets.IStopLoss.LimitPrice.get -> decimal? Alpaca.Markets.IStopLoss.StopPrice.get -> decimal @@ -897,6 +1027,16 @@ Alpaca.Markets.ITradeUpdate.PositionQuantity.get -> decimal? Alpaca.Markets.ITradeUpdate.TimestampUtc.get -> System.DateTime? Alpaca.Markets.ITradeUpdate.TradeIntegerQuantity.get -> long? Alpaca.Markets.ITradeUpdate.TradeQuantity.get -> decimal? +Alpaca.Markets.IUnitSplit +Alpaca.Markets.IUnitSplit.AlternateRate.get -> decimal +Alpaca.Markets.IUnitSplit.AlternateSymbol.get -> string! +Alpaca.Markets.IUnitSplit.EffectiveDate.get -> System.DateOnly +Alpaca.Markets.IUnitSplit.NewRate.get -> decimal +Alpaca.Markets.IUnitSplit.NewSymbol.get -> string! +Alpaca.Markets.IUnitSplit.OldRate.get -> decimal +Alpaca.Markets.IUnitSplit.OldSymbol.get -> string! +Alpaca.Markets.IUnitSplit.PayableDate.get -> System.DateOnly? +Alpaca.Markets.IUnitSplit.ProcessDate.get -> System.DateOnly Alpaca.Markets.IWatchList Alpaca.Markets.IWatchList.AccountId.get -> System.Guid Alpaca.Markets.IWatchList.Assets.get -> System.Collections.Generic.IReadOnlyList! @@ -912,6 +1052,9 @@ Alpaca.Markets.IWebSocket.ConnectAsync(System.Uri! uri, System.Threading.Cancell Alpaca.Markets.IWebSocket.ReceiveAsync(System.Memory buffer) -> System.Threading.Tasks.ValueTask Alpaca.Markets.IWebSocket.SendAsync(System.Buffers.ReadOnlySequence buffer) -> System.Threading.Tasks.ValueTask Alpaca.Markets.IWebSocket.State.get -> System.Net.WebSockets.WebSocketState +Alpaca.Markets.IWorthlessRemoval +Alpaca.Markets.IWorthlessRemoval.ProcessDate.get -> System.DateOnly +Alpaca.Markets.IWorthlessRemoval.Symbol.get -> string! Alpaca.Markets.LatestBestBidOfferListRequest Alpaca.Markets.LatestBestBidOfferListRequest.Exchanges.get -> System.Collections.Generic.IReadOnlyCollection! Alpaca.Markets.LatestBestBidOfferListRequest.LatestBestBidOfferListRequest(System.Collections.Generic.IEnumerable! symbols) -> void From 1c1e6dee7031f6bdd0388b0ef0fc0d10d754ff50 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 5 Jan 2025 23:00:09 +0100 Subject: [PATCH 119/125] Prepare release 7.2.0-beta1 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 652b6371..9b4768ec 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,18 +12,18 @@ - 7.1.4.0 - 7.1.4.0 - 7.1.4 + 7.2.0.0 + 7.2.0.0 + 7.2.0-beta1 -- Service release - the dependencies upgraded to be more up-to-date with the latest fixes. +- The `IAlpdaDataClient.ListCorporateActionsAsync` function was added to support historical corporate actions request/response. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp - © 2018-2024 Alpaca Securities LLC. All rights reserved. + © 2018-2025 Alpaca Securities LLC. All rights reserved. false Aplaca API SDK REST WebSocket trading Apache-2.0 From 0b0434df6b75ced355f7d04f64de5d5b6003295b Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 5 Jan 2025 23:07:25 +0100 Subject: [PATCH 120/125] Try to use .NET 9.0.x for building binaries in all cases --- .github/workflows/codeql-analysis.yml | 4 ++-- .github/workflows/documentation.yml | 4 ++-- .github/workflows/lockfiles.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- .../Alpaca.Markets.Extensions.Tests.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 12 ++++++------ Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj | 2 +- Alpaca.Markets/packages.lock.json | 12 ++++++------ UsageExamples/UsageExamples.csproj | 2 +- global.json | 5 ----- 10 files changed, 23 insertions(+), 28 deletions(-) delete mode 100644 global.json diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8c3a8d5a..e68e94dd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -25,10 +25,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Setup .NET 8.0.x + - name: Setup .NET 9.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index b0ee8f22..0c262cac 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -11,10 +11,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 8.0.x + - name: Setup .NET 9.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Cache NuGet Packages uses: actions/cache@v4 diff --git a/.github/workflows/lockfiles.yml b/.github/workflows/lockfiles.yml index a4dbc841..33354d66 100644 --- a/.github/workflows/lockfiles.yml +++ b/.github/workflows/lockfiles.yml @@ -17,10 +17,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 8.0.x + - name: Setup .NET 9.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Restore Dependencies run: dotnet restore --force-evaluate diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 95c8ea91..7e921c5f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,10 +13,10 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup .NET 8.0.x + - name: Setup .NET 9.0.x uses: actions/setup-dotnet@v4 with: - dotnet-version: '8.0.x' + dotnet-version: '9.0.x' - name: Cache NuGet Packages uses: actions/cache@v4 diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index a181a329..2fb682c7 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 ..\Alpaca.Markets.snk true true diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 2c736c66..b7dac487 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -922,15 +922,15 @@ }, "Microsoft.NET.ILLink.Analyzers": { "type": "Direct", - "requested": "[7.0.100-1.23401.1, )", - "resolved": "7.0.100-1.23401.1", - "contentHash": "XirkjOLc5Vc3HsXRc2Z6ZbQv6l0RvWgJa/31w7XqZ914MoSi3H3OCNRMWFw7H2EYfsnKbokFfhCcysAmUcEOgw==" + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[7.0.100-1.23401.1, )", - "resolved": "7.0.100-1.23401.1", - "contentHash": "mI6vCdPEhluLtMn/GV0texEWg5oAPQWCCE4LWspM+Bmy75Nd4EQsziQXrdOFqNeSBQMrxDX9C/O5Xi3kpKSMIw==" + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index 2c4d92c8..f4364450 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 ..\Alpaca.Markets.snk true true diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 54bd39e8..026318ad 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -507,15 +507,15 @@ }, "Microsoft.NET.ILLink.Analyzers": { "type": "Direct", - "requested": "[7.0.100-1.23401.1, )", - "resolved": "7.0.100-1.23401.1", - "contentHash": "XirkjOLc5Vc3HsXRc2Z6ZbQv6l0RvWgJa/31w7XqZ914MoSi3H3OCNRMWFw7H2EYfsnKbokFfhCcysAmUcEOgw==" + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[7.0.100-1.23401.1, )", - "resolved": "7.0.100-1.23401.1", - "contentHash": "mI6vCdPEhluLtMn/GV0texEWg5oAPQWCCE4LWspM+Bmy75Nd4EQsziQXrdOFqNeSBQMrxDX9C/O5Xi3kpKSMIw==" + "requested": "[7.0.100-1.23211.1, )", + "resolved": "7.0.100-1.23211.1", + "contentHash": "tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 42d5c099..474cc249 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -2,7 +2,7 @@ Exe - net48;net6.0 + net4.8;net8.0 true link enable diff --git a/global.json b/global.json deleted file mode 100644 index 7e8c0276..00000000 --- a/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "8.0.404" - } -} \ No newline at end of file From 9fd2940321505cd778824801f19203a12ecfcaf9 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Mon, 6 Jan 2025 00:56:30 +0100 Subject: [PATCH 121/125] Issue #740 - The helper function for reading all pages of historical corporate action data was added. --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 +- .../Alpaca.Markets.Extensions.csproj | 12 +- .../Pagination/AlpacaDataClientExtensions.cs | 89 +++++++++++++ .../PublicAPI.Shipped.txt | 2 + Alpaca.Markets.Extensions/packages.lock.json | 126 ++++++++++-------- .../Alpaca.Markets.Tests.csproj | 4 +- 6 files changed, 169 insertions(+), 68 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 2fb682c7..165778c5 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -16,12 +16,12 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index a228150d..40c59368 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,18 +12,18 @@ - 7.1.1.0 - 7.1.1.0 - 7.1.1 + 7.2.0.0 + 7.2.0.0 + 7.2.0-beta1 -- Service release - the dependencies upgraded to be more up-to-date with the latest fixes. +- The `AlpacaDataClientExtensions.ListCorporateActionsAsAsyncEnumerable` helper method was added to simplify corporate actions pagination handling. C# SDK for Alpaca Trade API https://docs.alpaca.markets/ https://github.com/alpacahq/alpaca-trade-api-csharp - © 2018-2024 Alpaca Securities LLC. All rights reserved. + © 2018-2025 Alpaca Securities LLC. All rights reserved. false Aplaca API SDK REST WebSocket trading Extansions for .NET SDK for Alpaca Trade API @@ -99,7 +99,7 @@ - + diff --git a/Alpaca.Markets.Extensions/Pagination/AlpacaDataClientExtensions.cs b/Alpaca.Markets.Extensions/Pagination/AlpacaDataClientExtensions.cs index fcdf140b..455c8f5b 100644 --- a/Alpaca.Markets.Extensions/Pagination/AlpacaDataClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Pagination/AlpacaDataClientExtensions.cs @@ -423,6 +423,75 @@ public static IAsyncEnumerable + /// Gets all items provided by in pagination + /// mode as single stream of items (in form of interface) so they + /// can be consumed by the await foreach statement on the caller side. + /// + /// Target instance of the interface. + /// Original historical minute bars request (with empty next page token). + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// The or argument is null. + /// + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListCorporateActionsAsAsyncEnumerable( + this IAlpacaDataClient client, + CorporateActionsRequest request) => + ListCorporateActionsAsAsyncEnumerable(client, request, CancellationToken.None); + + /// + /// Gets all items provided by in pagination + /// mode as single stream of items (in form of interface) so they + /// can be consumed by the await foreach statement on the caller side. + /// + /// Target instance of the interface. + /// Original historical minute bars request (with empty next page token). + /// + /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + /// The argument contains invalid data or some required data is missing, unable to create a valid HTTP request. + /// + /// + /// The request failed due to an underlying issue such as network connectivity, DNS failure, server certificate validation or timeout. + /// + /// + /// The response contains an error message or the received response cannot be deserialized properly due to JSON schema mismatch. + /// + /// + /// The initial TPC socket connection failed due to an underlying low-level network connectivity issue. + /// + /// + /// .NET Core and .NET 5 and later only: The request failed due to timeout. + /// + /// + /// + /// The or argument is null. + /// + [UsedImplicitly] + [CLSCompliant(false)] + public static IAsyncEnumerable ListCorporateActionsAsAsyncEnumerable( + this IAlpacaDataClient client, + CorporateActionsRequest request, + CancellationToken cancellationToken) => + getAllCorporateActionsPages( + client.EnsureNotNull(), getValidatedRequestWithoutPageToken(request.EnsureNotNull()), cancellationToken); + private static NewsArticlesRequest getValidatedRequestWithoutPageToken( IHistoricalRequest request) => request.GetValidatedRequestWithoutPageToken(); @@ -430,4 +499,24 @@ private static NewsArticlesRequest getValidatedRequestWithoutPageToken( private static HistoricalAuctionsRequest getValidatedRequestWithoutPageToken( IHistoricalRequest request) => request.GetValidatedRequestWithoutPageToken(); + + private static CorporateActionsRequest getValidatedRequestWithoutPageToken( + IHistoricalRequest request) => + request.GetValidatedRequestWithoutPageToken(); + + private static async IAsyncEnumerable getAllCorporateActionsPages( + IAlpacaDataClient client, + CorporateActionsRequest request, + [EnumeratorCancellation] CancellationToken cancellationToken) + { + do + { + var page = await client.ListCorporateActionsAsync( + request, cancellationToken).ConfigureAwait(false); + + yield return page; + + request.Pagination.Token = page.NextPageToken ?? String.Empty; + } while (!String.IsNullOrEmpty(request.Pagination.Token)); + } } diff --git a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt index 393b01cb..48064615 100644 --- a/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt +++ b/Alpaca.Markets.Extensions/PublicAPI.Shipped.txt @@ -51,6 +51,8 @@ static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.GetNewsArticlesAsAsy static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.GetNewsArticlesAsAsyncEnumerable(this Alpaca.Markets.IAlpacaDataClient! client, Alpaca.Markets.NewsArticlesRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.GetNewsArticlesPagesAsAsyncEnumerable(this Alpaca.Markets.IAlpacaDataClient! client, Alpaca.Markets.NewsArticlesRequest! request) -> System.Collections.Generic.IAsyncEnumerable!>! static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.GetNewsArticlesPagesAsAsyncEnumerable(this Alpaca.Markets.IAlpacaDataClient! client, Alpaca.Markets.NewsArticlesRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable!>! +static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.ListCorporateActionsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaDataClient! client, Alpaca.Markets.CorporateActionsRequest! request) -> System.Collections.Generic.IAsyncEnumerable! +static Alpaca.Markets.Extensions.AlpacaDataClientExtensions.ListCorporateActionsAsAsyncEnumerable(this Alpaca.Markets.IAlpacaDataClient! client, Alpaca.Markets.CorporateActionsRequest! request, System.Threading.CancellationToken cancellationToken) -> System.Collections.Generic.IAsyncEnumerable! static Alpaca.Markets.Extensions.AlpacaDataStreamingClientExtensions.GetCancellationSubscription(this Alpaca.Markets.IAlpacaDataStreamingClient! client, params string![]! symbols) -> Alpaca.Markets.IAlpacaDataSubscription! static Alpaca.Markets.Extensions.AlpacaDataStreamingClientExtensions.GetCancellationSubscription(this Alpaca.Markets.IAlpacaDataStreamingClient! client, System.Collections.Generic.IEnumerable! symbols) -> Alpaca.Markets.IAlpacaDataSubscription! static Alpaca.Markets.Extensions.AlpacaDataStreamingClientExtensions.GetCorrectionSubscription(this Alpaca.Markets.IAlpacaDataStreamingClient! client, params string![]! symbols) -> Alpaca.Markets.IAlpacaDataSubscription! diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index b7dac487..7ac1ac61 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,16 +4,16 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0, )", - "resolved": "7.1.0", - "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", + "requested": "[7.2.0-beta1, )", + "resolved": "7.2.0-beta1", + "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.1", - "System.IO.Pipelines": "8.0.0", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Threading.Channels": "8.0.0" + "Polly": "8.5.0", + "Portable.System.DateTimeOnly": "8.0.2", + "System.IO.Pipelines": "9.0.0", + "System.Net.Http.WinHttpHandler": "9.0.0", + "System.Threading.Channels": "9.0.0" } }, "IsExternalInit": { @@ -215,16 +215,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.5.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -262,8 +262,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -282,8 +282,8 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==", + "resolved": "9.0.0", + "contentHash": "H7UZoctQ2xFQgU6eGFRavMDJQGebLaqG9OqWg5dm3WFpPJ8mhdTDcJhz/ihxzUZm1I+wiykzp+tu3hYtQ0omMQ==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5" @@ -316,15 +316,15 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0, )", - "resolved": "7.1.0", - "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", + "requested": "[7.2.0-beta1, )", + "resolved": "7.2.0-beta1", + "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.1", - "System.IO.Pipelines": "8.0.0", - "System.Threading.Channels": "8.0.0" + "Polly": "8.5.0", + "Portable.System.DateTimeOnly": "8.0.2", + "System.IO.Pipelines": "9.0.0", + "System.Threading.Channels": "9.0.0" } }, "IsExternalInit": { @@ -523,16 +523,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.5.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -569,8 +569,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -609,15 +609,15 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0, )", - "resolved": "7.1.0", - "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", + "requested": "[7.2.0-beta1, )", + "resolved": "7.2.0-beta1", + "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.1", - "Portable.System.DateTimeOnly": "8.0.1", - "System.IO.Pipelines": "8.0.0", - "System.Threading.Channels": "8.0.0" + "Polly": "8.5.0", + "Portable.System.DateTimeOnly": "8.0.2", + "System.IO.Pipelines": "9.0.0", + "System.Threading.Channels": "9.0.0" } }, "IsExternalInit": { @@ -782,16 +782,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.5.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "Microsoft.Bcl.TimeProvider": "8.0.0", @@ -828,8 +828,8 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", "dependencies": { "System.Buffers": "4.5.1", "System.Memory": "4.5.5", @@ -868,14 +868,14 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.1.0, )", - "resolved": "7.1.0", - "contentHash": "NDWBglvCoR7iKkfK3/8ka6OoDtuVpi8j7uzeJhODmVCCtZzw4bmQO1G2w63OcbBqHLupKEVXHkcTowtBF7wsFg==", + "requested": "[7.2.0-beta1, )", + "resolved": "7.2.0-beta1", + "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", "dependencies": { "Newtonsoft.Json": "13.0.3", - "Polly": "8.3.1", - "System.IO.Pipelines": "8.0.0", - "System.Threading.Channels": "8.0.0" + "Polly": "8.5.0", + "System.IO.Pipelines": "9.0.0", + "System.Threading.Channels": "9.0.0" } }, "IsExternalInit": { @@ -1049,16 +1049,16 @@ }, "Polly": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "xN9AxOudus8u4a//Tfu6Wxd5Oj7S4pjh/651S6FfIiVrbxQ8TeM+ieZC8c0y7Qto70zKBM5g8rBTqbAJnbetOA==", + "resolved": "8.5.0", + "contentHash": "GBNZPy7i7OpkaIruWPRJ0+AWzdGDQDnKY91b7Ic2aAch4lKhPjUc5KSffpH9krIWe0MoyghqaRxwRC0Uwz2PkA==", "dependencies": { - "Polly.Core": "8.3.1" + "Polly.Core": "8.5.0" } }, "Polly.Core": { "type": "Transitive", - "resolved": "8.3.1", - "contentHash": "b9mMAjqXuCXFCtf/RtRPwFUkAm/sz37s7G+taDvS5EqfkJsLiWfO2xO2cSISjIgIY+88oIZTGguP6UrRGRlqzg==", + "resolved": "8.5.0", + "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==", "dependencies": { "Microsoft.Bcl.TimeProvider": "8.0.0" } @@ -1092,8 +1092,13 @@ }, "System.IO.Pipelines": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Threading.Tasks.Extensions": "4.5.4" + } }, "System.Memory": { "type": "Transitive", @@ -1104,6 +1109,11 @@ "type": "Transitive", "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" } } } diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index f4364450..d1ddf62b 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -15,11 +15,11 @@ - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all From f6e80c4557e515f2fc5be59d499931fe9e4e8d59 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 Jan 2025 13:46:32 +0100 Subject: [PATCH 122/125] Issue #740 - The unit tests for the new functions and classes were added. --- .../StreamingDataClientExtensions.cs | 4 +- Alpaca.Markets.Tests/AlpacaDataClientTest.cs | 57 +++ Alpaca.Markets.Tests/MessageDataHelpers.cs | 371 ++++++++++++++++++ Alpaca.Markets/AlpacaCryptoDataClient.cs | 2 +- Alpaca.Markets/AlpacaDataClient.cs | 6 +- .../Helpers/ActiveStocksExtensions.cs | 4 +- .../Helpers/AlpacaScreenerClientExtensions.cs | 4 +- .../Interfaces/IAlpacaDataClient.cs | 4 +- .../Interfaces/IAlpacaScreenerClient.cs | 2 +- .../Messages/JsonCorporateActionsResponse.cs | 4 +- 10 files changed, 443 insertions(+), 15 deletions(-) diff --git a/Alpaca.Markets.Extensions/Subscriptions/StreamingDataClientExtensions.cs b/Alpaca.Markets.Extensions/Subscriptions/StreamingDataClientExtensions.cs index 0c9b4017..5470b6f1 100644 --- a/Alpaca.Markets.Extensions/Subscriptions/StreamingDataClientExtensions.cs +++ b/Alpaca.Markets.Extensions/Subscriptions/StreamingDataClientExtensions.cs @@ -18,7 +18,7 @@ public static class StreamingDataClientExtensions public static AlpacaValueTask SubscribeAsync( this IStreamingDataClient client, params IAlpacaDataSubscription[] subscriptions) => - new(token => client.SubscribeAsync(subscriptions.EnsureNotNull(), token), default); + new(token => client.SubscribeAsync(subscriptions.EnsureNotNull(), token), CancellationToken.None); /// /// Unsubscribes several objects for receiving data from the server. @@ -33,5 +33,5 @@ public static AlpacaValueTask SubscribeAsync( public static AlpacaValueTask UnsubscribeAsync( this IStreamingDataClient client, params IAlpacaDataSubscription[] subscriptions) => - new(token => client.UnsubscribeAsync(subscriptions.EnsureNotNull(), token), default); + new(token => client.UnsubscribeAsync(subscriptions.EnsureNotNull(), token), CancellationToken.None); } diff --git a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs index 36221647..da4002ac 100644 --- a/Alpaca.Markets.Tests/AlpacaDataClientTest.cs +++ b/Alpaca.Markets.Tests/AlpacaDataClientTest.cs @@ -65,10 +65,67 @@ public async Task ListNewsArticlesAsyncWorks() article.Validate(Stock); } + [Fact] + public async Task ListCorporateActionsAsyncWorks() + { + using var mock = mockClientsFactory.GetAlpacaDataClientMock(Environments.Paper); + + mock.AddGet("/v1/corporate-actions", new JObject( + new JProperty("corporate_actions", new JObject( + new JProperty("stock_and_cash_mergers", new JArray(Stock.CreateStockAndCashMerger())), + new JProperty("rights_distributions", new JArray(Stock.CreateRightsDistribution())), + new JProperty("worthless_removals", new JArray(Stock.CreateWorthlessRemoval())), + new JProperty("stock_dividends", new JArray(Stock.CreateStockDividend())), + new JProperty("cash_dividends", new JArray(Stock.CreateCashDividend())), + new JProperty("reverse_splits", new JArray(Stock.CreateReverseSplit())), + new JProperty("forward_splits", new JArray(Stock.CreateForwardSplit())), + new JProperty("stock_mergers", new JArray(Stock.CreateStockMerger())), + new JProperty("cash_mergers", new JArray(Stock.CreateCashMerger())), + new JProperty("name_changes", new JArray(Stock.CreateNameChange())), + new JProperty("redemptions", new JArray(Stock.CreateRedemption())), + new JProperty("unit_splits", new JArray(Stock.CreateUnitSplit())), + new JProperty("spin_offs", new JArray(Stock.CreateSpinOff())))))); + + var today = DateOnly.FromDateTime(DateTime.Today); + var request = new CorporateActionsRequest + { + SortDirection = SortDirection.Ascending + } + .WithDateInterval(new Interval(today, today)) + .WithTypes([CorporateActionFilterType.ForwardSplit]) + .WithType(CorporateActionFilterType.SpinOff) + .WithSymbols([Stock]).WithSymbol(Stock); + + var actions= await mock.Client.ListCorporateActionsAsync(request); + + Assert.Null(actions.NextPageToken); + + getCorporateAction(actions.StockAndCashMergers).Validate(Stock); + getCorporateAction(actions.RightsDistributions).Validate(Stock); + getCorporateAction(actions.WorthlessRemovals).Validate(Stock); + getCorporateAction(actions.StockDividends).Validate(Stock); + getCorporateAction(actions.CashDividends).Validate(Stock); + getCorporateAction(actions.ReverseSplits).Validate(Stock); + getCorporateAction(actions.ForwardSplits).Validate(Stock); + getCorporateAction(actions.StockMergers).Validate(Stock); + getCorporateAction(actions.CashMergers).Validate(Stock); + getCorporateAction(actions.NameChanges).Validate(Stock); + getCorporateAction(actions.Redemptions).Validate(Stock); + getCorporateAction(actions.UnitSplits).Validate(Stock); + getCorporateAction(actions.SpinOffs).Validate(Stock); + } + private static Interval getTimeInterval() { var today = DateTime.Today; var yesterday = today.AddDays(-1); return new Interval(yesterday, today); } + private static TAction getCorporateAction( + IReadOnlyList actions) + { + Assert.NotNull(actions); + Assert.Single(actions); + return actions.Single(); + } } diff --git a/Alpaca.Markets.Tests/MessageDataHelpers.cs b/Alpaca.Markets.Tests/MessageDataHelpers.cs index 4a54570f..f06c60d1 100644 --- a/Alpaca.Markets.Tests/MessageDataHelpers.cs +++ b/Alpaca.Markets.Tests/MessageDataHelpers.cs @@ -1,10 +1,16 @@ using System.Diagnostics.CodeAnalysis; +using System.Globalization; namespace Alpaca.Markets.Tests; [SuppressMessage("ReSharper", "ParameterOnlyUsedForPreconditionCheck.Global")] internal static class MessageDataHelpers { + private static readonly Lazy _todayString = new( + () => _today.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); + + private static readonly DateOnly _today = DateOnly.FromDateTime(DateTime.Today); + private static readonly String _exchange = CryptoExchange.Cbse.ToString(); public const String StreamingMessageTypeTag = "T"; @@ -51,6 +57,146 @@ public static JObject CreateNewsArticle( new JProperty("updated_at", DateTime.UtcNow), new JProperty("symbols", new JArray(symbol))); + public static JObject CreateStockAndCashMerger( + this String symbol) => + new( + new JProperty("effective_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("acquirer_symbol", symbol), + new JProperty("acquiree_symbol", symbol), + new JProperty("acquirer_rate", Quantity), + new JProperty("acquiree_rate", Quantity), + new JProperty("cash_rate", Quantity)); + + public static JObject CreateRightsDistribution( + this String symbol) => + new( + new JProperty("expiration_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("source_symbol", symbol), + new JProperty("new_symbol", symbol), + new JProperty("rate", Quantity)); + + public static JObject CreateWorthlessRemoval( + this String symbol) => + new( + new JProperty("process_date", _todayString.Value), + new JProperty("symbol", symbol)); + + public static JObject CreateStockDividend( + this String symbol) => + new( + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("symbol", symbol), + new JProperty("rate", Quantity)); + + public static JObject CreateCashDividend( + this String symbol) => + new( + new JProperty("due_bill_off_date", _todayString.Value), + new JProperty("due_bill_on_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("rate", Quantity), + new JProperty("symbol", symbol), + new JProperty("special", true), + new JProperty("foreign", true)); + + public static JObject CreateReverseSplit( + this String symbol) => + new( + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("new_rate", Quantity), + new JProperty("old_rate", Quantity), + new JProperty("symbol", symbol)); + + public static JObject CreateForwardSplit( + this String symbol) => + new( + new JProperty("due_bill_redemption_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("new_rate", Quantity), + new JProperty("old_rate", Quantity), + new JProperty("symbol", symbol)); + + public static JObject CreateStockMerger( + this String symbol) => + new( + new JProperty("effective_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("acquirer_symbol", symbol), + new JProperty("acquiree_symbol", symbol), + new JProperty("acquirer_rate", Quantity), + new JProperty("acquiree_rate", Quantity)); + + public static JObject CreateCashMerger( + this String symbol) => + new( + new JProperty("effective_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("acquirer_symbol", symbol), + new JProperty("acquiree_symbol", symbol), + new JProperty("rate", Quantity)); + + public static JObject CreateNameChange( + this String symbol) => + new( + new JProperty("process_date", _todayString.Value), + new JProperty("old_symbol", symbol), + new JProperty("new_symbol", symbol)); + + public static JObject CreateRedemption( + this String symbol) => + new( + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("symbol", symbol), + new JProperty("rate", Quantity)); + + public static JObject CreateUnitSplit( + this String symbol) => + new( + new JProperty("effective_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("alternate_symbol", symbol), + new JProperty("alternate_rate", Quantity), + new JProperty("new_symbol", symbol), + new JProperty("old_symbol", symbol), + new JProperty("new_rate", Quantity), + new JProperty("old_rate", Quantity)); + + public static JObject CreateSpinOff( + this String symbol) => + new( + new JProperty("due_bill_redemption_date", _todayString.Value), + new JProperty("effective_date", _todayString.Value), + new JProperty("process_date", _todayString.Value), + new JProperty("payable_date", _todayString.Value), + new JProperty("record_date", _todayString.Value), + new JProperty("ex_date", _todayString.Value), + new JProperty("source_symbol", symbol), + new JProperty("source_rate", Quantity), + new JProperty("new_symbol", symbol), + new JProperty("new_rate", Quantity)); + public static JObject CreateOrderBook( this String symbol) => new( @@ -142,6 +288,231 @@ public static void Validate( Assert.Null(article.ThumbImageUrl); } + public static void Validate( + this IStockAndCashMerger action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.AcquirerSymbol); + Assert.Equal(symbol, action.AcquireeSymbol); + + Assert.Equal(Quantity, action.AcquireeRate); + Assert.Equal(Quantity, action.AcquirerRate); + Assert.Equal(Quantity, action.CashRate); + + Assert.Equal(_today, action.EffectiveDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + } + + public static void Validate( + this IRightsDistribution action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.SourceSymbol); + Assert.Equal(symbol, action.NewSymbol); + + Assert.Equal(Quantity, action.Rate); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.ExpirationDate); + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + + public static void Validate( + this IWorthlessRemoval action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(_today, action.ProcessDate); + } + + public static void Validate( + this IStockDividend action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(Quantity, action.Rate); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + + public static void Validate( + this ICashDividend action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(Quantity, action.Rate); + Assert.True(action.IsSpecial); + Assert.True(action.IsForeign); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.DueBillOffDate); + Assert.NotNull(action.DueBillOnDate); + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + + public static void Validate( + this IReverseSplit action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(Quantity, action.OldRate); + Assert.Equal(Quantity, action.NewRate); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + + public static void Validate( + this IForwardSplit action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(Quantity, action.OldRate); + Assert.Equal(Quantity, action.NewRate); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.DueBillRedemptionDate); + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + + public static void Validate( + this IStockMerger action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.AcquirerSymbol); + Assert.Equal(symbol, action.AcquireeSymbol); + + Assert.Equal(Quantity, action.AcquirerRate); + Assert.Equal(Quantity, action.AcquireeRate); + + Assert.Equal(_today, action.EffectiveDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + } + + public static void Validate( + this ICashMerger action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.AcquirerSymbol); + Assert.Equal(symbol, action.AcquireeSymbol); + + Assert.Equal(Quantity, action.Rate); + + Assert.Equal(_today, action.EffectiveDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + } + + public static void Validate( + this INameChange action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.OldSymbol); + Assert.Equal(symbol, action.NewSymbol); + + Assert.Equal(_today, action.ProcessDate); + } + + public static void Validate( + this IRedemption action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.Symbol); + + Assert.Equal(Quantity, action.Rate); + + Assert.Equal(_today, action.ProcessDate); + Assert.Equal(_today, action.PayableDate); + } + + public static void Validate( + this IUnitSplit action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.AlternateSymbol); + Assert.Equal(symbol, action.OldSymbol); + Assert.Equal(symbol, action.NewSymbol); + + Assert.Equal(Quantity, action.AlternateRate); + Assert.Equal(Quantity, action.OldRate); + Assert.Equal(Quantity, action.NewRate); + + Assert.Equal(_today, action.EffectiveDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.PayableDate); + } + + public static void Validate( + this ISpinOff action, + String symbol) + { + Assert.NotNull(action); + + Assert.Equal(symbol, action.SourceSymbol); + Assert.Equal(symbol, action.NewSymbol); + + Assert.Equal(Quantity, action.SourceRate); + Assert.Equal(Quantity, action.NewRate); + + Assert.Equal(_today, action.ExecutionDate); + Assert.Equal(_today, action.ProcessDate); + + Assert.NotNull(action.DueBillRedemptionDate); + Assert.NotNull(action.PayableDate); + Assert.NotNull(action.RecordDate); + } + public static void Validate( this IOrderBook orderBook, String symbol) diff --git a/Alpaca.Markets/AlpacaCryptoDataClient.cs b/Alpaca.Markets/AlpacaCryptoDataClient.cs index 00fbbcd2..ea4e56c1 100644 --- a/Alpaca.Markets/AlpacaCryptoDataClient.cs +++ b/Alpaca.Markets/AlpacaCryptoDataClient.cs @@ -112,7 +112,7 @@ await request.EnsureNotNull().Validate() data => data.OrderBooks, cancellationToken).ConfigureAwait(false); public Task GetTopMarketMoversAsync( - Int32? numberOfLosersAndGainersInResponse = default, + Int32? numberOfLosersAndGainersInResponse = null, CancellationToken cancellationToken = default) => HttpClient.GetTopMarketMoversAsync(RateLimitHandler, "crypto", numberOfLosersAndGainersInResponse, cancellationToken); diff --git a/Alpaca.Markets/AlpacaDataClient.cs b/Alpaca.Markets/AlpacaDataClient.cs index 3c795ba7..72780d4d 100644 --- a/Alpaca.Markets/AlpacaDataClient.cs +++ b/Alpaca.Markets/AlpacaDataClient.cs @@ -95,19 +95,19 @@ await request.EnsureNotNull().Validate() RateLimitHandler, cancellationToken).ConfigureAwait(false); public Task GetTopMarketMoversAsync( - Int32? numberOfLosersAndGainersInResponse = default, + Int32? numberOfLosersAndGainersInResponse = null, CancellationToken cancellationToken = default) => HttpClient.GetTopMarketMoversAsync(RateLimitHandler, "stocks", numberOfLosersAndGainersInResponse, cancellationToken); public Task> ListMostActiveStocksByVolumeAsync( - Int32? numberOfTopMostActiveStocks = default, + Int32? numberOfTopMostActiveStocks = null, CancellationToken cancellationToken = default) => HttpClient.ListMostActiveStocksAsync(RateLimitHandler, "volume", numberOfTopMostActiveStocks, cancellationToken); public Task> ListMostActiveStocksByTradeCountAsync( - Int32? numberOfTopMostActiveStocks = default, + Int32? numberOfTopMostActiveStocks = null, CancellationToken cancellationToken = default) => HttpClient.ListMostActiveStocksAsync(RateLimitHandler, "trades", numberOfTopMostActiveStocks, cancellationToken); diff --git a/Alpaca.Markets/Helpers/ActiveStocksExtensions.cs b/Alpaca.Markets/Helpers/ActiveStocksExtensions.cs index 2bb8b26b..fccd3dc9 100644 --- a/Alpaca.Markets/Helpers/ActiveStocksExtensions.cs +++ b/Alpaca.Markets/Helpers/ActiveStocksExtensions.cs @@ -6,7 +6,7 @@ public static async Task> ListMostActiveStocksAsync( this HttpClient httpClient, RateLimitHandler rateLimitHandler, String orderByFieldForRankingMostActive, - Int32? numberOfTopMostActiveStocks = default, + Int32? numberOfTopMostActiveStocks = null, CancellationToken cancellationToken = default) => (await httpClient.GetAsync( await getUriBuilderAsync(httpClient, orderByFieldForRankingMostActive, numberOfTopMostActiveStocks).ConfigureAwait(false), @@ -16,7 +16,7 @@ await getUriBuilderAsync(httpClient, orderByFieldForRankingMostActive, numberOfT private static async ValueTask getUriBuilderAsync( HttpClient httpClient, String orderByField, - Int32? top = default) => + Int32? top = null) => new UriBuilder(httpClient.BaseAddress!) { Query = await new QueryBuilder() diff --git a/Alpaca.Markets/Helpers/AlpacaScreenerClientExtensions.cs b/Alpaca.Markets/Helpers/AlpacaScreenerClientExtensions.cs index 5c95ce23..2a4ec379 100644 --- a/Alpaca.Markets/Helpers/AlpacaScreenerClientExtensions.cs +++ b/Alpaca.Markets/Helpers/AlpacaScreenerClientExtensions.cs @@ -6,7 +6,7 @@ public static async Task GetTopMarketMoversAsync( this HttpClient httpClient, RateLimitHandler rateLimitHandler, String marketType, - Int32? numberOfLosersAndGainersInResponse = default, + Int32? numberOfLosersAndGainersInResponse = null, CancellationToken cancellationToken = default) => await httpClient.GetAsync( await getUriBuilderAsync(httpClient, marketType, numberOfLosersAndGainersInResponse).ConfigureAwait(false), @@ -15,7 +15,7 @@ await getUriBuilderAsync(httpClient, marketType, numberOfLosersAndGainersInRespo private static async ValueTask getUriBuilderAsync( HttpClient httpClient, String marketType, - Int32? top = default) => + Int32? top = null) => new UriBuilder(httpClient.BaseAddress!) { Query = await new QueryBuilder() diff --git a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs index 8220cd5a..1ecfb13c 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaDataClient.cs @@ -420,7 +420,7 @@ Task> GetHistoricalAuctionsAsync( /// Read-only list of most active stocks ranked by volume. [UsedImplicitly] Task> ListMostActiveStocksByVolumeAsync( - Int32? numberOfTopMostActiveStocks = default, + Int32? numberOfTopMostActiveStocks = null, CancellationToken cancellationToken = default); /// @@ -445,7 +445,7 @@ Task> ListMostActiveStocksByVolumeAsync( /// Read-only list of most active stocks ranked by trade count. [UsedImplicitly] Task> ListMostActiveStocksByTradeCountAsync( - Int32? numberOfTopMostActiveStocks = default, + Int32? numberOfTopMostActiveStocks = null, CancellationToken cancellationToken = default); /// diff --git a/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs b/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs index cd087567..4bef35fd 100644 --- a/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs +++ b/Alpaca.Markets/Interfaces/IAlpacaScreenerClient.cs @@ -27,6 +27,6 @@ public interface IAlpacaScreenerClient /// Read-only market movers collections. [UsedImplicitly] Task GetTopMarketMoversAsync( - Int32? numberOfLosersAndGainersInResponse = default, + Int32? numberOfLosersAndGainersInResponse = null, CancellationToken cancellationToken = default); } diff --git a/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs b/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs index 97f13cf1..7b14e052 100644 --- a/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs +++ b/Alpaca.Markets/Messages/JsonCorporateActionsResponse.cs @@ -49,7 +49,7 @@ public sealed class JsonCorporateActionsDictionary } [JsonProperty(PropertyName = "corporate_actions", Required = Required.Default)] - public JsonCorporateActionsDictionary Nested { get; set; } = new(); + public JsonCorporateActionsDictionary Nested { get; [ExcludeFromCodeCoverage] set; } = new(); [JsonIgnore] public IReadOnlyList StockAndCashMergers => Nested.StockAndCashMergersList; @@ -91,7 +91,7 @@ public sealed class JsonCorporateActionsDictionary public IReadOnlyList SpinOffs => Nested.SpinOffsList; [JsonProperty(PropertyName = "next_page_token", Required = Required.Default)] - public String? NextPageToken { get; set; } + public String? NextPageToken { get; [ExcludeFromCodeCoverage] set; } [ExcludeFromCodeCoverage] public override String ToString() => From 5590f660deff74d564d11124de9f1c6dbe0de598 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 Jan 2025 14:08:53 +0100 Subject: [PATCH 123/125] The dependencies were upgraded before release. --- .../Alpaca.Markets.Extensions.Tests.csproj | 4 ++-- .../Alpaca.Markets.Extensions.csproj | 2 +- Alpaca.Markets.Extensions/packages.lock.json | 18 +++++++++--------- .../Alpaca.Markets.Tests.csproj | 4 ++-- Alpaca.Markets/Alpaca.Markets.csproj | 2 +- Alpaca.Markets/packages.lock.json | 18 +++++++++--------- UsageExamples/UsageExamples.csproj | 2 +- 7 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj index 165778c5..c84b2814 100644 --- a/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj +++ b/Alpaca.Markets.Extensions.Tests/Alpaca.Markets.Extensions.Tests.csproj @@ -20,8 +20,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index 40c59368..e155014c 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -107,7 +107,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 7ac1ac61..53ab78e6 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -79,9 +79,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==", "dependencies": { "System.Memory": "4.6.0" } @@ -390,9 +390,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==", "dependencies": { "System.Memory": "4.6.0" } @@ -674,9 +674,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==" }, "System.Linq.Async": { "type": "Direct", diff --git a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj index d1ddf62b..6c974700 100644 --- a/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj +++ b/Alpaca.Markets.Tests/Alpaca.Markets.Tests.csproj @@ -18,8 +18,8 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 9b4768ec..138b67ed 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -117,7 +117,7 @@ - + diff --git a/Alpaca.Markets/packages.lock.json b/Alpaca.Markets/packages.lock.json index 026318ad..f39193f8 100644 --- a/Alpaca.Markets/packages.lock.json +++ b/Alpaca.Markets/packages.lock.json @@ -56,9 +56,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==", "dependencies": { "System.Memory": "4.6.0" } @@ -237,9 +237,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==", "dependencies": { "System.Memory": "4.6.0" } @@ -392,9 +392,9 @@ }, "Portable.System.DateTimeOnly": { "type": "Direct", - "requested": "[8.0.2, )", - "resolved": "8.0.2", - "contentHash": "YiEjg6vXK4y2mEwD8F2rKc0XOWW7aRNC1lM+afPUmwQfZ75rX8py6FuC2S0JhBHRHiTl9skKsgPAgSlGipmOPA==" + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "JOr7+/s1MSjpg4m2lIFsFaA7bF0DEWq2Kg4gr7HWqlrwVaiqmJe/YChzCPUZ9qhYD/3YEDvp5C65PrqBMooh7A==" }, "System.IO.Pipelines": { "type": "Direct", diff --git a/UsageExamples/UsageExamples.csproj b/UsageExamples/UsageExamples.csproj index 474cc249..ca8231ee 100644 --- a/UsageExamples/UsageExamples.csproj +++ b/UsageExamples/UsageExamples.csproj @@ -21,7 +21,7 @@ - + From 011fb664e686d0c475290fbdca19600ee12d51c4 Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 Jan 2025 14:10:47 +0100 Subject: [PATCH 124/125] Prepare release 7.2.0 of SDK --- Alpaca.Markets/Alpaca.Markets.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Alpaca.Markets/Alpaca.Markets.csproj b/Alpaca.Markets/Alpaca.Markets.csproj index 138b67ed..8e3f9e5a 100644 --- a/Alpaca.Markets/Alpaca.Markets.csproj +++ b/Alpaca.Markets/Alpaca.Markets.csproj @@ -12,9 +12,9 @@ - 7.2.0.0 - 7.2.0.0 - 7.2.0-beta1 + 7.2.0.1 + 7.2.0.1 + 7.2.0 From 40750af034d890fda9def22e4c6ebe69f7d4820a Mon Sep 17 00:00:00 2001 From: Oleg Rakhmatulin Date: Sun, 12 Jan 2025 20:53:26 +0100 Subject: [PATCH 125/125] Prepare release 7.2.0 of Extensions --- .../Alpaca.Markets.Extensions.csproj | 8 ++--- Alpaca.Markets.Extensions/packages.lock.json | 30 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj index e155014c..2459de87 100644 --- a/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj +++ b/Alpaca.Markets.Extensions/Alpaca.Markets.Extensions.csproj @@ -12,9 +12,9 @@ - 7.2.0.0 - 7.2.0.0 - 7.2.0-beta1 + 7.2.0.1 + 7.2.0.1 + 7.2.0 @@ -99,7 +99,7 @@ - + diff --git a/Alpaca.Markets.Extensions/packages.lock.json b/Alpaca.Markets.Extensions/packages.lock.json index 53ab78e6..d678cb9f 100644 --- a/Alpaca.Markets.Extensions/packages.lock.json +++ b/Alpaca.Markets.Extensions/packages.lock.json @@ -4,13 +4,13 @@ ".NETFramework,Version=v4.6.2": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.2.0-beta1, )", - "resolved": "7.2.0-beta1", - "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", + "requested": "[7.2.0, )", + "resolved": "7.2.0", + "contentHash": "XlrIrXXkcZG9EK9bERIzwsXb08BcKYDMP3S93znYadOK+xlQOr9Jfp4E/dVNORnmevCIyP5cy/nReOMmoIPXkA==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.5.0", - "Portable.System.DateTimeOnly": "8.0.2", + "Portable.System.DateTimeOnly": "9.0.0", "System.IO.Pipelines": "9.0.0", "System.Net.Http.WinHttpHandler": "9.0.0", "System.Threading.Channels": "9.0.0" @@ -316,13 +316,13 @@ ".NETStandard,Version=v2.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.2.0-beta1, )", - "resolved": "7.2.0-beta1", - "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", + "requested": "[7.2.0, )", + "resolved": "7.2.0", + "contentHash": "XlrIrXXkcZG9EK9bERIzwsXb08BcKYDMP3S93znYadOK+xlQOr9Jfp4E/dVNORnmevCIyP5cy/nReOMmoIPXkA==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.5.0", - "Portable.System.DateTimeOnly": "8.0.2", + "Portable.System.DateTimeOnly": "9.0.0", "System.IO.Pipelines": "9.0.0", "System.Threading.Channels": "9.0.0" } @@ -609,13 +609,13 @@ ".NETStandard,Version=v2.1": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.2.0-beta1, )", - "resolved": "7.2.0-beta1", - "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", + "requested": "[7.2.0, )", + "resolved": "7.2.0", + "contentHash": "XlrIrXXkcZG9EK9bERIzwsXb08BcKYDMP3S93znYadOK+xlQOr9Jfp4E/dVNORnmevCIyP5cy/nReOMmoIPXkA==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.5.0", - "Portable.System.DateTimeOnly": "8.0.2", + "Portable.System.DateTimeOnly": "9.0.0", "System.IO.Pipelines": "9.0.0", "System.Threading.Channels": "9.0.0" } @@ -868,9 +868,9 @@ "net6.0": { "Alpaca.Markets": { "type": "Direct", - "requested": "[7.2.0-beta1, )", - "resolved": "7.2.0-beta1", - "contentHash": "JI2IRQc+s05y8mGAgPGXL3yU++L9rhOUxsAmlSvwqQ/Fln5reKrh/Prf4GmSglM+Psiw7ur2cC7t0y2yLfhS0g==", + "requested": "[7.2.0, )", + "resolved": "7.2.0", + "contentHash": "XlrIrXXkcZG9EK9bERIzwsXb08BcKYDMP3S93znYadOK+xlQOr9Jfp4E/dVNORnmevCIyP5cy/nReOMmoIPXkA==", "dependencies": { "Newtonsoft.Json": "13.0.3", "Polly": "8.5.0",