/// <summary> /// Resolves the position groups that exist within the specified collection of positions. /// </summary> /// <param name="positions">The collection of positions</param> /// <returns>An enumerable of position groups</returns> public PositionGroupCollection Resolve(PositionCollection positions) { var result = new PositionGroupCollection(positions .Select(position => new PositionGroup(_buyingPowerModel, position)).ToList() ); positions.Clear(); return(result); }
/// <summary> /// Resolves the algorithm's position groups from all of its holdings /// </summary> private void ResolvePositionGroups() { if (_requiresGroupResolution) { _requiresGroupResolution = false; // TODO : Replace w/ special IPosition impl to always equal security.Quantity and we'll // use them explicitly for resolution collection so we don't do this each time var investedPositions = _securities.Where(kvp => kvp.Value.Invested).Select(kvp => (IPosition) new Position(kvp.Value)); var positionsCollection = new PositionCollection(investedPositions); Groups = ResolvePositionGroups(positionsCollection); } }
/// <summary> /// Resolves the position groups that exist within the specified collection of positions. /// </summary> /// <param name="positions">The collection of positions</param> /// <returns>An enumerable of position groups</returns> public PositionGroupCollection Resolve(PositionCollection positions) { var result = PositionGroupCollection.Empty; var groups = GetPositionGroups(positions).ToList(); if (groups.Count != 0) { result = new PositionGroupCollection(groups); // we are expected to remove any positions which we resolved into a position group positions.Remove(result); } return(result); }
/// <summary> /// Resolves the optimal set of <see cref="IPositionGroup"/> from the provided <paramref name="positions"/>. /// Implementations are required to deduct grouped positions from the <paramref name="positions"/> collection. /// </summary> public PositionGroupCollection Resolve(PositionCollection positions) { // we start with no groups, each resolver's result will get merged in var groups = PositionGroupCollection.Empty; // each call to ResolvePositionGroups is expected to deduct grouped positions from the PositionCollection foreach (var resolver in _resolvers) { var resolved = resolver.Resolve(positions); groups = groups.CombineWith(resolved); } if (positions.Count > 0) { throw new InvalidOperationException("All positions must be resolved into groups."); } return(groups); }
/// <summary> /// Resolves position groups using the specified collection of positions /// </summary> /// <param name="positions">The positions to be grouped</param> /// <returns>A collection of position groups containing all of the provided positions</returns> public PositionGroupCollection ResolvePositionGroups(PositionCollection positions) { return(_resolver.Resolve(positions)); }