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); }
/// <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); }