Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Bitget.Net/Bitget.Net.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1</TargetFrameworks>
<LangVersion>latest</LangVersion>
Expand Down Expand Up @@ -55,7 +55,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="CryptoExchange.Net" Version="10.3.0" />
<PackageReference Include="CryptoExchange.Net" Version="10.4.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.101">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
63 changes: 63 additions & 0 deletions Bitget.Net/Bitget.Net.xml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,37 @@
<member name="M:Bitget.Net.BitgetTrackerFactory.CreateTradeTracker(CryptoExchange.Net.SharedApis.SharedSymbol,System.Nullable{System.Int32},System.Nullable{System.TimeSpan})">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetTrackerFactory.CreateUserSpotDataTracker(CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetTrackerFactory.CreateUserSpotDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig,Bitget.Net.BitgetEnvironment)">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetTrackerFactory.CreateUserFuturesDataTracker(Bitget.Net.Enums.BitgetProductTypeV2,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig)">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetTrackerFactory.CreateUserFuturesDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,Bitget.Net.Enums.BitgetProductTypeV2,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,Bitget.Net.BitgetEnvironment)">
<inheritdoc />
</member>
<member name="T:Bitget.Net.BitgetUserSpotDataTracker">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetUserSpotDataTracker.#ctor(Microsoft.Extensions.Logging.ILogger{Bitget.Net.BitgetUserSpotDataTracker},Bitget.Net.Interfaces.Clients.IBitgetRestClient,Bitget.Net.Interfaces.Clients.IBitgetSocketClient,System.String,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
<summary>
ctor
</summary>
</member>
<member name="T:Bitget.Net.BitgetUserFuturesDataTracker">
<inheritdoc />
</member>
<member name="P:Bitget.Net.BitgetUserFuturesDataTracker.WebsocketPositionUpdatesAreFullSnapshots">
<inheritdoc />
</member>
<member name="M:Bitget.Net.BitgetUserFuturesDataTracker.#ctor(Microsoft.Extensions.Logging.ILogger{Bitget.Net.BitgetUserFuturesDataTracker},Bitget.Net.Interfaces.Clients.IBitgetRestClient,Bitget.Net.Interfaces.Clients.IBitgetSocketClient,System.String,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,CryptoExchange.Net.SharedApis.ExchangeParameters)">
<summary>
ctor
</summary>
</member>
<member name="T:Bitget.Net.Clients.BitgetRestClient">
<inheritdoc />
</member>
Expand Down Expand Up @@ -7443,6 +7474,38 @@
Tracker factory
</summary>
</member>
<member name="M:Bitget.Net.Interfaces.IBitgetTrackerFactory.CreateUserSpotDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig,Bitget.Net.BitgetEnvironment)">
<summary>
Create a new Spot user data tracker
</summary>
<param name="userIdentifier">User identifier</param>
<param name="config">Configuration</param>
<param name="credentials">Credentials</param>
<param name="environment">Environment</param>
</member>
<member name="M:Bitget.Net.Interfaces.IBitgetTrackerFactory.CreateUserSpotDataTracker(CryptoExchange.Net.Trackers.UserData.Objects.SpotUserDataTrackerConfig)">
<summary>
Create a new spot user data tracker
</summary>
<param name="config">Configuration</param>
</member>
<member name="M:Bitget.Net.Interfaces.IBitgetTrackerFactory.CreateUserFuturesDataTracker(System.String,CryptoExchange.Net.Authentication.ApiCredentials,Bitget.Net.Enums.BitgetProductTypeV2,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig,Bitget.Net.BitgetEnvironment)">
<summary>
Create a new futures user data tracker
</summary>
<param name="userIdentifier">User identifier</param>
<param name="config">Configuration</param>
<param name="credentials">Credentials</param>
<param name="environment">Environment</param>
<param name="productType">Product type</param>
</member>
<member name="M:Bitget.Net.Interfaces.IBitgetTrackerFactory.CreateUserFuturesDataTracker(Bitget.Net.Enums.BitgetProductTypeV2,CryptoExchange.Net.Trackers.UserData.Objects.FuturesUserDataTrackerConfig)">
<summary>
Create a new futures user data tracker
</summary>
<param name="config">Configuration</param>
<param name="productType">Product type</param>
</member>
<member name="T:Bitget.Net.Objects.BitgetApiAddresses">
<summary>
Bitget Api addresses
Expand Down
70 changes: 70 additions & 0 deletions Bitget.Net/BitgetTrackerFactory.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
using Bitget.Net.Clients;
using Bitget.Net.Enums;
using Bitget.Net.Interfaces;
using Bitget.Net.Interfaces.Clients;
using CryptoExchange.Net.Authentication;
using CryptoExchange.Net.SharedApis;
using CryptoExchange.Net.Trackers.Klines;
using CryptoExchange.Net.Trackers.Trades;
using CryptoExchange.Net.Trackers.UserData;
using CryptoExchange.Net.Trackers.UserData.Interfaces;
using CryptoExchange.Net.Trackers.UserData.Objects;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

namespace Bitget.Net
{
Expand Down Expand Up @@ -100,5 +106,69 @@ public ITradeTracker CreateTradeTracker(SharedSymbol symbol, int? limit = null,
period
);
}

/// <inheritdoc />
public IUserSpotDataTracker CreateUserSpotDataTracker(SpotUserDataTrackerConfig? config = null)
{
var restClient = _serviceProvider?.GetRequiredService<IBitgetRestClient>() ?? new BitgetRestClient();
var socketClient = _serviceProvider?.GetRequiredService<IBitgetSocketClient>() ?? new BitgetSocketClient();
return new BitgetUserSpotDataTracker(
_serviceProvider?.GetRequiredService<ILogger<BitgetUserSpotDataTracker>>() ?? new NullLogger<BitgetUserSpotDataTracker>(),
restClient,
socketClient,
null,
config
);
}

/// <inheritdoc />
public IUserSpotDataTracker CreateUserSpotDataTracker(string userIdentifier, ApiCredentials credentials, SpotUserDataTrackerConfig? config = null, BitgetEnvironment? environment = null)
{
var clientProvider = _serviceProvider?.GetRequiredService<IBitgetUserClientProvider>() ?? new BitgetUserClientProvider();
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment);
return new BitgetUserSpotDataTracker(
_serviceProvider?.GetRequiredService<ILogger<BitgetUserSpotDataTracker>>() ?? new NullLogger<BitgetUserSpotDataTracker>(),
restClient,
socketClient,
userIdentifier,
config
);
}

/// <inheritdoc />
public IUserFuturesDataTracker CreateUserFuturesDataTracker(BitgetProductTypeV2 productType, FuturesUserDataTrackerConfig? config = null)
{
var exchangeParams = new ExchangeParameters(new ExchangeParameter("Bitget", "ProductType", productType.ToString()));

var restClient = _serviceProvider?.GetRequiredService<IBitgetRestClient>() ?? new BitgetRestClient();
var socketClient = _serviceProvider?.GetRequiredService<IBitgetSocketClient>() ?? new BitgetSocketClient();
return new BitgetUserFuturesDataTracker(
_serviceProvider?.GetRequiredService<ILogger<BitgetUserFuturesDataTracker>>() ?? new NullLogger<BitgetUserFuturesDataTracker>(),
restClient,
socketClient,
null,
config,
exchangeParams
);
}

/// <inheritdoc />
public IUserFuturesDataTracker CreateUserFuturesDataTracker(string userIdentifier, ApiCredentials credentials, BitgetProductTypeV2 productType, FuturesUserDataTrackerConfig? config = null, BitgetEnvironment? environment = null)
{
var exchangeParams = new ExchangeParameters(new ExchangeParameter("Bitget", "ProductType", productType.ToString()));

var clientProvider = _serviceProvider?.GetRequiredService<IBitgetUserClientProvider>() ?? new BitgetUserClientProvider();
var restClient = clientProvider.GetRestClient(userIdentifier, credentials, environment);
var socketClient = clientProvider.GetSocketClient(userIdentifier, credentials, environment);
return new BitgetUserFuturesDataTracker(
_serviceProvider?.GetRequiredService<ILogger<BitgetUserFuturesDataTracker>>() ?? new NullLogger<BitgetUserFuturesDataTracker>(),
restClient,
socketClient,
userIdentifier,
config,
exchangeParams
);
}
}
}
64 changes: 64 additions & 0 deletions Bitget.Net/BitgetUserDataTracker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using Bitget.Net.Interfaces.Clients;
using CryptoExchange.Net.SharedApis;
using CryptoExchange.Net.Trackers.UserData;
using CryptoExchange.Net.Trackers.UserData.Objects;
using Microsoft.Extensions.Logging;

namespace Bitget.Net
{
/// <inheritdoc />
public class BitgetUserSpotDataTracker : UserSpotDataTracker
{
/// <summary>
/// ctor
/// </summary>
public BitgetUserSpotDataTracker(
ILogger<BitgetUserSpotDataTracker> logger,
IBitgetRestClient restClient,
IBitgetSocketClient socketClient,
string? userIdentifier,
SpotUserDataTrackerConfig? config) : base(
logger,
restClient.SpotApiV2.SharedClient,
null,
restClient.SpotApiV2.SharedClient,
socketClient.SpotApiV2.SharedClient,
restClient.SpotApiV2.SharedClient,
socketClient.SpotApiV2.SharedClient,
socketClient.SpotApiV2.SharedClient,
userIdentifier,
config ?? new SpotUserDataTrackerConfig())
{
}
}

/// <inheritdoc />
public class BitgetUserFuturesDataTracker : UserFuturesDataTracker
{
/// <inheritdoc />
protected override bool WebsocketPositionUpdatesAreFullSnapshots => false;

/// <summary>
/// ctor
/// </summary>
public BitgetUserFuturesDataTracker(
ILogger<BitgetUserFuturesDataTracker> logger,
IBitgetRestClient restClient,
IBitgetSocketClient socketClient,
string? userIdentifier,
FuturesUserDataTrackerConfig? config,
ExchangeParameters exchangeParameters) : base(logger,
restClient.FuturesApiV2.SharedClient,
null,
restClient.FuturesApiV2.SharedClient,
socketClient.FuturesApiV2.SharedClient,
restClient.FuturesApiV2.SharedClient,
socketClient.FuturesApiV2.SharedClient,
socketClient.FuturesApiV2.SharedClient,
socketClient.FuturesApiV2.SharedClient,
userIdentifier,
config ?? new FuturesUserDataTrackerConfig())
{
}
}
}
4 changes: 2 additions & 2 deletions Bitget.Net/Clients/BitgetUserClientProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public void ClearUserClients(string userIdentifier)
/// <inheritdoc />
public IBitgetRestClient GetRestClient(string userIdentifier, ApiCredentials? credentials = null, BitgetEnvironment? environment = null)
{
if (!_restClients.TryGetValue(userIdentifier, out var client))
if (!_restClients.TryGetValue(userIdentifier, out var client) || client.Disposed)
client = CreateRestClient(userIdentifier, credentials, environment);

return client;
Expand All @@ -71,7 +71,7 @@ public IBitgetRestClient GetRestClient(string userIdentifier, ApiCredentials? cr
/// <inheritdoc />
public IBitgetSocketClient GetSocketClient(string userIdentifier, ApiCredentials? credentials = null, BitgetEnvironment? environment = null)
{
if (!_socketClients.TryGetValue(userIdentifier, out var client))
if (!_socketClients.TryGetValue(userIdentifier, out var client) || client.Disposed)
client = CreateSocketClient(userIdentifier, credentials, environment);

return client;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,44 @@ async Task<ExchangeWebResult<SharedFuturesSymbol[]>> IFuturesSymbolRestClient.Ge
return response;
}

async Task<ExchangeResult<SharedSymbol[]>> IFuturesSymbolRestClient.GetFuturesSymbolsForBaseAssetAsync(string baseAsset)
{
if (!ExchangeSymbolCache.HasCached(_topicId))
{
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
if (!symbols)
return new ExchangeResult<SharedSymbol[]>(Exchange, symbols.Error!);
}

return new ExchangeResult<SharedSymbol[]>(Exchange, ExchangeSymbolCache.GetSymbolsForBaseAsset(_topicId, baseAsset));
}

async Task<ExchangeResult<bool>> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(SharedSymbol symbol)
{
if (symbol.TradingMode == TradingMode.Spot)
throw new ArgumentException(nameof(symbol), "Spot symbols not allowed");

if (!ExchangeSymbolCache.HasCached(_topicId))
{
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
if (!symbols)
return new ExchangeResult<bool>(Exchange, symbols.Error!);
}

return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbol));
}

async Task<ExchangeResult<bool>> IFuturesSymbolRestClient.SupportsFuturesSymbolAsync(string symbolName)
{
if (!ExchangeSymbolCache.HasCached(_topicId))
{
var symbols = await ((IFuturesSymbolRestClient)this).GetFuturesSymbolsAsync(new GetSymbolsRequest()).ConfigureAwait(false);
if (!symbols)
return new ExchangeResult<bool>(Exchange, symbols.Error!);
}

return new ExchangeResult<bool>(Exchange, ExchangeSymbolCache.SupportsSymbol(_topicId, symbolName));
}
#endregion

#region Klines client
Expand Down Expand Up @@ -958,6 +996,7 @@ async Task<ExchangeWebResult<SharedPosition[]>> IFuturesOrderRestClient.GetPosit
LiquidationPrice = x.LiquidationPrice,
AverageOpenPrice = x.AverageOpenPrice,
Leverage = x.Leverage,
PositionMode = x.PositionSide == PositionSide.Oneway ? SharedPositionMode.OneWay : SharedPositionMode.HedgeMode,
PositionSide = x.PositionSide == PositionSide.Short ? SharedPositionSide.Short : SharedPositionSide.Long
}).ToArray());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,6 @@ async Task<ExchangeResult<UpdateSubscription>> IBalanceSocketClient.SubscribeToB
var result = await SubscribeToBalanceUpdatesAsync(
productType,
update => {
if (update.UpdateType == SocketUpdateType.Snapshot)
return;

handler(update.ToType(update.Data.Select(x => new SharedBalance(x.MarginAsset, x.Available, x.Equity)).ToArray()));
},
ct: ct).ConfigureAwait(false);
Expand Down Expand Up @@ -358,6 +355,7 @@ async Task<ExchangeResult<UpdateSubscription>> IPositionSocketClient.SubscribeTo
handler(update.ToType<SharedPosition[]>(update.Data.Select(x => new SharedPosition(ExchangeSymbolCache.ParseSymbol(_topicId, x.Symbol), x.Symbol, x.Total, x.UpdateTime)
{
AverageOpenPrice = x.AverageOpenPrice,
PositionMode = x.PositionSide == PositionSide.Oneway ? SharedPositionMode.OneWay : SharedPositionMode.HedgeMode,
PositionSide = x.PositionSide == PositionSide.Short ? SharedPositionSide.Short : SharedPositionSide.Long,
UnrealizedPnl = x.UnrealizedProfitAndLoss,
Leverage = x.Leverage,
Expand Down
Loading