/// <summary> /// Get the output zip file /// </summary> /// <param name="baseDirectory">Base output directory for the zip file</param> /// <param name="time">Date/time for the data we're writing</param> /// <returns>The full path to the output zip file</returns> private string GetZipOutputFileName(string baseDirectory, DateTime time) { return(LeanData.GenerateZipFilePath(baseDirectory, _symbol, time, _resolution, _dataType)); }
/// <summary> /// Get the output zip file /// </summary> /// <param name="baseDirectory">Base output directory for the zip file</param> /// <param name="time">Date/time for the data we're writing</param> /// <returns>The full path to the output zip file</returns> private string GetZipOutputFileName(string baseDirectory, DateTime time) { return(LeanData.GenerateZipFilePath(baseDirectory, _symbol.Value, _securityType, _market, time, _resolution)); }
public void GenerateZipFilePath(LeanDataTestParameters parameters) { var path = LeanData.GenerateZipFilePath(Globals.DataFolder, parameters.Symbol, parameters.Date, parameters.Resolution, parameters.TickType); Assert.AreEqual(parameters.ExpectedZipFilePath, path); }
/// <summary> /// Gets the list of option contracts for a given underlying symbol /// </summary> /// <param name="underlyingSymbol">The underlying symbol</param> /// <param name="date">The date for which to request the option chain (only used in backtesting)</param> /// <returns>The list of option contracts</returns> public IEnumerable <Symbol> GetOptionContractList(Symbol underlyingSymbol, DateTime date) { if (!underlyingSymbol.SecurityType.HasOptions()) { throw new NotSupportedException($"BacktestingOptionChainProvider.GetOptionContractList(): SecurityType.Equity, SecurityType.Future, or SecurityType.Index is expected but was {underlyingSymbol.SecurityType}"); } // Resolve any mapping before requesting option contract list for equities // Needs to be done in order for the data file key to be accurate Symbol mappedSymbol; if (underlyingSymbol.RequiresMapping()) { var mapFileResolver = _mapFileProvider.Get(AuxiliaryDataKey.Create(underlyingSymbol)); var mapFile = mapFileResolver.ResolveMapFile(underlyingSymbol); var ticker = mapFile.GetMappedSymbol(date, underlyingSymbol.Value); mappedSymbol = underlyingSymbol.UpdateMappedSymbol(ticker); } else { mappedSymbol = underlyingSymbol; } // build the option contract list from the open interest zip file entry names // create a canonical option symbol for the given underlying var canonicalSymbol = Symbol.CreateOption( mappedSymbol, mappedSymbol.ID.Market, mappedSymbol.SecurityType.DefaultOptionStyle(), default(OptionRight), 0, SecurityIdentifier.DefaultDate); var zipFileName = string.Empty; Stream stream = null; // In order of trust-worthiness of containing the complete option chain, OpenInterest is guaranteed // to have the complete option chain. Quotes come after open-interest // because it's also likely to contain the option chain. Trades may be // missing portions of the option chain, so we resort to it last. foreach (var tickType in new[] { TickType.OpenInterest, TickType.Quote, TickType.Trade }) { // build the zip file name and fetch it with our provider zipFileName = LeanData.GenerateZipFilePath(Globals.DataFolder, canonicalSymbol, date, Resolution.Minute, tickType); stream = _dataProvider.Fetch(zipFileName); if (stream != null) { break; } } if (stream == null) { Log.Trace($"BacktestingOptionChainProvider.GetOptionContractList(): File not found: {zipFileName}"); yield break; } // generate and return the contract symbol for each zip entry var zipEntryNames = Compression.GetZipEntryFileNames(stream); foreach (var zipEntryName in zipEntryNames) { yield return(LeanData.ReadSymbolFromZipEntry(canonicalSymbol, Resolution.Minute, zipEntryName)); } stream.DisposeSafely(); }