Example #1
0
        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));
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
        }