コード例 #1
0
        private string GetFileName(TradingEconomicsCalendar tradingEconomicsCalendar)
        {
            var ticker = tradingEconomicsCalendar.Ticker;

            if (string.IsNullOrWhiteSpace(ticker))
            {
                ticker = tradingEconomicsCalendar.Category + tradingEconomicsCalendar.Country;
            }

            return(ticker.Replace(" ", "-").ToLower() + "_calendar.json");
        }
コード例 #2
0
        /// <summary>
        /// Runs this instance.
        /// </summary>
        /// <returns>True if process all downloads successfully</returns>
        public override bool Run()
        {
            Log.Trace("TradingEconomicsCalendarDownloader.Run(): Begin downloading calendar data");

            var stopwatch = Stopwatch.StartNew();
            var data      = new List <TradingEconomicsCalendar>();
            var startUtc  = _fromDate;

            while (startUtc < _toDate)
            {
                var endUtc = startUtc.AddMonths(1).AddDays(-1);

                Log.Trace($"TradingEconomicsCalendarDownloader.Run(): Collecting calendar data from {startUtc:yyyy-MM-dd} to {endUtc:yyyy-MM-dd}");

                try
                {
                    _requestGate.WaitToProceed(TimeSpan.FromSeconds(1));

                    if (_supportedCountries.IsNullOrEmpty())
                    {
                        var content = Get(startUtc, endUtc).Result;
                        data.AddRange(TradingEconomicsCalendar.ProcessAPIResponse(content));
                    }
                    else
                    {
                        foreach (var supportedCountry in _supportedCountries)
                        {
                            Log.Trace($"TradingEconomicsCalendarDownloader.Run(): Collecting calendar data for {supportedCountry}...");
                            var content = Get(supportedCountry.ToLowerInvariant(), startUtc, endUtc).Result;
                            data.AddRange(TradingEconomicsCalendar.ProcessAPIResponse(content));
                            _requestGate.WaitToProceed(TimeSpan.FromSeconds(1));
                        }
                    }

                    startUtc = startUtc.AddMonths(1);
                }
                catch (Exception e)
                {
                    Log.Error(e, $"TradingEconomicsCalendarDownloader.Run(): Error parsing data for date {startUtc.ToStringInvariant("yyyyMMdd")}");
                    return(false);
                }
            }
            Log.Trace($"TradingEconomicsCalendarDownloader.Run(): {data.Count} calendar entries read in {stopwatch.Elapsed}");

            var status = ProcessData(data);

            Log.Trace($"TradingEconomicsCalendarDownloader.Run(): Finished in {stopwatch.Elapsed}");
            return(status);
        }
コード例 #3
0
        public void DeserializesProperlyUsingCSV()
        {
            var instance = new TradingEconomicsCalendar();
            var csv      = JsonConvert.DeserializeObject <List <TradingEconomicsCalendar> >(TestCalendarJson).First().ToCsv();

            var result = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create($"UNITED-STATES{TradingEconomics.Calendar.Delimiter}US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                csv,
                new DateTime(2019, 1, 1),
                false
                );

            var calendar = (TradingEconomicsCalendar)result;

            Assert.AreEqual("0", calendar.CalendarId);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.Time.Date);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.EndTime.Date);
            Assert.AreEqual("United States", calendar.Country);
            Assert.AreEqual("PPI PCE", calendar.Category);
            Assert.AreEqual("producer price index personal consumption expenditure price index yoy", calendar.Event);
            Assert.AreEqual("Jan", calendar.Reference);
            Assert.AreEqual("U.S.", calendar.Source);
            Assert.AreEqual(0m, calendar.Actual);
            Assert.AreEqual(0m, calendar.Previous);
            Assert.AreEqual(null, calendar.Forecast);
            Assert.AreEqual(0m, calendar.TradingEconomicsForecast);
            Assert.AreEqual("0", calendar.DateSpan);
            Assert.AreEqual(TradingEconomicsImportance.High, calendar.Importance);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.LastUpdate.Date);
            Assert.AreEqual(0m, calendar.Revised);
            Assert.AreEqual("United States", calendar.OCountry);
            Assert.AreEqual("PPI PCE", calendar.OCategory);
            Assert.AreEqual("US", calendar.Ticker);
            Assert.AreEqual(true, calendar.IsPercentage);
        }
コード例 #4
0
        public void DeserializesProperlyUsingJsonStringReader()
        {
            var instance = new TradingEconomicsCalendar();

            var result = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                TestCalendarRawAPIResponseJSON,
                new DateTime(2019, 1, 1),
                true
                );

            var calendar = (TradingEconomicsCalendar)((BaseDataCollection)result).Data.Single();

            Assert.AreEqual("0", calendar.CalendarId);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.Time.Date);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.EndTime.Date);
            Assert.AreEqual("United States", calendar.Country);
            Assert.AreEqual("PPI PCE", calendar.Category);
            Assert.AreEqual("producer price index personal consumption expenditure price index yoy", calendar.Event);
            Assert.AreEqual("Jan", calendar.Reference);
            Assert.AreEqual("U.S.", calendar.Source);
            Assert.AreEqual(0m, calendar.Actual);
            Assert.AreEqual(0m, calendar.Previous);
            Assert.AreEqual(null, calendar.Forecast);
            Assert.AreEqual(0m, calendar.TradingEconomicsForecast);
            Assert.AreEqual("0", calendar.DateSpan);
            Assert.AreEqual(TradingEconomicsImportance.High, calendar.Importance);
            Assert.AreEqual(new DateTime(2019, 1, 1), calendar.LastUpdate.Date);
            Assert.AreEqual(0m, calendar.Revised);
            Assert.AreEqual("United States", calendar.OCountry);
            Assert.AreEqual("PPI PCE", calendar.OCategory);
            Assert.AreEqual("US", calendar.Ticker);
            Assert.AreEqual(true, calendar.IsPercentage);
        }
コード例 #5
0
        public void SerializeRoundTrip()
        {
            var settings = new JsonSerializerSettings {
                TypeNameHandling = TypeNameHandling.All
            };

            var time   = new DateTime(2020, 3, 20, 14, 0, 0);
            var symbol = Symbol.Create(
                TradingEconomics.Calendar.UnitedStates.ExistingHomeSales,
                SecurityType.Base,
                QuantConnect.Market.USA,
                baseDataType: typeof(TradingEconomicsCalendar)
                );

            var item = new TradingEconomicsCalendar
            {
                Country    = "United States",
                Category   = "Existing Home Sales",
                Importance = TradingEconomicsImportance.Medium,
                Event      = "existing home sales",
                Actual     = 5770000m,
                Previous   = 5460000m,
                LastUpdate = time,
                EndTime    = time,
                Symbol     = symbol,
            };

            var serialized   = JsonConvert.SerializeObject(item, settings);
            var deserialized = JsonConvert.DeserializeObject <TradingEconomicsCalendar>(serialized, settings);

            Assert.AreEqual("United States", deserialized.Country);
            Assert.AreEqual("Existing Home Sales", deserialized.Category);
            Assert.AreEqual(TradingEconomicsImportance.Medium, deserialized.Importance);
            Assert.AreEqual(5770000m, deserialized.Actual);
            Assert.AreEqual(5460000m, deserialized.Previous);
            Assert.AreEqual(time, deserialized.LastUpdate);
            Assert.AreEqual(time, deserialized.Time);
            Assert.AreEqual(time, deserialized.EndTime);
            Assert.AreEqual(symbol, deserialized.Symbol);
        }
コード例 #6
0
        /// <summary>
        /// Creates a new subscription for the specified security
        /// </summary>
        /// <param name="request">The subscription request</param>
        /// <returns>A new subscription instance of the specified security</returns>
        protected Subscription CreateDataSubscription(SubscriptionRequest request)
        {
            Subscription subscription = null;

            try
            {
                var localEndTime           = request.EndTimeUtc.ConvertFromUtc(request.Security.Exchange.TimeZone);
                var timeZoneOffsetProvider = new TimeZoneOffsetProvider(request.Security.Exchange.TimeZone, request.StartTimeUtc, request.EndTimeUtc);

                IEnumerator <BaseData> enumerator;
                if (!_channelProvider.ShouldStreamSubscription(_job, request.Configuration))
                {
                    if (!Quandl.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        Quandl.SetAuthCode(Config.Get("quandl-auth-token"));
                    }

                    if (!Tiingo.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        Tiingo.SetAuthCode(Config.Get("tiingo-auth-token"));
                    }

                    if (!USEnergyAPI.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        USEnergyAPI.SetAuthCode(Config.Get("us-energy-information-auth-token"));
                    }

                    if (!FredApi.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        FredApi.SetAuthCode(Config.Get("fred-auth-token"));
                    }

                    if (!TradingEconomicsCalendar.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        TradingEconomicsCalendar.SetAuthCode(Config.Get("trading-economics-auth-token"));
                    }

                    var factory         = new LiveCustomDataSubscriptionEnumeratorFactory(_timeProvider);
                    var enumeratorStack = factory.CreateEnumerator(request, _dataProvider);

                    _customExchange.AddEnumerator(request.Configuration.Symbol, enumeratorStack);

                    var enqueable = new EnqueueableEnumerator <BaseData>();
                    _customExchange.SetDataHandler(request.Configuration.Symbol, data =>
                    {
                        enqueable.Enqueue(data);

                        subscription.OnNewDataAvailable();
                    });
                    enumerator = enqueable;
                }
                else
                {
                    EventHandler handler = (sender, args) => subscription?.OnNewDataAvailable();
                    enumerator = _dataQueueHandler.Subscribe(request.Configuration, handler);

                    if (request.Configuration.SecurityType == SecurityType.Equity && CorporateEventEnumeratorFactory.ShouldEmitAuxiliaryBaseData(request.Configuration))
                    {
                        var dividends = _dataQueueHandler.Subscribe(new SubscriptionDataConfig(request.Configuration, typeof(Dividend)), handler);
                        var splits    = _dataQueueHandler.Subscribe(new SubscriptionDataConfig(request.Configuration, typeof(Split)), handler);

                        enumerator = new LiveEquityDataSynchronizingEnumerator(_timeProvider, request.Configuration.ExchangeTimeZone, enumerator, dividends, splits);
                    }
                }

                if (request.Configuration.FillDataForward)
                {
                    var fillForwardResolution = _subscriptions.UpdateAndGetFillForwardResolution(request.Configuration);

                    enumerator = new LiveFillForwardEnumerator(_frontierTimeProvider, enumerator, request.Security.Exchange, fillForwardResolution, request.Configuration.ExtendedMarketHours, localEndTime, request.Configuration.Increment, request.Configuration.DataTimeZone);
                }

                // define market hours and user filters to incoming data
                if (request.Configuration.IsFilteredSubscription)
                {
                    enumerator = new SubscriptionFilterEnumerator(enumerator, request.Security, localEndTime, request.Configuration.ExtendedMarketHours, true);
                }

                // finally, make our subscriptions aware of the frontier of the data feed, prevents future data from spewing into the feed
                enumerator = new FrontierAwareEnumerator(enumerator, _frontierTimeProvider, timeZoneOffsetProvider);

                var subscriptionDataEnumerator = new SubscriptionDataEnumerator(request.Configuration, request.Security.Exchange.Hours, timeZoneOffsetProvider, enumerator);
                subscription = new Subscription(request, subscriptionDataEnumerator, timeZoneOffsetProvider);
            }
            catch (Exception err)
            {
                Log.Error(err);
            }

            return(subscription);
        }
コード例 #7
0
        /// <summary>
        /// Creates a new subscription for the specified security
        /// </summary>
        /// <param name="request">The subscription request</param>
        /// <returns>A new subscription instance of the specified security</returns>
        protected Subscription CreateDataSubscription(SubscriptionRequest request)
        {
            Subscription subscription = null;

            try
            {
                var localEndTime           = request.EndTimeUtc.ConvertFromUtc(request.Security.Exchange.TimeZone);
                var timeZoneOffsetProvider = new TimeZoneOffsetProvider(request.Security.Exchange.TimeZone, request.StartTimeUtc, request.EndTimeUtc);

                IEnumerator <BaseData> enumerator;
                if (!_channelProvider.ShouldStreamSubscription(_job, request.Configuration))
                {
                    if (!Quandl.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        Quandl.SetAuthCode(Config.Get("quandl-auth-token"));
                    }

                    if (!Tiingo.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        Tiingo.SetAuthCode(Config.Get("tiingo-auth-token"));
                    }

                    if (!USEnergyAPI.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        USEnergyAPI.SetAuthCode(Config.Get("us-energy-information-auth-token"));
                    }

                    if (!FredApi.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        FredApi.SetAuthCode(Config.Get("fred-auth-token"));
                    }

                    if (!TradingEconomicsCalendar.IsAuthCodeSet)
                    {
                        // we're not using the SubscriptionDataReader, so be sure to set the auth token here
                        TradingEconomicsCalendar.SetAuthCode(Config.Get("trading-economics-auth-token"));
                    }

                    var factory         = new LiveCustomDataSubscriptionEnumeratorFactory(_timeProvider);
                    var enumeratorStack = factory.CreateEnumerator(request, _dataProvider);

                    _customExchange.AddEnumerator(request.Configuration.Symbol, enumeratorStack);

                    var enqueable = new EnqueueableEnumerator <BaseData>();
                    _customExchange.SetDataHandler(request.Configuration.Symbol, data =>
                    {
                        enqueable.Enqueue(data);

                        subscription.OnNewDataAvailable();

                        UpdateSubscriptionRealTimePrice(
                            subscription,
                            timeZoneOffsetProvider,
                            request.Security.Exchange.Hours,
                            data);
                    });
                    enumerator = enqueable;
                }
                else
                {
                    // this enumerator allows the exchange to pump ticks into the 'back' of the enumerator,
                    // and the time sync loop can pull aggregated trade bars off the front
                    switch (request.Configuration.Type.Name)
                    {
                    case nameof(QuoteBar):
                        var quoteBarAggregator = new QuoteBarBuilderEnumerator(
                            request.Configuration.Increment,
                            request.Security.Exchange.TimeZone,
                            _timeProvider,
                            true,
                            (sender, args) => subscription.OnNewDataAvailable());

                        _exchange.AddDataHandler(request.Configuration.Symbol, data =>
                        {
                            var tick = data as Tick;

                            if (tick?.TickType == TickType.Quote && !tick.Suspicious)
                            {
                                quoteBarAggregator.ProcessData(tick);

                                UpdateSubscriptionRealTimePrice(
                                    subscription,
                                    timeZoneOffsetProvider,
                                    request.Security.Exchange.Hours,
                                    data);
                            }
                        });
                        enumerator = quoteBarAggregator;
                        break;

                    case nameof(TradeBar):
                        var tradeBarAggregator = new TradeBarBuilderEnumerator(
                            request.Configuration.Increment,
                            request.Security.Exchange.TimeZone,
                            _timeProvider,
                            true,
                            (sender, args) => subscription.OnNewDataAvailable());

                        var auxDataEnumerator = new LiveAuxiliaryDataEnumerator(
                            request.Security.Exchange.TimeZone,
                            _timeProvider);

                        _exchange.AddDataHandler(
                            request.Configuration.Symbol,
                            data =>
                        {
                            if (data.DataType == MarketDataType.Auxiliary)
                            {
                                auxDataEnumerator.Enqueue(data);

                                subscription.OnNewDataAvailable();
                            }
                            else
                            {
                                var tick = data as Tick;
                                if (tick?.TickType == TickType.Trade && !tick.Suspicious)
                                {
                                    tradeBarAggregator.ProcessData(tick);

                                    UpdateSubscriptionRealTimePrice(
                                        subscription,
                                        timeZoneOffsetProvider,
                                        request.Security.Exchange.Hours,
                                        data);
                                }
                            }
                        });

                        enumerator = request.Configuration.SecurityType == SecurityType.Equity
                                ? (IEnumerator <BaseData>) new LiveEquityDataSynchronizingEnumerator(_frontierTimeProvider, request.Security.Exchange.TimeZone, auxDataEnumerator, tradeBarAggregator)
                                : tradeBarAggregator;
                        break;

                    case nameof(OpenInterest):
                        var oiAggregator = new OpenInterestEnumerator(
                            request.Configuration.Increment,
                            request.Security.Exchange.TimeZone,
                            _timeProvider,
                            true,
                            (sender, args) => subscription.OnNewDataAvailable());

                        _exchange.AddDataHandler(request.Configuration.Symbol, data =>
                        {
                            var tick = data as Tick;

                            if (tick?.TickType == TickType.OpenInterest && !tick.Suspicious)
                            {
                                oiAggregator.ProcessData(tick);
                            }
                        });
                        enumerator = oiAggregator;
                        break;

                    case nameof(Tick):
                    default:
                        // tick or streaming custom data subscriptions can pass right through
                        var tickEnumerator = new EnqueueableEnumerator <BaseData>();

                        _exchange.AddDataHandler(
                            request.Configuration.Symbol,
                            data =>
                        {
                            var tick = data as Tick;
                            if (tick != null)
                            {
                                if (tick.TickType == request.Configuration.TickType)
                                {
                                    tickEnumerator.Enqueue(data);
                                    subscription.OnNewDataAvailable();
                                    if (tick.TickType != TickType.OpenInterest)
                                    {
                                        UpdateSubscriptionRealTimePrice(
                                            subscription,
                                            timeZoneOffsetProvider,
                                            request.Security.Exchange.Hours,
                                            data);
                                    }
                                }
                            }
                            else
                            {
                                tickEnumerator.Enqueue(data);
                                subscription.OnNewDataAvailable();
                            }
                        });

                        enumerator = tickEnumerator;
                        break;
                    }
                }

                if (request.Configuration.FillDataForward)
                {
                    var fillForwardResolution = _subscriptions.UpdateAndGetFillForwardResolution(request.Configuration);

                    enumerator = new LiveFillForwardEnumerator(_frontierTimeProvider, enumerator, request.Security.Exchange, fillForwardResolution, request.Configuration.ExtendedMarketHours, localEndTime, request.Configuration.Increment, request.Configuration.DataTimeZone, request.StartTimeLocal);
                }

                // define market hours and user filters to incoming data
                if (request.Configuration.IsFilteredSubscription)
                {
                    enumerator = new SubscriptionFilterEnumerator(enumerator, request.Security, localEndTime);
                }

                // finally, make our subscriptions aware of the frontier of the data feed, prevents future data from spewing into the feed
                enumerator = new FrontierAwareEnumerator(enumerator, _frontierTimeProvider, timeZoneOffsetProvider);

                var subscriptionDataEnumerator = new SubscriptionDataEnumerator(request.Configuration, request.Security.Exchange.Hours, timeZoneOffsetProvider, enumerator);
                subscription = new Subscription(request, subscriptionDataEnumerator, timeZoneOffsetProvider);
            }
            catch (Exception err)
            {
                Log.Error(err);
            }

            return(subscription);
        }
コード例 #8
0
 public void DecimalIsParsedCorrectly(string value, double?expected, bool inPercentage)
 {
     // Cast inside since we can't pass in decimal values through TestCase attributes
     Assert.AreEqual((decimal?)expected, TradingEconomicsCalendar.ParseDecimal(value, inPercentage));
 }
コード例 #9
0
        public void GetsCountryCurrencyCode(string country, string expectedCurrencyCode)
        {
            var currencyCode = TradingEconomicsCalendar.CountryToCurrencyCode(country);

            Assert.AreEqual(expectedCurrencyCode, currencyCode);
        }
コード例 #10
0
        public void ReturnsNullOnInvalidSymbolOrDate_AndContinuesWithoutErrors()
        {
            var instance       = new TradingEconomicsCalendar();
            var normalLines    = new List <string>();
            var corruptedLines = new List <string>();
            var deserialized   = JsonConvert.DeserializeObject <List <TradingEconomicsCalendar> >(TestCalendarJson).First();

            for (var i = 0; i < 5; i++)
            {
                normalLines.Add(deserialized.ToCsv());
            }

            deserialized.Ticker = "Foobar" + deserialized.Ticker;
            for (var i = 0; i < 5; i++)
            {
                corruptedLines.Add(deserialized.ToCsv());
            }

            var corruptedResult = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                corruptedLines.First(),
                new DateTime(2019, 1, 1),
                false
                );

            var corruptedNormalResult = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                normalLines.First(),
                DateTime.MaxValue,
                false
                );

            Assert.AreEqual(null, corruptedResult);
            Assert.AreEqual(null, corruptedNormalResult);

            foreach (var line in normalLines.Skip(1))
            {
                var calendar = (TradingEconomicsCalendar)instance.Reader(
                    new SubscriptionDataConfig(
                        typeof(TradingEconomicsCalendar),
                        Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                        Resolution.Daily,
                        TimeZones.Utc,
                        TimeZones.Utc,
                        false,
                        false,
                        false,
                        isCustom: true
                        ),
                    line,
                    new DateTime(2019, 1, 1),
                    false
                    );
                Assert.AreEqual("0", calendar.CalendarId);
                Assert.AreEqual(new DateTime(2019, 1, 1), calendar.Time.Date);
                Assert.AreEqual(new DateTime(2019, 1, 1), calendar.EndTime.Date);
                Assert.AreEqual("United States", calendar.Country);
                Assert.AreEqual("PPI PCE", calendar.Category);
                Assert.AreEqual("producer price index personal consumption expenditure price index yoy", calendar.Event);
                Assert.AreEqual("Jan", calendar.Reference);
                Assert.AreEqual("U.S.", calendar.Source);
                Assert.AreEqual(0m, calendar.Actual);
                Assert.AreEqual(0m, calendar.Previous);
                Assert.AreEqual(null, calendar.Forecast);
                Assert.AreEqual(0m, calendar.TradingEconomicsForecast);
                Assert.AreEqual("0", calendar.DateSpan);
                Assert.AreEqual(TradingEconomicsImportance.High, calendar.Importance);
                Assert.AreEqual(new DateTime(2019, 1, 1), calendar.LastUpdate.Date);
                Assert.AreEqual(0m, calendar.Revised);
                Assert.AreEqual("United States", calendar.OCountry);
                Assert.AreEqual("PPI PCE", calendar.OCategory);
                Assert.AreEqual("US", calendar.Ticker);
                Assert.AreEqual(true, calendar.IsPercentage);
            }
        }
コード例 #11
0
        public void ReaderDeserializationProducesSameResult()
        {
            var instance = new TradingEconomicsCalendar();

            var csv = JsonConvert.DeserializeObject <List <TradingEconomicsCalendar> >(TestCalendarJson).Single().ToCsv();

            var resultBacktest = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                csv,
                new DateTime(2019, 1, 1),
                false
                );

            var resultLive = instance.Reader(
                new SubscriptionDataConfig(
                    typeof(TradingEconomicsCalendar),
                    Symbol.CreateBase(typeof(TradingEconomicsCalendar), Symbol.Create("UNITED-STATES//US", SecurityType.Base, QuantConnect.Market.USA), QuantConnect.Market.USA),
                    Resolution.Daily,
                    TimeZones.Utc,
                    TimeZones.Utc,
                    false,
                    false,
                    false,
                    isCustom: true
                    ),
                TestCalendarRawAPIResponseJSON,
                new DateTime(2019, 1, 1),
                true
                );

            var calendarBacktest = (TradingEconomicsCalendar)resultBacktest;
            var calendarLive     = (TradingEconomicsCalendar)((BaseDataCollection)resultLive).Data.Single();

            Assert.AreEqual(calendarBacktest.CalendarId, calendarLive.CalendarId);
            Assert.AreEqual(calendarBacktest.Time.Date, calendarLive.Time.Date);
            Assert.AreEqual(calendarBacktest.EndTime.Date, calendarLive.EndTime.Date);
            Assert.AreEqual(calendarBacktest.Country, calendarLive.Country);
            Assert.AreEqual(calendarBacktest.Category, calendarLive.Category);
            Assert.AreEqual(calendarBacktest.Event, calendarLive.Event);
            Assert.AreEqual(calendarBacktest.Reference, calendarLive.Reference);
            Assert.AreEqual(calendarBacktest.Source, calendarLive.Source);
            Assert.AreEqual(calendarBacktest.Actual, calendarLive.Actual);
            Assert.AreEqual(calendarBacktest.Previous, calendarLive.Previous);
            Assert.AreEqual(calendarBacktest.Forecast, calendarLive.Forecast);
            Assert.AreEqual(calendarBacktest.TradingEconomicsForecast, calendarLive.TradingEconomicsForecast);
            Assert.AreEqual(calendarBacktest.DateSpan, calendarLive.DateSpan);
            Assert.AreEqual(calendarBacktest.Importance, calendarLive.Importance);
            Assert.AreEqual(calendarBacktest.LastUpdate.Date, calendarLive.LastUpdate.Date);
            Assert.AreEqual(calendarBacktest.Revised, calendarLive.Revised);
            Assert.AreEqual(calendarBacktest.OCountry, calendarLive.OCountry);
            Assert.AreEqual(calendarBacktest.OCategory, calendarLive.OCategory);
            Assert.AreEqual(calendarBacktest.Ticker, calendarLive.Ticker);
            Assert.AreEqual(calendarBacktest.IsPercentage, calendarLive.IsPercentage);
        }
 /// <summary>
 /// OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
 /// </summary>
 /// <param name="data">Trading Economics Calendar object</param>
 public void OnData(TradingEconomicsCalendar data)
 {
     Log($"{Time} - {data}");
 }