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); }
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); } }