public void InitializationTests() { // No parameters initialization, used default PDT 4x leverage open market and 2x leverage otherwise var model = new PatternDayTradingMarginModel(); var leverage = model.GetLeverage(CreateSecurity(Noon)); Assert.AreEqual(4.0m, leverage); model = new PatternDayTradingMarginModel(2.0m, 5.0m); leverage = model.GetLeverage(CreateSecurity(Noon)); Assert.AreEqual(5.0m, leverage); }
public void VerifyOpenMarketLeverage() { // Market is Open on Tuesday, Feb, 16th 2016 at Noon var leverage = 4m; var expected = 100 * 100m / leverage + 1; var model = new PatternDayTradingMarginModel(); 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 SetLeverageTest() { var model = new PatternDayTradingMarginModel(); // Open market var security = CreateSecurity(Noon); security.MarginModel = new PatternDayTradingMarginModel(); model.SetLeverage(security, 10m); Assert.AreNotEqual(10m, model.GetLeverage(security)); // Closed market security = CreateSecurity(Midnight); model.SetLeverage(security, 10m); Assert.AreNotEqual(10m, model.GetLeverage(security)); security.Holdings.SetHoldings(100m, 100); }
public void VerifyMarginCallOrderShort() { 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 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); }
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); }