17 using System.Collections.Generic;
32 public partial class QCAlgorithm
34 private bool _isEmitWarmupInsightWarningSent;
35 private bool _isEmitDelistedInsightWarningSent;
41 [DocumentationAttribute(Logging)]
89 lock(_pendingUniverseAdditionsLock)
93 _pendingUniverseAdditions.Add(universe);
99 InsightsGenerated += (algorithm, data) =>
Log($
"{Time}: {string.Join(" |
", data.Insights.OrderBy(i => i.Symbol.ToString()))}");
118 var universeSymbol = ukvp.Key;
119 if (_userAddedUniverses.Contains(universeSymbol))
125 if (ukvp.Value.DisposeRequested)
138 if (!universes.TryGetValue(universeSymbol, out universe))
146 foreach (var ukvp
in universes)
163 var insightsEnumerable =
Alpha.
Update(
this, slice);
165 var insights = insightsEnumerable == Enumerable.Empty<
Insight>()
166 ?
new Insight[] { } : insightsEnumerable.ToArray();
169 if (insights.Length != 0)
171 insights = InitializeInsights(insights);
172 OnInsightsGenerated(insights);
175 ProcessInsights(insights);
186 private void ProcessInsights(
Insight[] insights)
195 foreach (var target
in targets)
198 security.Holdings.Target = target;
204 if (targets.Length > 0)
206 Log($
"{Time}: PORTFOLIO: {string.Join(" |
", targets.Select(t => t.ToString()).OrderBy(t => t))}");
212 var riskTargetOverrides = riskTargetOverridesEnumerable == Enumerable.Empty<
IPortfolioTarget>()
216 foreach (var target
in riskTargetOverrides)
219 security.Holdings.Target = target;
225 if (riskTargetOverrides.Length > 0)
227 Log($
"{Time}: RISK: {string.Join(" |
", riskTargetOverrides.Select(t => t.ToString()).OrderBy(t => t))}");
233 if (riskTargetOverrides.Length != 0
234 || targets.Length != 0)
237 riskAdjustedTargets = riskTargetOverrides.Concat(targets).DistinctBy(pt => pt.Symbol).ToArray();
247 if (riskTargetOverrides.Length > 0)
249 Log($
"{Time}: RISK ADJUSTED TARGETS: {string.Join(" |
", riskAdjustedTargets.Select(t => t.ToString()).OrderBy(t => t))}");
260 [DocumentationAttribute(AlgorithmFramework)]
261 [DocumentationAttribute(Universes)]
266 Debug($
"{Time}: {changes}");
297 if (compositeUniverseSelection !=
null)
332 if (compositeAlphaModel !=
null)
334 compositeAlphaModel.
AddAlpha(alpha);
391 if (compositeRiskModel !=
null)
417 if (!_isEmitWarmupInsightWarningSent)
419 Error(
"Warning: insights emitted during algorithm warmup are ignored.");
420 _isEmitWarmupInsightWarningSent =
true;
425 insights = InitializeInsights(insights);
426 OnInsightsGenerated(insights);
427 ProcessInsights(insights);
449 List<Insight> validInsights =
null;
450 for (var i = 0; i < insights.Length; i++)
453 if (security.IsDelisted)
455 if (!_isEmitDelistedInsightWarningSent)
457 Error($
"QCAlgorithm.EmitInsights(): Warning: cannot emit insights for delisted securities, these will be discarded");
458 _isEmitDelistedInsightWarningSent =
true;
462 if (validInsights ==
null)
464 validInsights =
new List<Insight>() {};
465 for (var j = 0; j < i; j++)
467 validInsights.Add(insights[j]);
474 insights[i] = InitializeInsightFields(insights[i], security);
477 if (validInsights !=
null)
479 validInsights.Add(insights[i]);
484 return validInsights ==
null ? insights : validInsights.ToArray();
497 switch (insight.
Type)