/// <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);
        }
Ejemplo n.º 2
0
 /// <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);
        }
Ejemplo n.º 5
0
 /// <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));
 }