예제 #1
0
        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));
        }
예제 #3
0
        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}");
            }
        }
예제 #4
0
 private void OnMessage(SubmitBracketOrder command)
 {
     this.orderThrottler.Endpoint.Send(command);
     this.SendReceived(command);
 }