public void FutureOptionSecurityUsesFutureOptionMarginModel() { var underlyingFuture = Symbol.CreateFuture( QuantConnect.Securities.Futures.Indices.SP500EMini, Market.CME, new DateTime(2021, 3, 19)); var futureOption = Symbol.CreateOption(underlyingFuture, Market.CME, OptionStyle.American, OptionRight.Call, 2550m, new DateTime(2021, 3, 19)); var futureOptionSecurity = new QuantConnect.Securities.FutureOption.FutureOption( futureOption, MarketHoursDatabase.FromDataFolder().GetExchangeHours(Market.CME, futureOption, futureOption.SecurityType), new Cash("USD", 100000m, 1m), new OptionSymbolProperties(string.Empty, "USD", 1m, 0.01m, 1m), new CashBook(), new RegisteredSecurityDataTypesProvider(), new SecurityCache(), null); Assert.IsTrue(futureOptionSecurity.BuyingPowerModel is FuturesOptionsMarginModel); }
public void MarginRequirementEs(decimal strike, double expected, OptionRight optionRight, PositionSide positionSide, decimal underlyingRequirement) { var tz = TimeZones.NewYork; var expDate = new DateTime(2021, 3, 19); // For this symbol we dont have any history, but only one date and margins line var ticker = QuantConnect.Securities.Futures.Indices.SP500EMini; var future = Symbol.CreateFuture(ticker, Market.Globex, expDate); var symbol = Symbol.CreateOption(future, Market.Globex, OptionStyle.American, optionRight, strike, new DateTime(2021, 3, 19)); var futureSecurity = new Future( SecurityExchangeHours.AlwaysOpen(tz), new SubscriptionDataConfig(typeof(TradeBar), future, Resolution.Minute, tz, tz, true, false, false), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null ); var optionSecurity = new QuantConnect.Securities.FutureOption.FutureOption(symbol, SecurityExchangeHours.AlwaysOpen(tz), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache(), futureSecurity ); optionSecurity.Underlying.SetMarketPrice(new Tick { Value = 4172, Time = new DateTime(2001, 01, 07) }); var marginRequirement = FuturesOptionsMarginModel.GetMarginRequirement(optionSecurity, underlyingRequirement, positionSide); Log.Debug($"Side {positionSide}. Right {optionRight}. Strike {strike}. Margin: {marginRequirement}"); Assert.AreEqual(expected, marginRequirement, (double)underlyingRequirement * 0.30d); }
public void MarginRequirementsAreSetCorrectly() { var expDate = new DateTime(2021, 3, 19); var tz = TimeZones.NewYork; // For this symbol we dont have any history, but only one date and margins line var ticker = QuantConnect.Securities.Futures.Indices.SP500EMini; var future = Symbol.CreateFuture(ticker, Market.CME, expDate); var symbol = Symbol.CreateOption(future, Market.CME, OptionStyle.American, OptionRight.Call, 2550m, new DateTime(2021, 3, 19)); var futureSecurity = new Future( SecurityExchangeHours.AlwaysOpen(tz), new SubscriptionDataConfig(typeof(TradeBar), future, Resolution.Minute, tz, tz, true, false, false), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null ); var optionSecurity = new QuantConnect.Securities.FutureOption.FutureOption(symbol, SecurityExchangeHours.AlwaysOpen(tz), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache(), futureSecurity ); var futureMarginModel = new FuturesOptionsMarginModel(futureOption: optionSecurity); optionSecurity.Underlying.SetMarketPrice(new Tick { Value = 1500, Time = new DateTime(2001, 01, 07) }); var initialIntradayMarginRequirement = futureMarginModel.InitialIntradayMarginRequirement; var maintenanceIntradayMarginRequirement = futureMarginModel.MaintenanceIntradayMarginRequirement; var initialOvernightMarginRequirement = futureMarginModel.MaintenanceOvernightMarginRequirement; var maintenanceOvernightMarginRequirement = futureMarginModel.InitialOvernightMarginRequirement; Assert.AreNotEqual(0, initialIntradayMarginRequirement); Assert.AreNotEqual(0, maintenanceIntradayMarginRequirement); Assert.AreNotEqual(0, initialOvernightMarginRequirement); Assert.AreNotEqual(0, maintenanceOvernightMarginRequirement); }