Beispiel #1
0
//        private void ProcessPendingOrdersMarginRecalc(string instrument)
//        {
//            var pendingOrders = _ordersCache.GetPendingForMarginRecalc(instrument);
//
//            foreach (var pendingOrder in pendingOrders)
//            {
//                pendingOrder.UpdatePendingOrderMargin();
//            }
//        }

        #endregion


        #region Positions

        private void UpdatePositionsFxRates(InstrumentBidAskPair quote)
        {
            foreach (var position in _ordersCache.GetPositionsByFxAssetPairId(quote.Instrument))
            {
                var fxPrice = _cfdCalculatorService.GetPrice(quote, position.FxToAssetPairDirection,
                                                             position.Volume * (position.ClosePrice - position.OpenPrice) > 0);

                position.UpdateCloseFxPrice(fxPrice);
            }
        }
Beispiel #2
0
        private void ApplyFxRate(ImmutableArray <Position> positionsProvider,
                                 ImmutableArray <MarginTradingAccount> accountsProvider,
                                 decimal closePrice,
                                 string instrument)
        {
            if (closePrice == 0)
            {
                return;
            }

            var positions = positionsProvider.Where(p => p.FxAssetPairId == instrument);

            var positionsByAccounts = positions
                                      .GroupBy(p => p.AccountId)
                                      .ToDictionary(p => p.Key, p => p.ToArray());

            foreach (var accountPositions in positionsByAccounts)
            {
                foreach (var position in accountPositions.Value)
                {
                    var fxPrice = _cfdCalculatorService.GetPrice(closePrice,
                                                                 closePrice,
                                                                 position.FxToAssetPairDirection,
                                                                 position.Volume * (position.ClosePrice - position.OpenPrice) > 0);

                    position.UpdateCloseFxPriceWithoutAccountUpdate(fxPrice);
                }

                var snapshotAccount = accountsProvider.SingleOrDefault(a => a.Id == accountPositions.Key);

                if (snapshotAccount == null)
                {
                    _log.WriteWarning(nameof(ApplyFxRate), null, $"Couldn't find account with id [{accountPositions.Key}] to apply fx rate update");
                    continue;
                }

                snapshotAccount.CacheNeedsToBeUpdated();
            }
        }