public GetMaximumOrderQuantityResult GetMaximumOrderQuantityForDeltaBuyingPower( GetMaximumOrderQuantityForDeltaBuyingPowerParameters parameters ) { EnsureSecurityExists(parameters.Security); var expected = SecurityModel.GetMaximumOrderQuantityForDeltaBuyingPower(parameters); if (reentry) { return(expected); } reentry = true; var security = parameters.Security; var positionGroup = Portfolio.Positions[new PositionGroupKey(PositionGroupModel, security)]; var actual = PositionGroupModel.GetMaximumLotsForDeltaBuyingPower( new GetMaximumLotsForDeltaBuyingPowerParameters( parameters.Portfolio, positionGroup, parameters.DeltaBuyingPower, parameters.MinimumOrderMarginPortfolioPercentage, parameters.SilenceNonErrorReasons ) ); var lotSize = security.SymbolProperties.LotSize; Assert.AreEqual(expected.IsError, actual.IsError, $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForDeltaBuyingPower)}: " + $"ExpectedQuantity: {expected.Quantity} ActualQuantity: {actual.NumberOfLots * lotSize} {Environment.NewLine}" + $"ExpectedReason: {expected.Reason}{Environment.NewLine}" + $"ActualReason: {actual.Reason}" ); // we're not comparing group quantities, which is the number of position lots, but rather the implied // position quantities resulting from having that many lots. var resizedPositionGroup = positionGroup.WithQuantity(actual.NumberOfLots); var position = resizedPositionGroup.GetPosition(security.Symbol); var bpmOrder = new MarketOrder(security.Symbol, expected.Quantity, parameters.Portfolio.Securities.UtcTime); var pgbpmOrder = new MarketOrder(security.Symbol, position.Quantity, parameters.Portfolio.Securities.UtcTime); var bpmMarginRequired = security.BuyingPowerModel.GetInitialMarginRequirement(security, bpmOrder.Quantity); var pgbpmMarginRequired = PositionGroupModel.GetInitialMarginRequiredForOrder(Portfolio, resizedPositionGroup, pgbpmOrder); var availableBuyingPower = security.BuyingPowerModel.GetBuyingPower(parameters.Portfolio, security, bpmOrder.Direction); Assert.AreEqual(expected.Quantity, position.Quantity, $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForDeltaBuyingPower)}: " + $"ExpectedReason: {expected.Reason}{Environment.NewLine}" + $"ActualReason: {actual.Reason}" ); Assert.AreEqual(expected.Reason, actual.Reason, $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForDeltaBuyingPower)}" ); reentry = false; return(expected); }