public async Task <MtBackendResponse <MarginTradingAccountModel> > SetTradingCondition( [FromBody] SetTradingConditionModel model) { if (!_tradingConditionsCacheService.IsTradingConditionExists(model.TradingConditionId)) { return(MtBackendResponse <MarginTradingAccountModel> .Error( $"No trading condition {model.TradingConditionId} found in cache")); } var tradingCondition = _tradingConditionsCacheService.GetTradingCondition(model.TradingConditionId); var account = await _accountManager.SetTradingCondition(model.ClientId, model.AccountId, model.TradingConditionId); if (account == null) { return(MtBackendResponse <MarginTradingAccountModel> .Error( $"Account for client [{model.ClientId}] with id [{model.AccountId}] was not found")); } if (tradingCondition.LegalEntity != account.LegalEntity) { return(MtBackendResponse <MarginTradingAccountModel> .Error( $"Account for client [{model.ClientId}] with id [{model.AccountId}] has LegalEntity " + $"[{account.LegalEntity}], but trading condition wit id [{tradingCondition.Id}] has " + $"LegalEntity [{tradingCondition.LegalEntity}]")); } return(MtBackendResponse <MarginTradingAccountModel> .Ok(account.ToBackendContract())); }
private void UpdateAccount(IMarginTradingAccount account, ICollection <Position> positions, ICollection <Order> pendingOrders) { account.AccountFpl.CalculatedHash = account.AccountFpl.ActualHash; var accuracy = _assetsCache.GetAssetAccuracy(account.BaseAssetId); var positionsMaintenanceMargin = positions.Sum(item => item.GetMarginMaintenance()); var positionsInitMargin = positions.Sum(item => item.GetMarginInit()); var pendingOrdersMargin = 0;// pendingOrders.Sum(item => item.GetMarginInit()); account.AccountFpl.PnL = Math.Round(positions.Sum(x => x.GetTotalFpl()), accuracy); account.AccountFpl.UnrealizedDailyPnl = Math.Round(positions.Sum(x => x.GetTotalFpl() - x.ChargedPnL), accuracy); account.AccountFpl.UsedMargin = Math.Round(positionsMaintenanceMargin + pendingOrdersMargin, accuracy); account.AccountFpl.MarginInit = Math.Round(positionsInitMargin + pendingOrdersMargin, accuracy); account.AccountFpl.InitiallyUsedMargin = positions.Sum(p => p.GetInitialMargin()); account.AccountFpl.OpenPositionsCount = positions.Count; account.AccountFpl.ActiveOrdersCount = pendingOrders.Count; var tradingCondition = _tradingConditionsCache.GetTradingCondition(account.TradingConditionId); account.AccountFpl.MarginCall1Level = tradingCondition.MarginCall1; account.AccountFpl.MarginCall2Level = tradingCondition.MarginCall2; account.AccountFpl.StopOutLevel = tradingCondition.StopOut; }
public async Task <MtBackendResponse <TradingConditionModel> > AddOrReplaceTradingCondition( [FromBody] TradingConditionModel model) { if (string.IsNullOrWhiteSpace(model.Id)) { return(MtBackendResponse <TradingConditionModel> .Error("Id cannot be empty")); } if (string.IsNullOrWhiteSpace(model.Name)) { return(MtBackendResponse <TradingConditionModel> .Error("Name cannot be empty")); } if (string.IsNullOrWhiteSpace(model.LegalEntity)) { return(MtBackendResponse <TradingConditionModel> .Error("LegalEntity cannot be empty")); } if (_tradingConditionsCacheService.IsTradingConditionExists(model.Id)) { var existingCondition = _tradingConditionsCacheService.GetTradingCondition(model.Id); if (existingCondition.LegalEntity != model.LegalEntity) { return(MtBackendResponse <TradingConditionModel> .Error("LegalEntity cannot be changed")); } } var tradingCondition = model.ToDomainContract(); tradingCondition = await _tradingConditionsManager.AddOrReplaceTradingConditionAsync(tradingCondition); return(MtBackendResponse <TradingConditionModel> .Ok(tradingCondition?.ToBackendContract())); }
private async Task <MarginTradingAccount> CreateAccount(string clientId, string baseAssetId, string tradingConditionId) { var tradingCondition = _tradingConditionsCacheService.GetTradingCondition(tradingConditionId) .RequiredNotNull("tradingCondition id " + tradingConditionId); var wallet = _marginSettings.IsLive ? await _clientAccountClient.CreateWalletAsync(clientId, WalletType.Trading, OwnerType.Mt, $"{baseAssetId} margin wallet", null) : null; var id = _marginSettings.IsLive ? wallet?.Id : $"{_marginSettings.DemoAccountIdPrefix}{Guid.NewGuid():N}"; var initialBalance = _marginSettings.IsLive ? 0 : LykkeConstants.DefaultDemoBalance; return(new MarginTradingAccount { Id = id, BaseAssetId = baseAssetId, ClientId = clientId, Balance = initialBalance, TradingConditionId = tradingConditionId, LegalEntity = tradingCondition.LegalEntity, }); }