/* * QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals. * Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Collections; using System.Collections.Generic; using QuantConnect.Data; using QuantConnect.Securities; namespace QuantConnect.Lean.Engine.DataFeeds.Enumerators { /// /// An which wraps an existing . /// /// Using this class is important, versus directly yielding, because we setup the chain public class SubscriptionDataEnumerator : IEnumerator { private readonly IEnumerator _enumerator; private readonly SubscriptionDataConfig _configuration; private readonly SecurityExchangeHours _exchangeHours; private readonly TimeZoneOffsetProvider _offsetProvider; private readonly bool _isUniverse; private readonly bool _dailyStrictEndTimeEnabled; object IEnumerator.Current => Current; /// /// Gets the element in the collection at the current position of the enumerator. /// public SubscriptionData Current { get; private set; } /// /// Creates a new instance /// /// The subscription's configuration /// The security's exchange hours /// The subscription's time zone offset provider /// The underlying data enumerator /// The subscription is a universe subscription /// A subscription data enumerator public SubscriptionDataEnumerator(SubscriptionDataConfig configuration, SecurityExchangeHours exchangeHours, TimeZoneOffsetProvider offsetProvider, IEnumerator enumerator, bool isUniverse, bool dailyStrictEndTimeEnabled) { _enumerator = enumerator; _offsetProvider = offsetProvider; _exchangeHours = exchangeHours; _configuration = configuration; _isUniverse = isUniverse; _dailyStrictEndTimeEnabled = dailyStrictEndTimeEnabled; } /// /// Advances the enumerator to the next element of the collection. /// /// True if the enumerator was successfully advanced to the next element; /// False if the enumerator has passed the end of the collection. public bool MoveNext() { var result = _enumerator.MoveNext(); if (result) { // Use our config filter to see if we should emit this // This currently catches Auxiliary data that we don't want to emit if (_enumerator.Current != null && !_configuration.ShouldEmitData(_enumerator.Current, _isUniverse)) { // We shouldn't emit this data, so we will MoveNext() again. return MoveNext(); } Current = SubscriptionData.Create(_dailyStrictEndTimeEnabled, _configuration, _exchangeHours, _offsetProvider, _enumerator.Current, _configuration.DataNormalizationMode); } return result; } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { _enumerator.Dispose(); } /// /// Sets the enumerator to its initial position, which is before the first element in the collection. /// public void Reset() { _enumerator.Reset(); } } }