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);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.
        /// </summary>
        /// <meta name="tag" content="using data" />
        /// <meta name="tag" content="consolidating data" />
        public override void Initialize()
        {
            AddEquity("SPY");
            AddForex("EURUSD", Resolution.Hour);

            // 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 day 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) => ThreeDayBarConsolidatedHandler(sender, (TradeBar)consolidated);

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

            // API convenience method for easily receiving consolidated data
            Consolidate("SPY", TimeSpan.FromMinutes(45), FortyFiveMinuteBarHandler);
            Consolidate("SPY", Resolution.Hour, HourBarHandler);
            Consolidate("EURUSD", Resolution.Daily, DailyEurUsdBarHandler);

            // requires quote data subscription
            //Consolidate<QuoteBar>("EURUSD", TimeSpan.FromMinutes(45), FortyFiveMinuteBarHandler);
            //Consolidate<QuoteBar>("EURUSD", Resolution.Hour, HourBarHandler);

            // some securities may have trade and quote data available
            //Consolidate<TradeBar>("BTCUSD", Resolution.Hour, HourBarHandler);
            //Consolidate<QuoteBar>("BTCUSD", Resolution.Hour, HourBarHandler);
        }