private bool HasSufficientBuyingPowerForOrder(decimal orderQuantity, Security security, IAlgorithm algo) { var order = new MarketOrder(security.Symbol, orderQuantity, DateTime.UtcNow); _fakeOrderProcessor.AddTicket(order.ToOrderTicket(algo.Transactions)); var hashSufficientBuyingPower = security.BuyingPowerModel.HasSufficientBuyingPowerForOrder(algo.Portfolio, security, new MarketOrder(security.Symbol, orderQuantity, DateTime.UtcNow)); return(hashSufficientBuyingPower.IsSufficient); }
public void NegativeMarginRemaining(bool isError, int target, int side) { var algo = GetAlgorithm(); var security = InitAndGetSecurity(algo, 5); security.Holdings.SetHoldings(security.Price, 1000 * side); algo.Portfolio.CashBook.Add(algo.AccountCurrency, -100000, 1); var fakeOrderProcessor = new FakeOrderProcessor(); algo.Transactions.SetOrderProcessor(fakeOrderProcessor); Assert.IsTrue(algo.Portfolio.MarginRemaining < 0); var quantity = security.BuyingPowerModel.GetMaximumOrderQuantityForTargetBuyingPower( new GetMaximumOrderQuantityForTargetBuyingPowerParameters(algo.Portfolio, security, target * side, 0)).Quantity; if (!isError) { Assert.AreEqual(1000 * side * -1, quantity); } else { // even if we don't have margin 'GetMaximumOrderQuantityForTargetBuyingPower' doesn't care Assert.AreNotEqual(0, quantity); } var order = new MarketOrder(security.Symbol, quantity, new DateTime(2020, 1, 1)); fakeOrderProcessor.AddTicket(order.ToOrderTicket(algo.Transactions)); var actual = security.BuyingPowerModel.HasSufficientBuyingPowerForOrder( new HasSufficientBuyingPowerForOrderParameters(algo.Portfolio, security, order)); Assert.AreEqual(!isError, actual.IsSufficient); }