示例#1
0
        public async Task RestoreSwaps()
        {
            var positions = _ordersCache.Positions.GetAllPositions();

            if (positions.Any())
            {
                var positionsIds         = positions.Select(x => x.Id);
                var swapTotalPerPosition = await _accountHistoryRepository.GetSwapTotalPerPosition(positionsIds);

                if (swapTotalPerPosition.Any())
                {
                    swapTotalPerPosition.ForEach(x =>
                    {
                        var position = positions.Single(p => p.Id == x.Key);
                        position.SetSwapTotal(x.Value);
                    });

                    try
                    {
                        await _blobRepository.WriteAsync(LykkeConstants.StateBlobContainer, OrderCacheManager.PositionsBlobName, positions);
                    }
                    catch (Exception ex)
                    {
                        await _log.WriteErrorAsync(nameof(OrdersCache), "Save positions", "", ex);
                    }
                }
            }
        }
示例#2
0
        public async Task InvokeAll()
        {
            var migrationVersions = await _marginTradingBlobRepository.ReadAsync <Dictionary <string, int> >(
                LykkeConstants.MigrationsBlobContainer, "versions") ?? new Dictionary <string, int>();

            foreach (var migration in _migrations)
            {
                var migrationName = migration.GetType().Name;

                try
                {
                    if (!migrationVersions.TryGetValue(migrationName, out var version) ||
                        version < migration.Version)
                    {
                        await migration.Invoke();

                        migrationVersions.Remove(migrationName);
                        migrationVersions.Add(migrationName, migration.Version);
                    }
                }
                catch (Exception ex)
                {
                    await _log.WriteFatalErrorAsync(nameof(MigrationService), migrationName, ex, DateTime.UtcNow);
                }
            }

            await _marginTradingBlobRepository.WriteAsync(LykkeConstants.MigrationsBlobContainer, "versions", migrationVersions);
        }
示例#3
0
        private async Task DumpOrdersToRepository()
        {
            try
            {
                var orders = _orderCache.GetAllOrders();

                if (orders != null)
                {
                    await _blobRepository.WriteAsync(LykkeConstants.StateBlobContainer, OrdersBlobName, orders);
                }
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(OrdersCache), "Save orders", "", ex);
            }
        }
示例#4
0
 private async Task DumpToRepository()
 {
     try
     {
         await _blobRepository.WriteAsync(LykkeConstants.StateBlobContainer, BlobName, GetAllQuotes());
     }
     catch (Exception ex)
     {
         await _log.WriteErrorAsync(nameof(FxRateCacheService), "Save fx rates", "", ex);
     }
 }
示例#5
0
        private async Task DumpToRepository()
        {
            try
            {
                Dictionary <string, OrderBook> orderbookState;

                using (_contextFactory.GetReadSyncContext($"{nameof(OrderBookSaveService)}.{nameof(DumpToRepository)}"))
                    orderbookState = _orderBookList.GetOrderBookState();

                if (orderbookState != null)
                {
                    await _blobRepository.WriteAsync(LykkeConstants.StateBlobContainer, BlobName, orderbookState);
                }
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(OrderBookSaveService), "Save orderbook", "", ex);
            }
        }
示例#6
0
 public async Task SaveAsync(IReadOnlyCollection <RawMessage> items, string exchangeName)
 {
     await _blobRepository.WriteAsync(BlobContainer, exchangeName, items);
 }
示例#7
0
        /// <inheritdoc />
        public async Task <string> MakeTradingDataSnapshot(DateTime tradingDay, string correlationId, SnapshotStatus status = SnapshotStatus.Final)
        {
            if (!_scheduleSettingsCacheService.TryGetPlatformCurrentDisabledInterval(out var disabledInterval))
            {
                //TODO: remove later (if everything will work and we will never go to this branch)
                _scheduleSettingsCacheService.MarketsCacheWarmUp();

                if (!_scheduleSettingsCacheService.TryGetPlatformCurrentDisabledInterval(out disabledInterval))
                {
                    throw new Exception(
                              $"Trading should be stopped for whole platform in order to make trading data snapshot. Current schedule: {_scheduleSettingsCacheService.GetPlatformTradingSchedule()?.ToJson()}");
                }
            }

            if (disabledInterval.Start.AddDays(-1) > tradingDay.Date || disabledInterval.End < tradingDay.Date)
            {
                throw new Exception(
                          $"{nameof(tradingDay)}'s Date component must be from current disabled interval's Start -1d to End: [{disabledInterval.Start.AddDays(-1)}, {disabledInterval.End}].");
            }

            if (Lock.CurrentCount == 0)
            {
                throw new InvalidOperationException("Trading data snapshot creation is already in progress");
            }

            // We must be sure all messages have been processed by history brokers before starting current state validation.
            // If one or more queues contain not delivered messages the snapshot can not be created.
            _queueValidationService.ThrowExceptionIfQueuesNotEmpty(true);

            // Before starting snapshot creation the current state should be validated.
            var validationResult = await _snapshotValidationService.ValidateCurrentStateAsync();

            if (!validationResult.IsValid)
            {
                var ex = new InvalidOperationException(
                    $"The trading data snapshot might be corrupted. The current state of orders and positions is incorrect. Check the dbo.BlobData table for more info: container {LykkeConstants.MtCoreSnapshotBlobContainer}, correlationId {correlationId}");
                await _log.WriteFatalErrorAsync(nameof(SnapshotService),
                                                nameof(MakeTradingDataSnapshot),
                                                validationResult.ToJson(),
                                                ex);

                await _blobRepository.WriteAsync(LykkeConstants.MtCoreSnapshotBlobContainer, correlationId, validationResult);
            }
            else
            {
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          "The current state of orders and positions is correct.");
            }

            await Lock.WaitAsync();

            try
            {
                var orders     = _orderReader.GetAllOrders();
                var ordersJson = orders.Select(o => o.ConvertToSnapshotContract(_orderReader, status)).ToJson();
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Preparing data... {orders.Length} orders prepared.");

                var positions     = _orderReader.GetPositions();
                var positionsJson = positions.Select(p => p.ConvertToSnapshotContract(_orderReader, status)).ToJson();
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Preparing data... {positions.Length} positions prepared.");

                var accountStats = _accountsCacheService.GetAll();
                var accountsJson = accountStats.Select(a => a.ConvertToSnapshotContract(status)).ToJson();
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Preparing data... {accountStats.Count} accounts prepared.");

                var bestFxPrices     = _fxRateCacheService.GetAllQuotes();
                var bestFxPricesData = bestFxPrices.ToDictionary(q => q.Key, q => q.Value.ConvertToContract()).ToJson();
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Preparing data... {bestFxPrices.Count} best FX prices prepared.");

                var bestPrices     = _quoteCacheService.GetAllQuotes();
                var bestPricesData = bestPrices.ToDictionary(q => q.Key, q => q.Value.ConvertToContract()).ToJson();
                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Preparing data... {bestPrices.Count} best trading prices prepared.");

                var msg = $"TradingDay: {tradingDay:yyyy-MM-dd}, Orders: {orders.Length}, positions: {positions.Length}, accounts: {accountStats.Count}, best FX prices: {bestFxPrices.Count}, best trading prices: {bestPrices.Count}.";

                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Starting to write trading data snapshot. {msg}");

                var snapshot = new TradingEngineSnapshot(
                    tradingDay,
                    correlationId,
                    _dateService.Now(),
                    ordersJson: ordersJson,
                    positionsJson: positionsJson,
                    accountsJson: accountsJson,
                    bestFxPricesJson: bestFxPricesData,
                    bestTradingPricesJson: bestPricesData,
                    status: status);

                await _tradingEngineSnapshotsRepository.AddAsync(snapshot);

                await _log.WriteInfoAsync(nameof(SnapshotService), nameof(MakeTradingDataSnapshot),
                                          $"Trading data snapshot was written to the storage. {msg}");

                return($"Trading data snapshot was written to the storage. {msg}");
            }
            finally
            {
                Lock.Release();
            }
        }