private string GetItemSring(OrderbookMessage item, bool isAsk) { var strBuilder = new StringBuilder("{\"t\":\""); strBuilder.Append(item.Timestamp.ToString("mm:ss.fff")); strBuilder.Append("\",\"p\":["); var collection = isAsk ? item.Asks : item.Bids; for (int i = 0; i < collection.Count; ++i) { var price = collection[i]; if (i > 0) { strBuilder.Append(","); } strBuilder.Append("{\"v\":"); strBuilder.Append(price.Volume); strBuilder.Append(",\"p\":"); strBuilder.Append(price.Price); strBuilder.Append("}"); } strBuilder.Append("]}"); return(strBuilder.ToString()); }
private async Task ProcessMessageAsync(OrderbookMessage orderbookMessage) { OrderbookEntity orderbook = null; try { orderbook = await _orderbookWriter.GetAsync(OrderbookEntity.GetPk(), orderbookMessage.AssetPair); } catch (Exception ex) { _log.Warning($"Can't get orderbook from mynosql for assetPair = {orderbookMessage.AssetPair}", ex); } var entity = orderbook ?? new OrderbookEntity(orderbookMessage.AssetPair) { CreatedAt = orderbookMessage.Timestamp }; entity.CreatedAt = orderbookMessage.Timestamp; var prices = orderbookMessage.IsBuy ? entity.Bids : entity.Asks; prices.Clear(); foreach (var price in orderbookMessage.Prices) { prices.Add(new VolumePriceEntity((decimal)price.Volume, (decimal)price.Price)); } await _orderbookWriter.InsertOrReplaceAsync(entity); }
private string GetContainerName(OrderbookMessage item, bool isAsk) { string source = item.Source == null ? "" : item.Source.Replace('.', '-'); string suffix = isAsk ? "ask" : "bid"; return($"{source}-{item.Asset ?? ""}-{suffix}"); }
internal static OrderbookModel ToModel(this OrderbookMessage src) { return(new OrderbookModel { AssetPair = src.AssetPair, IsBuy = src.IsBuy, Timestamp = src.Timestamp, Levels = src.Prices.ConvertPrices() }); }
private async Task ProcessAsync(OrderbookMessage item, bool isAsk) { string containerName = GetContainerName(item, isAsk); if (!_dict.ContainsKey(containerName)) { _dict.TryAdd(containerName, new BlobSaver( _storageAccount, containerName, _maxBatchCount, _minBatchCount, _log)); } string itemStr = GetItemSring(item, isAsk); await _dict[containerName].SaveDataItemAsync(itemStr); }
private async Task ProcessOrderbookAsync(OrderbookMessage orderbookMessage) { try { var topic = $"orderbook.spot.{orderbookMessage.AssetPair.ToLower()}.{(orderbookMessage.IsBuy ? "buy" : "sell")}"; var subject = _realm.Services.GetSubject <OrderbookModel>(topic); subject.OnNext(orderbookMessage.ToModel()); } catch (Exception) { _log.WriteWarning(nameof(ProcessOrderbookAsync), orderbookMessage, "Failed to process orderbook"); throw; } await Task.CompletedTask; }
private async Task ProcessMessageAsync(OrderbookMessage orderbookMessage) { var entity = await _orderbookWriter.GetAsync(OrderbookEntity.GetPk(), orderbookMessage.AssetPair) ?? new OrderbookEntity(orderbookMessage.AssetPair) { CreatedAt = orderbookMessage.Timestamp, }; entity.CreatedAt = orderbookMessage.Timestamp; var prices = orderbookMessage.IsBuy ? entity.Bids : entity.Asks; prices.Clear(); foreach (var price in orderbookMessage.Prices) { prices.Add(new VolumePriceEntity((decimal)price.Volume, (decimal)price.Price)); } await _orderbookWriter.InsertOrReplaceAsync(entity); }
private async Task ProcessMessageAsync(OrderbookMessage item) { try { if (item.Asks != null && item.Asks.Count > 0) { await ProcessAsync(item, true); } if (item.Bids != null && item.Bids.Count > 0) { await ProcessAsync(item, false); } } catch (Exception exc) { await _log.WriteErrorAsync( nameof(OrderbookSubscriber), nameof(ProcessMessageAsync), exc); } }