Пример #1
0
        /// <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;
                }
            }
        }
Пример #3
0
 /// <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));
         }
     }
 }
Пример #4
0
        /// <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);
        }
Пример #5
0
 /// <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));
         }
     }
 }
Пример #6
0
        public override IEnumerable <BaseData> GetEvents(NewTradableDateEventArgs eventArgs)
        {
            // refresh map file instance
            InitializeMapFile();

            return(base.GetEvents(eventArgs));
        }
Пример #7
0
 /// <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());
        }
Пример #10
0
 /// <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);
         }
     }
 }
Пример #11
0
        /// <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);
                }
            }
        }
Пример #12
0
        /// <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));
                }
            }
        }
Пример #13
0
        /// <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());
 }