IndicatorBase now implements IDataConsolidated and fires the DataConsolidated event after each update.
The Of extension method now attaches a handler to the 'first' to update the 'second' and returns the reference to the 'second' for method chaining. See OfExtensionMethodTests.cs
Using the SetEndDate function would end up with the last day of data not being processed due to a period start/finish filter in the SubscriptionDataReader.MoveNext() function. Updating the SetEndDate to make the DateTime value to last moment in the day solves the issue. It also ends up fixing a lingering bug in the ConsoleResultHandler where we were computing the wrong number of days to process.
Includes new AddData<T> overload to accept fillforward and leverage parameters
Moved the clone implementation in BaseData to ObjectActivator
Added some test BaseData types that can be used as custom data but just patch through to default data locations
Also includes some performance tweaks to sleep certain tight looped threads
Also includes changes to mark data as fill-forward via Clone(bool fillForward), BaseData.IsFillForward property
Removing the isQcData flags allowed better support for consistency between different data types. This has a knock-on effect of allowing custom data to be fillforward and loaded from a file system.
Previously we weren't allowing the user to input a selector for 1D data points unless they jumped through some hoops. With this change we can now easily specify a selector for our 1D data via code like the following:
RegisterIndicator(symbol, indicator, resolution, selector);
When resolving a default consolidator we'll now always use identity IF the resolution was not specified or if it matches the subscription's resolution. The idea here being if they're the same then we can safely assume that we don't need to aggregate/transform the data in any way and just pipe the .Value to the indicator for every piece of data we get.
This allows the 1D short code indicator functions to work (EMA, SMA, MACD, RSI, ect..)