private async IAsyncEnumerable <ITradingInstrument> GetTradingInstruments(
            IReadOnlyList <Product> products,
            string tradingConditionId = null)
        {
            var clientProfiles = tradingConditionId == null
                ? await _clientProfilesRepository.GetAllAsync()
                : new[] { await _clientProfilesRepository.GetByIdAsync(tradingConditionId) };

            var assetTypes = products.Select(p => p.AssetType).Distinct().ToList();

            foreach (var clientProfile in clientProfiles)
            {
                var availableClientProfileSettingsList =
                    await _clientProfileSettingsRepository.GetAllAsync(clientProfile.Id, assetTypes, true);

                foreach (var product in products)
                {
                    var clientProfileSettings = availableClientProfileSettingsList.SingleOrDefault(x =>
                                                                                                   x.ClientProfileId == clientProfile.Id && x.AssetTypeId == product.AssetType);

                    if (clientProfileSettings == null)
                    {
                        continue;
                    }

                    var underlying = _underlyingsCache.GetByMdsCode(product.UnderlyingMdsCode);

                    yield return(TradingInstrument.CreateFromProduct(
                                     product,
                                     clientProfileSettings.ClientProfileId,
                                     clientProfileSettings.Margin,
                                     underlying?.Spread ?? _defaultTradingInstrumentSettings.Spread));
                }
            }
        }
Exemple #2
0
 public Task <List <ClientProfileSettings> > GetAllAsync()
 => _regulatorySettingsRepository.GetAllAsync(null, null);
Exemple #3
0
        public async Task <List <Asset> > GetLegacyAssets(IEnumerable <string> productIds = null)
        {
            var products =
                (await _productsRepository.GetByProductsIdsAsync(productIds))
                .Where(x => x.IsStarted)
                .ToDictionary(x => x.ProductId, v => v);

            var brokerSettingsResponse = await _brokerSettingsApi.GetByIdAsync(_brokerId);

            if (brokerSettingsResponse.ErrorCode != BrokerSettingsErrorCodesContract.None)
            {
                throw new InvalidOperationException($"Unexpected error code {brokerSettingsResponse.ErrorCode}, " +
                                                    $"while retrieving settings for broker id {_brokerId}");
            }

            var productTradingCurrencyMap = products.ToDictionary(x => x.Key, v => v.Value.TradingCurrency);
            var productMarketSettingsMap  = products.ToDictionary(x => x.Key, v => v.Value.Market);
            var productTickFormulaMap     = products.ToDictionary(x => x.Key, v => v.Value.TickFormula);
            var productToCategoryMap      = products.ToDictionary(x => x.Key, v => v.Value.Category);
            var productAssetTypeIdMap     = products.ToDictionary(x => x.Key, v => v.Value.AssetType);

            var tradingCurrencies =
                (await _currenciesRepository.GetByIdsAsync(productTradingCurrencyMap.Values.Distinct())).ToDictionary(x => x.Id, v => v);

            var availableClientProfileSettingsDict =
                (await _clientProfileSettingsRepository.GetAllAsync(string.Empty, productAssetTypeIdMap.Values.Distinct(), true))
                .GroupBy(x => x.AssetTypeId)
                .ToDictionary(x => x.Key, v => v.AsEnumerable());

            var underlyings = products.Select(x => x.Value.UnderlyingMdsCode).Distinct()
                              .Select(_underlyingsCache.GetByMdsCode)
                              .ToDictionary(x => x.MdsCode, v => v);

            var baseCurrenciesIds = underlyings.Values.Where(x => !string.IsNullOrEmpty(x.BaseCurrency))
                                    .Select(x => x.BaseCurrency).Distinct();

            var baseCurrencies =
                (await _currenciesRepository.GetByIdsAsync(baseCurrenciesIds)).ToDictionary(x => x.Id, v => v);

            var productCategories =
                (await _productCategoriesRepository.GetByIdsAsync(productToCategoryMap.Values.Distinct())).ToDictionary(x => x.Id, v => v);

            var productMarketSettings =
                (await _marketSettingsRepository.GetByIdsAsync(productMarketSettingsMap.Values.Distinct())).ToDictionary(x => x.Id, v => v);

            var productTickFormulas =
                (await _tickFormulaRepository.GetByIdsAsync(productTickFormulaMap.Values.Distinct())).ToDictionary(x => x.Id, v => v);

            var assetTypes = (await _assetTypesRepository.GetAllAsync()).ToDictionary(x => x.Id, v => v);

            var result = new List <Asset>();

            foreach (var product in products.Values)
            {
                var id    = product.ProductId;
                var asset = CreateEmptyAsset();

                underlyings.TryGetValue(product.UnderlyingMdsCode, out var underlying);
                var baseCurrencyId = underlying?.BaseCurrency;
                var baseCurrency   = string.IsNullOrEmpty(baseCurrencyId) ? null :
                                     baseCurrencies.ContainsKey(baseCurrencyId) ? baseCurrencies[baseCurrencyId] : null;

                if (underlying != null)
                {
                    asset.SetAssetFieldsFromUnderlying(underlying);
                }
                else
                {
                    _log.WriteWarning(nameof(LegacyAssetsService), nameof(GetLegacyAssets),
                                      $"Missing underlying in cache for product with mdsCode:{product.UnderlyingMdsCode}");
                }

                asset.SetAssetFieldsFromProduct(product);

                if (baseCurrency != null)
                {
                    asset.SetAssetFieldsFromBaseCurrency(baseCurrency, _assetTypesWithZeroInterestRate);
                }

                asset.SetAssetFieldsFromTradingCurrency(tradingCurrencies[productTradingCurrencyMap[id]], _assetTypesWithZeroInterestRate);

                if (availableClientProfileSettingsDict.TryGetValue(asset.Underlying.AssetType, out var clientProfileSettingsList))
                {
                    var availableClientProfileSettingsForAssetType = clientProfileSettingsList.Select(x =>
                                                                                                      x.ToClientProfileWithRate(product.GetMarginRate(x.Margin)));
                    asset.Underlying.AvailableClientProfiles.AddRange(availableClientProfileSettingsForAssetType);
                }

                asset.SetAssetFieldsFromCategory(productCategories[productToCategoryMap[id]]);
                asset.SetAssetFieldsFromMarketSettings(productMarketSettings[productMarketSettingsMap[id]]);
                asset.SetAssetFieldsFromTickFormula(productTickFormulas[productTickFormulaMap[id]]);
                asset.SetAssetFieldsFromAssetType(assetTypes[productAssetTypeIdMap[id]]);
                asset.SetDividendFactorFields(productMarketSettings[productMarketSettingsMap[id]],
                                              brokerSettingsResponse.BrokerSettings,
                                              product);

                result.Add(asset);
            }

            return(result);
        }
Exemple #4
0
        public async Task InsertAsync(AssetTypeWithTemplate model, string username, string correlationId)
        {
            var brokerSettingsResponse = await _brokerSettingsApi.GetByIdAsync(_brokerId);

            if (brokerSettingsResponse.ErrorCode == BrokerSettingsErrorCodesContract.BrokerSettingsDoNotExist)
            {
                throw new BrokerSettingsDoNotExistException();
            }

            await ValidateUnderlyingCategory(model.UnderlyingCategoryId);

            var regulationId = brokerSettingsResponse.BrokerSettings.RegulationId;

            await ValidateRegulatoryType(model.RegulatoryTypeId, regulationId);

            List <ClientProfileSettings> clientProfileSettings;

            //duplicate settings if we use template
            if (!string.IsNullOrEmpty(model.AssetTypeTemplateId))
            {
                var regulatoryProfileTemplateExists =
                    await _assetTypesRepository.ExistsAsync(model.AssetTypeTemplateId);

                if (!regulatoryProfileTemplateExists)
                {
                    throw new AssetTypeDoesNotExistException();
                }

                clientProfileSettings = await
                                        _clientProfileSettingsRepository.GetAllAsync(null, model.AssetTypeTemplateId);

                foreach (var clientProfileSetting in clientProfileSettings)
                {
                    clientProfileSetting.AssetTypeId = model.Id;

                    var regulatorySettings = await _regulatorySettingsApi.GetRegulatorySettingsByIdsAsync(
                        clientProfileSetting.RegulatoryProfileId, model.RegulatoryTypeId);

                    ValidateRegulatoryConstraint(regulatorySettings, clientProfileSetting);
                }
            }
            else
            {
                clientProfileSettings = new List <ClientProfileSettings>();
                var allRegulatorySettings =
                    await _regulatorySettingsApi.GetRegulatorySettingsByRegulationAsync(regulationId);

                var clientProfiles = await _clientProfilesRepository.GetAllAsync();

                foreach (var clientProfile in clientProfiles)
                {
                    var regulatorySettings = allRegulatorySettings.RegulatorySettings.Single(x =>
                                                                                             x.TypeId == model.RegulatoryTypeId && x.ProfileId == clientProfile.RegulatoryProfileId);

                    clientProfileSettings.Add(new ClientProfileSettings
                    {
                        AssetTypeId     = model.Id,
                        ClientProfileId = clientProfile.Id,
                        Margin          = regulatorySettings.MarginMinPercent,
                        IsAvailable     = regulatorySettings.IsAvailable,
                    });
                }
            }

            await _assetTypesRepository.InsertAsync(model, clientProfileSettings);

            await _auditService.TryAudit(correlationId, username, model.Id, AuditDataType.AssetType,
                                         model.ToJson());

            await _entityChangedSender.SendEntityCreatedEvent <AssetType, AssetTypeContract, AssetTypeChangedEvent>(model,
                                                                                                                    username, correlationId);

            foreach (var profileSettings in clientProfileSettings)
            {
                await _entityChangedSender
                .SendEntityCreatedEvent <ClientProfileSettings, ClientProfileSettingsContract,
                                         ClientProfileSettingsChangedEvent>(profileSettings, username, correlationId);
            }
        }