예제 #1
0
        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"));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        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));
            }
        }