public void DoesNotConsolidateDifferentSymbols() { var consolidator = new BaseDataConsolidator(2); var reference = DateTime.Today; var tb1 = new Tick { Symbol = Symbols.AAPL, Time = reference, Value = 5, Quantity = 10 }; var tb2 = new Tick { Symbol = Symbols.ZNGA, Time = reference, Value = 2, Quantity = 5 }; consolidator.Update(tb1); Exception ex = Assert.Throws <InvalidOperationException>(() => consolidator.Update(tb2)); Assert.That(ex.Message, Is.StringContaining("is not the same")); }
public void AggregatesNewTradeBarProperly() { TradeBar newTradeBar = null; var creator = new BaseDataConsolidator(4); creator.DataConsolidated += (sender, tradeBar) => { newTradeBar = tradeBar; }; var reference = DateTime.Today; var bar1 = new Tick { Symbol = "SPY", Time = reference, Value = 5, Quantity = 10 }; creator.Update(bar1); Assert.IsNull(newTradeBar); var bar2 = new Tick { Symbol = "SPY", Time = reference.AddHours(1), Value = 10, Quantity = 20 }; creator.Update(bar2); Assert.IsNull(newTradeBar); var bar3 = new Tick { Symbol = "SPY", Time = reference.AddHours(2), Value = 1, Quantity = 10 }; creator.Update(bar3); Assert.IsNull(newTradeBar); var bar4 = new Tick { Symbol = "SPY", Time = reference.AddHours(3), Value = 9, Quantity = 20 }; creator.Update(bar4); Assert.IsNotNull(newTradeBar); Assert.AreEqual("SPY", newTradeBar.Symbol); Assert.AreEqual(bar1.Time, newTradeBar.Time); Assert.AreEqual(bar1.Value, newTradeBar.Open); Assert.AreEqual(bar2.Value, newTradeBar.High); Assert.AreEqual(bar3.Value, newTradeBar.Low); Assert.AreEqual(bar4.Value, newTradeBar.Close); // base data can't aggregate volume Assert.AreEqual(0, newTradeBar.Volume); }
public void ExpectedConsolidatedTradeBarsInPeriodMode(TimeSpan barSpan, TimeSpan updateSpan) { TradeBar consolidated = null; using var consolidator = new BaseDataConsolidator(barSpan); consolidator.DataConsolidated += (sender, bar) => { Assert.AreEqual(barSpan, bar.Period); // The period matches our span consolidated = bar; }; var reference = new DateTime(2015, 04, 13); var dataTime = reference; var nextBarTime = reference + barSpan; var lastBarTime = reference; // First data point consolidator.Update(new Tick { Time = dataTime }); Assert.IsNull(consolidated); for (var i = 0; i < 10; i++) { // Add data on the given interval until we expect a new bar while (dataTime < nextBarTime) { dataTime = dataTime.Add(updateSpan); consolidator.Update(new Tick { Time = dataTime }); } // Our asserts Assert.IsNotNull(consolidated); // We have a bar Assert.AreEqual(dataTime, consolidated.EndTime); // New bar time should be dataTime Assert.AreEqual(barSpan, consolidated.EndTime - lastBarTime); // The difference between the bars is the span nextBarTime = dataTime + barSpan; lastBarTime = consolidated.EndTime; } }
public void AggregatesPeriodInPeriodModeWithDailyDataAndRoundedTime() { TradeBar consolidated = null; var consolidator = new BaseDataConsolidator(TimeSpan.FromDays(1)); consolidator.DataConsolidated += (sender, bar) => { consolidated = bar; }; var reference = new DateTime(2015, 04, 13); consolidator.Update(new Tick { Time = reference.AddSeconds(45) }); Assert.IsNull(consolidated); consolidator.Update(new Tick { Time = reference.AddDays(1).AddMinutes(1) }); Assert.IsNotNull(consolidated); Assert.AreEqual(TimeSpan.FromDays(1), consolidated.Period); Assert.AreEqual(reference, consolidated.Time); consolidated = null; consolidator.Update(new Tick { Time = reference.AddDays(2).AddHours(1).AddMinutes(1).AddSeconds(1) }); Assert.IsNotNull(consolidated); Assert.AreEqual(TimeSpan.FromDays(1), consolidated.Period); Assert.AreEqual(reference.AddDays(1), consolidated.Time); consolidated = null; consolidator.Update(new Tick { Time = reference.AddDays(3) }); Assert.IsNotNull(consolidated); Assert.AreEqual(TimeSpan.FromDays(1), consolidated.Period); Assert.AreEqual(reference.AddDays(2), consolidated.Time); }
public void ConsolidatesWithRegisterIndicator() { var consolidator = new BaseDataConsolidator(TimeSpan.FromMinutes(5)); consolidator.DataConsolidated += OnFiveMinutes; indicator = new SimpleMovingAverage(2); RegisterIndicator(indicator, consolidator); var time = DateTime.Today.AddHours(9); for (var i = 1; i < 100; i++) { consolidator.Update(new Tick(time.AddMinutes(i - 1), Symbols.SPY, i, i, i)); } }
public void AggregatesPeriodInCountModeWithHourlyData() { TradeBar consolidated = null; var consolidator = new BaseDataConsolidator(2); consolidator.DataConsolidated += (sender, bar) => { consolidated = bar; }; var reference = new DateTime(2015, 04, 13); consolidator.Update(new Tick { Time = reference }); Assert.IsNull(consolidated); consolidator.Update(new Tick { Time = reference.AddHours(1) }); Assert.IsNotNull(consolidated); // sadly the first emit will be off by the data resolution since we 'swallow' a point, so to speak. Assert.AreEqual(TimeSpan.FromHours(1), consolidated.Period); consolidated = null; consolidator.Update(new Tick { Time = reference.AddHours(2) }); Assert.IsNull(consolidated); consolidator.Update(new Tick { Time = reference.AddHours(3) }); Assert.IsNotNull(consolidated); Assert.AreEqual(TimeSpan.FromHours(2), consolidated.Period); consolidated = null; consolidator.Update(new Tick { Time = reference.AddHours(4) }); Assert.IsNull(consolidated); consolidator.Update(new Tick { Time = reference.AddHours(5) }); Assert.IsNotNull(consolidated); Assert.AreEqual(TimeSpan.FromHours(2), consolidated.Period); }
public void AggregatesBaseDataToCalendarTradeBarProperly() { // Monday var reference = new DateTime(2019, 3, 18); var ticks = new List <Tick> { new Tick(reference.AddDays(1), Symbols.SPY, 9, 11, 8) { Quantity = 10 }, new Tick(reference.AddDays(3), Symbols.SPY, 10, 12, 8) { Quantity = 10 }, new Tick(reference.AddDays(5), Symbols.SPY, 11, 13, 9) { Quantity = 10 }, new Tick(reference.AddDays(7), Symbols.SPY, 11, 13, 9) { Quantity = 10 }, new Tick(reference.AddDays(14), Symbols.SPY, 11, 13, 9) { Quantity = 10 } }; var weeklyConsolidator = new BaseDataConsolidator(CalendarType.Weekly); weeklyConsolidator.DataConsolidated += (s, e) => { AssertBaseTradeBar( ticks.Take(3), reference, reference.AddDays(7), Symbols.SPY, e); }; var monthlyConsolidator = new BaseDataConsolidator(CalendarType.Monthly); monthlyConsolidator.DataConsolidated += (s, e) => { AssertBaseTradeBar( ticks.Take(4), new DateTime(reference.Year, reference.Month, 1), new DateTime(reference.Year, reference.Month + 1, 1), Symbols.SPY, e); }; foreach (var tick in ticks.Take(4)) { weeklyConsolidator.Update(tick); } foreach (var tick in ticks) { monthlyConsolidator.Update(tick); } }
public void AggregatesTickToNewTradeBarProperly() { TradeBar newTradeBar = null; var creator = new BaseDataConsolidator(4); creator.DataConsolidated += (sender, tradeBar) => { newTradeBar = tradeBar; }; var reference = DateTime.Today; var bar1 = new Tick { Symbol = Symbols.SPY, Time = reference, Value = 5, Quantity = 10 }; creator.Update(bar1); Assert.IsNull(newTradeBar); var bar2 = new Tick { Symbol = Symbols.SPY, Time = reference.AddHours(1), Value = 10, Quantity = 20 }; creator.Update(bar2); Assert.IsNull(newTradeBar); var bar3 = new Tick { Symbol = Symbols.SPY, Time = reference.AddHours(2), Value = 1, Quantity = 10 }; creator.Update(bar3); Assert.IsNull(newTradeBar); var bar4 = new Tick { Symbol = Symbols.SPY, Time = reference.AddHours(3), Value = 9, Quantity = 20 }; creator.Update(bar4); Assert.IsNotNull(newTradeBar); Assert.AreEqual(Symbols.SPY, newTradeBar.Symbol); Assert.AreEqual(bar1.Time, newTradeBar.Time); Assert.AreEqual(bar1.Value, newTradeBar.Open); Assert.AreEqual(bar2.Value, newTradeBar.High); Assert.AreEqual(bar3.Value, newTradeBar.Low); Assert.AreEqual(bar4.Value, newTradeBar.Close); Assert.AreEqual(bar4.EndTime, newTradeBar.EndTime); // base data can't aggregate volume Assert.AreEqual(0, newTradeBar.Volume); }