/// <summary>
 /// Initializes a new instance of the <see cref="PositionGroupKey"/> class
 /// </summary>
 /// <param name="buyingPowerModel">The group's buying power model</param>
 /// <param name="positions">The positions comprising the group</param>
 public PositionGroupKey(IPositionGroupBuyingPowerModel buyingPowerModel, IEnumerable <IPosition> positions)
 {
     BuyingPowerModel = buyingPowerModel;
     // these have to be sorted for determinism
     UnitQuantities = positions.Select(p => Tuple.Create(p.Symbol, p.UnitQuantity)).ToImmutableSortedSet();
     IsDefaultGroup = UnitQuantities.Count == 1 && BuyingPowerModel.GetType() == typeof(SecurityPositionGroupBuyingPowerModel);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PositionGroupKey"/> class for groups with a single security
 /// </summary>
 /// <param name="buyingPowerModel">The group's buying power model</param>
 /// <param name="security">The security</param>
 public PositionGroupKey(IPositionGroupBuyingPowerModel buyingPowerModel, Security security)
 {
     IsDefaultGroup   = buyingPowerModel.GetType() == typeof(SecurityPositionGroupBuyingPowerModel);
     BuyingPowerModel = buyingPowerModel;
     UnitQuantities   = new[]
     {
         Tuple.Create(security.Symbol, security.SymbolProperties.LotSize)
     };
 }
 /// <summary>
 /// Computes the amount of buying power reserved by the provided position group
 /// </summary>
 public static decimal GetReservedBuyingPowerForPositionGroup(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup
     )
 {
     return(model.GetReservedBuyingPowerForPositionGroup(
                new ReservedBuyingPowerForPositionGroupParameters(portfolio, positionGroup)
                ).AbsoluteUsedBuyingPower);
 }
 /// <summary>
 /// The margin that must be held in order to change positions by the changes defined by the provided position group
 /// </summary>
 public static decimal GetInitialMarginRequirement(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup
     )
 {
     return(model.GetInitialMarginRequirement(
                new PositionGroupInitialMarginParameters(portfolio, positionGroup)
                ).Value);
 }
 /// <summary>
 /// Gets the margin currently allocated to the specified position group
 /// </summary>
 public static decimal GetMaintenanceMargin(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup
     )
 {
     return(model.GetMaintenanceMargin(
                new PositionGroupMaintenanceMarginParameters(portfolio, positionGroup)
                ));
 }
 /// <summary>
 /// Computes the change in reserved buying power we expect the portfolio to experience if the specified position
 /// group is added to the algorithm's holdings
 /// </summary>
 public static decimal GetChangeInReservedBuyingPower(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup,
     Order order
     )
 {
     return(model.GetReservedBuyingPowerImpact(
                new ReservedBuyingPowerImpactParameters(portfolio, positionGroup, order)
                ).Delta);
 }
 /// <summary>
 /// Gets the total margin required to execute the specified order in units of the account currency including fees
 /// </summary>
 public static decimal GetInitialMarginRequiredForOrder(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup,
     Order order
     )
 {
     return(model.GetInitialMarginRequiredForOrder(
                new PositionGroupInitialMarginForOrderParameters(portfolio, positionGroup, order)
                ).Value);
 }
 /// <summary>
 /// Gets the buying power available for a position group trade
 /// </summary>
 public static PositionGroupBuyingPower GetPositionGroupBuyingPower(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup,
     OrderDirection direction
     )
 {
     return(model.GetPositionGroupBuyingPower(new PositionGroupBuyingPowerParameters(
                                                  portfolio, positionGroup, direction
                                                  )));
 }
 /// <summary>
 /// Check if there is sufficient buying power for the position group to execute this order.
 /// </summary>
 public static HasSufficientBuyingPowerForOrderResult HasSufficientBuyingPowerForOrder(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup,
     Order order
     )
 {
     return(model.HasSufficientBuyingPowerForOrder(new HasSufficientPositionGroupBuyingPowerForOrderParameters(
                                                       portfolio, positionGroup, order
                                                       )));
 }
 /// <summary>
 /// Get the maximum market position group order quantity to obtain a delta in the buying power used by a position group.
 /// The deltas sign defines the position side to apply it to, positive long, negative short.
 /// </summary>
 public static GetMaximumLotsResult GetMaximumLotsForDeltaBuyingPower(
     this IPositionGroupBuyingPowerModel model,
     SecurityPortfolioManager portfolio,
     IPositionGroup positionGroup,
     decimal deltaBuyingPower
     )
 {
     return(model.GetMaximumLotsForDeltaBuyingPower(new GetMaximumLotsForDeltaBuyingPowerParameters(
                                                        portfolio, positionGroup, deltaBuyingPower
                                                        )));
 }
Exemple #11
0
        /// <summary>Indicates whether the current object is equal to another object of the same type.</summary>
        /// <param name="other">An object to compare with this object.</param>
        /// <returns>true if the current object is equal to the <paramref name="other" /> parameter; otherwise, false.</returns>
        public virtual bool Equals(IPositionGroupBuyingPowerModel other)
        {
            if (ReferenceEquals(null, other))
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return(GetType() == other.GetType());
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PositionManager"/> class
        /// </summary>
        /// <param name="securities">The algorithm's security manager</param>
        public PositionManager(SecurityManager securities)
        {
            _securities   = securities;
            Groups        = PositionGroupCollection.Empty;
            _defaultModel = new SecurityPositionGroupBuyingPowerModel();
            _resolver     = new CompositePositionGroupResolver(new OptionStrategyPositionGroupResolver(securities),
                                                               new SecurityPositionGroupResolver(_defaultModel));

            // we must be notified each time our holdings change, so each time a security is added, we
            // want to bind to its SecurityHolding.QuantityChanged event so we can trigger the resolver

            securities.CollectionChanged += (sender, args) =>
            {
                var items = args.NewItems ?? new List <object>();
                if (args.OldItems != null)
                {
                    foreach (var item in args.OldItems)
                    {
                        items.Add(item);
                    }
                }

                foreach (Security security in items)
                {
                    if (args.Action == NotifyCollectionChangedAction.Add)
                    {
                        security.Holdings.QuantityChanged += HoldingsOnQuantityChanged;
                        if (security.Invested)
                        {
                            // if this security has holdings then we'll need to resolve position groups
                            _requiresGroupResolution = true;
                        }
                    }
                    else if (args.Action == NotifyCollectionChangedAction.Remove)
                    {
                        security.Holdings.QuantityChanged -= HoldingsOnQuantityChanged;
                        if (security.Invested)
                        {
                            // only trigger group resolution if we had holdings in the removed security
                            _requiresGroupResolution = true;
                        }
                    }
                }
            };
        }
        public BuyingPowerModelComparator(
            IBuyingPowerModel securityModel,
            IPositionGroupBuyingPowerModel positionGroupModel,
            SecurityPortfolioManager portfolio = null,
            ITimeKeeper timeKeeper             = null,
            IOrderProcessor orderProcessor     = null
            )
        {
            Portfolio          = portfolio;
            SecurityModel      = securityModel;
            PositionGroupModel = positionGroupModel;

            if (portfolio == null)
            {
                var securities = new SecurityManager(timeKeeper ?? new TimeKeeper(DateTime.UtcNow));
                Portfolio = new SecurityPortfolioManager(securities, new SecurityTransactionManager(null, securities));
            }
            if (orderProcessor != null)
            {
                Portfolio.Transactions.SetOrderProcessor(orderProcessor);
            }
        }
Exemple #14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PositionGroup"/> class
 /// </summary>
 /// <param name="buyingPowerModel">The buying power model to use for this group</param>
 /// <param name="positions">The positions comprising this group</param>
 public PositionGroup(IPositionGroupBuyingPowerModel buyingPowerModel, params IPosition[] positions)
     : this(new PositionGroupKey(buyingPowerModel, positions), positions.ToDictionary(p => p.Symbol))
 {
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="SecurityPositionGroupResolver"/> class
 /// </summary>
 /// <param name="buyingPowerModel">The buying power model to use for created groups</param>
 public SecurityPositionGroupResolver(IPositionGroupBuyingPowerModel buyingPowerModel)
 {
     _buyingPowerModel = buyingPowerModel;
 }