/// <summary> /// Gets the historical data of an bar indicator and convert it into pandas.DataFrame /// </summary> /// <param name="indicator">Bar indicator</param> /// <param name="history">Historical data used to calculate the indicator</param> /// <param name="selector">Selects a value from the BaseData to send into the indicator, if null defaults to the Value property of BaseData (x => x.Value)</param> /// <returns>pandas.DataFrame containing the historical data of <param name="indicator"></returns> private PyObject Indicator <T>(IndicatorBase <T> indicator, IEnumerable <Slice> history, Func <IBaseData, T> selector = null) where T : IBaseData { // Reset the indicator indicator.Reset(); // Create a dictionary of the properties var name = indicator.GetType().Name; var properties = indicator.GetType().GetProperties() .Where(x => x.PropertyType.IsGenericType) .ToDictionary(x => x.Name, y => new List <IndicatorDataPoint>()); properties.Add(name, new List <IndicatorDataPoint>()); indicator.Updated += (s, e) => { if (!indicator.IsReady) { return; } foreach (var kvp in properties) { var dataPoint = kvp.Key == name ? e : GetPropertyValue(s, kvp.Key + ".Current"); kvp.Value.Add((IndicatorDataPoint)dataPoint); } }; selector = selector ?? (x => (T)x); history.PushThrough(bar => indicator.Update(selector(bar))); return(PandasConverter.GetIndicatorDataFrame(properties)); }
/// <summary> /// Gets the historical data of an indicator and convert it into pandas.DataFrame /// </summary> /// <param name="indicator">Indicator</param> /// <param name="history">Historical data used to calculate the indicator</param> /// <param name="selector">Selects a value from the BaseData to send into the indicator, if null defaults to the Value property of BaseData (x => x.Value)</param> /// <returns>pandas.DataFrame containing the historical data of <param name="indicator"></returns> private PyObject Indicator(IndicatorBase <IndicatorDataPoint> indicator, IEnumerable <IBaseDataBar> history, Func <IBaseData, decimal> selector = null) { // Reset the indicator indicator.Reset(); // Create a dictionary of the properties var name = indicator.GetType().Name; var properties = indicator.GetType().GetProperties() .Where(x => x.PropertyType.IsGenericType) .ToDictionary(x => x.Name, y => new List <IndicatorDataPoint>()); properties.Add(name, new List <IndicatorDataPoint>()); indicator.Updated += (s, e) => { if (!indicator.IsReady) { return; } foreach (var kvp in properties) { var dataPoint = kvp.Key == name ? e : GetPropertyValue(s, kvp.Key + ".Current"); kvp.Value.Add((IndicatorDataPoint)dataPoint); } }; selector = selector ?? (x => x.Value); foreach (var bar in history) { var value = selector(bar); indicator.Update(bar.EndTime, value); } return(_converter.GetIndicatorDataFrame(properties)); }