/// <summary> /// Checks if <paramref name="lastOrderQuantity"/> equals <paramref name="positionGroupQuantity"/> indicating we got the same result on this iteration /// meaning we're unable to converge through iteration. This function was split out to support derived types using the same error message as well /// as removing the added noise of the check and message creation. /// </summary> protected static bool UnableToConverge(decimal lastOrderQuantity, decimal positionGroupQuantity, IPositionGroup groupUnit, SecurityPortfolioManager portfolio, decimal target, decimal orderMargin, decimal absUnitMargin, decimal orderFees, out ArgumentException error) { // determine if we're unable to converge by seeing if quantity estimate hasn't changed if (lastOrderQuantity == positionGroupQuantity) { string message; if (groupUnit.Count == 1) { // single security group var security = portfolio.Securities[groupUnit.Single().Symbol]; message = "GetMaximumPositionGroupOrderQuantityForTargetBuyingPower failed to converge to target order margin " + Invariant($"{target}. Current order margin is {orderMargin}. Order quantity {positionGroupQuantity}. ") + Invariant($"Lot size is {security.SymbolProperties.LotSize}. Order fees {orderFees}. Security symbol ") + $"{security.Symbol}. Margin unit {absUnitMargin}."; } else { message = "GetMaximumPositionGroupOrderQuantityForTargetBuyingPower failed to converge to target order margin " + Invariant($"{target}. Current order margin is {orderMargin}. Order quantity {positionGroupQuantity}. ") + Invariant($"Position Group Unit is {groupUnit.Key}. Order fees {orderFees}. Position Group Name ") + $"{groupUnit.GetUserFriendlyName()}. Margin unit {absUnitMargin}."; } error = new ArgumentException(message); return(true); } error = null; return(false); }
/// <summary> /// Gets a user friendly name for the provided <paramref name="group"/> /// </summary> public static string GetUserFriendlyName(this IPositionGroup group) { if (group.Count == 1) { return(group.Single().Symbol.ToString()); } return(string.Join("|", group.Select(p => p.Symbol.ToString()))); }