/// <summary> /// For backwards adjusted data the price is adjusted by a scale factor which is a combination of splits and dividends. /// This backwards adjusted price is used by default and fed as the current price. /// </summary> /// <param name="date">Current date of the backtest.</param> private void UpdateScaleFactors(DateTime date) { try { _mappedSymbol = SubscriptionAdjustment.GetMappedSymbol(_symbolMap, date); _priceFactor = SubscriptionAdjustment.GetTimePriceFactor(_priceFactors, date); } catch (Exception err) { Log.Error("SubscriptionDataReader.UpdateScaleFactors(): " + err.Message); } _config.SetPriceScaleFactor(_priceFactor); _config.SetMappedSymbol(_mappedSymbol); }
/******************************************************** * CLASS CONSTRUCTOR *********************************************************/ /// <summary> /// Subscription data reader takes a subscription request, loads the type, accepts the data source and enumerate on the results. /// </summary> /// <param name="config">Subscription configuration object</param> /// <param name="security">Security asset</param> /// <param name="feed">Feed type enum</param> /// <param name="periodStart">Start date for the data request/backtest</param> /// <param name="periodFinish">Finish date for the data request/backtest</param> public SubscriptionDataReader(SubscriptionDataConfig config, Security security, DataFeedEndpoint feed, DateTime periodStart, DateTime periodFinish) { //Save configuration of data-subscription: _config = config; //Save access to fill foward flag: _isFillForward = config.FillDataForward; //Save Start and End Dates: _periodStart = periodStart; _periodFinish = periodFinish; //Save access to securities _security = security; _isQCData = security.IsQuantConnectData; _isQCEquity = (security.Type == SecurityType.Equity) && _isQCData; //Set QC Type Flags: IsQCTick = (config.Type.Name == "Tick" && _isQCData); IsQCTradeBar = (config.Type.Name == "TradeBar" && _isQCData); //Save the type of data we'll be getting from the source. _feedEndpoint = feed; //Create the dynamic type-activators: _objectActivator = Loader.GetActivator(config.Type); if (_objectActivator == null) { Engine.ResultHandler.ErrorMessage("Custom data type '" + config.Type.Name + "' missing parameterless constructor E.g. public " + config.Type.Name + "() { }"); _endOfStream = true; return; } //Create an instance of the "Type": var userObj = _objectActivator.Invoke(new object[] { }); _dataFactory = userObj as BaseData; //Save Access to the "Reader" Method: _readerMethod = _dataFactory.GetType().GetMethod("Reader", new[] { typeof(SubscriptionDataConfig), typeof(string), typeof(DateTime), typeof(DataFeedEndpoint) }); //Create a Delagate Accessor. _readerMethodInvoker = _readerMethod.DelegateForCallMethod(); //Save access to the "GetSource" Method: _getSourceMethod = _dataFactory.GetType().GetMethod("GetSource", new[] { typeof(SubscriptionDataConfig), typeof(DateTime), typeof(DataFeedEndpoint) }); //Load the entire factor and symbol mapping tables into memory try { if (_isQCEquity) { _priceFactors = SubscriptionAdjustment.GetFactorTable(config.Symbol); _symbolMap = SubscriptionAdjustment.GetMapTable(config.Symbol); } } catch (Exception err) { Log.Error("SubscriptionDataReader(): Fetching Price/Map Factors: " + err.Message); _priceFactors = new SortedDictionary <DateTime, decimal>(); _symbolMap = new SortedDictionary <DateTime, string>(); } }
/******************************************************** * CLASS CONSTRUCTOR *********************************************************/ /// <summary> /// Subscription data reader takes a subscription request, loads the type, accepts the data source and enumerate on the results. /// </summary> /// <param name="config">Subscription configuration object</param> /// <param name="security">Security asset</param> /// <param name="feed">Feed type enum</param> /// <param name="periodStart">Start date for the data request/backtest</param> /// <param name="periodFinish">Finish date for the data request/backtest</param> public SubscriptionDataReader(SubscriptionDataConfig config, Security security, DataFeedEndpoint feed, DateTime periodStart, DateTime periodFinish) { //Save configuration of data-subscription: _config = config; //Save access to fill foward flag: _isFillForward = config.FillDataForward; //Save Start and End Dates: _periodStart = periodStart; _periodFinish = periodFinish; //Save access to securities _security = security; _isDynamicallyLoadedData = security.IsDynamicallyLoadedData; // do we have factor tables? _hasScaleFactors = SubscriptionAdjustment.HasScalingFactors(config.Symbol); //Save the type of data we'll be getting from the source. _feedEndpoint = feed; //Create the dynamic type-activators: _objectActivator = ObjectActivator.GetActivator(config.Type); if (_objectActivator == null) { Engine.ResultHandler.ErrorMessage("Custom data type '" + config.Type.Name + "' missing parameterless constructor E.g. public " + config.Type.Name + "() { }"); _endOfStream = true; return; } //Create an instance of the "Type": var userObj = _objectActivator.Invoke(new object[] { }); _dataFactory = userObj as BaseData; //If its quandl set the access token in data factory: var quandl = _dataFactory as Quandl; if (quandl != null) { quandl.SetAuthCode(Config.Get("quandl-auth-token")); } //Load the entire factor and symbol mapping tables into memory try { if (_hasScaleFactors) { _priceFactors = SubscriptionAdjustment.GetFactorTable(config.Symbol); _symbolMap = SubscriptionAdjustment.GetMapTable(config.Symbol); } } catch (Exception err) { Log.Error("SubscriptionDataReader(): Fetching Price/Map Factors: " + err.Message); _priceFactors = new SortedDictionary <DateTime, decimal>(); _symbolMap = new SortedDictionary <DateTime, string>(); } }