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());
        }
Exemple #2
0
        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}");
        }
Exemple #4
0
 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);
     }
 }