Skip to content

Commit

Permalink
First approach
Browse files Browse the repository at this point in the history
  • Loading branch information
Marinovsky committed Dec 9, 2024
1 parent 22e0491 commit a5b0aae
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using QuantConnect.Interfaces;
using QuantConnect.Securities;
using System.Collections.Generic;
using System.Linq;

namespace QuantConnect.Algorithm.Framework.Portfolio.SignalExports
{
Expand Down Expand Up @@ -101,6 +102,10 @@ protected bool GetPortfolioTargets(out PortfolioTarget[] targets)
foreach (var holding in portfolio.Values)
{
var security = _algorithm.Securities[holding.Symbol];

// Skip non-tradeable securities
if (!security.IsTradable) continue;

var marginParameters = MaintenanceMarginParameters.ForQuantityAtCurrentPrice(security, holding.Quantity);
var adjustedPercent = security.BuyingPowerModel.GetMaintenanceMargin(marginParameters) / totalPortfolioValue;
// See PortfolioTarget.Percent:
Expand All @@ -119,6 +124,7 @@ protected bool GetPortfolioTargets(out PortfolioTarget[] targets)
++index;
}

targets = targets.Where(x => x != null).ToArray();
return true;
}

Expand Down
27 changes: 27 additions & 0 deletions Tests/Algorithm/Framework/Portfolio/SignalExportTargetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,27 @@ public void SignalExportManagerGetsCorrectPortfolioTargetArray(SecurityType secu
Assert.AreEqual(quantity, targetQuantity, 1);
}

[TestCaseSource(nameof(SignalExportManagerSkipsNonTradeableFuturesTestCase))]
public void SignalExportManagerSkipsNonTradeableFutures(IEnumerable<Symbol> symbols, int expectedNumberOfTargets)
{
var algorithm = new AlgorithmStub(true);
algorithm.SetFinishedWarmingUp();
algorithm.SetCash(100000);

foreach (var symbol in symbols)
{
var security = algorithm.AddSecurity(symbol);
security.SetMarketPrice(new Tick(new DateTime(2022, 01, 04), security.Symbol, 144.80m, 144.82m));
security.Holdings.SetHoldings(144.81m, 100);
}

var signalExportManagerHandler = new SignalExportManagerHandler(algorithm);
var result = signalExportManagerHandler.GetPortfolioTargets(out PortfolioTarget[] portfolioTargets);

Assert.IsTrue(result);
Assert.AreEqual(expectedNumberOfTargets, portfolioTargets.Length);
}

[Test]
public void SignalExportManagerReturnsFalseWhenNegativeTotalPortfolioValue()
{
Expand Down Expand Up @@ -410,5 +431,11 @@ public string GetMessageSent(SignalExportTargetParameters parameters)
return message;
}
}

private static object[] SignalExportManagerSkipsNonTradeableFuturesTestCase =
{
new object[] { new List<Symbol>() { Symbols.AAPL, Symbols.SPY, Symbols.SPX }, 2 },
new object[] { new List<Symbol>() { Symbols.AAPL, Symbols.SPY, Symbols.NFLX }, 3 },
};
}
}

0 comments on commit a5b0aae

Please sign in to comment.