mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2026-02-16 14:13:46 +00:00
Updated symbol tracking logic on UserDataTracker, added check for startTime filter for polling being to close to current time
This commit is contained in:
parent
f39d9f7cfb
commit
1471a4733f
@ -16,13 +16,6 @@ namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
bool Connected { get; }
|
bool Connected { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Currently tracked symbols. Data for these symbols will be requested when polling.
|
|
||||||
/// Websocket updates will be available for all symbols regardless.
|
|
||||||
/// When new data is received for a symbol which is not yet being tracked it will be added to this list and polled in the future unless the `OnlyTrackProvidedSymbols` option is set in the configuration.
|
|
||||||
/// </summary>
|
|
||||||
IEnumerable<SharedSymbol> TrackedSymbols { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// On connection status change. Might trigger multiple times with the same status depending on the underlying subscriptions.
|
/// On connection status change. Might trigger multiple times with the same status depending on the underlying subscriptions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
using CryptoExchange.Net.SharedApis;
|
using CryptoExchange.Net.SharedApis;
|
||||||
using CryptoExchange.Net.Trackers.UserData.Objects;
|
using CryptoExchange.Net.Trackers.UserData.Objects;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
||||||
@ -26,6 +27,13 @@ namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Exchange { get; }
|
public string Exchange { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Currently tracked symbols. Data for these symbols will be requested when polling.
|
||||||
|
/// Websocket updates will be available for all symbols regardless.
|
||||||
|
/// When new data is received for a symbol which is not yet being tracked it will be added to this list and polled in the future unless the `OnlyTrackProvidedSymbols` option is set in the configuration.
|
||||||
|
/// </summary>
|
||||||
|
IEnumerable<SharedSymbol> TrackedSymbols { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Balances tracker
|
/// Balances tracker
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
using CryptoExchange.Net.SharedApis;
|
using CryptoExchange.Net.SharedApis;
|
||||||
using CryptoExchange.Net.Trackers.UserData.Objects;
|
using CryptoExchange.Net.Trackers.UserData.Objects;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
||||||
@ -26,6 +27,13 @@ namespace CryptoExchange.Net.Trackers.UserData.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Exchange { get; }
|
public string Exchange { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Currently tracked symbols. Data for these symbols will be requested when polling.
|
||||||
|
/// Websocket updates will be available for all symbols regardless.
|
||||||
|
/// When new data is received for a symbol which is not yet being tracked it will be added to this list and polled in the future unless the `OnlyTrackProvidedSymbols` option is set in the configuration.
|
||||||
|
/// </summary>
|
||||||
|
IEnumerable<SharedSymbol> TrackedSymbols { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Balances tracker
|
/// Balances tracker
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -22,12 +22,13 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public BalanceTracker(
|
public BalanceTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
IBalanceRestClient restClient,
|
IBalanceRestClient restClient,
|
||||||
IBalanceSocketClient? socketClient,
|
IBalanceSocketClient? socketClient,
|
||||||
SharedAccountType accountType,
|
SharedAccountType accountType,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Balances, restClient.Exchange, config, false, null)
|
) : base(logger, symbolTracker, UserDataType.Balances, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
|
|||||||
@ -28,13 +28,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public FuturesOrderTracker(
|
public FuturesOrderTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
IFuturesOrderRestClient restClient,
|
IFuturesOrderRestClient restClient,
|
||||||
IFuturesOrderSocketClient? socketClient,
|
IFuturesOrderSocketClient? socketClient,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
IEnumerable<SharedSymbol> symbols,
|
IEnumerable<SharedSymbol> symbols,
|
||||||
bool onlyTrackProvidedSymbols,
|
bool onlyTrackProvidedSymbols,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Orders, restClient.Exchange, config, onlyTrackProvidedSymbols, symbols)
|
) : base(logger, symbolTracker, UserDataType.Orders, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
@ -234,7 +235,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (var symbol in _symbols.ToList())
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
var openOrdersResult = await _restClient.GetOpenFuturesOrdersAsync(new GetOpenOrdersRequest(symbol, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
var openOrdersResult = await _restClient.GetOpenFuturesOrdersAsync(new GetOpenOrdersRequest(symbol, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
||||||
if (!openOrdersResult.Success)
|
if (!openOrdersResult.Success)
|
||||||
@ -272,7 +273,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
}
|
}
|
||||||
|
|
||||||
var updatedPollTime = DateTime.UtcNow;
|
var updatedPollTime = DateTime.UtcNow;
|
||||||
foreach (var symbol in _symbols.ToList())
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
DateTime? fromTimeOrders = GetClosedOrdersRequestStartTime(symbol);
|
DateTime? fromTimeOrders = GetClosedOrdersRequestStartTime(symbol);
|
||||||
|
|
||||||
@ -373,7 +374,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
source = "StartTime";
|
source = "StartTime";
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
if (DateTime.UtcNow - fromTime < TimeSpan.FromSeconds(1))
|
||||||
|
{
|
||||||
|
// Set it to at least a seconds in the past to prevent issues
|
||||||
|
fromTime = DateTime.UtcNow.AddSeconds(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogTrace("{DataType}.{Symbol} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}",
|
||||||
|
DataType, $"{symbol.BaseAsset}/{symbol.QuoteAsset}", source, fromTime);
|
||||||
return fromTime!.Value;
|
return fromTime!.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,13 +26,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public FuturesUserTradeTracker(
|
public FuturesUserTradeTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
IFuturesOrderRestClient restClient,
|
IFuturesOrderRestClient restClient,
|
||||||
IUserTradeSocketClient? socketClient,
|
IUserTradeSocketClient? socketClient,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
IEnumerable<SharedSymbol> symbols,
|
IEnumerable<SharedSymbol> symbols,
|
||||||
bool onlyTrackProvidedSymbols,
|
bool onlyTrackProvidedSymbols,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Trades, restClient.Exchange, config, onlyTrackProvidedSymbols, symbols)
|
) : base(logger, symbolTracker, UserDataType.Trades, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
@ -57,7 +58,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
var anyError = false;
|
var anyError = false;
|
||||||
var fromTimeTrades = GetTradesRequestStartTime();
|
var fromTimeTrades = GetTradesRequestStartTime();
|
||||||
var updatedPollTime = DateTime.UtcNow;
|
var updatedPollTime = DateTime.UtcNow;
|
||||||
foreach (var symbol in _symbols)
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
var tradesResult = await _restClient.GetFuturesUserTradesAsync(new GetUserTradesRequest(symbol, startTime: fromTimeTrades, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
var tradesResult = await _restClient.GetFuturesUserTradesAsync(new GetUserTradesRequest(symbol, startTime: fromTimeTrades, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
||||||
if (!tradesResult.Success)
|
if (!tradesResult.Success)
|
||||||
@ -116,6 +117,13 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
source = "StartTime";
|
source = "StartTime";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var now = DateTime.UtcNow;
|
||||||
|
if (now - fromTime < TimeSpan.FromSeconds(1))
|
||||||
|
{
|
||||||
|
// Set it to at least a seconds in the past to prevent issues
|
||||||
|
fromTime = now.AddSeconds(-1);
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
||||||
return fromTime!.Value;
|
return fromTime!.Value;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public PositionTracker(
|
public PositionTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
IFuturesOrderRestClient restClient,
|
IFuturesOrderRestClient restClient,
|
||||||
IPositionSocketClient? socketClient,
|
IPositionSocketClient? socketClient,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
@ -36,7 +37,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
bool onlyTrackProvidedSymbols,
|
bool onlyTrackProvidedSymbols,
|
||||||
bool websocketPositionUpdatesAreFullSnapshots,
|
bool websocketPositionUpdatesAreFullSnapshots,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Positions, restClient.Exchange, config, onlyTrackProvidedSymbols, symbols)
|
) : base(logger, symbolTracker, UserDataType.Positions, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
@ -118,9 +119,9 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
{
|
{
|
||||||
toRemove ??= new List<SharedPosition>();
|
toRemove ??= new List<SharedPosition>();
|
||||||
toRemove.Add(item);
|
toRemove.Add(item);
|
||||||
|
_logger.LogWarning("Ignoring {DataType} update for {Key}, no SharedSymbol set", DataType, GetKey(item));
|
||||||
}
|
}
|
||||||
else if (_onlyTrackProvidedSymbols
|
else if (!_symbolTracker.ShouldProcess(symbolModel.SharedSymbol))
|
||||||
&& !_symbols.Any(y => y.TradingMode == symbolModel.SharedSymbol!.TradingMode && y.BaseAsset == symbolModel.SharedSymbol.BaseAsset && y.QuoteAsset == symbolModel.SharedSymbol.QuoteAsset))
|
|
||||||
{
|
{
|
||||||
toRemove ??= new List<SharedPosition>();
|
toRemove ??= new List<SharedPosition>();
|
||||||
toRemove.Add(item);
|
toRemove.Add(item);
|
||||||
@ -131,8 +132,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
if (toRemove != null)
|
if (toRemove != null)
|
||||||
@event = @event.Except(toRemove).ToArray();
|
@event = @event.Except(toRemove).ToArray();
|
||||||
|
|
||||||
if (!_onlyTrackProvidedSymbols)
|
_symbolTracker.UpdateTrackedSymbols(@event.Where(x => x.PositionSize > 0).OfType<SharedSymbolModel>().Select(x => x.SharedSymbol!));
|
||||||
UpdateSymbolsList(@event.Where(x => x.PositionSize > 0).OfType<SharedSymbolModel>().Select(x => x.SharedSymbol!));
|
|
||||||
|
|
||||||
|
|
||||||
// Update local store
|
// Update local store
|
||||||
|
|||||||
@ -28,13 +28,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SpotOrderTracker(
|
public SpotOrderTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
ISpotOrderRestClient restClient,
|
ISpotOrderRestClient restClient,
|
||||||
ISpotOrderSocketClient? socketClient,
|
ISpotOrderSocketClient? socketClient,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
IEnumerable<SharedSymbol> symbols,
|
IEnumerable<SharedSymbol> symbols,
|
||||||
bool onlyTrackProvidedSymbols,
|
bool onlyTrackProvidedSymbols,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Orders, restClient.Exchange, config, onlyTrackProvidedSymbols, symbols)
|
) : base(logger, symbolTracker, UserDataType.Orders, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
@ -245,7 +246,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach (var symbol in _symbols.ToList())
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
var openOrdersResult = await _restClient.GetOpenSpotOrdersAsync(new GetOpenOrdersRequest(symbol, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
var openOrdersResult = await _restClient.GetOpenSpotOrdersAsync(new GetOpenOrdersRequest(symbol, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
||||||
if (!openOrdersResult.Success)
|
if (!openOrdersResult.Success)
|
||||||
@ -283,7 +284,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
}
|
}
|
||||||
|
|
||||||
var updatedPollTime = DateTime.UtcNow;
|
var updatedPollTime = DateTime.UtcNow;
|
||||||
foreach (var symbol in _symbols.ToList())
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
DateTime? fromTimeOrders = GetClosedOrdersRequestStartTime(symbol);
|
DateTime? fromTimeOrders = GetClosedOrdersRequestStartTime(symbol);
|
||||||
|
|
||||||
@ -385,7 +386,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
source = "StartTime";
|
source = "StartTime";
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
if (DateTime.UtcNow - fromTime < TimeSpan.FromSeconds(1))
|
||||||
|
{
|
||||||
|
// Set it to at least a seconds in the past to prevent issues
|
||||||
|
fromTime = DateTime.UtcNow.AddSeconds(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogTrace("{DataType}.{Symbol} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}",
|
||||||
|
DataType, $"{symbol.BaseAsset}/{symbol.QuoteAsset}", source, fromTime);
|
||||||
return fromTime!.Value;
|
return fromTime!.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,13 +26,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SpotUserTradeTracker(
|
public SpotUserTradeTracker(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
ISpotOrderRestClient restClient,
|
ISpotOrderRestClient restClient,
|
||||||
IUserTradeSocketClient? socketClient,
|
IUserTradeSocketClient? socketClient,
|
||||||
TrackerItemConfig config,
|
TrackerItemConfig config,
|
||||||
IEnumerable<SharedSymbol> symbols,
|
IEnumerable<SharedSymbol> symbols,
|
||||||
bool onlyTrackProvidedSymbols,
|
bool onlyTrackProvidedSymbols,
|
||||||
ExchangeParameters? exchangeParameters = null
|
ExchangeParameters? exchangeParameters = null
|
||||||
) : base(logger, UserDataType.Trades, restClient.Exchange, config, onlyTrackProvidedSymbols, symbols)
|
) : base(logger, symbolTracker, UserDataType.Trades, restClient.Exchange, config)
|
||||||
{
|
{
|
||||||
if (_socketClient == null)
|
if (_socketClient == null)
|
||||||
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
config = config with { PollIntervalConnected = config.PollIntervalDisconnected };
|
||||||
@ -57,7 +58,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
var anyError = false;
|
var anyError = false;
|
||||||
var fromTimeTrades = GetTradesRequestStartTime();
|
var fromTimeTrades = GetTradesRequestStartTime();
|
||||||
var updatedPollTime = DateTime.UtcNow;
|
var updatedPollTime = DateTime.UtcNow;
|
||||||
foreach (var symbol in _symbols)
|
foreach (var symbol in _symbolTracker.GetTrackedSymbols())
|
||||||
{
|
{
|
||||||
var tradesResult = await _restClient.GetSpotUserTradesAsync(new GetUserTradesRequest(symbol, startTime: fromTimeTrades, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
var tradesResult = await _restClient.GetSpotUserTradesAsync(new GetUserTradesRequest(symbol, startTime: fromTimeTrades, exchangeParameters: _exchangeParameters)).ConfigureAwait(false);
|
||||||
if (!tradesResult.Success)
|
if (!tradesResult.Success)
|
||||||
@ -114,6 +115,12 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
source = "StartTime";
|
source = "StartTime";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DateTime.UtcNow - fromTime < TimeSpan.FromSeconds(1))
|
||||||
|
{
|
||||||
|
// Set it to at least a seconds in the past to prevent issues
|
||||||
|
fromTime = DateTime.UtcNow.AddSeconds(-1);
|
||||||
|
}
|
||||||
|
|
||||||
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
_logger.LogTrace("{DataType} UserDataTracker poll startTime filter based on {Source}: {Time:yyyy-MM-dd HH:mm:ss.fff}", DataType, source, fromTime);
|
||||||
return fromTime!.Value;
|
return fromTime!.Value;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -203,21 +203,14 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected ConcurrentDictionary<string, T> _store = new ConcurrentDictionary<string, T>(StringComparer.InvariantCultureIgnoreCase);
|
protected ConcurrentDictionary<string, T> _store = new ConcurrentDictionary<string, T>(StringComparer.InvariantCultureIgnoreCase);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tracked symbols list
|
|
||||||
/// </summary>
|
|
||||||
protected readonly List<SharedSymbol> _symbols;
|
|
||||||
/// <summary>
|
|
||||||
/// Symbol lock
|
|
||||||
/// </summary>
|
|
||||||
protected object _symbolLock = new object();
|
|
||||||
/// <summary>
|
|
||||||
/// Only track provided symbols setting
|
|
||||||
/// </summary>
|
|
||||||
protected bool _onlyTrackProvidedSymbols;
|
|
||||||
/// <summary>
|
|
||||||
/// Is SharedSymbol model
|
/// Is SharedSymbol model
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected bool _isSymbolModel;
|
protected bool _isSymbolModel;
|
||||||
|
/// <summary>
|
||||||
|
/// Symbol tracker
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
protected readonly UserDataSymbolTracker _symbolTracker;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public T[] Values
|
public T[] Values
|
||||||
@ -240,22 +233,23 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public event Func<UserDataUpdate<T[]>, Task>? OnUpdate;
|
public event Func<UserDataUpdate<T[]>, Task>? OnUpdate;
|
||||||
/// <inheritdoc />
|
|
||||||
public IEnumerable<SharedSymbol> TrackedSymbols => _symbols;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ctor
|
/// ctor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UserDataItemTracker(ILogger logger, UserDataType dataType, string exchange, TrackerItemConfig config, bool onlyTrackProvidedSymbols, IEnumerable<SharedSymbol>? symbols) : base(logger, dataType, exchange)
|
public UserDataItemTracker(
|
||||||
|
ILogger logger,
|
||||||
|
UserDataSymbolTracker symbolTracker,
|
||||||
|
UserDataType dataType,
|
||||||
|
string exchange,
|
||||||
|
TrackerItemConfig config) : base(logger, dataType, exchange)
|
||||||
{
|
{
|
||||||
_onlyTrackProvidedSymbols = onlyTrackProvidedSymbols;
|
|
||||||
_symbols = symbols?.ToList() ?? [];
|
|
||||||
|
|
||||||
_pollIntervalDisconnected = config.PollIntervalDisconnected;
|
_pollIntervalDisconnected = config.PollIntervalDisconnected;
|
||||||
_pollIntervalConnected = config.PollIntervalConnected;
|
_pollIntervalConnected = config.PollIntervalConnected;
|
||||||
_pollAtStart = config.PollAtStart;
|
_pollAtStart = config.PollAtStart;
|
||||||
_retentionTime = config is TrackerTimedItemConfig timeConfig ? timeConfig.RetentionTime : TimeSpan.MaxValue;
|
_retentionTime = config is TrackerTimedItemConfig timeConfig ? timeConfig.RetentionTime : TimeSpan.MaxValue;
|
||||||
_isSymbolModel = typeof(T).IsSubclassOf(typeof(SharedSymbolModel));
|
_isSymbolModel = typeof(T).IsSubclassOf(typeof(SharedSymbolModel));
|
||||||
|
_symbolTracker = symbolTracker;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -334,26 +328,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
/// Get the age of an item
|
/// Get the age of an item
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual TimeSpan GetAge(DateTime time, T item) => TimeSpan.Zero;
|
protected virtual TimeSpan GetAge(DateTime time, T item) => TimeSpan.Zero;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Update the tracked symbol list with potential new symbols
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="symbols"></param>
|
|
||||||
protected void UpdateSymbolsList(IEnumerable<SharedSymbol> symbols)
|
|
||||||
{
|
|
||||||
lock (_symbolLock)
|
|
||||||
{
|
|
||||||
foreach (var symbol in symbols.Distinct())
|
|
||||||
{
|
|
||||||
if (!_symbols.Any(x => x.TradingMode == symbol.TradingMode && x.BaseAsset == symbol.BaseAsset && x.QuoteAsset == symbol.QuoteAsset))
|
|
||||||
{
|
|
||||||
_symbols.Add(symbol);
|
|
||||||
_logger.LogDebug("Adding {BaseAsset}/{QuoteAsset} to symbol tracking list", symbol.BaseAsset, symbol.QuoteAsset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handle an update
|
/// Handle an update
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -374,8 +349,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
toRemove.Add(item);
|
toRemove.Add(item);
|
||||||
_logger.LogWarning("Ignoring {DataType} update for {Key}, no SharedSymbol set", DataType, GetKey(item));
|
_logger.LogWarning("Ignoring {DataType} update for {Key}, no SharedSymbol set", DataType, GetKey(item));
|
||||||
}
|
}
|
||||||
else if (_onlyTrackProvidedSymbols
|
else if (!_symbolTracker.ShouldProcess(symbolModel.SharedSymbol))
|
||||||
&& !_symbols.Any(y => y.TradingMode == symbolModel.SharedSymbol!.TradingMode && y.BaseAsset == symbolModel.SharedSymbol.BaseAsset && y.QuoteAsset == symbolModel.SharedSymbol.QuoteAsset))
|
|
||||||
{
|
{
|
||||||
toRemove ??= new List<T>();
|
toRemove ??= new List<T>();
|
||||||
toRemove.Add(item);
|
toRemove.Add(item);
|
||||||
@ -386,8 +360,7 @@ namespace CryptoExchange.Net.Trackers.UserData.ItemTrackers
|
|||||||
if (toRemove != null)
|
if (toRemove != null)
|
||||||
@event = @event.Except(toRemove).ToArray();
|
@event = @event.Except(toRemove).ToArray();
|
||||||
|
|
||||||
if (!_onlyTrackProvidedSymbols)
|
_symbolTracker.UpdateTrackedSymbols(@event.OfType<SharedSymbolModel>().Select(x => x.SharedSymbol!));
|
||||||
UpdateSymbolsList(@event.OfType<SharedSymbolModel>().Select(x => x.SharedSymbol!));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update local store
|
// Update local store
|
||||||
|
|||||||
@ -0,0 +1,60 @@
|
|||||||
|
using CryptoExchange.Net.SharedApis;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace CryptoExchange.Net.Trackers.UserData.Objects
|
||||||
|
{
|
||||||
|
public class UserDataSymbolTracker
|
||||||
|
{
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
private readonly List<SharedSymbol> _trackedSymbols;
|
||||||
|
private readonly bool _onlyTrackProvidedSymbols;
|
||||||
|
private readonly object _symbolLock = new object();
|
||||||
|
|
||||||
|
public UserDataSymbolTracker(ILogger logger, UserDataTrackerConfig config)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_trackedSymbols = config.TrackedSymbols?.ToList() ?? [];
|
||||||
|
_onlyTrackProvidedSymbols = config.OnlyTrackProvidedSymbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<SharedSymbol> GetTrackedSymbols()
|
||||||
|
{
|
||||||
|
lock (_symbolLock)
|
||||||
|
return _trackedSymbols.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ShouldProcess(SharedSymbol symbol)
|
||||||
|
{
|
||||||
|
if (!_onlyTrackProvidedSymbols)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return _trackedSymbols.Any(y => y.TradingMode == symbol!.TradingMode && y.BaseAsset == symbol.BaseAsset && y.QuoteAsset == symbol.QuoteAsset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update the tracked symbol list with potential new symbols
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="symbols"></param>
|
||||||
|
public void UpdateTrackedSymbols(IEnumerable<SharedSymbol> symbols)
|
||||||
|
{
|
||||||
|
if (_onlyTrackProvidedSymbols)
|
||||||
|
return;
|
||||||
|
|
||||||
|
lock (_symbolLock)
|
||||||
|
{
|
||||||
|
foreach (var symbol in symbols.Distinct())
|
||||||
|
{
|
||||||
|
if (!_trackedSymbols.Any(x => x.TradingMode == symbol.TradingMode && x.BaseAsset == symbol.BaseAsset && x.QuoteAsset == symbol.QuoteAsset))
|
||||||
|
{
|
||||||
|
_trackedSymbols.Add(symbol);
|
||||||
|
_logger.LogDebug("Adding {TradingMode}.{BaseAsset}/{QuoteAsset} to symbol tracking list", symbol.TradingMode, symbol.BaseAsset, symbol.QuoteAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
using CryptoExchange.Net.Objects;
|
using CryptoExchange.Net.Objects;
|
||||||
|
using CryptoExchange.Net.SharedApis;
|
||||||
using CryptoExchange.Net.Trackers.UserData.ItemTrackers;
|
using CryptoExchange.Net.Trackers.UserData.ItemTrackers;
|
||||||
using CryptoExchange.Net.Trackers.UserData.Objects;
|
using CryptoExchange.Net.Trackers.UserData.Objects;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
@ -33,6 +34,11 @@ namespace CryptoExchange.Net.Trackers.UserData
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected abstract UserDataItemTracker[] DataTrackers { get; }
|
protected abstract UserDataItemTracker[] DataTrackers { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Symbol tracker
|
||||||
|
/// </summary>
|
||||||
|
protected internal UserDataSymbolTracker SymbolTracker { get; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string? UserIdentifier { get; }
|
public string? UserIdentifier { get; }
|
||||||
|
|
||||||
@ -51,6 +57,11 @@ namespace CryptoExchange.Net.Trackers.UserData
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Connected => DataTrackers.All(x => x.Connected);
|
public bool Connected => DataTrackers.All(x => x.Connected);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Currently tracked symbols
|
||||||
|
/// </summary>
|
||||||
|
public IEnumerable<SharedSymbol> TrackedSymbols => SymbolTracker.GetTrackedSymbols();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ctor
|
/// ctor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -65,6 +76,7 @@ namespace CryptoExchange.Net.Trackers.UserData
|
|||||||
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
||||||
|
SymbolTracker = new UserDataSymbolTracker(logger, config);
|
||||||
Exchange = exchange;
|
Exchange = exchange;
|
||||||
UserIdentifier = userIdentifier;
|
UserIdentifier = userIdentifier;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,21 +77,21 @@ namespace CryptoExchange.Net.Trackers.UserData
|
|||||||
|
|
||||||
var trackers = new List<UserDataItemTracker>();
|
var trackers = new List<UserDataItemTracker>();
|
||||||
|
|
||||||
var balanceTracker = new BalanceTracker(logger, balanceRestClient, balanceSocketClient, accountType ?? SharedAccountType.PerpetualLinearFutures, config.BalancesConfig, exchangeParameters);
|
var balanceTracker = new BalanceTracker(logger, SymbolTracker, balanceRestClient, balanceSocketClient, accountType ?? SharedAccountType.PerpetualLinearFutures, config.BalancesConfig, exchangeParameters);
|
||||||
Balances = balanceTracker;
|
Balances = balanceTracker;
|
||||||
trackers.Add(balanceTracker);
|
trackers.Add(balanceTracker);
|
||||||
|
|
||||||
var orderTracker = new FuturesOrderTracker(logger, futuresOrderRestClient, futuresOrderSocketClient, config.OrdersConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
var orderTracker = new FuturesOrderTracker(logger, SymbolTracker, futuresOrderRestClient, futuresOrderSocketClient, config.OrdersConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
||||||
Orders = orderTracker;
|
Orders = orderTracker;
|
||||||
trackers.Add(orderTracker);
|
trackers.Add(orderTracker);
|
||||||
|
|
||||||
var positionTracker = new PositionTracker(logger, futuresOrderRestClient, positionSocketClient, config.PositionConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, WebsocketPositionUpdatesAreFullSnapshots, exchangeParameters);
|
var positionTracker = new PositionTracker(logger, SymbolTracker, futuresOrderRestClient, positionSocketClient, config.PositionConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, WebsocketPositionUpdatesAreFullSnapshots, exchangeParameters);
|
||||||
Positions = positionTracker;
|
Positions = positionTracker;
|
||||||
trackers.Add(positionTracker);
|
trackers.Add(positionTracker);
|
||||||
|
|
||||||
if (config.TrackTrades)
|
if (config.TrackTrades)
|
||||||
{
|
{
|
||||||
var tradeTracker = new FuturesUserTradeTracker(logger, futuresOrderRestClient, userTradeSocketClient, config.UserTradesConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
var tradeTracker = new FuturesUserTradeTracker(logger, SymbolTracker, futuresOrderRestClient, userTradeSocketClient, config.UserTradesConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
||||||
Trades = tradeTracker;
|
Trades = tradeTracker;
|
||||||
trackers.Add(tradeTracker);
|
trackers.Add(tradeTracker);
|
||||||
|
|
||||||
|
|||||||
@ -53,17 +53,17 @@ namespace CryptoExchange.Net.Trackers.UserData
|
|||||||
|
|
||||||
var trackers = new List<UserDataItemTracker>();
|
var trackers = new List<UserDataItemTracker>();
|
||||||
|
|
||||||
var balanceTracker = new BalanceTracker(logger, balanceRestClient, balanceSocketClient, SharedAccountType.Spot, config.BalancesConfig, exchangeParameters);
|
var balanceTracker = new BalanceTracker(logger, SymbolTracker, balanceRestClient, balanceSocketClient, SharedAccountType.Spot, config.BalancesConfig, exchangeParameters);
|
||||||
Balances = balanceTracker;
|
Balances = balanceTracker;
|
||||||
trackers.Add(balanceTracker);
|
trackers.Add(balanceTracker);
|
||||||
|
|
||||||
var orderTracker = new SpotOrderTracker(logger, spotOrderRestClient, spotOrderSocketClient, config.OrdersConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
var orderTracker = new SpotOrderTracker(logger, SymbolTracker, spotOrderRestClient, spotOrderSocketClient, config.OrdersConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
||||||
Orders = orderTracker;
|
Orders = orderTracker;
|
||||||
trackers.Add(orderTracker);
|
trackers.Add(orderTracker);
|
||||||
|
|
||||||
if (config.TrackTrades)
|
if (config.TrackTrades)
|
||||||
{
|
{
|
||||||
var tradeTracker = new SpotUserTradeTracker(logger, spotOrderRestClient, userTradeSocketClient, config.UserTradesConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
var tradeTracker = new SpotUserTradeTracker(logger, SymbolTracker, spotOrderRestClient, userTradeSocketClient, config.UserTradesConfig, config.TrackedSymbols, config.OnlyTrackProvidedSymbols, exchangeParameters);
|
||||||
Trades = tradeTracker;
|
Trades = tradeTracker;
|
||||||
trackers.Add(tradeTracker);
|
trackers.Add(tradeTracker);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user