nautilus_model/events/order/
stubs.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use std::str::FromStr;
17
18use nautilus_core::{UUID4, UnixNanos};
19use rstest::fixture;
20use ustr::Ustr;
21
22use crate::{
23    enums::{ContingencyType, LiquiditySide, OrderSide, OrderType, TimeInForce, TriggerType},
24    events::{
25        OrderAccepted, OrderCancelRejected, OrderDenied, OrderEmulated, OrderExpired, OrderFilled,
26        OrderInitialized, OrderModifyRejected, OrderPendingCancel, OrderPendingUpdate,
27        OrderRejected, OrderReleased, OrderSubmitted, OrderTriggered, OrderUpdated,
28    },
29    identifiers::{
30        AccountId, ClientOrderId, InstrumentId, OrderListId, StrategyId, TradeId, TraderId,
31        VenueOrderId, stubs as id_stubs,
32    },
33    types::{Currency, Money, Price, Quantity},
34};
35
36// Fixture wrappers for rstest - these are not glob-exported to avoid ambiguity
37#[fixture]
38pub fn trader_id() -> TraderId {
39    id_stubs::trader_id()
40}
41
42#[fixture]
43pub fn strategy_id_ema_cross() -> StrategyId {
44    id_stubs::strategy_id_ema_cross()
45}
46
47#[fixture]
48pub fn instrument_id_btc_usdt() -> InstrumentId {
49    id_stubs::instrument_id_btc_usdt()
50}
51
52#[fixture]
53pub fn client_order_id() -> ClientOrderId {
54    id_stubs::client_order_id()
55}
56
57#[fixture]
58pub fn venue_order_id() -> VenueOrderId {
59    id_stubs::venue_order_id()
60}
61
62#[fixture]
63pub fn account_id() -> AccountId {
64    id_stubs::account_id()
65}
66
67#[fixture]
68pub fn uuid4() -> UUID4 {
69    id_stubs::uuid4()
70}
71
72#[fixture]
73pub fn order_filled(
74    trader_id: TraderId,
75    strategy_id_ema_cross: StrategyId,
76    instrument_id_btc_usdt: InstrumentId,
77    client_order_id: ClientOrderId,
78    uuid4: UUID4,
79) -> OrderFilled {
80    OrderFilled::new(
81        trader_id,
82        strategy_id_ema_cross,
83        instrument_id_btc_usdt,
84        client_order_id,
85        VenueOrderId::new("123456"),
86        AccountId::new("SIM-001"),
87        TradeId::new("1"),
88        OrderSide::Buy,
89        OrderType::Limit,
90        Quantity::from_str("0.561").unwrap(),
91        Price::from_str("22000").unwrap(),
92        Currency::from_str("USDT").unwrap(),
93        LiquiditySide::Taker,
94        uuid4,
95        UnixNanos::default(),
96        UnixNanos::default(),
97        false,
98        None,
99        Some(Money::from("12.2 USDT")),
100    )
101}
102
103#[fixture]
104pub fn order_denied_max_submitted_rate(
105    trader_id: TraderId,
106    strategy_id_ema_cross: StrategyId,
107    instrument_id_btc_usdt: InstrumentId,
108    client_order_id: ClientOrderId,
109    uuid4: UUID4,
110) -> OrderDenied {
111    OrderDenied::new(
112        trader_id,
113        strategy_id_ema_cross,
114        instrument_id_btc_usdt,
115        client_order_id,
116        Ustr::from("Exceeded MAX_ORDER_SUBMIT_RATE"),
117        uuid4,
118        UnixNanos::default(),
119        UnixNanos::default(),
120    )
121}
122
123#[fixture]
124pub fn order_rejected_insufficient_margin(
125    trader_id: TraderId,
126    account_id: AccountId,
127    strategy_id_ema_cross: StrategyId,
128    instrument_id_btc_usdt: InstrumentId,
129    client_order_id: ClientOrderId,
130    uuid4: UUID4,
131) -> OrderRejected {
132    OrderRejected::new(
133        trader_id,
134        strategy_id_ema_cross,
135        instrument_id_btc_usdt,
136        client_order_id,
137        account_id,
138        Ustr::from("INSUFFICIENT_MARGIN"),
139        uuid4,
140        UnixNanos::default(),
141        UnixNanos::default(),
142        false,
143        false,
144    )
145}
146
147#[fixture]
148pub fn order_initialized_buy_limit(
149    trader_id: TraderId,
150    strategy_id_ema_cross: StrategyId,
151    instrument_id_btc_usdt: InstrumentId,
152    client_order_id: ClientOrderId,
153    uuid4: UUID4,
154) -> OrderInitialized {
155    let order_list_id = OrderListId::new("1");
156    let linked_order_ids = vec![ClientOrderId::new("O-2020872378424")];
157    OrderInitialized::new(
158        trader_id,
159        strategy_id_ema_cross,
160        instrument_id_btc_usdt,
161        client_order_id,
162        OrderSide::Buy,
163        OrderType::Limit,
164        Quantity::from_str("0.561").unwrap(),
165        TimeInForce::Day,
166        true,
167        true,
168        false,
169        false,
170        uuid4,
171        UnixNanos::default(),
172        UnixNanos::default(),
173        Some(Price::from_str("22000").unwrap()),
174        None,
175        None,
176        None,
177        None,
178        None,
179        None,
180        None,
181        Some(TriggerType::BidAsk),
182        Some(instrument_id_btc_usdt),
183        Some(ContingencyType::Oto),
184        Some(order_list_id),
185        Some(linked_order_ids),
186        None,
187        None,
188        None,
189        None,
190        None,
191    )
192}
193
194#[fixture]
195pub fn order_submitted(
196    trader_id: TraderId,
197    strategy_id_ema_cross: StrategyId,
198    instrument_id_btc_usdt: InstrumentId,
199    client_order_id: ClientOrderId,
200    account_id: AccountId,
201    uuid4: UUID4,
202) -> OrderSubmitted {
203    OrderSubmitted::new(
204        trader_id,
205        strategy_id_ema_cross,
206        instrument_id_btc_usdt,
207        client_order_id,
208        account_id,
209        uuid4,
210        UnixNanos::default(),
211        UnixNanos::default(),
212    )
213}
214
215#[fixture]
216pub fn order_triggered(
217    trader_id: TraderId,
218    strategy_id_ema_cross: StrategyId,
219    instrument_id_btc_usdt: InstrumentId,
220    client_order_id: ClientOrderId,
221    venue_order_id: VenueOrderId,
222    account_id: AccountId,
223    uuid4: UUID4,
224) -> OrderTriggered {
225    OrderTriggered::new(
226        trader_id,
227        strategy_id_ema_cross,
228        instrument_id_btc_usdt,
229        client_order_id,
230        uuid4,
231        UnixNanos::default(),
232        UnixNanos::default(),
233        false,
234        Some(venue_order_id),
235        Some(account_id),
236    )
237}
238
239#[fixture]
240pub fn order_emulated(
241    trader_id: TraderId,
242    strategy_id_ema_cross: StrategyId,
243    instrument_id_btc_usdt: InstrumentId,
244    client_order_id: ClientOrderId,
245    uuid4: UUID4,
246) -> OrderEmulated {
247    OrderEmulated::new(
248        trader_id,
249        strategy_id_ema_cross,
250        instrument_id_btc_usdt,
251        client_order_id,
252        uuid4,
253        UnixNanos::default(),
254        UnixNanos::default(),
255    )
256}
257
258#[fixture]
259pub fn order_released(
260    trader_id: TraderId,
261    strategy_id_ema_cross: StrategyId,
262    instrument_id_btc_usdt: InstrumentId,
263    client_order_id: ClientOrderId,
264    uuid4: UUID4,
265) -> OrderReleased {
266    OrderReleased::new(
267        trader_id,
268        strategy_id_ema_cross,
269        instrument_id_btc_usdt,
270        client_order_id,
271        Price::from_str("22000").unwrap(),
272        uuid4,
273        UnixNanos::default(),
274        UnixNanos::default(),
275    )
276}
277
278#[fixture]
279pub fn order_updated(
280    trader_id: TraderId,
281    strategy_id_ema_cross: StrategyId,
282    instrument_id_btc_usdt: InstrumentId,
283    client_order_id: ClientOrderId,
284    venue_order_id: VenueOrderId,
285    account_id: AccountId,
286    uuid4: UUID4,
287) -> OrderUpdated {
288    OrderUpdated::new(
289        trader_id,
290        strategy_id_ema_cross,
291        instrument_id_btc_usdt,
292        client_order_id,
293        Quantity::from(100),
294        uuid4,
295        UnixNanos::default(),
296        UnixNanos::default(),
297        false,
298        Some(venue_order_id),
299        Some(account_id),
300        Some(Price::from("22000")),
301        None,
302        None,
303    )
304}
305
306#[fixture]
307pub fn order_pending_update(
308    trader_id: TraderId,
309    strategy_id_ema_cross: StrategyId,
310    instrument_id_btc_usdt: InstrumentId,
311    client_order_id: ClientOrderId,
312    account_id: AccountId,
313    venue_order_id: VenueOrderId,
314    uuid4: UUID4,
315) -> OrderPendingUpdate {
316    OrderPendingUpdate::new(
317        trader_id,
318        strategy_id_ema_cross,
319        instrument_id_btc_usdt,
320        client_order_id,
321        account_id,
322        uuid4,
323        UnixNanos::default(),
324        UnixNanos::default(),
325        false,
326        Some(venue_order_id),
327    )
328}
329
330#[fixture]
331pub fn order_pending_cancel(
332    trader_id: TraderId,
333    strategy_id_ema_cross: StrategyId,
334    instrument_id_btc_usdt: InstrumentId,
335    client_order_id: ClientOrderId,
336    account_id: AccountId,
337    venue_order_id: VenueOrderId,
338    uuid4: UUID4,
339) -> OrderPendingCancel {
340    OrderPendingCancel::new(
341        trader_id,
342        strategy_id_ema_cross,
343        instrument_id_btc_usdt,
344        client_order_id,
345        account_id,
346        uuid4,
347        UnixNanos::default(),
348        UnixNanos::default(),
349        false,
350        Some(venue_order_id),
351    )
352}
353
354#[fixture]
355pub fn order_modify_rejected(
356    trader_id: TraderId,
357    strategy_id_ema_cross: StrategyId,
358    instrument_id_btc_usdt: InstrumentId,
359    client_order_id: ClientOrderId,
360    venue_order_id: VenueOrderId,
361    account_id: AccountId,
362    uuid4: UUID4,
363) -> OrderModifyRejected {
364    OrderModifyRejected::new(
365        trader_id,
366        strategy_id_ema_cross,
367        instrument_id_btc_usdt,
368        client_order_id,
369        Ustr::from("ORDER_DOES_NOT_EXIST"),
370        uuid4,
371        UnixNanos::default(),
372        UnixNanos::default(),
373        false,
374        Some(venue_order_id),
375        Some(account_id),
376    )
377}
378
379#[fixture]
380pub fn order_accepted(
381    trader_id: TraderId,
382    strategy_id_ema_cross: StrategyId,
383    instrument_id_btc_usdt: InstrumentId,
384    client_order_id: ClientOrderId,
385    account_id: AccountId,
386    venue_order_id: VenueOrderId,
387    uuid4: UUID4,
388) -> OrderAccepted {
389    OrderAccepted::new(
390        trader_id,
391        strategy_id_ema_cross,
392        instrument_id_btc_usdt,
393        client_order_id,
394        venue_order_id,
395        account_id,
396        uuid4,
397        UnixNanos::default(),
398        UnixNanos::default(),
399        false,
400    )
401}
402
403#[fixture]
404pub fn order_cancel_rejected(
405    trader_id: TraderId,
406    strategy_id_ema_cross: StrategyId,
407    instrument_id_btc_usdt: InstrumentId,
408    client_order_id: ClientOrderId,
409    venue_order_id: VenueOrderId,
410    account_id: AccountId,
411    uuid4: UUID4,
412) -> OrderCancelRejected {
413    OrderCancelRejected::new(
414        trader_id,
415        strategy_id_ema_cross,
416        instrument_id_btc_usdt,
417        client_order_id,
418        Ustr::from("ORDER_DOES_NOT_EXIST"),
419        uuid4,
420        UnixNanos::default(),
421        UnixNanos::default(),
422        false,
423        Some(venue_order_id),
424        Some(account_id),
425    )
426}
427
428#[fixture]
429pub fn order_expired(
430    trader_id: TraderId,
431    strategy_id_ema_cross: StrategyId,
432    instrument_id_btc_usdt: InstrumentId,
433    client_order_id: ClientOrderId,
434    venue_order_id: VenueOrderId,
435    account_id: AccountId,
436    uuid4: UUID4,
437) -> OrderExpired {
438    OrderExpired::new(
439        trader_id,
440        strategy_id_ema_cross,
441        instrument_id_btc_usdt,
442        client_order_id,
443        uuid4,
444        UnixNanos::default(),
445        UnixNanos::default(),
446        false,
447        Some(venue_order_id),
448        Some(account_id),
449    )
450}