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