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,
32        stubs::{
33            account_id, client_order_id, instrument_id_btc_usdt, strategy_id_ema_cross, trader_id,
34            uuid4, venue_order_id,
35        },
36    },
37    types::{Currency, Money, Price, Quantity},
38};
39
40#[fixture]
41pub fn order_filled(
42    trader_id: TraderId,
43    strategy_id_ema_cross: StrategyId,
44    instrument_id_btc_usdt: InstrumentId,
45    client_order_id: ClientOrderId,
46    uuid4: UUID4,
47) -> OrderFilled {
48    OrderFilled::new(
49        trader_id,
50        strategy_id_ema_cross,
51        instrument_id_btc_usdt,
52        client_order_id,
53        VenueOrderId::new("123456"),
54        AccountId::new("SIM-001"),
55        TradeId::new("1"),
56        OrderSide::Buy,
57        OrderType::Limit,
58        Quantity::from_str("0.561").unwrap(),
59        Price::from_str("22000").unwrap(),
60        Currency::from_str("USDT").unwrap(),
61        LiquiditySide::Taker,
62        uuid4,
63        UnixNanos::default(),
64        UnixNanos::default(),
65        false,
66        None,
67        Some(Money::from("12.2 USDT")),
68    )
69}
70
71#[fixture]
72pub fn order_denied_max_submitted_rate(
73    trader_id: TraderId,
74    strategy_id_ema_cross: StrategyId,
75    instrument_id_btc_usdt: InstrumentId,
76    client_order_id: ClientOrderId,
77    uuid4: UUID4,
78) -> OrderDenied {
79    OrderDenied::new(
80        trader_id,
81        strategy_id_ema_cross,
82        instrument_id_btc_usdt,
83        client_order_id,
84        Ustr::from("Exceeded MAX_ORDER_SUBMIT_RATE"),
85        uuid4,
86        UnixNanos::default(),
87        UnixNanos::default(),
88    )
89}
90
91#[fixture]
92pub fn order_rejected_insufficient_margin(
93    trader_id: TraderId,
94    account_id: AccountId,
95    strategy_id_ema_cross: StrategyId,
96    instrument_id_btc_usdt: InstrumentId,
97    client_order_id: ClientOrderId,
98    uuid4: UUID4,
99) -> OrderRejected {
100    OrderRejected::new(
101        trader_id,
102        strategy_id_ema_cross,
103        instrument_id_btc_usdt,
104        client_order_id,
105        account_id,
106        Ustr::from("INSUFFICIENT_MARGIN"),
107        uuid4,
108        UnixNanos::default(),
109        UnixNanos::default(),
110        false,
111        false,
112    )
113}
114
115#[fixture]
116pub fn order_initialized_buy_limit(
117    trader_id: TraderId,
118    strategy_id_ema_cross: StrategyId,
119    instrument_id_btc_usdt: InstrumentId,
120    client_order_id: ClientOrderId,
121    uuid4: UUID4,
122) -> OrderInitialized {
123    let order_list_id = OrderListId::new("1");
124    let linked_order_ids = vec![ClientOrderId::new("O-2020872378424")];
125    OrderInitialized::new(
126        trader_id,
127        strategy_id_ema_cross,
128        instrument_id_btc_usdt,
129        client_order_id,
130        OrderSide::Buy,
131        OrderType::Limit,
132        Quantity::from_str("0.561").unwrap(),
133        TimeInForce::Day,
134        true,
135        true,
136        false,
137        false,
138        uuid4,
139        UnixNanos::default(),
140        UnixNanos::default(),
141        Some(Price::from_str("22000").unwrap()),
142        None,
143        None,
144        None,
145        None,
146        None,
147        None,
148        None,
149        Some(TriggerType::BidAsk),
150        Some(instrument_id_btc_usdt),
151        Some(ContingencyType::Oto),
152        Some(order_list_id),
153        Some(linked_order_ids),
154        None,
155        None,
156        None,
157        None,
158        None,
159    )
160}
161
162#[fixture]
163pub fn order_submitted(
164    trader_id: TraderId,
165    strategy_id_ema_cross: StrategyId,
166    instrument_id_btc_usdt: InstrumentId,
167    client_order_id: ClientOrderId,
168    account_id: AccountId,
169    uuid4: UUID4,
170) -> OrderSubmitted {
171    OrderSubmitted::new(
172        trader_id,
173        strategy_id_ema_cross,
174        instrument_id_btc_usdt,
175        client_order_id,
176        account_id,
177        uuid4,
178        UnixNanos::default(),
179        UnixNanos::default(),
180    )
181}
182
183#[fixture]
184pub fn order_triggered(
185    trader_id: TraderId,
186    strategy_id_ema_cross: StrategyId,
187    instrument_id_btc_usdt: InstrumentId,
188    client_order_id: ClientOrderId,
189    venue_order_id: VenueOrderId,
190    account_id: AccountId,
191    uuid4: UUID4,
192) -> OrderTriggered {
193    OrderTriggered::new(
194        trader_id,
195        strategy_id_ema_cross,
196        instrument_id_btc_usdt,
197        client_order_id,
198        uuid4,
199        UnixNanos::default(),
200        UnixNanos::default(),
201        false,
202        Some(venue_order_id),
203        Some(account_id),
204    )
205}
206
207#[fixture]
208pub fn order_emulated(
209    trader_id: TraderId,
210    strategy_id_ema_cross: StrategyId,
211    instrument_id_btc_usdt: InstrumentId,
212    client_order_id: ClientOrderId,
213    uuid4: UUID4,
214) -> OrderEmulated {
215    OrderEmulated::new(
216        trader_id,
217        strategy_id_ema_cross,
218        instrument_id_btc_usdt,
219        client_order_id,
220        uuid4,
221        UnixNanos::default(),
222        UnixNanos::default(),
223    )
224}
225
226#[fixture]
227pub fn order_released(
228    trader_id: TraderId,
229    strategy_id_ema_cross: StrategyId,
230    instrument_id_btc_usdt: InstrumentId,
231    client_order_id: ClientOrderId,
232    uuid4: UUID4,
233) -> OrderReleased {
234    OrderReleased::new(
235        trader_id,
236        strategy_id_ema_cross,
237        instrument_id_btc_usdt,
238        client_order_id,
239        Price::from_str("22000").unwrap(),
240        uuid4,
241        UnixNanos::default(),
242        UnixNanos::default(),
243    )
244}
245
246#[fixture]
247pub fn order_updated(
248    trader_id: TraderId,
249    strategy_id_ema_cross: StrategyId,
250    instrument_id_btc_usdt: InstrumentId,
251    client_order_id: ClientOrderId,
252    venue_order_id: VenueOrderId,
253    account_id: AccountId,
254    uuid4: UUID4,
255) -> OrderUpdated {
256    OrderUpdated::new(
257        trader_id,
258        strategy_id_ema_cross,
259        instrument_id_btc_usdt,
260        client_order_id,
261        Quantity::from(100),
262        uuid4,
263        UnixNanos::default(),
264        UnixNanos::default(),
265        false,
266        Some(venue_order_id),
267        Some(account_id),
268        Some(Price::from("22000")),
269        None,
270    )
271}
272
273#[fixture]
274pub fn order_pending_update(
275    trader_id: TraderId,
276    strategy_id_ema_cross: StrategyId,
277    instrument_id_btc_usdt: InstrumentId,
278    client_order_id: ClientOrderId,
279    account_id: AccountId,
280    venue_order_id: VenueOrderId,
281    uuid4: UUID4,
282) -> OrderPendingUpdate {
283    OrderPendingUpdate::new(
284        trader_id,
285        strategy_id_ema_cross,
286        instrument_id_btc_usdt,
287        client_order_id,
288        account_id,
289        uuid4,
290        UnixNanos::default(),
291        UnixNanos::default(),
292        false,
293        Some(venue_order_id),
294    )
295}
296
297#[fixture]
298pub fn order_pending_cancel(
299    trader_id: TraderId,
300    strategy_id_ema_cross: StrategyId,
301    instrument_id_btc_usdt: InstrumentId,
302    client_order_id: ClientOrderId,
303    account_id: AccountId,
304    venue_order_id: VenueOrderId,
305    uuid4: UUID4,
306) -> OrderPendingCancel {
307    OrderPendingCancel::new(
308        trader_id,
309        strategy_id_ema_cross,
310        instrument_id_btc_usdt,
311        client_order_id,
312        account_id,
313        uuid4,
314        UnixNanos::default(),
315        UnixNanos::default(),
316        false,
317        Some(venue_order_id),
318    )
319}
320
321#[fixture]
322pub fn order_modify_rejected(
323    trader_id: TraderId,
324    strategy_id_ema_cross: StrategyId,
325    instrument_id_btc_usdt: InstrumentId,
326    client_order_id: ClientOrderId,
327    venue_order_id: VenueOrderId,
328    account_id: AccountId,
329    uuid4: UUID4,
330) -> OrderModifyRejected {
331    OrderModifyRejected::new(
332        trader_id,
333        strategy_id_ema_cross,
334        instrument_id_btc_usdt,
335        client_order_id,
336        Ustr::from("ORDER_DOES_NOT_EXIST"),
337        uuid4,
338        UnixNanos::default(),
339        UnixNanos::default(),
340        false,
341        Some(venue_order_id),
342        Some(account_id),
343    )
344}
345
346#[fixture]
347pub fn order_accepted(
348    trader_id: TraderId,
349    strategy_id_ema_cross: StrategyId,
350    instrument_id_btc_usdt: InstrumentId,
351    client_order_id: ClientOrderId,
352    account_id: AccountId,
353    venue_order_id: VenueOrderId,
354    uuid4: UUID4,
355) -> OrderAccepted {
356    OrderAccepted::new(
357        trader_id,
358        strategy_id_ema_cross,
359        instrument_id_btc_usdt,
360        client_order_id,
361        venue_order_id,
362        account_id,
363        uuid4,
364        UnixNanos::default(),
365        UnixNanos::default(),
366        false,
367    )
368}
369
370#[fixture]
371pub fn order_cancel_rejected(
372    trader_id: TraderId,
373    strategy_id_ema_cross: StrategyId,
374    instrument_id_btc_usdt: InstrumentId,
375    client_order_id: ClientOrderId,
376    venue_order_id: VenueOrderId,
377    account_id: AccountId,
378    uuid4: UUID4,
379) -> OrderCancelRejected {
380    OrderCancelRejected::new(
381        trader_id,
382        strategy_id_ema_cross,
383        instrument_id_btc_usdt,
384        client_order_id,
385        Ustr::from("ORDER_DOES_NOT_EXIST"),
386        uuid4,
387        UnixNanos::default(),
388        UnixNanos::default(),
389        false,
390        Some(venue_order_id),
391        Some(account_id),
392    )
393}
394
395#[fixture]
396pub fn order_expired(
397    trader_id: TraderId,
398    strategy_id_ema_cross: StrategyId,
399    instrument_id_btc_usdt: InstrumentId,
400    client_order_id: ClientOrderId,
401    venue_order_id: VenueOrderId,
402    account_id: AccountId,
403    uuid4: UUID4,
404) -> OrderExpired {
405    OrderExpired::new(
406        trader_id,
407        strategy_id_ema_cross,
408        instrument_id_btc_usdt,
409        client_order_id,
410        uuid4,
411        UnixNanos::default(),
412        UnixNanos::default(),
413        false,
414        Some(venue_order_id),
415        Some(account_id),
416    )
417}