예제 #1
0
        public void SetUp()
        {
            _accountAssetsRepository.GetAllAsync().Result.ForEach(aa =>
                                                                  _accountAssetsRepository.Remove(aa.TradingConditionId, aa.BaseAssetId, "BTCUSD"));
            _accountAssetsManager.UpdateAccountAssetsCache().GetAwaiter().GetResult();

            _ordersCache.InitOrders(new List <Order>());

            _overnightSwapCache.ClearAll();

            _quoteCacheService.GetAllQuotes().Values.ForEach(x => _quoteCacheService.RemoveQuote(x.Instrument));

            _overnightSwapHistoryRepository.GetAsync().Result.ForEach(x =>
                                                                      _overnightSwapHistoryRepository.DeleteAsync(x));
        }
예제 #2
0
        public Task Invoke()
        {
            using (_contextFactory.GetWriteSyncContext($"{nameof(PendingMarginInstrumentMigration)}.{nameof(Invoke)}"))
            {
                //open orders from cache
                var allOrders     = _orderCache.GetAll().ToList();
                var pendingOrders = _orderCache.GetPending().Where(x => string.IsNullOrEmpty(x.MarginCalcInstrument)).ToList();
                if (!pendingOrders.Any())
                {
                    return(Task.CompletedTask);
                }

                foreach (var order in pendingOrders)
                {
                    HandleOrder(order);
                }

                //reinit orders cache with modified data
                _orderCache.InitOrders(allOrders);
            }

            return(Task.CompletedTask);
        }
예제 #3
0
        /// <summary>
        /// Infer init data from blob and history.
        /// </summary>
        private (List <Order> Orders, List <Position> Positions) InferInitDataFromBlobAndHistory()
        {
            _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                           $"Start reading order and position data from blob.");

            var blobOrdersTask = _blobRepository.ReadWithTimestampAsync <List <Order> >(
                LykkeConstants.StateBlobContainer, OrdersBlobName);
            var blobPositionsTask = _blobRepository.ReadWithTimestampAsync <List <Position> >(
                LykkeConstants.StateBlobContainer, PositionsBlobName);

            var(blobOrders, blobOrdersTimestamp)       = blobOrdersTask.GetAwaiter().GetResult();
            var(blobPositions, blobPositionsTimestamp) = blobPositionsTask.GetAwaiter().GetResult();

            _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                           $"Finish reading data from blob, there are [{blobOrders.Count}] orders, [{blobPositions.Count}] positions. Start checking historical data.");

            var orderSnapshotsTask    = _ordersHistoryRepository.GetLastSnapshot(blobOrdersTimestamp);
            var positionSnapshotsTask = _positionsHistoryRepository.GetLastSnapshot(blobPositionsTimestamp);
            var orderSnapshots        = orderSnapshotsTask.GetAwaiter().GetResult().Select(OrderHistory.Create).ToList();

            PreProcess(orderSnapshots);
            var positionSnapshots = positionSnapshotsTask.GetAwaiter().GetResult();

            _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                           $"Finish reading historical data. #{orderSnapshots.Count} order history items since [{blobOrdersTimestamp:s}], #{positionSnapshots.Count} position history items since [{blobPositionsTimestamp:s}].");

            var(ordersResult, orderIdsChangedFromHistory) = MapOrders(blobOrders.ToDictionary(x => x.Id, x => x),
                                                                      orderSnapshots.ToDictionary(x => x.Id, x => x), _log);
            var(positionsResult, positionIdsChangedFromHistory) = MapPositions(
                blobPositions.ToDictionary(x => x.Id, x => x), positionSnapshots.ToDictionary(x => x.Id, x => x));

            if (positionIdsChangedFromHistory.Any())
            {
                var swapTotalPerPosition = _accountHistoryRepository.GetSwapTotalPerPosition(positionIdsChangedFromHistory).GetAwaiter().GetResult();
                swapTotalPerPosition.ForEach(x =>
                {
                    var position = positionsResult.Single(p => p.Id == x.Key);
                    position.SetSwapTotal(x.Value);
                });
            }

            RefreshRelated(ordersResult.ToDictionary(x => x.Id), positionsResult.ToDictionary(x => x.Id), orderSnapshots);
            ApplyExpirationDateFix(ordersResult);

            _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                           $"Initializing cache with [{ordersResult.Count}] orders and [{positionsResult.Count}] positions.");

            _orderCache.InitOrders(ordersResult, positionsResult);

            if (orderIdsChangedFromHistory.Any() || positionIdsChangedFromHistory.Any())
            {
                _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                               (orderIdsChangedFromHistory.Any() ? $"Some orders state was different from history: [{string.Join(",", orderIdsChangedFromHistory)}]. " : string.Empty)
                               + (positionIdsChangedFromHistory.Any() ? $"Some positions state was different from history: [{string.Join(",", positionIdsChangedFromHistory)}]. " : string.Empty)
                               + "Dumping merged order and position data to the blob."
                               );

                if (orderIdsChangedFromHistory.Any())
                {
                    DumpOrdersToRepository().Wait();
                }

                if (positionIdsChangedFromHistory.Any())
                {
                    DumpPositionsToRepository().Wait();
                }

                _log.WriteInfo(nameof(OrderCacheManager), nameof(InferInitDataFromBlobAndHistory),
                               "Finished dumping merged order and position data to the blob."
                               );
            }

            return(ordersResult, positionsResult);
        }