private OrderBook Convert(CacheProviderOrderBook orderBook) { var bids = new List <VolumePrice>(); var asks = new List <VolumePrice>(); foreach (var limitOrder in orderBook.Prices) { // Filter out negative or zero prices and zero volumes if (limitOrder.Price <= 0 || (decimal)limitOrder.Volume == 0) { continue; } if (limitOrder.Volume > 0) { bids.Add(new VolumePrice((decimal)limitOrder.Price, (decimal)limitOrder.Volume)); } else { asks.Add(new VolumePrice((decimal)limitOrder.Price, Math.Abs((decimal)limitOrder.Volume))); } } var assetPair = _lykkeAssetIdsAssetPairs[orderBook.AssetPair]; var result = new OrderBook(LykkeExchangeName, assetPair, bids, asks, orderBook.Timestamp); return(result); }
private void MoveFromDirtyToMain(string assetPairId) { lock (_syncLykke) { var dirtyOrderBook = _dirtyLykkeOrderBooks[assetPairId]; if (dirtyOrderBook.Asks != null && dirtyOrderBook.Bids != null) { var isValid = true; // Only if both bids and asks not empty if (dirtyOrderBook.Asks.Any() && dirtyOrderBook.Bids.Any()) { isValid = dirtyOrderBook.Asks.Min(o => o.Price) > dirtyOrderBook.Bids.Max(o => o.Price); } if (isValid) { var key = GetKeyForOrderBooks(dirtyOrderBook); _allOrderBooks[key] = new OrderBook(dirtyOrderBook.Source, dirtyOrderBook.AssetPair, dirtyOrderBook.Bids, dirtyOrderBook.Asks, dirtyOrderBook.Timestamp); } } } }
private void AddOrderBookFromCacheProvider(OrderBook orderBook) { var assetPairName = orderBook.AssetPair.Name; if (!_lykkeAssetNamesAssetPairs.ContainsKey(assetPairName)) { return; } lock (_syncLykke) { if (!_dirtyLykkeOrderBooks.ContainsKey(assetPairName)) { _dirtyLykkeOrderBooks.Add(assetPairName, orderBook); } else { // Update half only if it doesn't exist var dirtyOrderBook = _dirtyLykkeOrderBooks[assetPairName]; var newBids = dirtyOrderBook.Bids ?? orderBook.Bids; var newAsks = dirtyOrderBook.Asks ?? orderBook.Asks; var newOrderBook = new OrderBook(orderBook.Source, orderBook.AssetPair, newBids, newAsks, orderBook.Timestamp); _dirtyLykkeOrderBooks[assetPairName] = newOrderBook; } } MoveFromDirtyToMain(assetPairName); }
private Task HandleLykkeOrderBook(OrderBook orderBook) { var assetPairName = orderBook.AssetPair.Name; if (!_lykkeAssetNamesAssetPairs.ContainsKey(assetPairName)) { return(Task.CompletedTask); } lock (_syncLykke) { if (!_dirtyLykkeOrderBooks.ContainsKey(assetPairName)) { _dirtyLykkeOrderBooks.Add(assetPairName, orderBook); } else { // Update half even if it already exists var dirtyOrderBook = _dirtyLykkeOrderBooks[assetPairName]; var newBids = orderBook.Bids ?? dirtyOrderBook.Bids; var newAsks = orderBook.Asks ?? dirtyOrderBook.Asks; var newOrderBook = new OrderBook(orderBook.Source, orderBook.AssetPair, newBids, newAsks, orderBook.Timestamp); _dirtyLykkeOrderBooks[assetPairName] = newOrderBook; } } MoveFromDirtyToMain(orderBook.AssetPair.Name); return(Task.CompletedTask); }
public async Task HandleAsync(OrderBook orderBook) { // Lykke exchage if (string.Equals(orderBook.Source, LykkeExchangeName, StringComparison.InvariantCultureIgnoreCase)) { await HandleLykkeOrderBook(orderBook); } // Others exchanges else { var key = GetKeyForOrderBooks(orderBook); _allOrderBooks[key] = orderBook; } }
private static string GetKeyForOrderBooks(OrderBook orderBook) { return($"{orderBook.Source}-{orderBook.AssetPair.Name}"); }