Skip to content

Commit e6cb96f

Browse files
committed
revert to inital cython implementation
1 parent 3b3c551 commit e6cb96f

File tree

4 files changed

+22
-17
lines changed

4 files changed

+22
-17
lines changed

crates/execution/src/matching_engine/engine.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,10 @@ impl OrderMatchingEngine {
860860

861861
// Immediately fill marketable order
862862
self.fill_market_order(order);
863+
864+
if order.is_open() {
865+
self.accept_order(order);
866+
}
863867
}
864868

865869
fn process_stop_market_order(&mut self, order: &mut OrderAny) {
@@ -1376,9 +1380,6 @@ impl OrderMatchingEngine {
13761380
if order.filled_qty() == Quantity::zero(order.filled_qty().precision)
13771381
&& order.order_type() == OrderType::MarketToLimit
13781382
{
1379-
// Matching engine should the first accept order then update limit price
1380-
self.accept_order(order);
1381-
13821383
self.generate_order_updated(order, order.quantity(), Some(fill_px), None);
13831384
initial_market_to_limit_fill = true;
13841385
}

crates/execution/src/matching_engine/tests.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2532,26 +2532,26 @@ fn test_process_market_to_limit_orders_not_fully_filled(
25322532
engine_l2.process_order(&mut market_to_limit_order, account_id);
25332533

25342534
// Check sequence of events for MARKET-TO-LIMIT order being not fully filled
2535-
// 1. OrderAccepted - order fill be transformed to limit so we must receive accepted event
2536-
// 2. OrderUpdated - order was updated to new limix price where market order stopped filling
2537-
// 3. OrderFilled - after inclusion in book we emit order filled event for market order at start
2535+
// 1. OrderUpdated - order was updated to new limix price where market order stopped filling
2536+
// 2. OrderFilled - market order which was filled emits filled event
2537+
// 3. OrderAccepted - remaining quantity of market order is accepted as limit order
25382538
let saved_messages = get_order_event_handler_messages(order_event_handler);
25392539
assert_eq!(saved_messages.len(), 3);
25402540
let order_event_first = saved_messages.first().unwrap();
2541-
let order_accepted = match order_event_first {
2542-
OrderEventAny::Accepted(order_accepted) => order_accepted,
2543-
_ => panic!("Expected OrderAccepted event in first message"),
2541+
let order_updated = match order_event_first {
2542+
OrderEventAny::Updated(order) => order,
2543+
_ => panic!("Expected OrderUpdated event in first message"),
25442544
};
2545-
assert_eq!(order_accepted.client_order_id, client_order_id);
2545+
assert_eq!(order_updated.client_order_id, client_order_id);
25462546
let order_event_second = saved_messages.get(1).unwrap();
2547-
let order_updated = match order_event_second {
2548-
OrderEventAny::Updated(order_updated) => order_updated,
2549-
_ => panic!("Expected OrderUpdated event in second message"),
2547+
let order_filled = match order_event_second {
2548+
OrderEventAny::Filled(order) => order,
2549+
_ => panic!("Expected OrderFilled event in second message"),
25502550
};
2551-
assert_eq!(order_updated.client_order_id, client_order_id);
2551+
assert_eq!(order_filled.client_order_id, client_order_id);
25522552
let order_event_third = saved_messages.get(2).unwrap();
2553-
let order_filled = match order_event_third {
2554-
OrderEventAny::Filled(order_filled) => order_filled,
2553+
let order_accepted = match order_event_third {
2554+
OrderEventAny::Accepted(order) => order,
25552555
_ => panic!("Expected OrderFilled event in third message"),
25562556
};
25572557
assert_eq!(order_filled.client_order_id, client_order_id);

crates/model/src/orders/base.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ impl OrderStatus {
113113
(Self::Submitted, OrderEventAny::Canceled(_)) => Self::Canceled, // FOK and IOC cases
114114
(Self::Submitted, OrderEventAny::Accepted(_)) => Self::Accepted,
115115
(Self::Submitted, OrderEventAny::Filled(_)) => Self::Filled,
116+
(Self::Submitted, OrderEventAny::Updated(_)) => Self::Submitted,
116117
(Self::Accepted, OrderEventAny::Rejected(_)) => Self::Rejected, // StopLimit order
117118
(Self::Accepted, OrderEventAny::PendingUpdate(_)) => Self::PendingUpdate,
118119
(Self::Accepted, OrderEventAny::PendingCancel(_)) => Self::PendingCancel,
@@ -147,6 +148,7 @@ impl OrderStatus {
147148
(Self::PartiallyFilled, OrderEventAny::Canceled(_)) => Self::Canceled,
148149
(Self::PartiallyFilled, OrderEventAny::Expired(_)) => Self::Expired,
149150
(Self::PartiallyFilled, OrderEventAny::Filled(_)) => Self::Filled,
151+
(Self::PartiallyFilled, OrderEventAny::Accepted(_)) => Self::Accepted,
150152
_ => return Err(OrderError::InvalidStateTransition),
151153
};
152154
Ok(new_state)

nautilus_trader/backtest/matching_engine.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,9 @@ cdef class OrderMatchingEngine:
10131013
# Immediately fill marketable order
10141014
self.fill_market_order(order)
10151015

1016+
if order.is_open_c():
1017+
self.accept_order(order)
1018+
10161019
cdef void _process_limit_order(self, LimitOrder order):
10171020
# Check AT_THE_OPEN/AT_THE_CLOSE time in force
10181021
if order.time_in_force == TimeInForce.AT_THE_OPEN or order.time_in_force == TimeInForce.AT_THE_CLOSE:
@@ -1829,7 +1832,6 @@ cdef class OrderMatchingEngine:
18291832

18301833
if order.filled_qty._mem.raw == 0:
18311834
if order.order_type == OrderType.MARKET_TO_LIMIT:
1832-
self.accept_order(order)
18331835
self._generate_order_updated(
18341836
order,
18351837
qty=order.quantity,

0 commit comments

Comments
 (0)