internal void UpdateOrder_WhenOrderCompleted_CorrectlyUpdatesIndexes() { // Arrange var order = new StubOrderBuilder().EntryOrder("O-123456").BuildMarketOrder(); var traderId = TraderId.FromString("TESTER-000"); var accountId = AccountId.FromString("NAUTILUS-000-SIMULATED"); var positionId = new PositionId("P-123456"); var strategyId = new StrategyId("SCALPER", "001"); this.database.AddOrder(order, traderId, accountId, strategyId, positionId); order.Apply(StubEventMessageProvider.OrderSubmittedEvent(order)); this.database.UpdateOrder(order); order.Apply(StubEventMessageProvider.OrderRejectedEvent(order)); // Act this.database.UpdateOrder(order); // Assert Assert.Contains(order.Id, this.database.GetOrderIds()); Assert.Contains(order.Id, this.database.GetOrderIds(traderId)); Assert.Contains(order.Id, this.database.GetOrderIds(traderId, strategyId)); Assert.Contains(order.Id, this.database.GetOrderCompletedIds()); Assert.Contains(order.Id, this.database.GetOrderCompletedIds(traderId)); Assert.Contains(order.Id, this.database.GetOrderCompletedIds(traderId, strategyId)); Assert.DoesNotContain(order.Id, this.database.GetOrderWorkingIds()); Assert.Contains(order.Id, this.database.GetOrders(traderId)); Assert.Contains(order.Id, this.database.GetOrders(traderId, strategyId)); Assert.Contains(order.Id, this.database.GetOrdersCompleted(traderId)); Assert.Contains(order.Id, this.database.GetOrdersCompleted(traderId, strategyId)); }
internal void IsComplete_OrderPartiallyFilled_ReturnsFalse() { // Arrange var order = new StubOrderBuilder() .WithQuantity(Quantity.Create(100000)) .BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order, order.Price); var event4 = StubEventMessageProvider.OrderPartiallyFilledEvent( order, Quantity.Create(50000), Quantity.Create(50000), order.Price); order.Apply(event1); order.Apply(event2); order.Apply(event3); order.Apply(event4); // Act var result = order.IsCompleted; // Assert Assert.True(order.State == OrderState.PartiallyFilled); Assert.False(result); }
internal void GetOrdersCompleted_WhenDoesNotExistInCache_ReturnsEmptyDictionary() { // Arrange var order = new StubOrderBuilder().EntryOrder("O-123456").BuildMarketOrder(); var traderId = TraderId.FromString("TESTER-000"); var accountId = AccountId.FromString("NAUTILUS-000-SIMULATED"); var positionId = new PositionId("P-123456"); var strategyId = new StrategyId("SCALPER", "001"); this.database.AddOrder(order, traderId, accountId, strategyId, positionId); order.Apply(StubEventMessageProvider.OrderSubmittedEvent(order)); this.database.UpdateOrder(order); order.Apply(StubEventMessageProvider.OrderRejectedEvent(order)); this.database.UpdateOrder(order); // Act this.database.ClearCaches(); // Assert Assert.Empty(this.database.GetOrders()); Assert.Empty(this.database.GetOrders(traderId)); Assert.Empty(this.database.GetOrders(traderId, strategyId)); Assert.Empty(this.database.GetOrdersWorking()); Assert.Empty(this.database.GetOrdersWorking(traderId)); Assert.Empty(this.database.GetOrdersWorking(traderId, strategyId)); Assert.Empty(this.database.GetOrdersCompleted()); Assert.Empty(this.database.GetOrdersCompleted(traderId)); Assert.Empty(this.database.GetOrdersCompleted(traderId, strategyId)); }
internal void GetSlippage_SellOrderFilledVariousAveragePrices_ReturnsExpectedResult(decimal averagePrice, decimal expectedSlippage) { // Arrange var order = new StubOrderBuilder() .WithOrderSide(OrderSide.Sell) .WithPrice(Price.Create(1.20000m, 5)) .BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order, order.Price); var event4 = StubEventMessageProvider.OrderFilledEvent(order, Price.Create(averagePrice, 5)); order.Apply(event1); order.Apply(event2); order.Apply(event3); order.Apply(event4); // Act var result = order.Slippage; // Assert Assert.Equal(OrderState.Filled, order.State); Assert.Equal(expectedSlippage, result); }
internal void Apply_OrderPartiallyFilled_ReturnsCorrectOrderStatus() { // Arrange var order = new StubOrderBuilder().BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order, order.Price); var event4 = StubEventMessageProvider.OrderPartiallyFilledEvent( order, order.Quantity, Quantity.Create(order.Quantity / 2), order.Price); // Act order.Apply(event1); order.Apply(event2); order.Apply(event3); order.Apply(event4); var result = order.State; // Assert Assert.Equal(OrderState.PartiallyFilled, result); }
internal void Rejected_ParametersValid_ReturnsExpectedResult() { // Arrange var order = new StubOrderBuilder().BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderRejectedEvent(order); // Act order.Apply(event1); order.Apply(event2); // Assert Assert.Equal(3, order.EventCount); Assert.Equal(OrderState.Rejected, order.State); Assert.Equal(StubZonedDateTime.UnixEpoch(), order.LastEvent.Timestamp); }
internal void IsComplete_OrderWorking_ReturnsFalse() { // Arrange var order = new StubOrderBuilder().BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order); // Act order.Apply(event1); order.Apply(event2); order.Apply(event3); var result = order.IsCompleted; // Assert Assert.False(result); }
internal void Apply_OrderFilled_ReturnsCorrectOrderStatus() { // Arrange var order = new StubOrderBuilder().BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order, order.Price); var event4 = StubEventMessageProvider.OrderFilledEvent(order, order.Price); // Act order.Apply(event1); order.Apply(event2); order.Apply(event3); order.Apply(event4); // Assert Assert.Equal(OrderState.Filled, order.State); }
internal void Working_ParametersValid_ReturnsExpectedResult() { // Arrange var order = new StubOrderBuilder().BuildStopMarketOrder(); var event1 = StubEventMessageProvider.OrderSubmittedEvent(order); var event2 = StubEventMessageProvider.OrderAcceptedEvent(order); var event3 = StubEventMessageProvider.OrderWorkingEvent(order, order.Price); // Act order.Apply(event1); order.Apply(event2); order.Apply(event3); // Assert Assert.Equal("BO-123456", order.IdBroker?.Value); Assert.Equal(4, order.EventCount); Assert.Equal(OrderState.Working, order.State); Assert.Equal(StubZonedDateTime.UnixEpoch(), order.LastEvent.Timestamp); }
internal void LoadOrdersCache_WhenOrdersInDatabase_CorrectlyCachesOrders() { // Arrange var order1 = new StubOrderBuilder().EntryOrder("O-123456-1").BuildStopMarketOrder(); var order2 = new StubOrderBuilder().EntryOrder("O-123456-2").BuildStopMarketOrder(); var traderId = TraderId.FromString("TESTER-000"); var accountId = AccountId.FromString("NAUTILUS-000-SIMULATED"); var positionId = new PositionId("P-123456"); var strategyId = new StrategyId("SCALPER", "001"); this.database.AddOrder(order1, traderId, accountId, strategyId, positionId); this.database.AddOrder(order2, traderId, accountId, strategyId, positionId); order2.Apply(StubEventMessageProvider.OrderSubmittedEvent(order2)); this.database.UpdateOrder(order2); order2.Apply(StubEventMessageProvider.OrderAcceptedEvent(order2)); this.database.UpdateOrder(order2); order2.Apply(StubEventMessageProvider.OrderWorkingEvent(order2)); this.database.UpdateOrder(order2); order2.Apply(StubEventMessageProvider.OrderCancelledEvent(order2)); this.database.UpdateOrder(order2); this.database.ClearCaches(); // Act this.database.LoadOrdersCache(); // Assert Assert.Equal(order1, this.database.GetOrders()[order1.Id]); Assert.Equal(order2, this.database.GetOrders()[order2.Id]); Assert.Equal(1, this.database.GetOrders()[order1.Id].EventCount); Assert.Equal(5, this.database.GetOrders()[order2.Id].EventCount); Assert.Equal(OrderState.Initialized, this.database.GetOrders()[order1.Id].State); Assert.Equal(OrderState.Cancelled, this.database.GetOrders()[order2.Id].State); }