private static bool IsPortfolioValueInputValid(BaseOpeningStrategy strategy, ref string incorrectParameter)
        {
            if (strategy.GrandTotalPortfolioAmount <= 0)
                incorrectParameter = "GrandTotalPortfolioAmount";

            if (strategy.PortfolioAllocationPercentage <= 0)
                incorrectParameter = "PortfolioAllocationPercentage";

            if (strategy.NumberOfPortfolioPositions <= 0)
                incorrectParameter = "NumberOfPortfolioPositions";

            return string.IsNullOrEmpty(incorrectParameter);
        }
        private static void SetCalculatedPositionSizeValue(BaseOpeningStrategy strategy)
        {
            RiskCalculator calculator = new RiskCalculator();
            RiskCalculationOutput output = calculator.Calculate(
                new RiskCalculationInput()
                    {
                        TotalPortfolioAmount = strategy.GrandTotalPortfolioAmount,
                        PortfolioAllocationPercentage = strategy.PortfolioAllocationPercentage,
                        NumberOfPositions = strategy.NumberOfPortfolioPositions,
                        MaxPortfolioRisk = strategy.MaxPortfolioRisk,
                        MaxPositionRisk = strategy.MaxPositionRisk
                    });

            strategy.EffectiveAmountToInvest = output.MaximumAllocatedPositionAmount;
        }
 /// <summary>
 /// 
 /// </summary>
 /// <returns></returns>
 private static bool IsFixedAmountToRiskValid(BaseOpeningStrategy strategy)
 {
     return strategy.FixedAmountToRiskPerPosition > 0;
 }
        internal static void SetAndValidateValue(BaseOpeningStrategy strategy)
        {
            ValidateInput(strategy);

            SetInput(strategy);
        }
        private static void ValidateInput(BaseOpeningStrategy strategy)
        {
            if (strategy.PositionSizingCalculationStrategy == PositionSizingCalculationStrategy.FixedAmount &&
                !IsFixedAmountToInvestValid(strategy))
                throw new StrategyIncorrectInputException(
                    "Fixed amount to invest value is not valid for PositionAmountCalculationStrategy.FixedAmount");

            string incorrectParameter = string.Empty;
            if (strategy.PositionSizingCalculationStrategy ==
                PositionSizingCalculationStrategy.CalculateBasedOnPortfolioValue &&
                !IsPortfolioValueInputValid(strategy, ref incorrectParameter))
                throw new StrategyIncorrectInputException(incorrectParameter,
                                                          "Portfolio calculation parameters amount is not valid for RiskAmountCalculationStrategy.CalculateBasedOnPortfolioValue");

            if (strategy.PositionSizingCalculationStrategy ==
                PositionSizingCalculationStrategy.CalculatedBasedOnRiskAmount)
            {
                if (strategy.RiskAmountCalculationStrategy == RiskAmountCalculationStrategy.FixedAmount &&
                    !IsFixedAmountToRiskValid(strategy))
                    throw new StrategyIncorrectInputException(
                        "Fixed amount to risk value is not valid for RiskAmountCalculationStrategy.FixedAmount");

                if (strategy.RiskAmountCalculationStrategy ==
                    RiskAmountCalculationStrategy.CalculatedBasedOnPortfolioAmount &&
                    !IsRiskCalculationInputValid(strategy, ref incorrectParameter))
                    throw new StrategyIncorrectInputException(incorrectParameter,
                                                              "Risk calculation parameters amount is not valid for RiskAmountCalculationStrategy.CalculatedBasedOnPortfolioAmount");

            }
        }
        private static void SetInput(BaseOpeningStrategy strategy)
        {
            LoggingUtility.WriteInfo(strategy.LoggingConfig,
                                     string.Format(
                                         "Position size allocation parameters: Portfolio Amt: {0:c}, No Of Positions {1}, Portfolio Allocation: {2}",
                                         strategy.GrandTotalPortfolioAmount,
                                         strategy.NumberOfPortfolioPositions,
                                         strategy.PortfolioAllocationPercentage));

            switch (strategy.PositionSizingCalculationStrategy)
            {
                case PositionSizingCalculationStrategy.FixedAmount:
                    strategy.EffectiveAmountToInvest = strategy.FixedAmountToInvestPerPosition;
                    break;

                case PositionSizingCalculationStrategy.CalculatedBasedOnRiskAmount:
                    SetCalculatedRiskAmountValue(strategy);
                    break;

                case PositionSizingCalculationStrategy.CalculateBasedOnPortfolioValue:
                    SetCalculatedPositionSizeValue(strategy);
                    break;
                default:

                    throw new NotImplementedException("PositionSizingCalculationStrategy not implemented");

            }

            LoggingUtility.WriteInfo(strategy.LoggingConfig,
                                     string.Format(
                                         "Position size allocation per position {0:c}",
                                         strategy.EffectiveAmountToInvest));
        }
        private static void SetCalculatedRiskAmountValue(BaseOpeningStrategy strategy)
        {
            if (strategy.RiskAmountCalculationStrategy == RiskAmountCalculationStrategy.FixedAmount)
            {
                strategy.EffectiveAmountToRisk = strategy.FixedAmountToRiskPerPosition;
            }
            else if (strategy.RiskAmountCalculationStrategy == RiskAmountCalculationStrategy.CalculatedBasedOnPortfolioAmount)
            {
                RiskCalculator calculator = new RiskCalculator();
                RiskCalculationOutput output = calculator.Calculate(
                    new RiskCalculationInput()
                        {
                            TotalPortfolioAmount = strategy.GrandTotalPortfolioAmount,
                            PortfolioAllocationPercentage = strategy.PortfolioAllocationPercentage,
                            NumberOfPositions = strategy.NumberOfPortfolioPositions,
                            MaxPortfolioRisk = strategy.MaxPortfolioRisk,
                            MaxPositionRisk = strategy.MaxPositionRisk
                        });

                strategy.EffectiveAmountToInvest = output.MaximumAllocatedPositionAmount;

                if (strategy.RiskAppetiteStrategy == RiskAppetiteStrategy.MinRisk)

                    strategy.EffectiveAmountToRisk = new double[]
                                                         {
                                                             output.MaximumAllocatedPositionRiskAmountByPortfolioRisk,
                                                             output.MaximumAllocatedPositionRiskAmountByPositionRisk
                                                         }.Min();
                else
                    strategy.EffectiveAmountToRisk = new double[]
                                                         {
                                                             output.MaximumAllocatedPositionRiskAmountByPortfolioRisk,
                                                             output.MaximumAllocatedPositionRiskAmountByPositionRisk
                                                         }.Max();
            }
            else
            {
                throw new NotImplementedException("RiskAmountCalculationStrategy not implemented");
            }
        }