Ejemplo n.º 1
0
        public double CalculateOpeningQuantity(OpeningQuantityCalculatorInput input)
        {
            double quantity = 0;

            if (input.PositionSizingCalculationStrategy == PositionSizingCalculationStrategy.FixedAmount)
            {
                // calculate the size based on fixed size
                quantity = input.MaxAmountToInvest / input.TargetPrice;
            }
            else if (input.PositionSizingCalculationStrategy == PositionSizingCalculationStrategy.CalculatedBasedOnRiskAmount)
            {
                // calculate the size based on risk
                double riskPerUnit = input.TargetPrice * input.StopPercentage / 100d;
                quantity = input.MaxAmountToRisk / riskPerUnit;

                double totalAmount = quantity*input.TargetPrice;
                if (totalAmount > input.MaxAmountToInvest)
                {
                    quantity = input.MaxAmountToInvest/input.TargetPrice;
                }

            }

            quantity = CalculateClosingQuantity(quantity, new ClosingQuantityCalculatorInput()
                                                          {
                                                              RoundLots = input.RoundLots,
                                                              PositionSizePercentage = input.PositionSizePercentage
                                                          });

            if (quantity < input.MinimumPosition)
                quantity = input.MinimumPosition;

            return quantity;
        }
        private double GetTargetQuantity(double targetPrice)
        {
            OpeningQuantityCalculatorInput input = new OpeningQuantityCalculatorInput()
            {
                MaxAmountToInvest = EffectiveAmountToInvest,
                MaxAmountToRisk = EffectiveAmountToRisk,
                PositionSizePercentage = PositionSizePercentage,
                PositionSizingCalculationStrategy = PositionSizingCalculationStrategy,
                RoundLots = RoundLots,
                TargetPrice = targetPrice,
                StopPercentage = StopPercentage,
                MinimumPosition = MinimumOrderSize
            };

            QuantityCalculator qtyCalc = new QuantityCalculator(LoggingConfig);
            return qtyCalc.CalculateOpeningQuantity(input);
        }
 protected void ValidateStrategyType(OpeningQuantityCalculatorInput input, PositionSizingCalculationStrategy stratType)
 {
     if (input.PositionSizingCalculationStrategy != stratType)
         throw new ArgumentException("PositionSizingCalculationStrategy", "PositionSizingCalculationStrategy");
 }
 protected abstract object CalculateImpl(OpeningQuantityCalculatorInput input);