/// <summary>
        /// Gets the margin available for trading a specific symbol in a specific direction.
        /// </summary>
        /// <param name="symbol">The symbol to compute margin remaining for</param>
        /// <param name="direction">The order/trading direction</param>
        /// <returns>The maximum order size that is currently executable in the specified direction</returns>
        public decimal GetMarginRemaining(Symbol symbol, OrderDirection direction = OrderDirection.Buy)
        {
            var security = Securities[symbol];
            var context  = new BuyingPowerContext(this, security, direction);

            return(security.BuyingPowerModel.GetBuyingPower(context).Value);
        }
Exemple #2
0
        /// <summary>
        /// Gets the buying power available for a trade
        /// </summary>
        /// <param name="model">The <see cref="IBuyingPowerModel"/></param>
        /// <param name="portfolio">The algorithm's portfolio</param>
        /// <param name="security">The security to be traded</param>
        /// <param name="direction">The direction of the trade</param>
        /// <returns>The buying power available for the trade</returns>
        public static decimal GetBuyingPower(
            this IBuyingPowerModel model,
            SecurityPortfolioManager portfolio,
            Security security,
            OrderDirection direction
            )
        {
            var context     = new BuyingPowerContext(portfolio, security, direction);
            var buyingPower = model.GetBuyingPower(context);

            // existing implementations assume certain non-account currency units, so return raw value
            return(buyingPower.Value);
        }
Exemple #3
0
        /// <summary>
        /// Gets the buying power available for a trade
        /// </summary>
        /// <param name="context">A context object containing the algorithm's potrfolio, security, and order direction</param>
        /// <returns>The buying power available for the trade</returns>
        public override BuyingPower GetBuyingPower(BuyingPowerContext context)
        {
            var security  = context.Security;
            var portfolio = context.Portfolio;
            var direction = context.Direction;

            var baseCurrency = security as IBaseCurrencySymbol;

            if (baseCurrency == null)
            {
                return(context.ResultInAccountCurrency(0m));
            }

            var baseCurrencyPosition  = portfolio.CashBook[baseCurrency.BaseCurrencySymbol].Amount;
            var quoteCurrencyPosition = portfolio.CashBook[security.QuoteCurrency.Symbol].Amount;

            // determine the unit price in terms of the quote currency
            var unitPrice = new MarketOrder(security.Symbol, 1, DateTime.UtcNow).GetValue(security) / security.QuoteCurrency.ConversionRate;

            if (unitPrice == 0)
            {
                return(context.ResultInAccountCurrency(0m));
            }

            // NOTE: This is returning in units of the BASE currency
            if (direction == OrderDirection.Buy)
            {
                // invert units for math, 6500USD per BTC, currency pairs aren't real fractions
                // (USD)/(BTC/USD) => 10kUSD/ (6500 USD/BTC) => 10kUSD * (1BTC/6500USD) => ~ 1.5BTC
                return(context.Result(quoteCurrencyPosition / unitPrice, baseCurrency.BaseCurrencySymbol));
            }

            if (direction == OrderDirection.Sell)
            {
                return(context.Result(baseCurrencyPosition, baseCurrency.BaseCurrencySymbol));
            }

            return(context.ResultInAccountCurrency(0m));
        }
        /// <summary>
        /// Gets the buying power available for a trade
        /// </summary>
        /// <param name="context">A context object containing the algorithm's potrfolio, security, and order direction</param>
        /// <returns>The buying power available for the trade</returns>
        public virtual BuyingPower GetBuyingPower(BuyingPowerContext context)
        {
            var marginRemaining = GetMarginRemaining(context.Portfolio, context.Security, context.Direction);

            return(context.ResultInAccountCurrency(marginRemaining));
        }