Skip to content

Commit

Permalink
Refactor: Cross Zero Order event (#8110)
Browse files Browse the repository at this point in the history
* refactor: reuse OrderEvent
test:refactor: CrossZeroOrder proccess Status update

* clean: extra paddings
  • Loading branch information
Romazes committed Jun 26, 2024
1 parent 57f8962 commit 8a34d4a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 32 deletions.
3 changes: 2 additions & 1 deletion Brokerages/Brokerage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,8 @@ protected bool TryHandleRemainingCrossZeroOrder(Order leanOrder, OrderEvent orde
{
// if we have a contingent that needs to be submitted then we can't respect the 'Filled' state from the order
// because the Lean order hasn't been technically filled yet, so mark it as 'PartiallyFilled'
OnOrderEvent(new OrderEvent(leanOrder, DateTime.UtcNow, OrderFee.Zero) { Status = OrderStatus.PartiallyFilled, FillQuantity = orderEvent.FillQuantity });
orderEvent.Status = OrderStatus.PartiallyFilled;
OnOrderEvent(orderEvent);

Task.Run(() =>
{
Expand Down
37 changes: 6 additions & 31 deletions Tests/Brokerages/OrderCrossingBrokerageTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,10 @@ public void PlaceCrossOrder(Order leanOrder, OrderStatus[] expectedOrderStatusCh

using var brokerage = InitializeBrokerage((leanOrder?.Symbol.Value, 180m, 10));

var skipFirstFilledEvent = default(bool);
brokerage.OrdersStatusChanged += (_, orderEvents) =>
{
var orderEventStatus = orderEvents[0].Status;
// Skip processing the first occurrence of the Filled event, The First Part of CrossZeroOrder was filled.
if (!skipFirstFilledEvent && orderEventStatus == OrderStatus.Filled)
{
skipFirstFilledEvent = true;
return;
}
actualCrossZeroOrderStatusOrdering.Enqueue(orderEventStatus);
Log.Trace($"{nameof(PlaceCrossOrder)}.OrdersStatusChangedEvent.Status: {orderEventStatus}");
Expand Down Expand Up @@ -146,18 +138,10 @@ public void PlaceCrossOrderAndUpdate(Order leanOrder, OrderStatus[] expectedOrde

using var brokerage = InitializeBrokerage((leanOrder?.Symbol.Value, 180m, 10));

var skipFirstFilledEvent = default(bool);
brokerage.OrdersStatusChanged += (_, orderEvents) =>
{
var orderEventStatus = orderEvents[0].Status;
// Skip processing the first occurrence of the Filled event, The First Part of CrossZeroOrder was filled.
if (!skipFirstFilledEvent && orderEventStatus == OrderStatus.Filled)
{
skipFirstFilledEvent = true;
return;
}
actualCrossZeroOrderStatusOrdering.Enqueue(orderEventStatus);
Log.Trace($"{nameof(PlaceCrossOrder)}.OrdersStatusChangedEvent.Status: {orderEventStatus}");
Expand Down Expand Up @@ -358,13 +342,6 @@ private class PhonyBrokerage : Brokerage
/// <inheritdoc cref="CancellationTokenSource"/>
private readonly CancellationTokenSource _cancellationTokenSource = new();

/// <summary>
/// Indicates whether the first occurrence of the Filled event has been skipped.
/// Used to ensure the first Filled event is processed appropriately for setting the
/// order state to PartiallyFilled.
/// </summary>
private bool _isSkipFirstFilled;

/// <summary>
/// Temporarily stores the IDs of brokerage orders for testing purposes.
/// </summary>
Expand Down Expand Up @@ -409,13 +386,7 @@ private void OrdersStatusChangedEventHandler(object _, List<OrderEvent> orderEve
leanOrder = _orderProvider.GetOrderById(orderEvent.OrderId);
}

// Process the first occurrence of the Filled event to simulate the leanOrder as PartiallyFilled.
if (!_isSkipFirstFilled && orderEvent.Status == OrderStatus.Filled)
{
_isSkipFirstFilled = true;
TryHandleRemainingCrossZeroOrder(leanOrder, orderEvent);
}
else
if (!TryHandleRemainingCrossZeroOrder(leanOrder, orderEvent))
{
_orderProvider.UpdateOrderStatusById(orderEvent.OrderId, orderEvent.Status);
}
Expand Down Expand Up @@ -592,7 +563,11 @@ private void ImitationBrokerageOrderUpdates()
{
if (order.Status == OrderStatus.Submitted || order.Status == OrderStatus.PartiallyFilled || order.Status == OrderStatus.UpdateSubmitted)
{
OnOrderEvent(new OrderEvent(order, new DateTime(2024, 6, 10), OrderFee.Zero) { Status = OrderStatus.Filled });
var orderEvent = new OrderEvent(order, new DateTime(2024, 6, 10), OrderFee.Zero) { Status = OrderStatus.Filled };
if (!TryHandleRemainingCrossZeroOrder(order, orderEvent))
{
OnOrderEvent(orderEvent);
}
}
}
}
Expand Down

0 comments on commit 8a34d4a

Please sign in to comment.