internal void CanSerializeAndDeserialize_OrderFilledEvents() { // Arrange var order = new StubOrderBuilder() .WithQuantity(Quantity.Create(100000)) .BuildStopLimitOrder(); var filled = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), order.Id, new ExecutionId("E123456"), new PositionIdBroker("P123456"), order.Symbol, order.OrderSide, order.Quantity, Price.Create(2m, 1), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act var packed = this.serializer.Serialize(filled); var unpacked = (OrderFilled)this.serializer.Deserialize(packed); // Assert Assert.Equal(filled, unpacked); this.Output.WriteLine(Convert.ToBase64String(packed)); }
private void FillOrder(Order order, DateTime time, int price, int quantity, bool isAggressor) { order.FilledQuantity += quantity; order.RemainingQuantity -= quantity; order.Status = order.RemainingQuantity == 0 ? OrderStatus.Filled : OrderStatus.PartiallyFilled; OrderFilled?.Invoke(this, new OrderFilledEventArgs(order, time, price, quantity, isAggressor)); }
private void When(OrderFilled @event) { this.executionIds.Add(@event.ExecutionId); this.PositionIdBroker = @event.PositionIdBroker; this.FilledQuantity = @event.FilledQuantity; this.AveragePrice = @event.AveragePrice; this.Slippage = this.CalculateSlippage(); this.SetIsCompleteTrue(); }
internal void ApplyEvents_OrderFilledFromShortPositionToLong_ReturnsCorrectMarketPositionAndQuantity() { // Arrange var orderFill1 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), new Symbol("AUDUSD", new Venue("FXCM")), OrderSide.Sell, Quantity.Create(1000000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var position = new Position(new PositionId("P-123456"), orderFill1); var orderFill2 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123457"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Buy, Quantity.Create(500000), Price.Create(1.00001m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var orderFill3 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123458"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Buy, Quantity.Create(1000000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act position.Apply(orderFill2); position.Apply(orderFill3); // Assert Assert.Equal(MarketPosition.Long, position.MarketPosition); Assert.Equal(Quantity.Create(500000), position.Quantity); }
private void OnMessage(OrderFilled @event) { this.EventCount++; this.Logger.LogInformation(LogId.Trading, $"{Received}{Event} {@event}."); this.ProcessOrderEvent(@event); this.HandleOrderFillEvent(@event); this.ClearModifyBuffer(@event.OrderId); this.CancelExpiryBackup(@event.OrderId); this.SendToEventPublisher(@event); }
internal void ApplyEvents_MultipleFillsInOpenDirection_ReturnsCorrectValues() { // Arrange var orderFill1 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), new Symbol("AUDUSD", new Venue("FXCM")), OrderSide.Sell, Quantity.Create(100000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var orderFill2 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-1234561"), new ExecutionId("E-1234561"), new PositionIdBroker("ET-123456"), new Symbol("AUDUSD", new Venue("FXCM")), OrderSide.Sell, Quantity.Create(100000), Price.Create(1.00001m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var position = new Position(new PositionId("P-123456"), orderFill1); var tick = StubQuoteTickProvider.Create(new Symbol("AUDUSD", new Venue("FXCM"))); // Act position.Apply(orderFill2); // Assert Assert.Equal(1.000005m, position.AverageOpenPrice); Assert.Equal(MarketPosition.Short, position.MarketPosition); Assert.Equal(Quantity.Create(200000), position.Quantity); Assert.Equal(decimal.Zero, position.RealizedPoints); Assert.Equal(0, position.RealizedReturn); Assert.Equal(Money.Zero(position.BaseCurrency), position.RealizedPnl); Assert.Equal(0.199945m, position.UnrealizedPoints(tick)); Assert.Equal(0.19994400027999865, position.UnrealizedReturn(tick)); Assert.Equal(Money.Create(39989m, position.BaseCurrency), position.UnrealizedPnl(tick)); Assert.Equal(0.199945m, position.TotalPoints(tick)); Assert.Equal(0.19994400027999865, position.TotalReturn(tick)); Assert.Equal(Money.Create(39989m, position.BaseCurrency), position.TotalPnl(tick)); }
internal void Position_OrderFilledSellCase_ReturnsCorrectValues() { // Arrange var orderFill = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), new Symbol("AUD/USD", new Venue("FXCM")), OrderSide.Sell, Quantity.Create(1000), Price.Create(2000m, 2), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act var position = new Position(new PositionId("P-123456"), orderFill); // Assert Assert.Equal(new Symbol("AUD/USD", new Venue("FXCM")), position.Symbol); Assert.Equal(new OrderId("O-123456"), position.FromOrderId); Assert.Equal(new OrderId("O-123456"), position.LastOrderId); Assert.Equal(new ExecutionId("E-123456"), position.LastExecutionId); Assert.Equal(new PositionIdBroker("ET-123456"), position.IdBroker); Assert.Equal(new OrderId("O-123456"), position.GetOrderIds()[0]); Assert.Equal(new ExecutionId("E-123456"), position.GetExecutionIds()[0]); Assert.Equal(2000, position.AverageOpenPrice); Assert.Null(position.AverageClosePrice); Assert.Null(position.ClosedTime); Assert.Null(position.OpenDuration); Assert.Equal(OrderSide.Sell, position.EntryDirection); Assert.Equal(Quantity.Create(1000), position.Quantity); Assert.Equal(Quantity.Create(1000), position.PeakQuantity); Assert.Equal(MarketPosition.Short, position.MarketPosition); Assert.Equal(StubZonedDateTime.UnixEpoch(), position.OpenedTime); Assert.Equal(1, position.EventCount); Assert.Equal(orderFill, position.LastEvent); Assert.Equal(0m, position.RealizedPoints); Assert.Equal(0, position.RealizedReturn); Assert.Equal(Money.Zero(position.BaseCurrency), position.RealizedPnl); Assert.True(position.IsOpen); Assert.True(position.IsShort); Assert.False(position.IsClosed); Assert.False(position.IsLong); Assert.Equal(StubZonedDateTime.UnixEpoch(), position.LastUpdated); Assert.Equal(orderFill, position.LastEvent); Assert.Equal(orderFill, position.InitialEvent); }
internal void ApplyEvents_OrderFilledFromAlreadyShort_ReturnsCorrectMarketPositionAndQuantity() { // Arrange var orderFill11 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), new Symbol("AUD/USD", new Venue("FXCM")), OrderSide.Sell, Quantity.Create(5000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var position = new Position(new PositionId("P-123456"), orderFill11); var orderFill2 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Buy, Quantity.Create(5000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch() + Duration.FromMinutes(1), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act position.Apply(orderFill2); // Assert Assert.Equal(MarketPosition.Flat, position.MarketPosition); Assert.Equal(Duration.FromMinutes(1), position.OpenDuration); Assert.Equal(Quantity.Create(0), position.Quantity); Assert.Equal(orderFill2, position.LastEvent); Assert.True(position.IsClosed); Assert.False(position.IsOpen); Assert.False(position.IsShort); Assert.False(position.IsLong); }
internal void ApplyEvents_OrderFilledFromLongPositionToFlat_ReturnsCorrectMarketPositionAndQuantity() { // Arrange var orderFill1 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), new Symbol("AUDUSD", new Venue("FXCM")), OrderSide.Buy, Quantity.Create(100000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var position = new Position(new PositionId("P-123456"), orderFill1); var orderFill2 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123456"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Buy, Quantity.Create(200000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var orderFill3 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123457"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Sell, Quantity.Create(50000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); var orderFill4 = new OrderFilled( AccountId.FromString("FXCM-02851908-DEMO"), new OrderId("O-123458"), new ExecutionId("E-123456"), new PositionIdBroker("ET-123456"), position.Symbol, OrderSide.Sell, Quantity.Create(250000), Price.Create(1.00000m, 5), Currency.USD, StubZonedDateTime.UnixEpoch(), Guid.NewGuid(), StubZonedDateTime.UnixEpoch()); // Act position.Apply(orderFill2); position.Apply(orderFill3); position.Apply(orderFill4); // Assert Assert.Equal(MarketPosition.Short, position.MarketPosition); Assert.Equal(Quantity.Create(100000), position.Quantity); Assert.Null(position.ClosedTime); Assert.Equal(1.00000m, position.AverageClosePrice); Assert.Equal(orderFill4, position.LastEvent); Assert.True(position.IsShort); Assert.True(position.IsOpen); Assert.False(position.IsClosed); Assert.False(position.IsLong); }
private void OnMessage(OrderFilled @event) { this.ReceivedObjects.Add(@event); }
private void OnMessage(OrderFilled @event) { this.SendToBus(@event); }