Skip to content

Commit cf730bd

Browse files
committed
Reordered OrderBook data flags and sequence params
1 parent 5eab3c6 commit cf730bd

File tree

14 files changed

+108
-50
lines changed

14 files changed

+108
-50
lines changed

RELEASES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Released on TBD (UTC).
1717
- Ported Bias indicator to Rust, thanks @Pushkarm029
1818

1919
### Breaking Changes
20+
- Reordered `OrderBookDelta` params `flags` and `sequence` and removed default 0 values (more explicit and less chance of mismatches)
21+
- Reordered `OrderBook` params `flags` and `sequence` and removed default 0 values (more explicit and less chance of mismatches)
2022
- Added `flags` parameter to `OrderBook.add`
2123
- Added `flags` parameter to `OrderBook.update`
2224
- Added `flags` parameter to `OrderBook.delete`

nautilus_core/model/src/python/orderbook/book.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl OrderBook {
5757
#[getter]
5858
#[pyo3(name = "book_type")]
5959
fn py_book_type(&self) -> BookType {
60-
BookType::L3_MBO
60+
self.book_type
6161
}
6262

6363
#[getter]
@@ -95,39 +95,39 @@ impl OrderBook {
9595
self.reset();
9696
}
9797

98-
#[pyo3(signature = (order, ts_event, flags=0, sequence=0))]
98+
#[pyo3(signature = (order, flags, sequence, ts_event))]
9999
#[pyo3(name = "add")]
100-
fn py_add(&mut self, order: BookOrder, ts_event: u64, flags: u8, sequence: u64) {
100+
fn py_add(&mut self, order: BookOrder, flags: u8, sequence: u64, ts_event: u64) {
101101
self.add(order, flags, sequence, ts_event.into());
102102
}
103103

104-
#[pyo3(signature = (order, ts_event, flags=0, sequence=0))]
104+
#[pyo3(signature = (order, flags, sequence, ts_event))]
105105
#[pyo3(name = "update")]
106-
fn py_update(&mut self, order: BookOrder, ts_event: u64, flags: u8, sequence: u64) {
106+
fn py_update(&mut self, order: BookOrder, flags: u8, sequence: u64, ts_event: u64) {
107107
self.update(order, flags, sequence, ts_event.into());
108108
}
109109

110-
#[pyo3(signature = (order, ts_event, flags=0, sequence=0))]
110+
#[pyo3(signature = (order, flags, sequence, ts_event))]
111111
#[pyo3(name = "delete")]
112-
fn py_delete(&mut self, order: BookOrder, ts_event: u64, flags: u8, sequence: u64) {
112+
fn py_delete(&mut self, order: BookOrder, flags: u8, sequence: u64, ts_event: u64) {
113113
self.delete(order, flags, sequence, ts_event.into());
114114
}
115115

116-
#[pyo3(signature = (ts_event, sequence=0))]
116+
#[pyo3(signature = (sequence, ts_event))]
117117
#[pyo3(name = "clear")]
118-
fn py_clear(&mut self, ts_event: u64, sequence: u64) {
118+
fn py_clear(&mut self, sequence: u64, ts_event: u64) {
119119
self.clear(sequence, ts_event.into());
120120
}
121121

122-
#[pyo3(signature = (ts_event, sequence=0))]
122+
#[pyo3(signature = (sequence, ts_event))]
123123
#[pyo3(name = "clear_bids")]
124-
fn py_clear_bids(&mut self, ts_event: u64, sequence: u64) {
124+
fn py_clear_bids(&mut self, sequence: u64, ts_event: u64) {
125125
self.clear_bids(sequence, ts_event.into());
126126
}
127127

128-
#[pyo3(signature = (ts_event, sequence=0))]
128+
#[pyo3(signature = (sequence, ts_event))]
129129
#[pyo3(name = "clear_asks")]
130-
fn py_clear_asks(&mut self, ts_event: u64, sequence: u64) {
130+
fn py_clear_asks(&mut self, sequence: u64, ts_event: u64) {
131131
self.clear_asks(sequence, ts_event.into());
132132
}
133133

nautilus_trader/adapters/betfair/data_types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ def from_batch(batch: pa.RecordBatch) -> list[BSPOrderBookDelta]:
7272
instrument_id=instrument_id,
7373
action=action,
7474
order=book_order,
75+
flags=0,
76+
sequence=0,
7577
ts_event=batch["ts_event"].to_pylist()[idx],
7678
ts_init=batch["ts_init"].to_pylist()[idx],
7779
)

nautilus_trader/adapters/betfair/parsing/streaming.py

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,10 @@ def runner_change_to_order_book_snapshot(
336336
instrument_id,
337337
BookAction.CLEAR,
338338
NULL_ORDER,
339-
ts_event,
340-
ts_init,
339+
flags=0,
340+
sequence=0,
341+
ts_event=ts_event,
342+
ts_init=ts_init,
341343
),
342344
]
343345

@@ -349,8 +351,10 @@ def runner_change_to_order_book_snapshot(
349351
instrument_id,
350352
BookAction.UPDATE if bid.volume > 0.0 else BookAction.DELETE,
351353
book_order,
352-
ts_event,
353-
ts_init,
354+
flags=0,
355+
sequence=0,
356+
ts_event=ts_event,
357+
ts_init=ts_init,
354358
)
355359
deltas.append(delta)
356360

@@ -362,8 +366,10 @@ def runner_change_to_order_book_snapshot(
362366
instrument_id,
363367
BookAction.UPDATE if ask.volume > 0.0 else BookAction.DELETE,
364368
book_order,
365-
ts_event,
366-
ts_init,
369+
flags=0,
370+
sequence=0,
371+
ts_event=ts_event,
372+
ts_init=ts_init,
367373
)
368374
deltas.append(delta)
369375

@@ -428,8 +434,10 @@ def runner_change_to_order_book_deltas(
428434
instrument_id,
429435
BookAction.UPDATE if bid.volume > 0.0 else BookAction.DELETE,
430436
book_order,
431-
ts_event,
432-
ts_init,
437+
flags=0,
438+
sequence=0,
439+
ts_event=ts_event,
440+
ts_init=ts_init,
433441
)
434442
deltas.append(delta)
435443

@@ -442,8 +450,10 @@ def runner_change_to_order_book_deltas(
442450
instrument_id,
443451
BookAction.UPDATE if ask.volume > 0.0 else BookAction.DELETE,
444452
book_order,
445-
ts_event,
446-
ts_init,
453+
flags=0,
454+
sequence=0,
455+
ts_event=ts_event,
456+
ts_init=ts_init,
447457
)
448458
deltas.append(delta)
449459

@@ -502,8 +512,10 @@ def runner_change_to_bsp_order_book_deltas(
502512
instrument_id,
503513
BookAction.DELETE if spb.volume == 0.0 else BookAction.UPDATE,
504514
book_order,
505-
ts_event,
506-
ts_init,
515+
flags=0,
516+
sequence=0,
517+
ts_event=ts_event,
518+
ts_init=ts_init,
507519
)
508520
deltas.append(delta)
509521

@@ -514,8 +526,10 @@ def runner_change_to_bsp_order_book_deltas(
514526
instrument_id,
515527
BookAction.DELETE if spl.volume == 0.0 else BookAction.UPDATE,
516528
book_order,
517-
ts_event,
518-
ts_init,
529+
flags=0,
530+
sequence=0,
531+
ts_event=ts_event,
532+
ts_init=ts_init,
519533
)
520534
deltas.append(delta)
521535

nautilus_trader/adapters/binance/common/schemas/market.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,10 @@ def parse_to_order_book_snapshot(
153153
instrument_id,
154154
BookAction.ADD,
155155
o,
156-
ts_init,
157-
ts_init,
156+
flags=0,
158157
sequence=self.lastUpdateId or 0,
158+
ts_event=ts_init, # No event timestamp
159+
ts_init=ts_init,
159160
)
160161
for o in bids + asks
161162
]

nautilus_trader/adapters/binance/spot/schemas/market.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,10 @@ def parse_to_order_book_snapshot(
138138
instrument_id,
139139
BookAction.ADD,
140140
o,
141-
ts_init,
142-
ts_init,
141+
flags=0,
143142
sequence=self.lastUpdateId,
143+
ts_event=ts_init, # No event timestamp
144+
ts_init=ts_init,
144145
)
145146
for o in bids + asks
146147
]

nautilus_trader/core/nautilus_pyo3.pyi

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,12 +2152,12 @@ class OrderBook:
21522152
@property
21532153
def count(self) -> int: ...
21542154
def reset(self) -> None: ...
2155-
def add(self, order: BookOrder, ts_event: int, flags: int = 0, sequence: int = 0) -> None: ...
2156-
def update(self, order: BookOrder, ts_event: int, flags: int = 0, sequence: int = 0) -> None: ...
2157-
def delete(self, order: BookOrder, ts_event: int, flags: int = 0, sequence: int = 0) -> None: ...
2158-
def clear(self, ts_event: int, sequence: int = 0) -> None: ...
2159-
def clear_bids(self, ts_event: int, sequence: int = 0) -> None: ...
2160-
def clear_asks(self, ts_event: int, sequence: int = 0) -> None: ...
2155+
def add(self, order: BookOrder, flags: int, sequence: int, ts_event: int) -> None: ...
2156+
def update(self, order: BookOrder, flags: int, sequence: int, ts_event: int) -> None: ...
2157+
def delete(self, order: BookOrder, flags: int, sequence: int, ts_event: int) -> None: ...
2158+
def clear(self, sequence: int, ts_event: int) -> None: ...
2159+
def clear_bids(self, sequence: int, ts_event: int) -> None: ...
2160+
def clear_asks(self, sequence: int, ts_event: int) -> None: ...
21612161
def apply_delta(self, delta: OrderBookDelta) -> None: ...
21622162
def apply_deltas(self, deltas: OrderBookDeltas) -> None: ...
21632163
def apply_depth(self, depth: OrderBookDepth10) -> None: ...

nautilus_trader/model/data.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,9 @@ cdef class OrderBookDelta(Data):
242242
@staticmethod
243243
cdef OrderBookDelta clear_c(
244244
InstrumentId instrument_id,
245+
uint64_t sequence,
245246
uint64_t ts_event,
246247
uint64_t ts_init,
247-
uint64_t sequence=*,
248248
)
249249

250250
@staticmethod

nautilus_trader/model/data.pyx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,14 +1618,16 @@ cdef class OrderBookDelta(Data):
16181618
The order book delta action.
16191619
order : BookOrder, optional with no default so ``None`` must be passed explicitly
16201620
The book order for the delta.
1621+
flags : uint8_t
1622+
The record flags bit field, indicating packet end and data information.
1623+
A value of zero indicates no flags.
1624+
sequence : uint64_t
1625+
The unique sequence number for the update.
1626+
If no sequence number provided in the source data then use a value of zero.
16211627
ts_event : uint64_t
16221628
The UNIX timestamp (nanoseconds) when the data event occurred.
16231629
ts_init : uint64_t
16241630
The UNIX timestamp (nanoseconds) when the data object was initialized.
1625-
flags : uint8_t, default 0 (no flags)
1626-
The record flags bit field, indicating packet end and data information.
1627-
sequence : uint64_t, default 0
1628-
The unique sequence number for the update.
16291631
16301632
"""
16311633

@@ -1634,10 +1636,10 @@ cdef class OrderBookDelta(Data):
16341636
InstrumentId instrument_id not None,
16351637
BookAction action,
16361638
BookOrder order: BookOrder | None,
1639+
uint8_t flags,
1640+
uint64_t sequence,
16371641
uint64_t ts_event,
16381642
uint64_t ts_init,
1639-
uint8_t flags=0,
1640-
uint64_t sequence=0,
16411643
) -> None:
16421644
# Placeholder for now
16431645
cdef BookOrder_t book_order = order._mem if order is not None else book_order_from_raw(
@@ -1932,17 +1934,18 @@ cdef class OrderBookDelta(Data):
19321934
@staticmethod
19331935
cdef OrderBookDelta clear_c(
19341936
InstrumentId instrument_id,
1937+
uint64_t sequence,
19351938
uint64_t ts_event,
19361939
uint64_t ts_init,
1937-
uint64_t sequence=0,
19381940
):
19391941
return OrderBookDelta(
19401942
instrument_id=instrument_id,
19411943
action=BookAction.CLEAR,
19421944
order=None,
1945+
flags=0,
1946+
sequence=sequence,
19431947
ts_event=ts_event,
19441948
ts_init=ts_init,
1945-
sequence=sequence,
19461949
)
19471950

19481951
@staticmethod
@@ -2025,8 +2028,10 @@ cdef class OrderBookDelta(Data):
20252028
The order ID.
20262029
flags : uint8_t
20272030
The record flags bit field, indicating packet end and data information.
2031+
A value of zero indicates no flags.
20282032
sequence : uint64_t
20292033
The unique sequence number for the update.
2034+
If no sequence number provided in the source data then use a value of zero.
20302035
ts_event : uint64_t
20312036
The UNIX timestamp (nanoseconds) when the tick event occurred.
20322037
ts_init : uint64_t
@@ -2082,7 +2087,7 @@ cdef class OrderBookDelta(Data):
20822087
return OrderBookDelta.to_dict_c(obj)
20832088

20842089
@staticmethod
2085-
def clear(InstrumentId instrument_id, uint64_t ts_event, uint64_t ts_init, uint64_t sequence=0):
2090+
def clear(InstrumentId instrument_id, uint64_t sequence, uint64_t ts_event, uint64_t ts_init):
20862091
"""
20872092
Return an order book delta which acts as an initial ``CLEAR``.
20882093
@@ -2091,7 +2096,7 @@ cdef class OrderBookDelta(Data):
20912096
OrderBookDelta
20922097
20932098
"""
2094-
return OrderBookDelta.clear_c(instrument_id, ts_event, ts_init, sequence)
2099+
return OrderBookDelta.clear_c(instrument_id, sequence, ts_event, ts_init)
20952100

20962101
@staticmethod
20972102
def to_pyo3_list(list[OrderBookDelta] deltas) -> list[nautilus_pyo3.OrderBookDelta]:
@@ -2477,8 +2482,10 @@ cdef class OrderBookDepth10(Data):
24772482
The count of ask orders per level for the update. Can be zeros if data not available.
24782483
flags : uint8_t
24792484
The record flags bit field, indicating packet end and data information.
2485+
A value of zero indicates no flags.
24802486
sequence : uint64_t
24812487
The unique sequence number for the update.
2488+
If no sequence number provided in the source data then use a value of zero.
24822489
ts_event : uint64_t
24832490
The UNIX timestamp (nanoseconds) when the tick event occurred.
24842491
ts_init : uint64_t

nautilus_trader/test_kit/stubs/data.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,9 @@ def order_book_snapshot(
295295
for i in range(ask_levels)
296296
]
297297

298-
deltas = [OrderBookDelta.clear(instrument.id, ts_event, ts_init)]
298+
deltas = [OrderBookDelta.clear(instrument.id, 0, ts_event, ts_init)]
299299
deltas += [
300-
OrderBookDelta(instrument.id, BookAction.ADD, order, ts_event, ts_init)
300+
OrderBookDelta(instrument.id, BookAction.ADD, order, 0, 0, ts_event, ts_init)
301301
for order in bids + asks
302302
]
303303
return OrderBookDeltas(
@@ -309,13 +309,17 @@ def order_book_snapshot(
309309
def order_book_delta(
310310
instrument_id: InstrumentId | None = None,
311311
order: BookOrder | None = None,
312+
flags: int = 0,
313+
sequence: int = 0,
312314
ts_event: int = 0,
313315
ts_init: int = 0,
314316
) -> OrderBookDeltas:
315317
return OrderBookDelta(
316318
instrument_id=instrument_id or TestIdStubs.audusd_id(),
317319
action=BookAction.UPDATE,
318320
order=order or TestDataStubs.order(),
321+
flags=flags,
322+
sequence=sequence,
319323
ts_event=ts_event,
320324
ts_init=ts_init,
321325
)
@@ -392,6 +396,8 @@ def order_book_delta_clear(
392396
instrument_id=instrument_id or TestIdStubs.audusd_id(),
393397
action=BookAction.CLEAR,
394398
order=NULL_ORDER,
399+
flags=0,
400+
sequence=0,
395401
ts_event=0,
396402
ts_init=0,
397403
)

tests/integration_tests/adapters/betfair/test_betfair_persistence.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ def test_bsp_delta_serialize(self):
4444
side=OrderSide.BUY,
4545
order_id=1,
4646
),
47+
flags=0,
48+
sequence=0,
4749
ts_event=1635313844283000000,
4850
ts_init=1635313844283000000,
4951
)

0 commit comments

Comments
 (0)