Skip to content

Commit f5aa06e

Browse files
authored
Added UsdtFuturesV5Api Rest+Socket client (#154)
1 parent 6eb0d2b commit f5aa06e

55 files changed

Lines changed: 2888 additions & 9 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

HTX.Net/Clients/HTXRestClient.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using CryptoExchange.Net.Clients;
66
using HTX.Net.Interfaces.Clients.UsdtFuturesApi;
77
using HTX.Net.Clients.UsdtFutures;
8+
using HTX.Net.Clients.UsdtFuturesV5;
9+
using HTX.Net.Interfaces.Clients.UsdtFuturesV5Api;
810
using Microsoft.Extensions.Options;
911
using CryptoExchange.Net.Objects.Options;
1012

@@ -21,6 +23,9 @@ public class HTXRestClient : BaseRestClient<HTXEnvironment, HTXCredentials>, IHT
2123
/// <inheritdoc />
2224
public IHTXRestClientUsdtFuturesApi UsdtFuturesApi { get; }
2325

26+
/// <inheritdoc />
27+
public IHTXRestClientUsdtFuturesV5Api UsdtFuturesV5Api { get; }
28+
2429
#endregion
2530

2631
#region constructor/destructor
@@ -46,6 +51,7 @@ public HTXRestClient(HttpClient? httpClient, ILoggerFactory? loggerFactory, IOpt
4651

4752
SpotApi = AddApiClient(new HTXRestClientSpotApi(_logger, httpClient, options.Value));
4853
UsdtFuturesApi = AddApiClient(new HTXRestClientUsdtFuturesApi(_logger, httpClient, options.Value));
54+
UsdtFuturesV5Api = AddApiClient(new HTXRestClientUsdtFuturesV5Api(_logger, httpClient, options.Value));
4955
}
5056
#endregion
5157

HTX.Net/Clients/HTXSocketClient.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
using CryptoExchange.Net.Objects.Options;
33
using HTX.Net.Clients.SpotApi;
44
using HTX.Net.Clients.UsdtFutures;
5+
using HTX.Net.Clients.UsdtFuturesV5;
56
using HTX.Net.Interfaces.Clients;
67
using HTX.Net.Interfaces.Clients.SpotApi;
78
using HTX.Net.Interfaces.Clients.UsdtFuturesApi;
9+
using HTX.Net.Interfaces.Clients.UsdtFuturesV5Api;
810
using HTX.Net.Objects.Options;
911
using Microsoft.Extensions.Options;
1012

@@ -18,6 +20,8 @@ public class HTXSocketClient : BaseSocketClient<HTXEnvironment, HTXCredentials>,
1820
public IHTXSocketClientSpotApi SpotApi { get; }
1921
/// <inheritdoc />
2022
public IHTXSocketClientUsdtFuturesApi UsdtFuturesApi { get; }
23+
/// <inheritdoc />
24+
public IHTXSocketClientUsdtFuturesV5Api UsdtFuturesV5Api { get; }
2125
#endregion
2226

2327
#region ctor
@@ -42,6 +46,7 @@ public HTXSocketClient(IOptions<HTXSocketOptions> options, ILoggerFactory? logge
4246

4347
SpotApi = AddApiClient(new HTXSocketClientSpotApi(_logger, options.Value));
4448
UsdtFuturesApi = AddApiClient(new HTXSocketClientUsdtFuturesApi(_logger, options.Value));
49+
UsdtFuturesV5Api = AddApiClient(new HTXSocketClientUsdtFuturesV5Api(_logger, options.Value));
4550
}
4651
#endregion
4752

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using CryptoExchange.Net.Clients;
2+
using CryptoExchange.Net.Converters.MessageParsing;
3+
using CryptoExchange.Net.Converters.MessageParsing.DynamicConverters;
4+
using CryptoExchange.Net.Objects.Errors;
5+
using CryptoExchange.Net.SharedApis;
6+
using HTX.Net.Clients.MessageHandlers;
7+
using HTX.Net.Interfaces.Clients.UsdtFuturesV5Api;
8+
using HTX.Net.Objects.Internal;
9+
using HTX.Net.Objects.Options;
10+
11+
namespace HTX.Net.Clients.UsdtFuturesV5
12+
{
13+
/// <inheritdoc />
14+
internal partial class HTXRestClientUsdtFuturesV5Api : RestApiClient<HTXEnvironment, HTXAuthenticationProvider, HTXCredentials>, IHTXRestClientUsdtFuturesV5Api
15+
{
16+
/// <inheritdoc />
17+
public new HTXRestOptions ClientOptions => (HTXRestOptions)base.ClientOptions;
18+
19+
protected override ErrorMapping ErrorMapping => HTXErrors.FuturesMapping;
20+
21+
protected override IRestMessageHandler MessageHandler => new HTXRestMessageHandler(HTXErrors.FuturesMapping);
22+
23+
/// <inheritdoc />
24+
public string ExchangeName => "HTX";
25+
26+
#region Api clients
27+
28+
/// <inheritdoc />
29+
public IHTXRestClientUsdtFuturesV5ApiAccount Account { get; }
30+
/// <inheritdoc />
31+
public IHTXRestClientUsdtFuturesV5ApiExchangeData ExchangeData { get; }
32+
/// <inheritdoc />
33+
public IHTXRestClientUsdtFuturesV5ApiTrading Trading { get; }
34+
35+
#endregion
36+
37+
#region constructor/destructor
38+
internal HTXRestClientUsdtFuturesV5Api(ILogger log, HttpClient? httpClient, HTXRestOptions options)
39+
: base(log, httpClient, options.Environment.UsdtMarginSwapRestBaseAddress, options, options.UsdtFuturesV5Options)
40+
{
41+
Account = new HTXRestClientUsdtFuturesV5ApiAccount(this);
42+
ExchangeData = new HTXRestClientUsdtFuturesV5ApiExchangeData(this);
43+
Trading = new HTXRestClientUsdtFuturesV5ApiTrading(this);
44+
}
45+
#endregion
46+
47+
protected override IMessageSerializer CreateSerializer() => new SystemTextJsonMessageSerializer(SerializerOptions.WithConverters(HTXExchange._serializerContext));
48+
49+
/// <inheritdoc />
50+
public override string FormatSymbol(string baseAsset, string quoteAsset, TradingMode tradingMode, DateTime? deliverTime = null)
51+
=> HTXExchange.FormatSymbol(baseAsset, quoteAsset, tradingMode, deliverTime);
52+
53+
/// <inheritdoc />
54+
protected override HTXAuthenticationProvider CreateAuthenticationProvider(HTXCredentials credentials)
55+
=> new HTXAuthenticationProvider(credentials, ClientOptions.SignPublicRequests);
56+
57+
internal Task<WebCallResult<T>> SendAsync<T>(RequestDefinition definition, ParameterCollection? parameters, CancellationToken cancellationToken, int? weight = null)
58+
where T : class
59+
=> SendToAddressAsync<T>(BaseAddress, definition, parameters, cancellationToken, weight);
60+
61+
internal async Task<WebCallResult<T>> SendToAddressAsync<T>(string baseAddress, RequestDefinition definition, ParameterCollection? parameters, CancellationToken cancellationToken, int? weight = null)
62+
where T : class
63+
{
64+
var result = await base.SendAsync<HTXApiResponseV2<T>>(baseAddress, definition, parameters, cancellationToken, null, weight).ConfigureAwait(false);
65+
if (!result || result.Data == null)
66+
return result.AsError<T>(result.Error!);
67+
68+
if (result.Data.Code != 200)
69+
return result.AsError<T>(new ServerError(result.Data.Code, GetErrorInfo(result.Data.Code, result.Data.Message)));
70+
71+
return result.As(result.Data.Data);
72+
}
73+
74+
/// <inheritdoc />
75+
protected override Task<WebCallResult<DateTime>> GetServerTimestampAsync()
76+
=> Task.FromResult(new WebCallResult<DateTime>(null, null, null, null, null, null, null, null, null, null, null, ResultDataSource.Server, DateTime.UtcNow, null));
77+
}
78+
}
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
using HTX.Net.Enums;
2+
using HTX.Net.Interfaces.Clients.UsdtFuturesV5Api;
3+
using HTX.Net.Objects.Models.UsdtFuturesV5;
4+
5+
namespace HTX.Net.Clients.UsdtFuturesV5
6+
{
7+
/// <inheritdoc />
8+
internal class HTXRestClientUsdtFuturesV5ApiAccount : IHTXRestClientUsdtFuturesV5ApiAccount
9+
{
10+
private static readonly RequestDefinitionCache _definitions = new RequestDefinitionCache();
11+
private readonly HTXRestClientUsdtFuturesV5Api _baseClient;
12+
13+
internal HTXRestClientUsdtFuturesV5ApiAccount(HTXRestClientUsdtFuturesV5Api baseClient)
14+
{
15+
_baseClient = baseClient;
16+
}
17+
18+
#region Get Asset Mode
19+
20+
/// <inheritdoc />
21+
public async Task<WebCallResult<HTXAssetModeV5>> GetAssetModeAsync(CancellationToken ct = default)
22+
{
23+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/account/asset_mode", HTXExchange.RateLimiter.UsdtRead, 1, true);
24+
return await _baseClient.SendAsync<HTXAssetModeV5>(request, null, ct).ConfigureAwait(false);
25+
}
26+
27+
#endregion
28+
29+
#region Set Asset Mode
30+
31+
/// <inheritdoc />
32+
public async Task<WebCallResult<HTXAssetModeUpdateV5>> SetAssetModeAsync(AssetMode assetMode, CancellationToken ct = default)
33+
{
34+
var parameters = new ParameterCollection
35+
{
36+
{ "assets_mode", EnumConverter.GetString(assetMode) }
37+
};
38+
var request = _definitions.GetOrCreate(HttpMethod.Post, "/v5/account/asset_mode", HTXExchange.RateLimiter.UsdtTrade, 1, true);
39+
return await _baseClient.SendAsync<HTXAssetModeUpdateV5>(request, parameters, ct).ConfigureAwait(false);
40+
}
41+
42+
#endregion
43+
44+
#region Get Account Balance
45+
46+
/// <inheritdoc />
47+
public async Task<WebCallResult<HTXAccountBalanceV5>> GetAccountBalanceAsync(CancellationToken ct = default)
48+
{
49+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/account/balance", HTXExchange.RateLimiter.UsdtRead, 1, true);
50+
return await _baseClient.SendAsync<HTXAccountBalanceV5>(request, null, ct).ConfigureAwait(false);
51+
}
52+
53+
#endregion
54+
55+
#region Get Bills
56+
57+
/// <inheritdoc />
58+
public async Task<WebCallResult<HTXBillV5[]>> GetBillsAsync(string? contractCode = null, MarginMode? marginMode = null, IEnumerable<FinancialRecordType>? types = null, DateTime? startTime = null, DateTime? endTime = null, long? fromId = null, int? limit = null, FilterDirection? direction = null, CancellationToken ct = default)
59+
{
60+
var parameters = new ParameterCollection();
61+
parameters.AddOptionalParameter("contract_code", contractCode);
62+
parameters.AddOptionalEnum("margin_mode", marginMode);
63+
parameters.AddOptionalParameter("type", types == null ? null : string.Join(",", types.Select(EnumConverter.GetString)));
64+
parameters.AddOptionalMillisecondsString("start_time", startTime);
65+
parameters.AddOptionalMillisecondsString("end_time", endTime);
66+
parameters.AddOptionalParameter("from", fromId);
67+
parameters.AddOptionalParameter("limit", limit);
68+
parameters.AddOptionalEnum("direct", direction);
69+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/account/bills", HTXExchange.RateLimiter.UsdtRead, 1, true);
70+
return await _baseClient.SendAsync<HTXBillV5[]>(request, parameters, ct).ConfigureAwait(false);
71+
}
72+
73+
#endregion
74+
75+
#region Get Position Mode
76+
77+
/// <inheritdoc />
78+
public async Task<WebCallResult<HTXPositionModeV5>> GetPositionModeAsync(CancellationToken ct = default)
79+
{
80+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/position/mode", HTXExchange.RateLimiter.UsdtRead, 1, true);
81+
return await _baseClient.SendAsync<HTXPositionModeV5>(request, null, ct).ConfigureAwait(false);
82+
}
83+
84+
#endregion
85+
86+
#region Set Position Mode
87+
88+
/// <inheritdoc />
89+
public async Task<WebCallResult<HTXPositionModeV5>> SetPositionModeAsync(PositionMode positionMode, CancellationToken ct = default)
90+
{
91+
var parameters = new ParameterCollection
92+
{
93+
{ "position_mode", EnumConverter.GetString(positionMode) }
94+
};
95+
var request = _definitions.GetOrCreate(HttpMethod.Post, "/v5/position/mode", HTXExchange.RateLimiter.UsdtTrade, 1, true);
96+
return await _baseClient.SendAsync<HTXPositionModeV5>(request, parameters, ct).ConfigureAwait(false);
97+
}
98+
99+
#endregion
100+
101+
#region Get Leverage
102+
103+
/// <inheritdoc />
104+
public async Task<WebCallResult<HTXLeverageV5[]>> GetLeverageAsync(string? contractCode = null, MarginMode? marginMode = null, FuturesPositionSide? positionSide = null, CancellationToken ct = default)
105+
{
106+
var parameters = new ParameterCollection();
107+
parameters.AddOptionalParameter("contract_code", contractCode);
108+
parameters.AddOptionalEnum("margin_mode", marginMode);
109+
parameters.AddOptionalEnum("position_side", positionSide);
110+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/position/lever", HTXExchange.RateLimiter.UsdtRead, 1, true);
111+
return await _baseClient.SendAsync<HTXLeverageV5[]>(request, parameters, ct).ConfigureAwait(false);
112+
}
113+
114+
#endregion
115+
116+
#region Set Leverage
117+
118+
/// <inheritdoc />
119+
public async Task<WebCallResult<HTXLeverageV5>> SetLeverageAsync(string contractCode, MarginMode marginMode, int leverageRate, FuturesPositionSide? positionSide = null, CancellationToken ct = default)
120+
{
121+
var parameters = new ParameterCollection
122+
{
123+
{ "contract_code", contractCode },
124+
{ "lever_rate", leverageRate }
125+
};
126+
parameters.AddEnum("margin_mode", marginMode);
127+
parameters.AddOptionalEnum("position_side", positionSide);
128+
var request = _definitions.GetOrCreate(HttpMethod.Post, "/v5/position/lever", HTXExchange.RateLimiter.UsdtTrade, 1, true);
129+
return await _baseClient.SendAsync<HTXLeverageV5>(request, parameters, ct).ConfigureAwait(false);
130+
}
131+
132+
#endregion
133+
134+
#region Get Open Positions
135+
136+
/// <inheritdoc />
137+
public async Task<WebCallResult<HTXPositionV5[]>> GetOpenPositionsAsync(string? contractCode = null, CancellationToken ct = default)
138+
{
139+
var parameters = new ParameterCollection();
140+
parameters.AddOptionalParameter("contract_code", contractCode);
141+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/trade/position/opens", HTXExchange.RateLimiter.UsdtRead, 1, true);
142+
return await _baseClient.SendAsync<HTXPositionV5[]>(request, parameters, ct).ConfigureAwait(false);
143+
}
144+
145+
#endregion
146+
147+
#region Get Risk Limits
148+
149+
/// <inheritdoc />
150+
public async Task<WebCallResult<HTXPositionRiskLimitV5[]>> GetRiskLimitsAsync(string? contractCode = null, MarginMode? marginMode = null, FuturesPositionSide? positionSide = null, CancellationToken ct = default)
151+
{
152+
var parameters = new ParameterCollection();
153+
parameters.AddOptionalParameter("contract_code", contractCode);
154+
parameters.AddOptionalEnum("margin_mode", marginMode);
155+
parameters.AddOptionalEnum("position_side", positionSide);
156+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/position/risk/limit", HTXExchange.RateLimiter.UsdtRead, 1, true);
157+
return await _baseClient.SendAsync<HTXPositionRiskLimitV5[]>(request, parameters, ct).ConfigureAwait(false);
158+
}
159+
160+
#endregion
161+
}
162+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using HTX.Net.Enums;
2+
using HTX.Net.Interfaces.Clients.UsdtFuturesV5Api;
3+
using HTX.Net.Objects.Models.UsdtFuturesV5;
4+
5+
namespace HTX.Net.Clients.UsdtFuturesV5
6+
{
7+
/// <inheritdoc />
8+
internal class HTXRestClientUsdtFuturesV5ApiExchangeData : IHTXRestClientUsdtFuturesV5ApiExchangeData
9+
{
10+
private static readonly RequestDefinitionCache _definitions = new RequestDefinitionCache();
11+
private readonly HTXRestClientUsdtFuturesV5Api _baseClient;
12+
13+
internal HTXRestClientUsdtFuturesV5ApiExchangeData(HTXRestClientUsdtFuturesV5Api baseClient)
14+
{
15+
_baseClient = baseClient;
16+
}
17+
18+
#region Get Funding Rate
19+
20+
/// <inheritdoc />
21+
public async Task<WebCallResult<HTXFundingRateV5>> GetFundingRateAsync(string contractCode, CancellationToken ct = default)
22+
{
23+
var parameters = new ParameterCollection
24+
{
25+
{ "contract_code", contractCode }
26+
};
27+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/market/funding_rate", HTXExchange.RateLimiter.UsdtRead, 1, false);
28+
return await _baseClient.SendAsync<HTXFundingRateV5>(request, parameters, ct).ConfigureAwait(false);
29+
}
30+
31+
#endregion
32+
33+
#region Get Funding Rate History
34+
35+
/// <inheritdoc />
36+
public async Task<WebCallResult<HTXFundingRateHistoryV5[]>> GetFundingRateHistoryAsync(string contractCode, DateTime? startTime = null, DateTime? endTime = null, long? fromId = null, int? limit = null, FilterDirection? direction = null, CancellationToken ct = default)
37+
{
38+
var parameters = new ParameterCollection
39+
{
40+
{ "contract_code", contractCode }
41+
};
42+
parameters.AddOptionalMillisecondsString("start_time", startTime);
43+
parameters.AddOptionalMillisecondsString("end_time", endTime);
44+
parameters.AddOptionalParameter("from", fromId);
45+
parameters.AddOptionalParameter("limit", limit);
46+
parameters.AddOptionalEnum("direct", direction);
47+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/market/funding_rate_history", HTXExchange.RateLimiter.UsdtRead, 1, false);
48+
return await _baseClient.SendAsync<HTXFundingRateHistoryV5[]>(request, parameters, ct).ConfigureAwait(false);
49+
}
50+
51+
#endregion
52+
53+
#region Get Open Interest
54+
55+
/// <inheritdoc />
56+
public async Task<WebCallResult<HTXOpenInterestV5>> GetOpenInterestAsync(string contractCode, CancellationToken ct = default)
57+
{
58+
var parameters = new ParameterCollection
59+
{
60+
{ "contract_code", contractCode }
61+
};
62+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/market/open_interest", HTXExchange.RateLimiter.UsdtRead, 1, false);
63+
return await _baseClient.SendAsync<HTXOpenInterestV5>(request, parameters, ct).ConfigureAwait(false);
64+
}
65+
66+
#endregion
67+
68+
#region Get Price Limits
69+
70+
/// <inheritdoc />
71+
public async Task<WebCallResult<HTXPriceLimitV5[]>> GetPriceLimitsAsync(string? contractCode = null, CancellationToken ct = default)
72+
{
73+
var parameters = new ParameterCollection();
74+
parameters.AddOptionalParameter("contract_code", contractCode);
75+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/market/price_limit", HTXExchange.RateLimiter.UsdtRead, 1, false);
76+
return await _baseClient.SendAsync<HTXPriceLimitV5[]>(request, parameters, ct).ConfigureAwait(false);
77+
}
78+
79+
#endregion
80+
81+
#region Get Risk Limits
82+
83+
/// <inheritdoc />
84+
public async Task<WebCallResult<HTXRiskLimitV5[]>> GetRiskLimitsAsync(string contractCode, MarginMode? marginMode = null, string? tier = null, CancellationToken ct = default)
85+
{
86+
var parameters = new ParameterCollection
87+
{
88+
{ "contract_code", contractCode }
89+
};
90+
parameters.AddOptionalEnum("margin_mode", marginMode);
91+
parameters.AddOptionalParameter("tier", tier);
92+
var request = _definitions.GetOrCreate(HttpMethod.Get, "/v5/market/risk/limit", HTXExchange.RateLimiter.UsdtRead, 1, false);
93+
return await _baseClient.SendAsync<HTXRiskLimitV5[]>(request, parameters, ct).ConfigureAwait(false);
94+
}
95+
96+
#endregion
97+
}
98+
}

0 commit comments

Comments
 (0)