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