1use 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}