private async Task <EditStrategyViewModel> GetViewModel(int?id)
        {
            var model = new EditStrategyViewModel
            {
                Indicators = _indicatorsService.GetIndicatorsAvailableForStrategies().Select(dto => new EditIndicatorViewModel()
                {
                    Name = dto.IndicatorName,
                    Type = dto.IndicatorType
                }).ToList(),
            };

            foreach (var indicator in model.Indicators)
            {
                var properties = _indicatorsService.GetPropertiesForIndicator(indicator.Type);
                indicator.Properties = properties.Select(p => new IndicatorPropertyViewModel {
                    Name = p.Name, Value = p.Value
                }).ToList();
                var description = _indicatorsService.GetIndicatorDescription(indicator.Type);
                indicator.BuySignalDescription  = description.BuySignalDescription;
                indicator.SellSignalDescription = description.SellSignalDescription;
            }
            if (id.HasValue)
            {
                model.Id = id;
                await FillIndicatorValues(id, model);
            }
            return(model);
        }
        private async Task FillIndicatorValues(int?id, EditStrategyViewModel model)
        {
            var strategy = await _strategyService.GetStrategy(CurrentUserId, id.Value);

            model.IsConjunctiveStrategy = strategy.IsConjunctiveStrategy;
            model.SignalDaysPeriod      = strategy.SignalDaysPeriod ?? 1;
            model.Name = strategy.Name;
            foreach (var parameterizedIndicator in strategy.Indicators.Where(t => t.IndicatorType.HasValue))
            {
                var indicatorModel =
                    model.Indicators.FirstOrDefault(m => m.Type == parameterizedIndicator.IndicatorType.Value);
                if (indicatorModel == null)
                {
                    continue;
                }

                indicatorModel.IsSelected = true;
                foreach (var property in parameterizedIndicator.Properties)
                {
                    var propertyModel = indicatorModel.Properties.FirstOrDefault(p => p.Name == property.Name);
                    if (propertyModel == null)
                    {
                        continue;
                    }

                    propertyModel.Value = property.Value;
                }
            }
        }
        private StrategyDto BuildCreateStrategyDto(EditStrategyViewModel model)
        {
            var dto = new StrategyDto
            {
                Name       = model.Name,
                UserId     = CurrentUserId,
                Id         = model.Id ?? 0,
                Indicators = model.Indicators.Select(i => new ParameterizedIndicator
                {
                    IndicatorType = i.Type,
                    Properties    = i.Properties
                                    .Where(p => !string.IsNullOrWhiteSpace(p.Name))
                                    .Select(p => new IndicatorProperty
                    {
                        Name  = p.Name,
                        Value = p.Value
                    }).ToList()
                }).ToList(),
                SignalDaysPeriod = model.IsConjunctiveStrategy ? (int?)model.SignalDaysPeriod : null
            };

            return(dto);
        }
        public async Task <ActionResult> EditStrategy(EditStrategyViewModel model)
        {
            if (!model.Indicators?.Any() ?? false)
            {
                return(JsonErrorResult("Strategy must have at least one indicator"));
            }
            if (!ModelState.IsValid)
            {
                return(JsonErrorResult(ModelState));
            }
            var dto = BuildCreateStrategyDto(model);
            int?id  = model.Id;

            if (model.Id.HasValue)
            {
                await _strategyService.UpdateStrategy(dto);
            }
            else
            {
                id = await _strategyService.CreateStrategy(dto);
            }
            ShowNotification("", "Strategy has been saved", ToastType.Success);
            return(new JsonNetResult(new { id, redirectUrl = Url.Action("Index") }));
        }