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);