/// <summary> /// Check for new splits /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New split event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol && _mapFile.HasData(eventArgs.Date)) { var factor = _splitFactor; if (factor != null) { var close = AuxiliaryDataEnumerator.GetRawClose( eventArgs.LastBaseData?.Price ?? 0, _config); _splitFactor = null; yield return(new Split( eventArgs.Symbol, eventArgs.Date, close, factor.Value, SplitType.SplitOccurred)); } decimal splitFactor; if (_factorFile.HasSplitEventOnNextTradingDay(eventArgs.Date, out splitFactor)) { _splitFactor = splitFactor; yield return(new Split( eventArgs.Symbol, eventArgs.Date, AuxiliaryDataEnumerator.GetRawClose( eventArgs.LastBaseData?.Price ?? 0, _config), splitFactor, SplitType.Warning)); } } }
/// <summary> /// Check for dividends and returns them /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New Dividend event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol && _mapFile.HasData(eventArgs.Date)) { if (_priceFactorRatio != null) { var close = AuxiliaryDataEnumerator.GetRawClose( eventArgs.LastBaseData?.Price ?? 0, _config); var baseData = Dividend.Create( _config.Symbol, eventArgs.Date, close, _priceFactorRatio.Value ); // let the config know about it for normalization _config.SumOfDividends += baseData.Distribution; _priceFactorRatio = null; yield return(baseData); } // check the factor file to see if we have a dividend event tomorrow decimal priceFactorRatio; if (_factorFile.HasDividendEventOnNextTradingDay(eventArgs.Date, out priceFactorRatio)) { _priceFactorRatio = priceFactorRatio; } } }
/// <summary> /// Check for delistings /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New delisting event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol) { // we send the delisting warning when we reach the delisting date, here we make sure we compare using the date component // of the delisting date since for example some futures can trade a few hours in their delisting date, else we would skip on // emitting the delisting warning, which triggers us to handle liquidation once delisted if (!_delistedWarning && eventArgs.Date >= _delistingDate.Date) { _delistedWarning = true; var price = eventArgs.LastBaseData?.Price ?? 0; yield return(new Delisting( eventArgs.Symbol, eventArgs.Date, price, DelistingType.Warning)); } if (!_delisted && eventArgs.Date > _delistingDate) { _delisted = true; var price = eventArgs.LastBaseData?.Price ?? 0; // delisted at EOD yield return(new Delisting( eventArgs.Symbol, _delistingDate.AddDays(1), price, DelistingType.Delisted)); } } }
/// <summary> /// Advances the enumerator to the next element of the collection. /// </summary> /// <returns> true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.</returns> /// <exception cref="T:System.InvalidOperationException">The collection was modified after the enumerator was created.</exception> public bool MoveNext() { var currentDate = _timeProvider.GetUtcNow().ConvertFromUtc(_dataConfig.ExchangeTimeZone).Date; if (currentDate != _lastTime) { // when the date changes for the security we trigger a new tradable date event var newDayEvent = new NewTradableDateEventArgs(currentDate, _securityCache.GetData(), _dataConfig.Symbol, null); foreach (var delistingEvent in _delistingEventProvider.GetEvents(newDayEvent)) { _dataToEmit.Enqueue(delistingEvent); } // update last time _lastTime = currentDate; } if (_dataToEmit.Count > 0) { // emit event if any Current = _dataToEmit.Dequeue(); return(true); } Current = null; return(false); }
/// <summary> /// Check for delistings /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New delisting event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol) { if (!_delistedWarning && eventArgs.Date >= _delistingDate) { _delistedWarning = true; var price = eventArgs.LastBaseData?.Price ?? 0; yield return(new Delisting( eventArgs.Symbol, eventArgs.Date, price, DelistingType.Warning)); } if (!_delisted && eventArgs.Date > _delistingDate) { _delisted = true; var price = eventArgs.LastBaseData?.Price ?? 0; // delisted at EOD yield return(new Delisting( eventArgs.Symbol, _delistingDate.AddDays(1), price, DelistingType.Delisted)); } } }
public override IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { // refresh map file instance InitializeMapFile(); return(base.GetEvents(eventArgs)); }
/// <summary> /// Handle a new tradable date, drives the <see cref="ITradableDateEventProvider"/> instances /// </summary> protected void NewTradableDate(object sender, NewTradableDateEventArgs eventArgs) { Initialize(); for (var i = 0; i < _tradableDateEventProviders.Length; i++) { foreach (var newEvent in _tradableDateEventProviders[i].GetEvents(eventArgs)) { _auxiliaryData.Enqueue(newEvent); } } }
public override IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { var currentInstance = MapFile; // refresh map file instance InitializeMapFile(); var newInstance = MapFile; Log.Trace($"LiveMappingEventProvider({Config}): new tradable date {eventArgs.Date}. " + $"New MapFile: {!ReferenceEquals(currentInstance, newInstance)}. " + $"MapFile.Count Old: {currentInstance?.Count()} New: {newInstance?.Count()}"); return(base.GetEvents(eventArgs)); }
public override bool MoveNext() { var currentDate = _timeProvider.GetUtcNow().ConvertFromUtc(Config.ExchangeTimeZone).Add(-Time.LiveAuxiliaryDataOffset).Date; if (currentDate != _lastTime) { // when the date changes for the security we trigger a new tradable date event var newDayEvent = new NewTradableDateEventArgs(currentDate, _securityCache.GetData(), Config.Symbol, null); NewTradableDate(this, newDayEvent); // update last time _lastTime = currentDate; } return(base.MoveNext()); }
/// <summary> /// Check for new mappings /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New mapping event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol && _mapFile.HasData(eventArgs.Date)) { // check to see if the symbol was remapped var newSymbol = _mapFile.GetMappedSymbol(eventArgs.Date, _config.MappedSymbol); if (newSymbol != _config.MappedSymbol) { var changed = new SymbolChangedEvent( _config.Symbol, eventArgs.Date, _config.MappedSymbol, newSymbol); _config.MappedSymbol = newSymbol; yield return(changed); } } }
/// <summary> /// Check for new mappings /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New mapping event if any</returns> public virtual IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (Config.Symbol == eventArgs.Symbol && MapFile.HasData(eventArgs.Date)) { var old = Config.MappedSymbol; var newSymbol = MapFile.GetMappedSymbol(eventArgs.Date, Config.MappedSymbol); Config.MappedSymbol = newSymbol; // check to see if the symbol was remapped if (old != Config.MappedSymbol) { var changed = new SymbolChangedEvent( Config.Symbol, eventArgs.Date, old, Config.MappedSymbol); yield return(changed); } } }
/// <summary> /// Check for new splits /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New split event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol && _factorFile != null && _mapFile.HasData(eventArgs.Date)) { var factor = _splitFactor; if (factor != null) { var close = _referencePrice; if (close == 0) { throw new InvalidOperationException($"Zero reference price for {_config.Symbol} split at {eventArgs.Date}"); } _splitFactor = null; _referencePrice = 0; yield return(new Split( eventArgs.Symbol, eventArgs.Date, close, factor.Value, SplitType.SplitOccurred)); } decimal splitFactor; decimal referencePrice; if (_factorFile.HasSplitEventOnNextTradingDay(eventArgs.Date, out splitFactor, out referencePrice)) { _splitFactor = splitFactor; _referencePrice = referencePrice; yield return(new Split( eventArgs.Symbol, eventArgs.Date, eventArgs.LastRawPrice ?? 0, splitFactor, SplitType.Warning)); } } }
/// <summary> /// Check for dividends and returns them /// </summary> /// <param name="eventArgs">The new tradable day event arguments</param> /// <returns>New Dividend event if any</returns> public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { if (_config.Symbol == eventArgs.Symbol && _factorFile != null && _mapFile.HasData(eventArgs.Date)) { if (_priceFactorRatio != null) { if (_referencePrice == 0) { throw new InvalidOperationException($"Zero reference price for {_config.Symbol} dividend at {eventArgs.Date}"); } var baseData = Dividend.Create( _config.Symbol, eventArgs.Date, _referencePrice, _priceFactorRatio.Value ); // let the config know about it for normalization _config.SumOfDividends += baseData.Distribution; _priceFactorRatio = null; _referencePrice = 0; yield return(baseData); } // check the factor file to see if we have a dividend event tomorrow decimal priceFactorRatio; decimal referencePrice; if (_factorFile.HasDividendEventOnNextTradingDay(eventArgs.Date, out priceFactorRatio, out referencePrice)) { _priceFactorRatio = priceFactorRatio; _referencePrice = referencePrice; } } }
public IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs) { yield return(Data.Dequeue()); }