private string GetFileName(TradingEconomicsCalendar tradingEconomicsCalendar) { var ticker = tradingEconomicsCalendar.Ticker; if (string.IsNullOrWhiteSpace(ticker)) { ticker = tradingEconomicsCalendar.Category + tradingEconomicsCalendar.Country; } return(ticker.Replace(" ", "-").ToLower() + "_calendar.json"); }
/// <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); }
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); }
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); }
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); }
/// <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); }
/// <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); }
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)); }
public void GetsCountryCurrencyCode(string country, string expectedCurrencyCode) { var currencyCode = TradingEconomicsCalendar.CountryToCurrencyCode(country); Assert.AreEqual(expectedCurrencyCode, currencyCode); }
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); } }
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}"); }