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, stubs as id_stubs,
32 },
33 types::{Currency, Money, Price, Quantity},
34};
35
36#[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}