コード例 #1
0
        public GetMaximumOrderQuantityResult GetMaximumOrderQuantityForTargetBuyingPower(
            GetMaximumOrderQuantityForTargetBuyingPowerParameters parameters
            )
        {
            EnsureSecurityExists(parameters.Security);
            var expected = SecurityModel.GetMaximumOrderQuantityForTargetBuyingPower(parameters);

            if (reentry)
            {
                return(expected);
            }

            reentry = true;
            var security      = parameters.Security;
            var positionGroup = Portfolio.Positions[new PositionGroupKey(PositionGroupModel, security)];
            var actual        = PositionGroupModel.GetMaximumLotsForTargetBuyingPower(
                new GetMaximumLotsForTargetBuyingPowerParameters(
                    parameters.Portfolio,
                    positionGroup,
                    parameters.TargetBuyingPower,
                    parameters.MinimumOrderMarginPortfolioPercentage,
                    parameters.SilenceNonErrorReasons
                    )
                );

            var lotSize = security.SymbolProperties.LotSize;

            Assert.AreEqual(expected.IsError, actual.IsError,
                            $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForTargetBuyingPower)}: " +
                            $"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 bpmOrderValue   = bpmOrder.GetValue(security);
            var pgbpmOrderValue = pgbpmOrder.GetValue(security);

            var bpmOrderFees   = security.FeeModel.GetOrderFee(new OrderFeeParameters(security, bpmOrder)).Value.Amount;
            var pgbpmOrderFees = security.FeeModel.GetOrderFee(new OrderFeeParameters(security, pgbpmOrder)).Value.Amount;

            var bpmMarginRequired   = bpmOrderValue + bpmOrderFees;
            var pgbpmMarginRequired = pgbpmOrderValue + pgbpmOrderFees;

            Assert.AreEqual(expected.Quantity, position.Quantity,
                            $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForTargetBuyingPower)}: " +
                            $"ExpectedReason: {expected.Reason}{Environment.NewLine}" +
                            $"ActualReason: {actual.Reason}"
                            );

            Assert.AreEqual(expected.Reason, actual.Reason,
                            $"{PositionGroupModel.GetType().Name}:{nameof(GetMaximumOrderQuantityForTargetBuyingPower)}: " +
                            $"ExpectedReason: {expected.Reason}{Environment.NewLine}" +
                            $"ActualReason: {actual.Reason}"
                            );

            reentry = false;
            return(expected);
        }