예제 #1
0
        public void UpdateOrderFpl(IOrder order, FplData fplData)
        {
            fplData.AccountBaseAssetAccuracy = _assetsCache.GetAssetAccuracy(order.AccountAssetId);
            fplData.QuoteRate = _cfdCalculatorService.GetQuoteRateForQuoteAsset(order.AccountAssetId, order.Instrument);

            var fpl = order.GetOrderType() == OrderDirection.Buy
                ? (order.ClosePrice - order.OpenPrice) * fplData.QuoteRate * order.GetMatchedVolume()
                : (order.OpenPrice - order.ClosePrice) * fplData.QuoteRate * order.GetMatchedVolume();

            fplData.Fpl = Math.Round(fpl, fplData.AccountBaseAssetAccuracy);

            var accountAsset = _accountAssetsCacheService.GetAccountAsset(order.TradingConditionId, order.AccountAssetId, order.Instrument);

            fplData.MarginInit        = Math.Round(order.ClosePrice * order.GetMatchedVolume() * fplData.QuoteRate / accountAsset.LeverageInit, fplData.AccountBaseAssetAccuracy);
            fplData.MarginMaintenance = Math.Round(order.ClosePrice * order.GetMatchedVolume() * fplData.QuoteRate / accountAsset.LeverageMaintenance, fplData.AccountBaseAssetAccuracy);

            fplData.OpenCrossPrice  = Math.Round(order.OpenPrice * fplData.QuoteRate, order.AssetAccuracy);
            fplData.CloseCrossPrice = Math.Round(order.ClosePrice * fplData.QuoteRate, order.AssetAccuracy);

            fplData.OpenPrice     = order.OpenPrice;
            fplData.ClosePrice    = order.ClosePrice;
            fplData.SwapsSnapshot = order.GetSwaps();

            fplData.CalculatedHash = fplData.ActualHash;

            fplData.TotalFplSnapshot = order.GetTotalFpl(fplData.SwapsSnapshot);

            var account = _accountsCacheService.Get(order.ClientId, order.AccountId);

            account.CacheNeedsToBeUpdated();
        }
예제 #2
0
파일: FplService.cs 프로젝트: wildbunny/MT
        public void UpdateOrderFpl(IOrder order, FplData fplData)
        {
            var handler = order.Status != OrderStatus.WaitingForExecution
                ? UpdateOrderFplData
                : (Action <IOrder, FplData>)UpdatePendingOrderMargin;

            handler(order, fplData);
        }
예제 #3
0
파일: FplService.cs 프로젝트: alpo-8/MT
        private void UpdatePendingOrderMargin(Position order, FplData fplData)
        {
            fplData.AccountBaseAssetAccuracy = _assetsCache.GetAssetAccuracy(order.AccountAssetId);

            CalculateMargin(order, fplData);

            fplData.CalculatedHash = fplData.ActualHash;
            _accountsCacheService.Get(order.AccountId).CacheNeedsToBeUpdated();
        }
예제 #4
0
파일: FplService.cs 프로젝트: alpo-8/MT
        public decimal CalculateOvernightMaintenanceMargin(Position position)
        {
            var fplData = new FplData {
                AccountBaseAssetAccuracy = position.FplData.AccountBaseAssetAccuracy
            };

            CalculateMargin(position, fplData, true);

            return(fplData.MarginMaintenance);
        }
예제 #5
0
파일: FplService.cs 프로젝트: wildbunny/MT
        public void CalculateMargin(IOrder order, FplData fplData)
        {
            var accountAsset = _accountAssetsCacheService.GetAccountAsset(order.TradingConditionId, order.AccountAssetId, order.Instrument);

            fplData.MarginRate = _cfdCalculatorService.GetQuoteRateForBaseAsset(order.AccountAssetId, order.Instrument,
                                                                                order.LegalEntity);
            fplData.MarginInit =
                Math.Round(Math.Abs(order.Volume) * fplData.MarginRate / accountAsset.LeverageInit,
                           fplData.AccountBaseAssetAccuracy);
            fplData.MarginMaintenance =
                Math.Round(Math.Abs(order.Volume) * fplData.MarginRate / accountAsset.LeverageMaintenance,
                           fplData.AccountBaseAssetAccuracy);
        }
예제 #6
0
        private void CalculateMargin(Position position, FplData fplData, bool isWarnCheck = false)
        {
            var tradingInstrument =
                _tradingInstrumentsCache.GetTradingInstrument(position.TradingConditionId, position.AssetPairId);
            var volumeForCalculation = Math.Abs(position.Volume);

            fplData.MarginRate = position.ClosePrice * position.CloseFxPrice;

            var(marginInit, marginMaintenance) = GetMargins(tradingInstrument, volumeForCalculation, fplData.MarginRate, isWarnCheck);
            fplData.MarginInit        = Math.Round(marginInit, fplData.AccountBaseAssetAccuracy);
            fplData.MarginMaintenance = Math.Round(marginMaintenance, fplData.AccountBaseAssetAccuracy);
            fplData.InitialMargin     = Math.Round(position.OpenPrice * position.OpenFxPrice * volumeForCalculation / tradingInstrument.InitLeverage, fplData.AccountBaseAssetAccuracy);
        }
예제 #7
0
파일: FplService.cs 프로젝트: alpo-8/MT
        private void CalculateMargin(Position position, FplData fplData, bool isWarnCheck = false)
        {
            var tradingInstrument =
                _tradingInstrumentsCache.GetTradingInstrument(position.TradingConditionId, position.AssetPairId);
            var volumeForCalculation = Math.Abs(position.Volume);

            fplData.MarginRate = _cfdCalculatorService.GetQuoteRateForBaseAsset(position.AccountAssetId,
                                                                                position.AssetPairId,
                                                                                position.LegalEntity, position.Direction == PositionDirection.Short); // to use close price

            var(marginInit, marginMaintenance) = GetMargins(tradingInstrument, volumeForCalculation,
                                                            fplData.MarginRate, isWarnCheck);
            fplData.MarginInit        = Math.Round(marginInit, fplData.AccountBaseAssetAccuracy);
            fplData.MarginMaintenance = Math.Round(marginMaintenance, fplData.AccountBaseAssetAccuracy);
            fplData.InitialMargin     = Math.Round(position.OpenPrice * position.OpenFxPrice * volumeForCalculation /
                                                   tradingInstrument.LeverageInit, fplData.AccountBaseAssetAccuracy);
        }
예제 #8
0
파일: FplService.cs 프로젝트: alpo-8/MT
        private void UpdatePositionFplData(Position position, FplData fplData)
        {
            fplData.AccountBaseAssetAccuracy = _assetsCache.GetAssetAccuracy(position.AccountAssetId);

            var fpl = (position.ClosePrice - position.OpenPrice) * position.CloseFxPrice * position.Volume;

            fplData.Fpl = Math.Round(fpl, fplData.AccountBaseAssetAccuracy);

            if (position.ClosePrice == 0)
            {
                position.UpdateClosePrice(position.OpenPrice);
            }

            CalculateMargin(position, fplData);

            if (fplData.ActualHash == 0)
            {
                fplData.ActualHash = 1;
            }
            fplData.CalculatedHash = fplData.ActualHash;
        }
예제 #9
0
파일: FplService.cs 프로젝트: wildbunny/MT
        private void UpdateOrderFplData(IOrder order, FplData fplData)
        {
            fplData.AccountBaseAssetAccuracy = _assetsCache.GetAssetAccuracy(order.AccountAssetId);
            fplData.FplRate = _cfdCalculatorService.GetQuoteRateForQuoteAsset(order.AccountAssetId, order.Instrument,
                                                                              order.LegalEntity, order.Volume * (order.ClosePrice - order.OpenPrice) > 0);

            var fpl = (order.ClosePrice - order.OpenPrice) * fplData.FplRate * order.Volume;

            fplData.Fpl = Math.Round(fpl, fplData.AccountBaseAssetAccuracy);

            CalculateMargin(order, fplData);

            fplData.OpenPrice     = order.OpenPrice;
            fplData.ClosePrice    = order.ClosePrice;
            fplData.SwapsSnapshot = order.GetSwaps();

            fplData.CalculatedHash = fplData.ActualHash;

            fplData.TotalFplSnapshot = order.GetTotalFpl(fplData.SwapsSnapshot);

            _accountsCacheService.Get(order.ClientId, order.AccountId).CacheNeedsToBeUpdated();
        }
예제 #10
0
        //TODO: change the approach completely!
        private void UpdatePositionFplData(Position position, FplData fplData)
        {
            if (fplData.ActualHash == 0)
            {
                fplData.ActualHash = 1;
            }

            fplData.CalculatedHash = fplData.ActualHash;

            if (fplData.AccountBaseAssetAccuracy == default)
            {
                fplData.AccountBaseAssetAccuracy = AssetsConstants.DefaultAssetAccuracy;
            }

            fplData.RawFpl = (position.ClosePrice - position.OpenPrice) * position.CloseFxPrice * position.Volume;

            if (position.ClosePrice == 0)
            {
                position.UpdateClosePrice(position.OpenPrice);
            }

            CalculateMargin(position, fplData);
        }