public void OnEndOfTimeStepDoesNotThrowWhenSeedsSameUnderlyingForTwoSecurities() { var qcAlgorithm = new QCAlgorithm(); qcAlgorithm.SubscriptionManager.SetDataManager(new DataManagerStub(qcAlgorithm)); qcAlgorithm.SetLiveMode(true); var testHistoryProvider = new TestHistoryProvider(); qcAlgorithm.HistoryProvider = testHistoryProvider; var option = qcAlgorithm.AddOption(testHistoryProvider.underlyingSymbol); var symbol = Symbol.CreateOption(testHistoryProvider.underlyingSymbol, Market.USA, OptionStyle.American, OptionRight.Call, 1, new DateTime(2015, 12, 24)); var symbol2 = Symbol.CreateOption(testHistoryProvider.underlyingSymbol, Market.USA, OptionStyle.American, OptionRight.Put, 1, new DateTime(2015, 12, 24)); var optionContract = qcAlgorithm.AddOptionContract(symbol, Resolution.Daily); var optionContract2 = qcAlgorithm.AddOptionContract(symbol2, Resolution.Minute); qcAlgorithm.OnEndOfTimeStep(); var data = qcAlgorithm.Securities[testHistoryProvider.underlyingSymbol].GetLastData(); Assert.AreEqual(testHistoryProvider.LastResolutionRequest, Resolution.Minute); Assert.IsNotNull(data); Assert.AreEqual(data.Price, 2); }
private static Security InitAndGetSecurity(QCAlgorithm algo, decimal fee, SecurityType securityType = SecurityType.Equity, string symbol = "SPY", DateTime?time = null) { algo.SubscriptionManager.SetDataManager(new DataManagerStub(algo)); Security security; if (securityType == SecurityType.Equity) { security = algo.AddEquity(symbol); _symbol = security.Symbol; } else if (securityType == SecurityType.Option) { security = algo.AddOption(symbol); _symbol = security.Symbol; } else if (securityType == SecurityType.Future) { security = algo.AddFuture(symbol == "SPY" ? "ES" : symbol); _symbol = security.Symbol; } else { throw new Exception("SecurityType not implemented"); } security.FeeModel = new ConstantFeeModel(fee); Update(security, 25, time); return(security); }
private static Security InitAndGetSecurity(QCAlgorithm algo, decimal fee, SecurityType securityType = SecurityType.Equity, string symbol = "SPY") { algo.SubscriptionManager.SetDataManager(new DataManagerStub(algo)); Security security; if (securityType == SecurityType.Equity) { security = algo.AddEquity(symbol); _symbol = security.Symbol; } else if (securityType == SecurityType.Option) { security = algo.AddOption(symbol); _symbol = security.Symbol; } else if (securityType == SecurityType.Future) { security = algo.AddFuture(symbol); _symbol = security.Symbol; } else { throw new Exception("SecurityType not implemented"); } security.TransactionModel = new ConstantFeeTransactionModel(fee); Update(algo.Portfolio.CashBook, security, 25); return(security); }
public void AddDataOptionsTickerHasNoChainedUnderlyingSymbols(string ticker, Type customDataType) { SymbolCache.Clear(); var qcAlgorithm = new QCAlgorithm(); qcAlgorithm.SubscriptionManager.SetDataManager(new DataManagerStub(qcAlgorithm)); var asset = qcAlgorithm.AddOption(ticker); // Dummy here is meant to try to corrupt the SymbolCache. Ideally, SymbolCache should return non-custom data types with higher priority // in case we want to add two custom data types, but still have them associated with the equity from the cache if we're using it. // This covers the case where two idential data subscriptions are created. var dummy = qcAlgorithm.AddData(customDataType, ticker, Resolution.Daily, qcAlgorithm.SubscriptionManager.Subscriptions.Where(x => x.SecurityType == SecurityType.Option).Single().DataTimeZone); var customData = qcAlgorithm.AddData(customDataType, ticker, Resolution.Daily, qcAlgorithm.SubscriptionManager.Subscriptions.Where(x => x.SecurityType == SecurityType.Option).Single().DataTimeZone); // Check to see if we have an underlying symbol when we shouldn't Assert.IsFalse(customData.Symbol.HasUnderlying, $"{customDataType.Name} has an underlying Symbol"); var assetSubscription = qcAlgorithm.SubscriptionManager.Subscriptions.Where(x => x.SecurityType == SecurityType.Option).Single(); var customDataSubscription = qcAlgorithm.SubscriptionManager.Subscriptions.Where(x => x.SecurityType == SecurityType.Base).Single(); Assert.IsTrue(assetSubscription.TickerShouldBeMapped()); Assert.IsFalse(customDataSubscription.TickerShouldBeMapped()); //Assert.AreNotEqual(assetSubscription.MappedSymbol, customDataSubscription.MappedSymbol); }
public void DefaultBrokerageModel_IsUSA_ForOption() { var option = _algo.AddOption(Sym); Assert.IsTrue(option.Symbol.ID.Market == Market.USA); Assert.IsTrue(_algo.BrokerageModel.GetType() == typeof(DefaultBrokerageModel)); }
public void Setup() { var algo = new QCAlgorithm(); var settings = new UniverseSettings(Resolution.Second, 1, true, false, TimeSpan.Zero); var timeKeeper = new TimeKeeper(new DateTime(2015, 12, 07)); var subscriptionManager = new SubscriptionManager(timeKeeper); var securityInitializer = SecurityInitializer.Null; _canonicalSecurity = algo.AddOption("SPY"); _optionsChainUniverse = new OptionChainUniverse(_canonicalSecurity, settings, subscriptionManager, securityInitializer); }
public void NonAccountCurrency_GetBuyingPower(decimal nonAccountCurrencyCash) { var algorithm = new QCAlgorithm(); algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm)); algorithm.Portfolio.SetAccountCurrency("EUR"); algorithm.Portfolio.SetCash(10000); algorithm.Portfolio.SetCash(Currencies.USD, nonAccountCurrencyCash, 0.88m); var option = algorithm.AddOption("SPY"); var buyingPowerModel = new OptionMarginModel(); var quantity = buyingPowerModel.GetBuyingPower(new BuyingPowerParameters( algorithm.Portfolio, option, OrderDirection.Buy)); Assert.AreEqual(10000m + algorithm.Portfolio.CashBook[Currencies.USD].ValueInAccountCurrency, quantity.Value); }
public void AddOptionWithUnderlyingFuture() { // Adds an option containing a Future as its underlying Symbol. // This is an essential step in enabling custom derivatives // based on any asset class provided to Option. This test // checks the ability to create Future Options. var algo = new QCAlgorithm(); algo.SubscriptionManager.SetDataManager(new DataManagerStub(algo)); var underlying = algo.AddFuture("ES", Resolution.Minute, Market.CME); underlying.SetFilter(0, 365); var futureOption = algo.AddOption(underlying.Symbol, Resolution.Minute); Assert.IsTrue(futureOption.Symbol.HasUnderlying); Assert.AreEqual(underlying.Symbol, futureOption.Symbol.Underlying); }
public void PythonFilterFunctionReturnsUniverse() { var algorithm = new QCAlgorithm(); algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm)); var spyOption = algorithm.AddOption("SPY"); using (Py.GIL()) { //Filter function that returns a OptionFilterUniverse var module = PythonEngine.ModuleFromString(Guid.NewGuid().ToString(), "def filter(universe):\n" + " universe = universe.WeeklysOnly().Expiration(0, 5)\n" + " return universe" ); var filterFunction = module.GetAttr("filter"); Assert.DoesNotThrow(() => spyOption.SetFilter(filterFunction)); } }
public void PythonFilterFunctionReturnsList() { var algorithm = new QCAlgorithm(); algorithm.SubscriptionManager.SetDataManager(new DataManagerStub(algorithm)); var spyOption = algorithm.AddOption("SPY"); using (Py.GIL()) { //Filter function that returns a list of symbols var module = PythonEngine.ModuleFromString(Guid.NewGuid().ToString(), "def filter(universe):\n" + " universe = universe.WeeklysOnly().Expiration(0, 10)\n" + " return [symbol for symbol in universe\n" + " if symbol.ID.OptionRight != OptionRight.Put\n" + " and universe.Underlying.Price - symbol.ID.StrikePrice < 10]\n" ); var filterFunction = module.GetAttr("filter"); Assert.DoesNotThrow(() => spyOption.SetFilter(filterFunction)); } }
/// <summary> /// Creates and adds a new equity <see cref="Option"/> security to the algorithm /// </summary> /// <param name="underlying">The underlying equity symbol</param> /// <param name="resolution">The <see cref="Resolution"/> of market data, Tick, Second, Minute, Hour, or Daily. Default is <see cref="Resolution.Minute"/></param> /// <param name="market">The equity's market, <seealso cref="Market"/>. Default is value null and looked up using BrokerageModel.DefaultMarkets in <see cref="AddSecurity{T}"/></param> /// <param name="fillDataForward">If true, returns the last available data even if none in that timeslice. Default is <value>true</value></param> /// <param name="leverage">The requested leverage for this equity. Default is set by <see cref="SecurityInitializer"/></param> /// <returns>The new <see cref="Option"/> security</returns> public Option AddOption(string underlying, Resolution resolution = Resolution.Minute, string market = null, bool fillDataForward = true, decimal leverage = 0m) { return(_algorithm.AddOption(underlying, resolution, market, fillDataForward, leverage)); }