public void HandlesDaylightSavingTimeChange() { var dailyBarsEmitted = 0; var fillForwardBars = new List <BaseData>(); // 3 QuoteBars as they would be read from the EURUSD oanda daily file by QuoteBar.Reader() // The conversion from dataTimeZone to exchangeTimeZone has been done by hand // dataTimeZone == UTC /* * 20180311 00:00,1.2308,1.2308,1.2308,1.2308,0,1.23096,1.23096,1.23096,1.23096,0 * 20180312 00:00,1.23082,1.23449,1.22898,1.23382,0,1.23097,1.23463,1.22911,1.23396,0 */ var data = new BaseData[] { // Sunday 3/11 new QuoteBar { Value = 0, Time = new DateTime(2018, 3, 10, 19, 0, 0), Period = Time.OneDay }, // Monday 3/12 new QuoteBar { Value = 1, Time = new DateTime(2018, 3, 11, 20, 0, 0), Period = Time.OneDay }, }.ToList(); var enumerator = data.GetEnumerator(); var market = Market.Oanda; var symbol = Symbol.Create("EURUSD", SecurityType.Forex, market); var marketHours = MarketHoursDatabase.FromDataFolder(); var exchange = new ForexExchange(marketHours.GetExchangeHours(market, symbol, SecurityType.Forex)); var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(TimeSpan.FromDays(1)), false, data.Last().EndTime, Time.OneDay, TimeZones.Utc, data.First().EndTime); while (fillForwardEnumerator.MoveNext()) { fillForwardBars.Add(fillForwardEnumerator.Current); Console.WriteLine(fillForwardEnumerator.Current.Time.DayOfWeek + " " + fillForwardEnumerator.Current.Time + " - " + fillForwardEnumerator.Current.EndTime.DayOfWeek + " " + fillForwardEnumerator.Current.EndTime); dailyBarsEmitted++; } Assert.AreEqual(2, dailyBarsEmitted); Assert.AreEqual(new DateTime(2018, 3, 10, 19, 0, 0), fillForwardBars[0].Time); Assert.AreEqual(new DateTime(2018, 3, 11, 20, 0, 0), fillForwardBars[1].Time); fillForwardEnumerator.Dispose(); }
public void HandlesDaylightSavingTimeChange_InifinteLoop() { var dailyBarsEmitted = 0; var fillForwardBars = new List <BaseData>(); var data = new BaseData[] { new QuoteBar { Value = 0, Time = new DateTime(2019, 10, 4, 10, 0, 0), Period = Time.OneDay }, new QuoteBar { Value = 1, Time = new DateTime(2019, 10, 8, 11, 0, 0), Period = Time.OneDay } }.ToList(); var enumerator = data.GetEnumerator(); var algo = new AlgorithmStub(); var market = Market.Oanda; var security = algo.AddCfd("AU200AUD", Resolution.Daily, market); var fillForwardEnumerator = new FillForwardEnumerator(enumerator, security.Exchange, Ref.Create(TimeSpan.FromDays(1)), false, data.Last().EndTime, Time.OneDay, TimeZones.Utc, data.First().EndTime); while (fillForwardEnumerator.MoveNext()) { fillForwardBars.Add(fillForwardEnumerator.Current); Console.WriteLine(fillForwardEnumerator.Current.Time.DayOfWeek + " " + fillForwardEnumerator.Current.Time + " - " + fillForwardEnumerator.Current.EndTime.DayOfWeek + " " + fillForwardEnumerator.Current.EndTime + " " + fillForwardEnumerator.Current.IsFillForward); dailyBarsEmitted++; } Assert.AreEqual(4, dailyBarsEmitted); Assert.AreEqual(new DateTime(2019, 10, 4, 10, 0, 0), fillForwardBars[0].Time); Assert.AreEqual(new DateTime(2019, 10, 6, 11, 0, 0), fillForwardBars[1].Time); Assert.AreEqual(new DateTime(2019, 10, 7, 11, 0, 0), fillForwardBars[2].Time); Assert.AreEqual(new DateTime(2019, 10, 8, 11, 0, 0), fillForwardBars[3].Time); fillForwardEnumerator.Dispose(); }
public void FillsForwardMissingDaysOnFillForwardResolutionOfAnHour() { var dataResolution = Time.OneDay; var reference = new DateTime(2015, 6, 23); var data = new BaseData[] { // tues 6/23 new TradeBar { Value = 0, Time = reference, Period = dataResolution, Volume = 100 }, // wed 7/1 new TradeBar { Value = 1, Time = reference.AddDays(8), Period = dataResolution, Volume = 200 }, }.ToList(); var enumerator = data.GetEnumerator(); var exchange = new EquityExchange(); bool isExtendedMarketHours = false; var ffResolution = TimeSpan.FromHours(1); var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(ffResolution), isExtendedMarketHours, data.Last().EndTime, dataResolution, exchange.TimeZone, data.First().EndTime); int dailyBars = 0; int hourlyBars = 0; while (fillForwardEnumerator.MoveNext()) { Console.WriteLine(fillForwardEnumerator.Current.EndTime); if (fillForwardEnumerator.Current.Time.TimeOfDay == TimeSpan.Zero) { dailyBars++; } else { hourlyBars++; Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); } } // we expect 7 daily bars here, beginning tues, wed, thurs, fri, mon, tues, wed Assert.AreEqual(7, dailyBars); // we expect 6 days worth of ff hourly bars at 7 bars a day Assert.AreEqual(42, hourlyBars); fillForwardEnumerator.Dispose(); }
public void OandaFillsForwardDailyForexOnWeekends() { var dailyBarsEmitted = 0; var fillForwardBars = new List <BaseData>(); // 3 QuoteBars as they would be read from the EURUSD oanda daily file by QuoteBar.Reader() // The conversion from dataTimeZone to exchangeTimeZone has been done by hand // dataTimeZone == UTC /* * 20120719 00:00,1.22769,1.2324,1.22286,1.22759,0,1.22781,1.23253,1.22298,1.22771,0 * 20120720 00:00,1.22757,1.22823,1.21435,1.21542,0,1.22769,1.22835,1.21449,1.21592,0 * 20120722 00:00,1.21542,1.21542,1.21037,1.21271,0,1.21592,1.21592,1.21087,1.21283,0 * 20120723 00:00,1.21273,1.21444,1.20669,1.21238,0,1.21285,1.21454,1.20685,1.21249,0 */ var data = new BaseData[] { // fri 7/20 new QuoteBar { Value = 0, Time = new DateTime(2012, 7, 19, 20, 0, 0), Period = Time.OneDay }, // sunday 7/22 new QuoteBar { Value = 1, Time = new DateTime(2012, 7, 21, 20, 0, 0), Period = Time.OneDay }, // monday 7/23 new QuoteBar { Value = 2, Time = new DateTime(2012, 7, 22, 20, 0, 0), Period = Time.OneDay }, }.ToList(); var enumerator = data.GetEnumerator(); var market = Market.Oanda; var symbol = Symbol.Create("EURUSD", SecurityType.Forex, market); var marketHours = MarketHoursDatabase.FromDataFolder(); var exchange = new ForexExchange(marketHours.GetExchangeHours(market, symbol, SecurityType.Forex)); var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(TimeSpan.FromDays(1)), false, data.Last().EndTime, Time.OneDay, TimeZones.Utc, data.First().EndTime); while (fillForwardEnumerator.MoveNext()) { fillForwardBars.Add(fillForwardEnumerator.Current); Console.WriteLine(fillForwardEnumerator.Current.Time.DayOfWeek + " " + fillForwardEnumerator.Current.Time + " - " + fillForwardEnumerator.Current.EndTime.DayOfWeek + " " + fillForwardEnumerator.Current.EndTime); dailyBarsEmitted++; } Assert.AreEqual(3, dailyBarsEmitted); Assert.AreEqual(new DateTime(2012, 7, 19, 20, 0, 0), fillForwardBars[0].Time); Assert.AreEqual(new DateTime(2012, 7, 21, 20, 0, 0), fillForwardBars[1].Time); Assert.AreEqual(new DateTime(2012, 7, 22, 20, 0, 0), fillForwardBars[2].Time); fillForwardEnumerator.Dispose(); }
public void FillsForwardHourlyOnMinutesBeginningOfDay() { var dataResolution = Time.OneHour; var reference = new DateTime(2015, 6, 25); var data = new BaseData[] { // thurs 6/25 new TradeBar { Value = 0, Time = reference, Period = dataResolution, Volume = 100 }, // fri 6/26 new TradeBar { Value = 1, Time = reference.Date.AddHours(9), Period = dataResolution, Volume = 200 }, }.ToList(); var enumerator = data.GetEnumerator(); var exchange = new EquityExchange(); bool isExtendedMarketHours = false; var ffResolution = TimeSpan.FromMinutes(15); var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(ffResolution), isExtendedMarketHours, data.Last().EndTime, dataResolution, exchange.TimeZone, data.First().EndTime); // 12:00 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(1), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(100, ((TradeBar)fillForwardEnumerator.Current).Volume); // 9:45 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(9.75), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 10:00 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(10), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(1, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(200, ((TradeBar)fillForwardEnumerator.Current).Volume); Assert.IsFalse(fillForwardEnumerator.MoveNext()); fillForwardEnumerator.Dispose(); }
public void FillsForwardDailyMissingDays() { var dataResolution = Time.OneDay; var reference = new DateTime(2015, 6, 25); var data = new BaseData[] { // thurs 6/25 new TradeBar { Value = 0, Time = reference, Period = Time.OneDay, Volume = 100 }, // fri 6/26 new TradeBar { Value = 1, Time = reference.AddDays(5), Period = Time.OneDay, Volume = 200 }, }.ToList(); var enumerator = data.GetEnumerator(); var exchange = new EquityExchange(); bool isExtendedMarketHours = false; var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(TimeSpan.FromDays(1)), isExtendedMarketHours, data.Last().EndTime.AddDays(1), dataResolution, exchange.TimeZone, data.First().EndTime); // 6/25 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.IsTrue(((TradeBar)fillForwardEnumerator.Current).Period == dataResolution); Assert.AreEqual(100, ((TradeBar)fillForwardEnumerator.Current).Volume); // 6/26 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(2), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.IsTrue(((TradeBar)fillForwardEnumerator.Current).Period == dataResolution); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 6/29 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(5), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.IsTrue(((TradeBar)fillForwardEnumerator.Current).Period == dataResolution); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 6/30 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(6), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(1, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.IsTrue(((TradeBar)fillForwardEnumerator.Current).Period == dataResolution); Assert.AreEqual(200, ((TradeBar)fillForwardEnumerator.Current).Volume); // 7/1 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(7), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(1, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.IsTrue(((TradeBar)fillForwardEnumerator.Current).Period == dataResolution); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); Assert.IsFalse(fillForwardEnumerator.MoveNext()); fillForwardEnumerator.Dispose(); }
public void FillsForwardDailyOnHoursInMarketHours() { var dataResolution = Time.OneDay; var reference = new DateTime(2015, 6, 25); var data = new BaseData[] { // thurs 6/25 new TradeBar { Value = 0, Time = reference, Period = Time.OneDay, Volume = 100 }, // fri 6/26 new TradeBar { Value = 1, Time = reference.AddDays(1), Period = Time.OneDay, Volume = 200 }, }.ToList(); var enumerator = data.GetEnumerator(); var exchange = new EquityExchange(); bool isExtendedMarketHours = false; var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(TimeSpan.FromHours(1)), isExtendedMarketHours, data.Last().EndTime, dataResolution, exchange.TimeZone, data.First().EndTime); // 12:00am Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(100, ((TradeBar)fillForwardEnumerator.Current).Volume); // 10:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(10), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 11:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(11), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 12:00pm (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(12), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 1:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(13), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 2:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(14), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 3:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(15), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 4:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(1).AddHours(16), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 12:00am Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddDays(2), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(1, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(200, ((TradeBar)fillForwardEnumerator.Current).Volume); Assert.IsFalse(fillForwardEnumerator.MoveNext()); fillForwardEnumerator.Dispose(); }
public void SkipsAfterMarketData() { var dataResolution = Time.OneHour; var reference = new DateTime(2015, 6, 25, 14, 0, 0); var end = reference.Date.AddDays(1).AddHours(10); var data = new BaseData[] { new TradeBar { Time = reference, Value = 0, Period = dataResolution, Volume = 100 }, new TradeBar { Time = reference.AddHours(3), Value = 1, Period = dataResolution, Volume = 200 }, new TradeBar { Time = reference.Date.AddDays(1).AddHours(10) - dataResolution, Value = 2, Period = dataResolution, Volume = 300 } }.ToList(); var enumerator = data.GetEnumerator(); var exchange = new EquityExchange(); bool isExtendedMarketHours = false; var fillForwardEnumerator = new FillForwardEnumerator(enumerator, exchange, Ref.Create(TimeSpan.FromHours(1)), isExtendedMarketHours, end, dataResolution, exchange.TimeZone, data.First().EndTime); // 3:00 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(1), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(100, ((TradeBar)fillForwardEnumerator.Current).Volume); // 4:00 (ff) Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(2), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(0, fillForwardEnumerator.Current.Value); Assert.IsTrue(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(0, ((TradeBar)fillForwardEnumerator.Current).Volume); // 6:00 - this is raw data, the FF enumerator doesn't try to perform filtering per se, just filtering on when to FF Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(reference.AddHours(4), fillForwardEnumerator.Current.EndTime); Assert.AreEqual(1, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(200, ((TradeBar)fillForwardEnumerator.Current).Volume); // 10:00 Assert.IsTrue(fillForwardEnumerator.MoveNext()); Assert.AreEqual(end, fillForwardEnumerator.Current.EndTime); Assert.AreEqual(2, fillForwardEnumerator.Current.Value); Assert.IsFalse(fillForwardEnumerator.Current.IsFillForward); Assert.AreEqual(dataResolution, fillForwardEnumerator.Current.EndTime - fillForwardEnumerator.Current.Time); Assert.AreEqual(300, ((TradeBar)fillForwardEnumerator.Current).Volume); Assert.IsFalse(fillForwardEnumerator.MoveNext()); fillForwardEnumerator.Dispose(); }
public override void DelSubItem(string itemName) { BaseData.Remove(BaseData.Where(item => item.Name == itemName).First()); UpdateCurrentWeatherCondition(BaseData.Count == 0 ? "" : BaseData.First().Name); }