public void VerifyMarginCallOrderLong() { var netLiquidationValue = 5000m; var totalMargin = 10000m; var securityPrice = 100m; var quantity = 300; var model = new PatternDayTradingMarginModel(); // Open Market var security = CreateSecurity(Noon); security.Holdings.SetHoldings(securityPrice, quantity); var expected = -(int)(Math.Round((totalMargin - netLiquidationValue) / securityPrice, MidpointRounding.AwayFromZero) * 4m); var actual = model.GenerateMarginCallOrder(security, netLiquidationValue, totalMargin).Quantity; Assert.AreEqual(expected, actual); // Closed Market security = CreateSecurity(Midnight); security.Holdings.SetHoldings(securityPrice, quantity); expected = -(int)(Math.Round((totalMargin - netLiquidationValue) / securityPrice, MidpointRounding.AwayFromZero) * 2m); actual = model.GenerateMarginCallOrder(security, netLiquidationValue, totalMargin).Quantity; Assert.AreEqual(expected, actual); }
public void VerifyClosedMarketLeverageAltVersion() { var leverage = 3m; var expected = 100 * 100m / leverage + 1; var model = new PatternDayTradingMarginModel(leverage, 4m); // Market is Closed on Tuesday, Feb, 16th 2016 at Midnight var security = CreateSecurity(Midnight); var order = new MarketOrder(security.Symbol, 100, security.LocalTime); Assert.AreEqual((double)leverage, (double)model.GetLeverage(security), 1e-3); Assert.AreEqual((double)expected, (double)model.GetInitialMarginRequiredForOrder(security, order), 1e-3); // Market is Closed on Monday, Feb, 15th 2016 at Noon (US President Day) security = CreateSecurity(NoonHoliday); order = new MarketOrder(security.Symbol, 100, security.LocalTime); Assert.AreEqual((double)leverage, (double)model.GetLeverage(security), 1e-3); Assert.AreEqual((double)expected, (double)model.GetInitialMarginRequiredForOrder(security, order), 1e-3); // Market is Closed on Sunday, Feb, 14th 2016 at Noon security = CreateSecurity(NoonWeekend); order = new MarketOrder(security.Symbol, 100, security.LocalTime); Assert.AreEqual((double)leverage, (double)model.GetLeverage(security), 1e-3); Assert.AreEqual((double)expected, (double)model.GetInitialMarginRequiredForOrder(security, order), 1e-3); }
public void VerifyMarginCallOrderShortClosedMarket() { var securityPrice = 100m; var quantity = -300; var orderProcessor = new FakeOrderProcessor(); var portfolio = GetPortfolio(orderProcessor, quantity, Midnight); var model = new PatternDayTradingMarginModel(); // Open Market var security = CreateSecurity(Midnight); security.BuyingPowerModel = model; security.Holdings.SetHoldings(securityPrice, quantity); portfolio.Securities.Add(security); portfolio.CashBook["USD"].AddAmount(35000); portfolio.InvalidateTotalPortfolioValue(); var netLiquidationValue = portfolio.TotalPortfolioValue; var totalMargin = portfolio.TotalMarginUsed; var expected = (int)(Math.Round((totalMargin - netLiquidationValue) / securityPrice, MidpointRounding.AwayFromZero) * 2m); var actual = (portfolio.MarginCallModel as TestDefaultMarginCallModel).GenerateMarginCallOrder(security, netLiquidationValue, totalMargin).Quantity; Assert.AreEqual(expected, actual); }
public void VerifyOpenMarketLeverageAltVersion() { // Market is Open on Tuesday, Feb, 16th 2016 at Noon var leverage = 5m; var expected = 100 * 100m / leverage + 1; var model = new PatternDayTradingMarginModel(2m, leverage); var security = CreateSecurity(Noon); var order = new MarketOrder(security.Symbol, 100, security.LocalTime); Assert.AreEqual((double)leverage, (double)model.GetLeverage(security), 1e-3); Assert.AreEqual((double)expected, (double)model.GetInitialMarginRequiredForOrder(security, order), 1e-3); }
public void VerifyMaintenaceMargin() { var model = new PatternDayTradingMarginModel(); // Open Market var security = CreateSecurity(Noon); security.Holdings.SetHoldings(100m, 100); Assert.AreEqual((double)100 * 100 / 4, (double)model.GetMaintenanceMargin(security), 1e-3); // Closed Market security = CreateSecurity(Midnight); security.Holdings.SetHoldings(100m, 100); Assert.AreEqual((double)100 * 100 / 2, (double)model.GetMaintenanceMargin(security), 1e-3); }