47 private static TimeSpan _logDisplayInterval = TimeSpan.FromSeconds(5);
58 public static void Main(
string[] args)
71 switch (commandDataType)
82 Log.
Error($
"QuantConnect.DownloaderDataProvider.Launcher: Unsupported command data type '{commandDataType}'. Valid options: UNIVERSE, TRADE, QUOTE, OPENINTEREST.");
98 if (dataDownloader ==
null)
100 throw new ArgumentNullException(nameof(dataDownloader),
"The data downloader instance cannot be null. Please ensure that a valid instance of data downloader is provided.");
103 var totalDownloadSymbols = dataDownloadConfig.
Symbols.Count;
104 var completeSymbolCount = 0;
105 var startDownloadUtcTime = DateTime.UtcNow;
107 foreach (var symbol
in dataDownloadConfig.Symbols)
109 var downloadParameters =
new DataDownloaderGetParameters(symbol, dataDownloadConfig.Resolution, dataDownloadConfig.StartDate, dataDownloadConfig.EndDate, dataDownloadConfig.TickType);
111 Log.
Trace($
"DownloaderDataProvider.Main(): Starting download {downloadParameters}");
112 var downloadedData = dataDownloader.Get(downloadParameters);
114 if (downloadedData ==
null)
116 completeSymbolCount++;
117 Log.
Trace($
"DownloaderDataProvider.Main(): No data available for the following parameters: {downloadParameters}");
121 var (dataTimeZone, exchangeTimeZone) = GetDataAndExchangeTimeZoneBySymbol(symbol);
123 var writer =
new LeanDataWriter(dataDownloadConfig.Resolution, symbol, dataDirectory, dataDownloadConfig.TickType, dataCacheProvider, mapSymbol: mapSymbol);
125 var groupedData = DataFeeds.DownloaderDataProvider.FilterAndGroupDownloadDataBySymbol(
128 dataDownloadConfig.DataType,
131 downloadParameters.StartUtc,
132 downloadParameters.EndUtc);
134 var lastLogStatusTime = DateTime.UtcNow;
136 foreach (var data
in groupedData)
138 writer.Write(data.Select(data =>
140 var utcNow = DateTime.UtcNow;
141 if (utcNow - lastLogStatusTime >= _logDisplayInterval)
143 lastLogStatusTime = utcNow;
144 Log.Trace($
"Downloading data for {downloadParameters.Symbol}. Please hold on...");
150 completeSymbolCount++;
151 var symbolPercentComplete = (double)completeSymbolCount / totalDownloadSymbols * 100;
152 Log.
Trace($
"DownloaderDataProvider.RunDownload(): {symbolPercentComplete:F2}% complete ({completeSymbolCount} out of {totalDownloadSymbols} symbols)");
154 Log.
Trace($
"DownloaderDataProvider.RunDownload(): Download completed for {downloadParameters.Symbol} at {downloadParameters.Resolution} resolution, " +
155 $
"covering the period from {dataDownloadConfig.StartDate} to {dataDownloadConfig.EndDate}.");
157 Log.
Trace($
"All downloads completed in {(DateTime.UtcNow - startDownloadUtcTime).TotalSeconds:F2} seconds.");
165 private static void RunUniverseDownloader(IDataDownloader dataDownloader,
DataUniverseDownloadConfig dataUniverseDownloadConfig)
167 foreach (var symbol
in dataUniverseDownloadConfig.
Symbols)
183 private static (DateTimeZone dataTimeZone, DateTimeZone exchangeTimeZone) GetDataAndExchangeTimeZoneBySymbol(Symbol symbol)
185 var entry = _marketHoursDatabase.GetEntry(symbol.ID.Market, symbol, symbol.SecurityType);
186 return (entry.DataTimeZone, entry.ExchangeHours.TimeZone);
214 if (optionChainProvider ==
null)
218 mapFileProvider, factorFileProvider, _ => { },
false,
new DataPermissionManager(),
null,
new AlgorithmSettings()));
220 baseOptionChainProvider.Initialize(
new(mapFileProvider, historyManager));
225 mapFileProvider.Initialize(dataProvider);
226 factorFileProvider.Initialize(mapFileProvider, dataProvider);