private decimal GetValueFromIndicator(IStrategyRuleView rule, List <IndicatorResult> values, bool isFirst)
        {
            var transform = isFirst ? rule.TransformItemsV1 : rule.TransformItemsV2;

            switch (transform)
            {
            case TransformFunction.First:
                return(values.Select(i => i.Value).First());

            case TransformFunction.Max:
                return(values.Max(i => i.Value));

            case TransformFunction.Sum:
                return(values.Sum(i => i.Value));

            case TransformFunction.Avg:
                return(values.Average(i => i.Value));

            case TransformFunction.Min:
                return(values.Min(i => i.Value));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
 private void Initialize(IStrategyRuleView rule)
 {
     Condition   = rule.Condition;
     RuleName    = rule.RuleName;
     RuleSetName = rule.RuleSetName;
     RuleSetId   = rule.RuleSetId;
     RuleId      = rule.RuleId;
 }
        private decimal GetValueFromHistorical(IStrategyRuleView rule, bool isFirst)
        {
            var values = isFirst ? _charts.Periods.First(p => p.Period == rule.Period).Quotes.Skip(rule.SkipItemsV1).Take(rule.TakeItemsV1).ToList()
                : _charts.Periods.First(p => p.Period == rule.Period).Quotes.Skip(rule.SkipItemsV2).Take(rule.TakeItemsV2).ToList();

            var result = CalculateHistoricalValue(values, isFirst ? rule.TransformItemsV1 : rule.TransformItemsV2,
                                                  isFirst ? (HistoricalDataSeriesType)rule.DataSeriesV1 : (HistoricalDataSeriesType)rule.DataSeriesV2);

            return(result);
        }
        private decimal GetSecondValue(IStrategyRuleView rule)
        {
            switch (rule.DataSourceV2)
            {
            case DataSourceType.Indicator:
                return(GetValueFromIndicator(rule, false));

            case DataSourceType.HistoricalData:
                return(GetValueFromHistorical(rule, false));

            case DataSourceType.Constant:
                return(decimal.Parse(rule.ConstV2));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        private decimal GetValueFromIndicator(IStrategyRuleView rule, bool isFirst)
        {
            var indicator = _charts.Periods.First(p => p.Period == rule.Period).Indicators
                            .Where(i => i.Indicator.IndicatorId == (isFirst ? rule.DataSeriesV1 : rule.DataSeriesV2))
                            .Select(i => i)
                            .FirstOrDefault();

            if (indicator != null)
            {
                var values = indicator.IndicatorValues
                             .Skip(isFirst ? rule.SkipItemsV1 : rule.SkipItemsV2)
                             .Take(isFirst ? rule.TakeItemsV1 : rule.TakeItemsV2)
                             .ToList();

                return(GetValueFromIndicator(rule, values, isFirst));
            }

            return(decimal.MinValue);
        }
 public StrategyRuleResult(IStrategyRuleView rule)
 {
     Initialize(rule);
 }