public void SequentialConsolidatorsFiresAllEvents()
        {
            var first = new IdentityDataConsolidator<BaseData>();
            var second = new IdentityDataConsolidator<BaseData>();
            var sequential = new SequentialConsolidator(first, second);

            bool firstFired = false;
            bool secondFired = false;
            bool sequentialFired = false;

            first.DataConsolidated += (sender, consolidated) =>
            {
                firstFired = true;
            };

            second.DataConsolidated += (sender, consolidated) =>
            {
                secondFired = true;
            };

            sequential.DataConsolidated += (sender, consolidated) =>
            {
                sequentialFired = true;
            };

            sequential.Update(new TradeBar());

            Assert.IsTrue(firstFired);
            Assert.IsTrue(secondFired);
            Assert.IsTrue(sequentialFired);
        }
        public void SequentialConsolidatorAcceptsSubTypesForSecondInputType()
        {
            var first = new IdentityDataConsolidator<TradeBar>();
            var second = new IdentityDataConsolidator<BaseData>();
            var sequential = new SequentialConsolidator(first, second);

            bool firstFired = false;
            bool secondFired = false;
            bool sequentialFired = false;

            first.DataConsolidated += (sender, consolidated) =>
            {
                firstFired = true;
            };

            second.DataConsolidated += (sender, consolidated) =>
            {
                secondFired = true;
            };

            sequential.DataConsolidated += (sender, consolidated) =>
            {
                sequentialFired = true;
            };

            sequential.Update(new TradeBar());

            Assert.IsTrue(firstFired);
            Assert.IsTrue(secondFired);
            Assert.IsTrue(sequentialFired);
        }
        public override void Initialize()
        {
            AddSecurity(SecurityType.Equity, "SPY", Resolution.Minute);

            // we have data for these dates locally
            var start = new DateTime(2013, 10, 07, 09, 30, 0);
            SetStartDate(start);
            SetEndDate(start.AddDays(1));

            // define our 30 minute trade bar consolidator. we can access the 30 minute bar
            // from the DataConsolidated events
            var thirtyMinuteConsolidator = new TradeBarConsolidator(TimeSpan.FromMinutes(30));

            // attach our event handler. the event handler is a function that will be called each time we produce
            // a new consolidated piece of data.
            thirtyMinuteConsolidator.DataConsolidated += ThirtyMinuteBarHandler;

            // this call adds our 30 minute consolidator to the manager to receive updates from the engine
            SubscriptionManager.AddConsolidator("SPY", thirtyMinuteConsolidator);

            // here we'll define a slightly more complex consolidator. what we're trying to produce is a 3
            // day bar.  Now we could just use a single TradeBarConsolidator like above and pass in TimeSpan.FromDays(3),
            // but in reality that's not what we want. For time spans of longer than a day we'll get incorrect results around
            // weekends and such. What we really want are tradeable days. So we'll create a daily consolidator, and then wrap
            // it with a 3 count consolidator.

            // first define a one day trade bar -- this produces a consolidated piece of data after a day has passed
            var oneDayConsolidator = new TradeBarConsolidator(TimeSpan.FromDays(1));

            // next define our 3 count trade bar -- this produces a consolidated piece of data after it sees 3 pieces of data
            var threeCountConsolidator = new TradeBarConsolidator(3);

            // here we combine them to make a new, 3 hour trade bar. The SequentialConsolidator allows composition of consolidators.
            // it takes the consolidated output of one consolidator (in this case, the oneDayConsolidator) and pipes it through to
            // the threeCountConsolidator.  His output will be a 3 day bar.
            var three_oneDayBar = new SequentialConsolidator(oneDayConsolidator, threeCountConsolidator);

            // attach our handler
            three_oneDayBar.DataConsolidated += (sender, consolidated) => ThreeHourBarConsolidatedHandler(sender, (TradeBar) consolidated);

            // this call adds our 3 day to the manager to receive updates from the engine
            SubscriptionManager.AddConsolidator("SPY", three_oneDayBar);
        }