private async Task FillMarketDataAsync(Dictionary <string, TemporaryAggregatedData> tempDataByLimitOrderAndDtId)
        {
            var newMarketData = new Dictionary <string, IMarketData>();
            var assetPairs    = await _assetsService.AssetPairGetAllAsync();

            var tempDataValues = tempDataByLimitOrderAndDtId.Values.OrderBy(x => x.Dt);

            var marketProfile = await _marketProfileService.ApiMarketProfileGetAsync();

            var assetPairsHash = marketProfile.Select(i => i.AssetPair).ToHashSet();

            foreach (var record in tempDataValues)
            {
                if (record.Volume1 <= 0)
                {
                    continue;
                }

                try
                {
                    var assetPair = FindPairWithAssets(assetPairs, record.Asset1, record.Asset2);
                    if (assetPair == null || !assetPairsHash.Contains(assetPair.Id))
                    {
                        continue;
                    }

                    var isInverted = IsInvertedTarget(assetPair, record.Asset1);
                    var volume     = isInverted ? record.Volume1 : record.Volume2;

                    if (newMarketData.ContainsKey(assetPair.Id))
                    {
                        newMarketData[assetPair.Id].LastPrice = record.Price;
                        newMarketData[assetPair.Id].Volume   += volume;
                    }
                    else
                    {
                        newMarketData.Add(assetPair.Id, new MarketData
                        {
                            AssetPairId = assetPair.Id,
                            LastPrice   = record.Price,
                            Volume      = volume,
                            Dt          = DateTime.UtcNow
                        });
                    }
                }
                catch (Exception ex)
                {
                    _log.WriteError("FillMarketDataAsync", record.ToJson(), ex);
                }
            }

            await _marketDataRepository.AddOrMergeMarketData(newMarketData.Values);
        }
예제 #2
0
        public async Task <IActionResult> Get(string sessionId, int?cacheTimeout)
        {
            List <AssertPairRate> cacheEntry;

            Guid sId;

            if (!Guid.TryParse(sessionId, out sId))
            {
                sId = Guid.NewGuid();
            }

            if (!_cache.TryGetValue(sId, out cacheEntry))
            {
                var pairsList = await _lykkeMarketProfile.ApiMarketProfileGetAsync();

                var dicPairsList = await _assetsServiceWithCache.GetAllAssetPairsAsync();

                cacheEntry =
                    new List <AssertPairRate>(from rates in (from apr in pairsList

                                                             select new AssertPairRate
                {
                    AssetPair = apr.AssetPair,
                    Bid = (float)apr.BidPrice,
                    Ask = (float)apr.AskPrice
                })
                                              join dic in dicPairsList on rates.AssetPair equals dic.Id
                                              select new AssertPairRate
                {
                    AssetPair = rates.AssetPair,
                    Bid       = rates.Bid,
                    Ask       = rates.Ask,
                    Accuracy  = dic.Accuracy
                }
                                              );



                await StoreAsserts(cacheEntry);


                var cacheEntryOptions = new MemoryCacheEntryOptions()
                                        .SetAbsoluteExpiration(TimeSpan.FromMinutes((cacheTimeout ?? 0) == 0 ? _settings.CacheTimeout : cacheTimeout.Value));

                _cache.Set(CacheKeys.Rates, cacheEntry, cacheEntryOptions);
            }

            return(Json(new { SessionId = sId, Asserts = cacheEntry }));
        }
        private async Task <List <MarketSlice> > GetMarketProfilesAsync()
        {
            var marketData = new List <MarketSlice>();

            var marketProfiles = await _marketProfileClient.ApiMarketProfileGetAsync();

            marketData.AddRange(marketProfiles
                                .Select(x => new MarketSlice
            {
                AssetPairId = x.AssetPair,
                Ask         = x.AskPrice.ToString(CultureInfo.InvariantCulture),
                Bid         = x.BidPrice.ToString(CultureInfo.InvariantCulture)
            }));

            return(marketData);
        }
예제 #4
0
        private async Task Execute(ITimerTrigger timer, TimerTriggeredHandlerArgs args, CancellationToken cancellationToken)
        {
            var    date = DateTime.UtcNow - _marketDataInterval;
            double to   = date.ToUnixTime();

            var assetPairIds = (await _marketProfileClient.ApiMarketProfileGetAsync(cancellationToken))
                               .Select(x => x.AssetPair)
                               .ToList();

            var tasks = new List <Task>();

            foreach (var assetPairId in assetPairIds)
            {
                tasks.Add(_database.SortedSetRemoveRangeByScoreAsync(RedisService.GetMarketDataBaseVolumeKey(assetPairId), 0, to, Exclude.Stop, CommandFlags.FireAndForget));
                tasks.Add(_database.SortedSetRemoveRangeByScoreAsync(RedisService.GetMarketDataQuoteVolumeKey(assetPairId), 0, to, Exclude.Stop, CommandFlags.FireAndForget));
                tasks.Add(_database.SortedSetRemoveRangeByScoreAsync(RedisService.GetMarketDataPriceKey(assetPairId), 0, to, Exclude.Stop, CommandFlags.FireAndForget));
            }

            await Task.WhenAll(tasks);
        }
 public async Task <IList <AssetPairModel> > GetAllPairsAsync()
 {
     return(await _api.ApiMarketProfileGetAsync());
 }
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 public static IList <AssetPairModel> ApiMarketProfileGet(this ILykkeMarketProfile operations)
 {
     return(operations.ApiMarketProfileGetAsync().GetAwaiter().GetResult());
 }