internal static SuccessfulTradingHistoryEntry Execute(TradeRequest buyRequest, TradeRequest sellRequest, int time) { Contract.Requires<ArgumentNullException>(buyRequest != null); Contract.Requires<ArgumentNullException>(sellRequest != null); Contract.Requires<ArgumentException>(buyRequest.Type == TradeRequestType.Buy); Contract.Requires<ArgumentException>(sellRequest.Type == TradeRequestType.Sell); Contract.Requires<ArgumentException>(buyRequest.Good == sellRequest.Good); Contract.Requires<ArgumentException>(buyRequest.Price >= sellRequest.Price); var amount = Math.Min(buyRequest.Amount, sellRequest.Amount); var price = (buyRequest.Price + sellRequest.Price) / 2; var totalPrice = price * amount; buyRequest._store.Add(buyRequest.Good, amount); buyRequest._store.Money += (buyRequest.Price - price) * amount; buyRequest.Amount -= amount; buyRequest._soldAmount += amount; buyRequest._soldTotalPrice += totalPrice; sellRequest._store.Money += totalPrice; sellRequest.Amount -= amount; sellRequest._soldAmount += amount; sellRequest._soldTotalPrice += totalPrice; return new SuccessfulTradingHistoryEntry(buyRequest.Good, amount, buyRequest.Price, sellRequest.Price, time); }
public TradeRequest CreateTradeRequest(TradeRequestType type, Good good, float amount, float price) { var request = new TradeRequest(this, type, good, amount, price); if (type == TradeRequestType.Sell) { Add(good, -amount); } else { Money -= amount * price; } return request; }
public void ExecuteAndFinishTest() { var buyTraderMock = new Mock<ITrader>(); var sellTraderMock = new Mock<ITrader>(); var buyStoreMock = SetUpStoreMock(new Mock<IStore>(), buyTraderMock); var sellStoreMock = SetUpStoreMock(new Mock<IStore>(), sellTraderMock); var good = new Good("Good"); var buy = new TradeRequest(buyStoreMock.Object, TradeRequestType.Buy, good, 20f, 3f); var sell = new TradeRequest(sellStoreMock.Object, TradeRequestType.Sell, good, 10f, 1f); //execute var logEntry = TradeRequest.Execute(buy, sell, 0); // check requests Assert.IsFalse(buy.IsEmpty); Assert.IsTrue(sell.IsEmpty); Assert.AreEqual(10f, buyStoreMock.Object.Money); Assert.AreEqual(20f, sellStoreMock.Object.Money); buyStoreMock.Verify(o => o.Add(good, 10f)); // check log entry Assert.AreEqual(10f, logEntry.Amount); Assert.AreEqual(3f, logEntry.BuyPrice); Assert.AreEqual(1f, logEntry.SellPrice); Assert.AreEqual(2f, logEntry.Price); Assert.AreEqual(good, logEntry.Good); Assert.AreEqual(0, logEntry.Time); //finish var logEntry2 = buy.Finish(0); Assert.IsNull(sell.Finish(0)); // check requests Assert.IsTrue(buy.IsEmpty); Assert.AreEqual(40f, buyStoreMock.Object.Money); buyTraderMock.Verify(o => o.OnTradeRequestFinish(TradeRequestType.Buy, good, 20, 3f, 10, 20f)); sellTraderMock.Verify(o => o.OnTradeRequestFinish(TradeRequestType.Sell, good, 10, 1f, 10, 20f)); // check log entry 2 Assert.AreEqual(10f, logEntry2.Amount); Assert.AreEqual(3f, logEntry2.Price); Assert.AreEqual(TradeRequestType.Buy, logEntry2.Type); Assert.AreEqual(good, logEntry2.Good); Assert.AreEqual(0, logEntry2.Time); }
public FailedTradingHistoryEntry(TradeRequest tradeRequest, int time) : this(tradeRequest.Good, tradeRequest.Amount, tradeRequest.Type, tradeRequest.Price, time) { Contract.Requires<ArgumentNullException>(tradeRequest != null); }
public void RegisterTradeRequest(TradeRequest request) { Contract.Requires<ArgumentNullException>(request != null); throw new NotImplementedException(); }
public void RegisterTradeRequest(TradeRequest request) { _tradeRequests.Add(request); }