internal void OnSubmitBracketOrderCommand_WhenDuplicatedCommand_OperatesDatabaseAndSendsToGateway() { // Arrange var bracketOrder = StubBracketOrderProvider.Create(); 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"); var command = new SubmitBracketOrder( traderId, accountId, strategyId, positionId, bracketOrder, Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act this.engine.Endpoint.SendAsync(command).Wait(); this.engine.Endpoint.SendAsync(command).Wait(); Task.Delay(100).Wait(); // Buffer to avoid intermittent tests // Assert Assert.Null(this.engine.UnhandledMessages.FirstOrDefault()); Assert.Equal(3, this.engine.ProcessedCount); Assert.Equal(2, this.engine.CommandCount); Assert.Single(this.tradingGateway.CalledMethods); Assert.Single(this.tradingGateway.ReceivedObjects); Assert.Equal("SubmitOrder", this.tradingGateway.CalledMethods[0]); Assert.Equal(bracketOrder, this.tradingGateway.ReceivedObjects[0]); }
internal void CanSerializeAndDeserialize_SubmitBracketOrderCommands_WithNoTakeProfit() { // Arrange var entry = new StubOrderBuilder().BuildMarketOrder(); var stopLoss = new StubOrderBuilder().BuildStopMarketOrder(); var bracketOrder = new BracketOrder(entry, stopLoss); var command = new SubmitBracketOrder( new TraderId("TESTER", "000"), new AccountId("FXCM", "028999999", "SIMULATED"), new StrategyId("EMACross", "001"), new PositionId("P-123456"), bracketOrder, Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act var packed = this.serializer.Serialize(command); var unpacked = (SubmitBracketOrder)this.serializer.Deserialize(packed); // Assert Assert.Equal(command, unpacked); Assert.Equal(bracketOrder, unpacked.BracketOrder); this.Output.WriteLine(Convert.ToBase64String(packed)); this.Output.WriteLine(Encoding.UTF8.GetString(packed)); }
private void OnMessage(SubmitBracketOrder command) { this.CommandCount++; this.Logger.LogInformation(LogId.Trading, $"{Received}{Command} {command}."); var result = this.database.AddBracketOrder( command.BracketOrder, command.TraderId, command.AccountId, command.StrategyId, command.PositionId); if (result.IsSuccess) { this.gateway.SubmitOrder(command.BracketOrder); var submitted1 = new OrderSubmitted( command.AccountId, command.BracketOrder.Entry.Id, this.TimeNow(), this.NewGuid(), this.TimeNow()); var submitted2 = new OrderSubmitted( command.AccountId, command.BracketOrder.StopLoss.Id, this.TimeNow(), this.NewGuid(), this.TimeNow()); command.BracketOrder.Entry.Apply(submitted1); command.BracketOrder.StopLoss.Apply(submitted2); this.database.UpdateOrder(command.BracketOrder.Entry); this.database.UpdateOrder(command.BracketOrder.StopLoss); this.SendToEventPublisher(submitted1); this.SendToEventPublisher(submitted2); if (command.BracketOrder.TakeProfit != null) { var submitted3 = new OrderSubmitted( command.AccountId, command.BracketOrder.TakeProfit.Id, this.TimeNow(), this.NewGuid(), this.TimeNow()); command.BracketOrder.TakeProfit.Apply(submitted3); this.database.UpdateOrder(command.BracketOrder.TakeProfit); this.SendToEventPublisher(submitted3); } } else { this.Logger.LogError(LogId.Database, $"Cannot execute command {command} {result.Message}"); } }
private void OnMessage(SubmitBracketOrder command) { this.orderThrottler.Endpoint.Send(command); this.SendReceived(command); }