18 using System.Collections.Generic;
31 private List<ISignalExportTarget> _signalExports;
41 private bool _isLiveWarningModeLog;
50 _algorithm = algorithm;
51 _isLiveWarningModeLog =
false;
60 _signalExports ??=
new List<ISignalExportTarget>();
62 _signalExports.AddRange(signalExports);
90 var portfolio = _algorithm.Portfolio;
94 var totalPortfolioValue = portfolio.TotalPortfolioValue;
95 if (totalPortfolioValue <= 0)
97 _algorithm.Error(
"Total portfolio value was less than or equal to 0");
101 foreach (var holding
in portfolio.Values)
103 var security = _algorithm.Securities[holding.Symbol];
105 var adjustedPercent = security.BuyingPowerModel.GetMaintenanceMargin(marginParameters) / totalPortfolioValue;
108 var holdingPercent = adjustedPercent * security.BuyingPowerModel.GetLeverage(security);
112 var adjustedHoldingPercent = (holdingPercent * totalPortfolioValue) / _algorithm.Portfolio.TotalPortfolioValueLessFreeBuffer;
113 if (holding.Quantity < 0)
115 adjustedHoldingPercent *= -1;
118 targets[index] =
new PortfolioTarget(holding.Symbol, adjustedHoldingPercent);
133 if (!_algorithm.LiveMode)
135 if (!_isLiveWarningModeLog)
137 _algorithm.Debug(
"Portfolio targets are only sent in live mode");
138 _isLiveWarningModeLog =
true;
144 if (portfolioTargets ==
null || portfolioTargets.Length == 0)
146 _algorithm.Debug(
"No portfolio target given");
150 var targets =
new List<PortfolioTarget>(portfolioTargets);
154 Algorithm = _algorithm
158 foreach (var signalExport
in _signalExports)
160 result &= signalExport.Send(signalExportTargetParameters);