public async Task HandleBuy_NeedsToBuy_BuysCorrectAmount(int shares, double price, int shareBought)
        {
            var strategysStock = new StrategysStock
            {
                StockSymbol      = _stockSymbol,
                TradingFrequency = _tradingFrequency,
                Strategy         = _strategyName
            };

            _mockAlpacaClient
            .Setup(x => x.GetTotalEquity())
            .ReturnsAsync(_totalEquity);
            _mockTrackingRepository
            .Setup(x => x.GetOrCreateEmptyPosition(strategysStock))
            .ReturnsAsync(new Position
            {
                NumberOfShares = shares,
                StockSymbol    = _stockSymbol
            });

            await _strategyHandler.HandleBuy((decimal)price, strategysStock);

            _mockAlpacaClient.Verify(x => x.PlaceOrder(It.Is <Order>(x => x.SharesBought == shareBought), null), Times.Once);
            _mockTrackingRepository.Verify(x => x.AddPendingOrder(It.IsAny <StrategysStock>(), It.Is <Order>(x => x.SharesBought == shareBought)), Times.Once);
        }
        public async Task HandleSell_NoNeedToBuy_DoesNotSell()
        {
            var shares = 0;
            var price  = 456m;

            var strategysStock = new StrategysStock
            {
                StockSymbol      = _stockSymbol,
                TradingFrequency = _tradingFrequency,
                Strategy         = _strategyName
            };

            _mockAlpacaClient
            .Setup(x => x.GetTotalEquity())
            .ReturnsAsync(_totalEquity);
            _mockTrackingRepository
            .Setup(x => x.GetOrCreateEmptyPosition(strategysStock))
            .ReturnsAsync(new Position
            {
                NumberOfShares = shares,
                StockSymbol    = _stockSymbol
            });

            await _strategyHandler.HandleSell(price, strategysStock);

            _mockAlpacaClient.Verify(x => x.PlaceOrder(It.IsAny <Order>(), null), Times.Never);
            _mockTrackingRepository.Verify(x => x.AddPendingOrder(It.IsAny <StrategysStock>(), It.IsAny <Order>()), Times.Never);
        }
示例#3
0
        private async Task ReconcileStock(long sharesPerPosition, StrategysStock strategy)
        {
            _logger.LogDebug($"Assigning {sharesPerPosition} shares of {strategy.StockSymbol} to {strategy.Strategy}");

            var postition = await _trackingRepository.GetOrCreateEmptyPosition(strategy);

            await _trackingRepository.AddOrder(strategy, new Order
            {
                MarketPrice     = 0, //This is zero because this strategy did not buy or sell this stock so it should not count for or against it.
                OrderPlacedTime = DateTime.UtcNow,
                SharesBought    = sharesPerPosition - postition.NumberOfShares,
            });
        }
        internal async Task HandleSell(decimal marketPrice, StrategysStock stockStrategy)
        {
            var currentPosition = await _trackingRepository.GetOrCreateEmptyPosition(stockStrategy);

            if (currentPosition.NumberOfShares > 0)
            {
                var order = new Order
                {
                    StockSymbol     = stockStrategy.StockSymbol,
                    SharesBought    = currentPosition.NumberOfShares * (-1),
                    MarketPrice     = marketPrice,
                    OrderPlacedTime = DateTime.UtcNow
                };

                await _trackingRepository.AddPendingOrder(stockStrategy, order);

                await _alpacaClient.PlaceOrder(order);
            }
        }
        internal async Task HandleBuy(decimal marketPrice, StrategysStock stockStrategy)
        {
            var equityTask      = _alpacaClient.GetTotalEquity();
            var currentPosition = await _trackingRepository.GetOrCreateEmptyPosition(stockStrategy);

            var sharesNeeded = CalculateNumberOfSharesNeeded(currentPosition.NumberOfShares, marketPrice, await equityTask);

            if (sharesNeeded > 0)
            {
                var order = new Order
                {
                    StockSymbol     = stockStrategy.StockSymbol,
                    SharesBought    = sharesNeeded,
                    MarketPrice     = marketPrice,
                    OrderPlacedTime = DateTime.UtcNow
                };

                await _trackingRepository.AddPendingOrder(stockStrategy, order);

                await _alpacaClient.PlaceOrder(order);
            }
        }