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(); }
public void UpdateOrderFpl(IOrder order, FplData fplData) { var handler = order.Status != OrderStatus.WaitingForExecution ? UpdateOrderFplData : (Action <IOrder, FplData>)UpdatePendingOrderMargin; handler(order, fplData); }
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(); }
public decimal CalculateOvernightMaintenanceMargin(Position position) { var fplData = new FplData { AccountBaseAssetAccuracy = position.FplData.AccountBaseAssetAccuracy }; CalculateMargin(position, fplData, true); return(fplData.MarginMaintenance); }
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); }
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); }
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); }
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; }
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(); }
//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); }