SetHoldings is a useful function for protyping to not have to care about the particulars of orders until later, but when making a lot of trades with it one backtest gets stuck in slow motion.

My suspicion is that CalculateOrderQuantity is the culprit, because this issue is greater with FX it seems (high quantities). See implementation:

// compute the initial order quantity
var orderQuantity = (int)(targetOrderValue / unitPrice);
var iterations = 0;

do
{
// decrease the order quantity
if (iterations > 0)
{
// if fees are high relative to price, we reduce the order quantity faster
if (feeToPriceRatio > 0)
orderQuantity -= feeToPriceRatio;
else
orderQuantity--;
}

// generate the order
var order = new MarketOrder(security.Symbol, orderQuantity, UtcTime);
orderValue = order.GetValue(security);
orderFees = security.FeeModel.GetOrderFee(security, order);
feeToPriceRatio = (int)(orderFees / unitPrice);

// calculate the margin required for the order
marginRequired = security.MarginModel.GetInitialMarginRequiredForOrder(security, order);

iterations++;

} while (orderQuantity > 0 && (marginRequired > marginRemaining || orderValue + orderFees > targetOrderValue));

Has anyone else had this issue? Did anyone attempt to optimize it already?  I suppose it could also be the sheer amount of orders that is the issue, but I don't think so after trying to reduce the call frequency to SetHoldings to rather small values.

Attached example where I ripped out a bunch of stuff from a project with the issue to provide a reasonably small test case.