Skip to content
9 changes: 4 additions & 5 deletions Algorithm/Alphas/CompositeAlphaModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,10 @@ public void AddAlpha(IAlphaModel alphaModel)
/// <param name="pyAlphaModel">The alpha model to add</param>
public void AddAlpha(PyObject pyAlphaModel)
{
IAlphaModel alphaModel;
if (!pyAlphaModel.TryConvert(out alphaModel))
{
alphaModel = new AlphaModelPythonWrapper(pyAlphaModel);
}
var alphaModel = PythonUtil.CreateInstanceOrWrapper<IAlphaModel>(
pyAlphaModel,
py => new AlphaModelPythonWrapper(py)
);
_alphaModels.Add(alphaModel);
}
}
Expand Down
95 changes: 34 additions & 61 deletions Algorithm/QCAlgorithm.Framework.Python.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
using QuantConnect.Algorithm.Framework.Portfolio;
using QuantConnect.Algorithm.Framework.Risk;
using QuantConnect.Algorithm.Framework.Selection;
using QuantConnect.Util;

namespace QuantConnect.Algorithm
{
Expand All @@ -31,15 +32,10 @@ public partial class QCAlgorithm
[DocumentationAttribute(AlgorithmFramework)]
public void SetAlpha(PyObject alpha)
{
IAlphaModel model;
if (alpha.TryConvert(out model))
{
SetAlpha(model);
}
else
{
Alpha = new AlphaModelPythonWrapper(alpha);
}
Alpha = PythonUtil.CreateInstanceOrWrapper<IAlphaModel>(
alpha,
py => new AlphaModelPythonWrapper(py)
);
}

/// <summary>
Expand All @@ -49,15 +45,11 @@ public void SetAlpha(PyObject alpha)
[DocumentationAttribute(AlgorithmFramework)]
public void AddAlpha(PyObject alpha)
{
IAlphaModel model;
if (alpha.TryConvert(out model))
{
AddAlpha(model);
}
else
{
AddAlpha(new AlphaModelPythonWrapper(alpha));
}
var model = PythonUtil.CreateInstanceOrWrapper<IAlphaModel>(
alpha,
py => new AlphaModelPythonWrapper(py)
);
AddAlpha(model);
}

/// <summary>
Expand All @@ -68,15 +60,10 @@ public void AddAlpha(PyObject alpha)
[DocumentationAttribute(TradingAndOrders)]
public void SetExecution(PyObject execution)
{
IExecutionModel model;
if (execution.TryConvert(out model))
{
SetExecution(model);
}
else
{
Execution = new ExecutionModelPythonWrapper(execution);
}
Execution = PythonUtil.CreateInstanceOrWrapper<IExecutionModel>(
execution,
py => new ExecutionModelPythonWrapper(py)
);
}

/// <summary>
Expand All @@ -87,15 +74,10 @@ public void SetExecution(PyObject execution)
[DocumentationAttribute(TradingAndOrders)]
public void SetPortfolioConstruction(PyObject portfolioConstruction)
{
IPortfolioConstructionModel model;
if (portfolioConstruction.TryConvert(out model))
{
SetPortfolioConstruction(model);
}
else
{
PortfolioConstruction = new PortfolioConstructionModelPythonWrapper(portfolioConstruction);
}
PortfolioConstruction = PythonUtil.CreateInstanceOrWrapper<IPortfolioConstructionModel>(
portfolioConstruction,
py => new PortfolioConstructionModelPythonWrapper(py)
);
}

/// <summary>
Expand All @@ -106,12 +88,10 @@ public void SetPortfolioConstruction(PyObject portfolioConstruction)
[DocumentationAttribute(Universes)]
public void SetUniverseSelection(PyObject universeSelection)
{
IUniverseSelectionModel model;
if (!universeSelection.TryConvert(out model))
{
model = new UniverseSelectionModelPythonWrapper(universeSelection);
}
SetUniverseSelection(model);
UniverseSelection = PythonUtil.CreateInstanceOrWrapper<IUniverseSelectionModel>(
universeSelection,
py => new UniverseSelectionModelPythonWrapper(py)
);
}

/// <summary>
Expand All @@ -122,11 +102,10 @@ public void SetUniverseSelection(PyObject universeSelection)
[DocumentationAttribute(Universes)]
public void AddUniverseSelection(PyObject universeSelection)
{
IUniverseSelectionModel model;
if (!universeSelection.TryConvert(out model))
{
model = new UniverseSelectionModelPythonWrapper(universeSelection);
}
var model = PythonUtil.CreateInstanceOrWrapper<IUniverseSelectionModel>(
universeSelection,
py => new UniverseSelectionModelPythonWrapper(py)
);
AddUniverseSelection(model);
}

Expand All @@ -138,15 +117,10 @@ public void AddUniverseSelection(PyObject universeSelection)
[DocumentationAttribute(TradingAndOrders)]
public void SetRiskManagement(PyObject riskManagement)
{
IRiskManagementModel model;
if (riskManagement.TryConvert(out model))
{
SetRiskManagement(model);
}
else
{
RiskManagement = new RiskManagementModelPythonWrapper(riskManagement);
}
RiskManagement = PythonUtil.CreateInstanceOrWrapper<IRiskManagementModel>(
riskManagement,
py => new RiskManagementModelPythonWrapper(py)
);
}

/// <summary>
Expand All @@ -157,11 +131,10 @@ public void SetRiskManagement(PyObject riskManagement)
[DocumentationAttribute(TradingAndOrders)]
public void AddRiskManagement(PyObject riskManagement)
{
IRiskManagementModel model;
if (!riskManagement.TryConvert(out model))
{
model = new RiskManagementModelPythonWrapper(riskManagement);
}
var model = PythonUtil.CreateInstanceOrWrapper<IRiskManagementModel>(
riskManagement,
py => new RiskManagementModelPythonWrapper(py)
);
AddRiskManagement(model);
}
}
Expand Down
25 changes: 13 additions & 12 deletions Algorithm/QCAlgorithm.Python.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1372,12 +1372,10 @@ public void SetBenchmark(PyObject benchmark)
[DocumentationAttribute(Modeling)]
public void SetBrokerageModel(PyObject model)
{
IBrokerageModel brokerageModel;
if (!model.TryConvert(out brokerageModel))
{
brokerageModel = new BrokerageModelPythonWrapper(model);
}

var brokerageModel = PythonUtil.CreateInstanceOrWrapper<IBrokerageModel>(
model,
py => new BrokerageModelPythonWrapper(py)
);
SetBrokerageModel(brokerageModel);
}

Expand All @@ -1392,11 +1390,10 @@ public void SetBrokerageModel(PyObject model)
[DocumentationAttribute(Logging)]
public void SetBrokerageMessageHandler(PyObject handler)
{
if (!handler.TryConvert(out IBrokerageMessageHandler brokerageMessageHandler))
{
brokerageMessageHandler = new BrokerageMessageHandlerPythonWrapper(handler);
}

var brokerageMessageHandler = PythonUtil.CreateInstanceOrWrapper<IBrokerageMessageHandler>(
handler,
py => new BrokerageMessageHandlerPythonWrapper(py)
);
SetBrokerageMessageHandler(brokerageMessageHandler);
}

Expand All @@ -1407,7 +1404,11 @@ public void SetBrokerageMessageHandler(PyObject handler)
[DocumentationAttribute(Modeling)]
public void SetRiskFreeInterestRateModel(PyObject model)
{
SetRiskFreeInterestRateModel(RiskFreeInterestRateModelPythonWrapper.FromPyObject(model));
var riskFreeInterestRateModel = PythonUtil.CreateInstanceOrWrapper<IRiskFreeInterestRateModel>(
model,
py => new RiskFreeInterestRateModelPythonWrapper(py)
);
SetRiskFreeInterestRateModel(riskFreeInterestRateModel);
}

/// <summary>
Expand Down
11 changes: 5 additions & 6 deletions Algorithm/Risk/CompositeRiskManagementModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public CompositeRiskManagementModel(params IRiskManagementModel[] riskManagement
/// Initializes a new instance of the <see cref="CompositeRiskManagementModel"/> class
/// </summary>
/// <param name="riskManagementModels">The individual risk management models defining this composite model</param>
public CompositeRiskManagementModel(IEnumerable<IRiskManagementModel>riskManagementModels)
public CompositeRiskManagementModel(IEnumerable<IRiskManagementModel> riskManagementModels)
{
foreach (var riskManagementModel in riskManagementModels)
{
Expand Down Expand Up @@ -129,11 +129,10 @@ public void AddRiskManagement(IRiskManagementModel riskManagementModel)
/// <param name="pyRiskManagementModel">The risk management model to add</param>
public void AddRiskManagement(PyObject pyRiskManagementModel)
{
IRiskManagementModel riskManagementModel;
if (!pyRiskManagementModel.TryConvert(out riskManagementModel))
{
riskManagementModel = new RiskManagementModelPythonWrapper(pyRiskManagementModel);
}
var riskManagementModel = PythonUtil.CreateInstanceOrWrapper<IRiskManagementModel>(
pyRiskManagementModel,
py => new RiskManagementModelPythonWrapper(py)
);
_riskManagementModels.Add(riskManagementModel);
}
}
Expand Down
14 changes: 5 additions & 9 deletions Common/Algorithm/Framework/Alphas/Analysis/InsightManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using Python.Runtime;
using QuantConnect.Interfaces;
using System.Collections.Generic;
using QuantConnect.Util;

namespace QuantConnect.Algorithm.Framework.Alphas.Analysis
{
Expand Down Expand Up @@ -61,15 +62,10 @@ public void SetInsightScoreFunction(IInsightScoreFunction insightScoreFunction)
/// <param name="insightScoreFunction">Model that scores insights</param>
public void SetInsightScoreFunction(PyObject insightScoreFunction)
{
IInsightScoreFunction model;
if (insightScoreFunction.TryConvert(out model))
{
SetInsightScoreFunction(model);
}
else
{
_insightScoreFunction = new InsightScoreFunctionPythonWrapper(insightScoreFunction);
}
_insightScoreFunction = PythonUtil.CreateInstanceOrWrapper<IInsightScoreFunction>(
insightScoreFunction,
py => new InsightScoreFunctionPythonWrapper(py)
);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,10 @@ public void AddSignalExportProvider(ISignalExportTarget signalExport)
/// <param name="signalExport">Signal export provider</param>
public void AddSignalExportProvider(PyObject signalExport)
{
if (!signalExport.TryConvert<ISignalExportTarget>(out var managedSignalExport))
{
managedSignalExport = new SignalExportTargetPythonWrapper(signalExport);
}
var managedSignalExport = PythonUtil.CreateInstanceOrWrapper<ISignalExportTarget>(
signalExport,
py => new SignalExportTargetPythonWrapper(py)
);
AddSignalExportProvider(managedSignalExport);
}

Expand Down Expand Up @@ -172,7 +172,7 @@ public bool SetTargetPortfolio(params PortfolioTarget[] portfolioTargets)
}

if (_signalExports.IsNullOrEmpty())
{
{
return false;
}

Expand Down
9 changes: 4 additions & 5 deletions Common/Data/SubscriptionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -216,11 +216,10 @@ public void AddConsolidator(Symbol symbol, IDataConsolidator consolidator, TickT
/// <param name="pyConsolidator">The custom python consolidator</param>
public void AddConsolidator(Symbol symbol, PyObject pyConsolidator)
{
if (!pyConsolidator.TryConvert(out IDataConsolidator consolidator))
{
consolidator = new DataConsolidatorPythonWrapper(pyConsolidator);
}

var consolidator = PythonUtil.CreateInstanceOrWrapper<IDataConsolidator>(
pyConsolidator,
py => new DataConsolidatorPythonWrapper(py)
);
AddConsolidator(symbol, consolidator);
}

Expand Down
10 changes: 5 additions & 5 deletions Common/Python/DividendYieldModelPythonWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System;
using Python.Runtime;
using QuantConnect.Data;
using QuantConnect.Util;

namespace QuantConnect.Python
{
Expand Down Expand Up @@ -62,11 +63,10 @@ public decimal GetDividendYield(DateTime date, decimal securityPrice)
/// <returns>The converted <see cref="IDividendYieldModel"/> instance</returns>
public static IDividendYieldModel FromPyObject(PyObject model)
{
if (!model.TryConvert(out IDividendYieldModel dividendYieldModel))
{
dividendYieldModel = new DividendYieldModelPythonWrapper(model);
}

var dividendYieldModel = PythonUtil.CreateInstanceOrWrapper<IDividendYieldModel>(
model,
py => new DividendYieldModelPythonWrapper(py)
);
return dividendYieldModel;
}
}
Expand Down
10 changes: 5 additions & 5 deletions Common/Python/RiskFreeInterestRateModelPythonWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System;
using Python.Runtime;
using QuantConnect.Data;
using QuantConnect.Util;

namespace QuantConnect.Python
{
Expand Down Expand Up @@ -50,11 +51,10 @@ public decimal GetInterestRate(DateTime date)
/// <returns>The converted <see cref="IRiskFreeInterestRateModel"/> instance</returns>
public static IRiskFreeInterestRateModel FromPyObject(PyObject model)
{
if (!model.TryConvert(out IRiskFreeInterestRateModel riskFreeInterestRateModel))
{
riskFreeInterestRateModel = new RiskFreeInterestRateModelPythonWrapper(model);
}

var riskFreeInterestRateModel = PythonUtil.CreateInstanceOrWrapper<IRiskFreeInterestRateModel>(
model,
py => new RiskFreeInterestRateModelPythonWrapper(py)
);
return riskFreeInterestRateModel;
}
}
Expand Down
Loading