Exemplo n.º 1
0
        /// <summary>
        /// Clones the data, computes the utc emit time and performs exchange round down behavior, storing the result in a new <see cref="SubscriptionData"/> instance
        /// </summary>
        /// <param name="configuration">The subscription's configuration</param>
        /// <param name="exchangeHours">The exchange hours of the security</param>
        /// <param name="offsetProvider">The subscription's offset provider</param>
        /// <param name="data">The data being emitted</param>
        /// <param name="normalizationMode">Specifies how data is normalized</param>
        /// <param name="factor">price scale factor</param>
        /// <returns>A new <see cref="SubscriptionData"/> containing the specified data</returns>
        public static SubscriptionData Create(SubscriptionDataConfig configuration, SecurityExchangeHours exchangeHours, TimeZoneOffsetProvider offsetProvider, BaseData data, DataNormalizationMode normalizationMode, decimal?factor = null)
        {
            if (data == null)
            {
                return(null);
            }

            data = data.Clone(data.IsFillForward);
            var emitTimeUtc = offsetProvider.ConvertToUtc(data.EndTime);

            // Let's round down for any data source that implements a time delta between
            // the start of the data and end of the data (usually used with Bars).
            // The time delta ensures that the time collected from `EndTime` has
            // no look-ahead bias, and is point-in-time.
            if (data.Time != data.EndTime)
            {
                data.Time = data.Time.ExchangeRoundDownInTimeZone(configuration.Increment, exchangeHours, configuration.DataTimeZone, configuration.ExtendedMarketHours);
            }

            if (factor.HasValue && (configuration.SecurityType != SecurityType.Equity || (factor.Value != 1 || configuration.SumOfDividends != 0)))
            {
                var normalizedData = data.Clone(data.IsFillForward).Normalize(factor.Value, normalizationMode, configuration.SumOfDividends);

                return(new PrecalculatedSubscriptionData(configuration, data, normalizedData, normalizationMode, emitTimeUtc));
            }

            return(new SubscriptionData(data, emitTimeUtc));
        }
        public void ChangeDataNormalizationMode()
        {
            var tb = new TradeBar
            {
                Time   = new DateTime(2020, 5, 21, 8, 9, 0),
                Period = TimeSpan.FromHours(1),
                Symbol = Symbols.SPY,
                Open   = 100,
                High   = 200,
                Low    = 300,
                Close  = 400
            };

            var factor         = 0.5m;
            var sumOfDividends = 100m;
            var adjustedTb     = tb.Clone(tb.IsFillForward).Adjust(factor);

            var exchangeHours  = SecurityExchangeHours.AlwaysOpen(TimeZones.Utc);
            var offsetProvider = new TimeZoneOffsetProvider(TimeZones.Utc, new DateTime(2020, 5, 21), new DateTime(2020, 5, 22));

            var emitTimeUtc = offsetProvider.ConvertToUtc(tb.EndTime);

            _config.SumOfDividends = sumOfDividends;

            var subscriptionData = new PrecalculatedSubscriptionData(
                _config,
                tb,
                adjustedTb,
                DataNormalizationMode.Adjusted,
                emitTimeUtc);

            _config.DataNormalizationMode = DataNormalizationMode.Raw;
            Assert.AreEqual(tb.Open, (subscriptionData.Data as TradeBar).Open);
            Assert.AreEqual(tb.High, (subscriptionData.Data as TradeBar).High);
            Assert.AreEqual(tb.Low, (subscriptionData.Data as TradeBar).Low);
            Assert.AreEqual(tb.Close, (subscriptionData.Data as TradeBar).Close);

            _config.DataNormalizationMode = DataNormalizationMode.Adjusted;
            Assert.AreEqual(tb.Open * factor, (subscriptionData.Data as TradeBar).Open);
            Assert.AreEqual(tb.High * factor, (subscriptionData.Data as TradeBar).High);
            Assert.AreEqual(tb.Low * factor, (subscriptionData.Data as TradeBar).Low);
            Assert.AreEqual(tb.Close * factor, (subscriptionData.Data as TradeBar).Close);

            _config.DataNormalizationMode = DataNormalizationMode.TotalReturn;
            Assert.Throws <ArgumentException>(() =>
            {
                var data = subscriptionData.Data;
            }
                                              );

            _config.DataNormalizationMode = DataNormalizationMode.SplitAdjusted;
            Assert.Throws <ArgumentException>(() =>
            {
                var data = subscriptionData.Data;
            }
                                              );
        }
        public void ConvertToUtcAfterDST()
        {
            // the exact instant DST goes into affect
            var tzDate         = new DateTime(2015, 03, 08, 2, 0, 0);
            var utcDate        = tzDate.AddHours(5);
            var offsetProvider = new TimeZoneOffsetProvider(TimeZones.NewYork, utcDate, utcDate.AddDays(1));
            var result         = offsetProvider.ConvertToUtc(tzDate);

            // We substract an hour due to the effect of DST
            Assert.AreEqual(utcDate - TimeSpan.FromHours(1), result);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Clones the data, computes the utc emit time and performs exchange round down behavior, storing the result in a new <see cref="SubscriptionData"/> instance
        /// </summary>
        /// <param name="configuration">The subscription's configuration</param>
        /// <param name="exchangeHours">The exchange hours of the security</param>
        /// <param name="offsetProvider">The subscription's offset provider</param>
        /// <param name="data">The data being emitted</param>
        /// <returns>A new <see cref="SubscriptionData"/> containing the specified data</returns>
        public static SubscriptionData Create(SubscriptionDataConfig configuration, SecurityExchangeHours exchangeHours, TimeZoneOffsetProvider offsetProvider, BaseData data)
        {
            if (data == null)
            {
                return(null);
            }

            data = data.Clone(data.IsFillForward);
            var emitTimeUtc = offsetProvider.ConvertToUtc(data.EndTime);

            data.Time = data.Time.ExchangeRoundDownInTimeZone(configuration.Increment, exchangeHours, configuration.DataTimeZone, configuration.ExtendedMarketHours);
            return(new SubscriptionData(data, emitTimeUtc));
        }
Exemplo n.º 5
0
        /// <summary>
        /// Clones the data, computes the utc emit time and performs exchange round down behavior, storing the result in a new <see cref="SubscriptionData"/> instance
        /// </summary>
        /// <param name="configuration">The subscription's configuration</param>
        /// <param name="exchangeHours">The exchange hours of the security</param>
        /// <param name="offsetProvider">The subscription's offset provider</param>
        /// <param name="data">The data being emitted</param>
        /// <returns>A new <see cref="SubscriptionData"/> containing the specified data</returns>
        public static SubscriptionData Create(SubscriptionDataConfig configuration, SecurityExchangeHours exchangeHours, TimeZoneOffsetProvider offsetProvider, BaseData data)
        {
            if (data == null)
            {
                return(null);
            }

            data = data.Clone(data.IsFillForward);
            var emitTimeUtc = offsetProvider.ConvertToUtc(data.EndTime);

            // Let's round down for any data source that implements a time delta between
            // the start of the data and end of the data (usually used with Bars).
            // The time delta ensures that the time collected from `EndTime` has
            // no look-ahead bias, and is point-in-time.
            if (data.Time != data.EndTime)
            {
                data.Time = data.Time.ExchangeRoundDownInTimeZone(configuration.Increment, exchangeHours, configuration.DataTimeZone, configuration.ExtendedMarketHours);
            }

            return(new SubscriptionData(data, emitTimeUtc));
        }