Skip to content

Commit

Permalink
Use GetIndicatorAsManagedObject instead of ConvertToIndicator
Browse files Browse the repository at this point in the history
  • Loading branch information
JosueNina committed Feb 24, 2025
1 parent f995487 commit 4af8cfa
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 49 deletions.
24 changes: 15 additions & 9 deletions Algorithm/QCAlgorithm.Python.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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> indicatorDataPoint;
IndicatorBase<IBaseDataBar> indicatorDataBar;
IndicatorBase<TradeBar> indicatorTradeBar;

var convertedIndicator = indicator.ConvertToIndicator();

if (convertedIndicator is PythonIndicator pythonIndicator)
if (indicator.TryConvert<PythonIndicator>(out var pythonIndicator))
{
RegisterIndicator(symbol, WrapPythonIndicator(indicator, pythonIndicator), consolidator,
selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
}
else if (convertedIndicator is IndicatorBase<IndicatorDataPoint> indicatorDataPoint)
else if (indicator.TryConvert(out indicatorDataPoint))
{
RegisterIndicator(symbol, indicatorDataPoint, consolidator,
selector?.ConvertToDelegate<Func<IBaseData, decimal>>());
}
else if (convertedIndicator is IndicatorBase<IBaseDataBar> indicatorDataBar)
else if (indicator.TryConvert(out indicatorDataBar))
{
RegisterIndicator(symbol, indicatorDataBar, consolidator,
selector?.ConvertToDelegate<Func<IBaseData, IBaseDataBar>>());
}
else if (convertedIndicator is IndicatorBase<TradeBar> indicatorTradeBar)
else if (indicator.TryConvert(out indicatorTradeBar))
{
RegisterIndicator(symbol, indicatorTradeBar, consolidator,
selector?.ConvertToDelegate<Func<IBaseData, TradeBar>>());
}
else if (convertedIndicator is IndicatorBase<IBaseData> indicatorBaseData)
else if (indicator.TryConvert(out IndicatorBase<IBaseData> indicatorBaseData))
{
RegisterIndicator(symbol, indicatorBaseData, consolidator,
selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
}
else
{
RegisterIndicator(symbol, WrapPythonIndicator(indicator), consolidator,
selector?.ConvertToDelegate<Func<IBaseData, IBaseData>>());
}
}

/// <summary>
Expand Down Expand Up @@ -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 =>
{
Expand Down
7 changes: 6 additions & 1 deletion Indicators/CompositeIndicator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
/// </exception>
public CompositeIndicator(string name, PyObject left, PyObject right, PyObject handler)
: this(name, left.ConvertToIndicator(), right.ConvertToIndicator(), new IndicatorComposer(handler.ConvertToDelegate<Func<IndicatorBase, IndicatorBase, IndicatorResult>>()))
: this(
name,
(IndicatorBase)left.GetIndicatorAsManagedObject(),
(IndicatorBase)right.GetIndicatorAsManagedObject(),
new IndicatorComposer(handler.ConvertToDelegate<Func<IndicatorBase, IndicatorBase, IndicatorResult>>())
)
{
}

Expand Down
40 changes: 1 addition & 39 deletions Indicators/IndicatorExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/// <summary>
/// Converts a <see cref="PyObject"/> into an <see cref="IndicatorBase"/>.
/// </summary>
/// <param name="pyObject">The Python object to convert.</param>
/// <returns>The corresponding <see cref="IndicatorBase"/> if the conversion is successful.</returns>
public static IndicatorBase ConvertToIndicator(this PyObject pyObject)
{
IndicatorBase indicator;

if (pyObject.TryConvert<PythonIndicator>(out var pythonIndicator))
{
pythonIndicator.SetIndicator(pyObject);
indicator = pythonIndicator;
}
else if (pyObject.TryConvert<IndicatorBase<IndicatorDataPoint>>(out var dataPointIndicator))
{
indicator = dataPointIndicator;
}
else if (pyObject.TryConvert<IndicatorBase<IBaseDataBar>>(out var baseDataBarIndicator))
{
indicator = baseDataBarIndicator;
}
else if (pyObject.TryConvert<IndicatorBase<TradeBar>>(out var tradeBarIndicator))
{
indicator = tradeBarIndicator;
}
else if (pyObject.TryConvert<IndicatorBase<IBaseData>>(out var baseDataIndicator))
{
indicator = baseDataIndicator;
}
else
{
indicator = new PythonIndicator(pyObject);
}

return indicator;
}

/// <summary>Creates a new ExponentialMovingAverage indicator with the specified period and smoothingFactor from the left indicator
/// </summary>
/// <param name="left">The ExponentialMovingAverage indicator will be created using the data from left</param>
Expand Down Expand Up @@ -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))
{
Expand Down

0 comments on commit 4af8cfa

Please sign in to comment.