/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Linq; using System.Collections.Generic; using NUnit.Framework; using QuantConnect.Brokerages.Backtesting; using QuantConnect.Algorithm; using QuantConnect.Brokerages; using QuantConnect.Securities.Option; using Moq; using QuantConnect.Securities; using QuantConnect.Data.Market; using QuantConnect.Data; namespace QuantConnect.Tests.Engine { [TestFixture] public class BasicOptionAssignmentSimulationTests { private static readonly SecurityExchangeHours SecurityExchangeHours = SecurityExchangeHours.AlwaysOpen(TimeZones.NewYork); [Test] public void GenerateSimulationDatesFromOptionExpirations() { var algorithm = new QCAlgorithm(); var sim = new BasicOptionAssignmentSimulation(); algorithm.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage); algorithm.SetCash(100000); var securities = new SecurityManager(TimeKeeper); algorithm.Securities = securities; securities.Add( Symbols.SPY, new Security( SecurityExchangeHours, CreateTradeBarDataConfig(SecurityType.Equity, Symbols.SPY), new Cash(Currencies.USD, 0, 1m), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance ) ); securities[Symbols.SPY].SetMarketPrice(new TradeBar { Time = securities.UtcTime, Symbol = Symbols.SPY, Close = 195 }); var option1 = Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Call, 192m, new DateTime(2016, 02, 16)); securities.Add( option1, new Option( SecurityExchangeHours, CreateTradeBarDataConfig(SecurityType.Equity, option1), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance ) ); var option2 = Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Call, 193m, new DateTime(2016, 02, 19)); securities.Add( option2, new Option( SecurityExchangeHours, CreateTradeBarDataConfig(SecurityType.Equity, option2), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance ) ); var option3 = Symbol.CreateOption("SPY", Market.USA, OptionStyle.American, OptionRight.Call, 190m, new DateTime(2016, 03, 18)); securities.Add( option3, new Option( SecurityExchangeHours, CreateTradeBarDataConfig(SecurityType.Equity, option3), new Cash(Currencies.USD, 0, 1m), new OptionSymbolProperties(SymbolProperties.GetDefault(Currencies.USD)), ErrorCurrencyConverter.Instance ) ); securities[option1].Holdings.SetHoldings(1, -100); securities[option2].Holdings.SetHoldings(1, -100); securities[option3].Holdings.SetHoldings(1, -100); var startSim = new DateTime(2016, 01, 22); var endSim = new DateTime(2016, 03, 19); algorithm.SetDateTime(startSim); // we run request for simulation every minute up to the expiration date of option2 // Option3 is too far in the future - we update dates list every month int countSims = 0; foreach (var count in Enumerable.Range(0, (int)(endSim - startSim).TotalMinutes)) { algorithm.SetDateTime(startSim.AddMinutes(count)); countSims += sim.IsReadyToSimulate(algorithm)? 1 : 0; } // there should be 132 attempts to run simulation Assert.AreEqual(132, countSims); } [Test] public void SimulatesAssignment() { var algorithm = new QCAlgorithm(); var sim = new BasicOptionAssignmentSimulation(); var securities = new SecurityManager(TimeKeeper); var brokerage = new Mock(algorithm); algorithm.Securities = securities; // dictionaries with expected and actual results var expected = new Dictionary(); var actual = new Dictionary(); brokerage.Setup(m => m.ActivateOptionAssignment(It.IsAny