diff --git a/Algorithm/QCAlgorithm.Python.cs b/Algorithm/QCAlgorithm.Python.cs index 111614b828d6..19e453f729fb 100644 --- a/Algorithm/QCAlgorithm.Python.cs +++ b/Algorithm/QCAlgorithm.Python.cs @@ -299,7 +299,7 @@ public Universe AddUniverse(PyObject pyObject) return AddUniverse(pyObject, null, null); } // TODO: to be removed when https://github.com/QuantConnect/pythonnet/issues/62 is solved - else if (pyObject.TryConvert(out universe)) + else if(pyObject.TryConvert(out universe)) { return AddUniverse(universe); } @@ -662,34 +662,40 @@ public void RegisterIndicator(Symbol symbol, PyObject indicator, PyObject pyObje public void RegisterIndicator(Symbol symbol, PyObject indicator, IDataConsolidator consolidator, PyObject selector = null) { // TODO: to be removed when https://github.com/QuantConnect/pythonnet/issues/62 is solved + IndicatorBase indicatorDataPoint; + IndicatorBase indicatorDataBar; + IndicatorBase indicatorTradeBar; - var convertedIndicator = indicator.ConvertToIndicator(); - - if (convertedIndicator is PythonIndicator pythonIndicator) + if (indicator.TryConvert(out var pythonIndicator)) { RegisterIndicator(symbol, WrapPythonIndicator(indicator, pythonIndicator), consolidator, selector?.ConvertToDelegate>()); } - else if (convertedIndicator is IndicatorBase indicatorDataPoint) + else if (indicator.TryConvert(out indicatorDataPoint)) { RegisterIndicator(symbol, indicatorDataPoint, consolidator, selector?.ConvertToDelegate>()); } - else if (convertedIndicator is IndicatorBase indicatorDataBar) + else if (indicator.TryConvert(out indicatorDataBar)) { RegisterIndicator(symbol, indicatorDataBar, consolidator, selector?.ConvertToDelegate>()); } - else if (convertedIndicator is IndicatorBase indicatorTradeBar) + else if (indicator.TryConvert(out indicatorTradeBar)) { RegisterIndicator(symbol, indicatorTradeBar, consolidator, selector?.ConvertToDelegate>()); } - else if (convertedIndicator is IndicatorBase indicatorBaseData) + else if (indicator.TryConvert(out IndicatorBase indicatorBaseData)) { RegisterIndicator(symbol, indicatorBaseData, consolidator, selector?.ConvertToDelegate>()); } + else + { + RegisterIndicator(symbol, WrapPythonIndicator(indicator), consolidator, + selector?.ConvertToDelegate>()); + } } /// @@ -1762,7 +1768,7 @@ private dynamic[] GetIndicatorArray(PyObject first, PyObject second = null, PyOb { using (Py.GIL()) { - var array = new[] { first, second, third, fourth } + var array = new[] {first, second, third, fourth} .Select( x => { diff --git a/Indicators/CompositeIndicator.cs b/Indicators/CompositeIndicator.cs index c04c9cb9c9aa..1040755a4660 100644 --- a/Indicators/CompositeIndicator.cs +++ b/Indicators/CompositeIndicator.cs @@ -115,7 +115,12 @@ public CompositeIndicator(IndicatorBase left, IndicatorBase right, IndicatorComp /// Thrown if the provided left or right indicator is not a valid QuantConnect Indicator object. /// public CompositeIndicator(string name, PyObject left, PyObject right, PyObject handler) - : this(name, left.ConvertToIndicator(), right.ConvertToIndicator(), new IndicatorComposer(handler.ConvertToDelegate>())) + : this( + name, + (IndicatorBase)left.GetIndicatorAsManagedObject(), + (IndicatorBase)right.GetIndicatorAsManagedObject(), + new IndicatorComposer(handler.ConvertToDelegate>()) + ) { } diff --git a/Indicators/IndicatorExtensions.cs b/Indicators/IndicatorExtensions.cs index 9159500520c2..523baa4cdf68 100644 --- a/Indicators/IndicatorExtensions.cs +++ b/Indicators/IndicatorExtensions.cs @@ -284,44 +284,6 @@ public static CompositeIndicator Times(this IndicatorBase left, IndicatorBase ri return new(name, left, right, (l, r) => l.Current.Value * r.Current.Value); } - /// - /// Converts a into an . - /// - /// The Python object to convert. - /// The corresponding if the conversion is successful. - public static IndicatorBase ConvertToIndicator(this PyObject pyObject) - { - IndicatorBase indicator; - - if (pyObject.TryConvert(out var pythonIndicator)) - { - pythonIndicator.SetIndicator(pyObject); - indicator = pythonIndicator; - } - else if (pyObject.TryConvert>(out var dataPointIndicator)) - { - indicator = dataPointIndicator; - } - else if (pyObject.TryConvert>(out var baseDataBarIndicator)) - { - indicator = baseDataBarIndicator; - } - else if (pyObject.TryConvert>(out var tradeBarIndicator)) - { - indicator = tradeBarIndicator; - } - else if (pyObject.TryConvert>(out var baseDataIndicator)) - { - indicator = baseDataIndicator; - } - else - { - indicator = new PythonIndicator(pyObject); - } - - return indicator; - } - /// Creates a new ExponentialMovingAverage indicator with the specified period and smoothingFactor from the left indicator /// /// The ExponentialMovingAverage indicator will be created using the data from left @@ -602,7 +564,7 @@ public static object Plus(PyObject left, PyObject right, string name = "") return Plus(indicatorLeft, indicatorRight, name); } - private static dynamic GetIndicatorAsManagedObject(PyObject indicator) + internal static dynamic GetIndicatorAsManagedObject(this PyObject indicator) { if (indicator.TryConvert(out PythonIndicator pythonIndicator, true)) {