nautilus_model/instruments/
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 chrono::{TimeZone, Utc};
17use nautilus_core::UnixNanos;
18use rstest::*;
19use rust_decimal::Decimal;
20use rust_decimal_macros::dec;
21use ustr::Ustr;
22
23use super::{
24    CryptoOption, betting::BettingInstrument, binary_option::BinaryOption,
25    futures_spread::FuturesSpread, option_spread::OptionSpread, synthetic::SyntheticInstrument,
26};
27use crate::{
28    enums::{AssetClass, OptionKind},
29    identifiers::{InstrumentId, Symbol, Venue},
30    instruments::{
31        CryptoFuture, CryptoPerpetual, CurrencyPair, Equity, FuturesContract, OptionContract,
32    },
33    types::{Currency, Money, Price, Quantity},
34};
35
36impl Default for SyntheticInstrument {
37    /// Creates a new default [`SyntheticInstrument`] instance for testing.
38    fn default() -> Self {
39        let btc_binance = InstrumentId::from("BTC.BINANCE");
40        let ltc_binance = InstrumentId::from("LTC.BINANCE");
41        let formula = "(BTC.BINANCE + LTC.BINANCE) / 2.0".to_string();
42        SyntheticInstrument::new(
43            Symbol::new("BTC-LTC"),
44            2,
45            vec![btc_binance, ltc_binance],
46            formula.clone(),
47            0.into(),
48            0.into(),
49        )
50    }
51}
52
53////////////////////////////////////////////////////////////////////////////////
54// CryptoFuture
55////////////////////////////////////////////////////////////////////////////////
56
57#[fixture]
58pub fn crypto_future_btcusdt(
59    #[default(2)] price_precision: u8,
60    #[default(6)] size_precision: u8,
61    #[default(Price::from("0.01"))] price_increment: Price,
62    #[default(Quantity::from("0.000001"))] size_increment: Quantity,
63) -> CryptoFuture {
64    let activation = Utc.with_ymd_and_hms(2014, 4, 8, 0, 0, 0).unwrap();
65    let expiration = Utc.with_ymd_and_hms(2014, 7, 8, 0, 0, 0).unwrap();
66    CryptoFuture::new(
67        InstrumentId::from("ETHUSDT-123.BINANCE"),
68        Symbol::from("BTCUSDT"),
69        Currency::from("BTC"),
70        Currency::from("USDT"),
71        Currency::from("USDT"),
72        false,
73        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
74        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
75        price_precision,
76        size_precision,
77        price_increment,
78        size_increment,
79        None,
80        None,
81        Some(Quantity::from("9000.0")),
82        Some(Quantity::from("0.000001")),
83        None,
84        Some(Money::new(10.00, Currency::from("USDT"))),
85        Some(Price::from("1000000.00")),
86        Some(Price::from("0.01")),
87        None,
88        None,
89        None,
90        None,
91        0.into(),
92        0.into(),
93    )
94}
95
96#[fixture]
97pub fn ethbtc_quanto(
98    #[default(5)] price_precision: u8,
99    #[default(3)] size_precision: u8,
100    #[default(Price::from("0.00001"))] price_increment: Price,
101    #[default(Quantity::from("0.001"))] size_increment: Quantity,
102) -> CryptoFuture {
103    let activation = Utc.with_ymd_and_hms(2014, 4, 8, 0, 0, 0).unwrap();
104    let expiration = Utc.with_ymd_and_hms(2014, 7, 8, 0, 0, 0).unwrap();
105    CryptoFuture::new(
106        InstrumentId::from("ETHBTC-123.BINANCE"),
107        Symbol::from("ETHBTC"),
108        Currency::from("ETH"),
109        Currency::from("BTC"),
110        Currency::from("BTC"),
111        false,
112        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
113        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
114        price_precision,
115        size_precision,
116        price_increment,
117        size_increment,
118        None,
119        None,
120        Some(Quantity::from("9000.0")),
121        Some(Quantity::from("0.001")),
122        None,
123        Some(Money::new(1.0, Currency::from("BTC"))),
124        Some(Price::from("1.0")),
125        Some(Price::from("0.00001")),
126        None,
127        None,
128        None,
129        None,
130        0.into(),
131        0.into(),
132    )
133}
134
135////////////////////////////////////////////////////////////////////////////////
136// CryptoPerpetual – BitMEX inverse (XBTUSD)
137// ////////////////////////////////////////////////////////////////////////////
138
139#[fixture]
140pub fn xbtusd_inverse_perp(
141    // One-decimal tick (0.5 USD) and integer contract size
142    #[default(1)] price_precision: u8,
143    #[default(0)] size_precision: u8,
144    #[default(Price::from("0.5"))] price_increment: Price,
145    #[default(Quantity::from("1"))] size_increment: Quantity,
146) -> CryptoPerpetual {
147    CryptoPerpetual::new(
148        // BitMEX uses XBT for BTC; keep the “-PERP” suffix for clarity
149        InstrumentId::from("XBTUSD-PERP.BITMEX"),
150        Symbol::from("XBTUSD"),
151        Currency::BTC(), // base
152        Currency::USD(), // quote
153        Currency::BTC(), // settlement (inverse)
154        true,            // is_inverse
155        price_precision,
156        size_precision,
157        price_increment,
158        size_increment,
159        None,                              // lot_size
160        Some(Quantity::from("1")),         // multiplier: 1 USD/contract
161        None,                              // max_quantity
162        None,                              // min_quantity
163        Some(Money::from("10000000 USD")), // max_notional
164        Some(Money::from("1 USD")),        // min_notional
165        Some(Price::from("10000000")),     // max_price
166        Some(Price::from("0.01")),         // min_price
167        Some(dec!(0.01)),                  // margin_init
168        Some(dec!(0.0035)),                // margin_maint
169        Some(dec!(-0.00025)),              // maker_fee (rebate)
170        Some(dec!(0.00075)),               // taker_fee
171        UnixNanos::default(),              // ts_event
172        UnixNanos::default(),              // ts_init
173    )
174}
175
176////////////////////////////////////////////////////////////////////////////////
177// CryptoOption
178////////////////////////////////////////////////////////////////////////////////
179
180#[fixture]
181pub fn crypto_option_btc_deribit(
182    #[default(3)] price_precision: u8,
183    #[default(1)] size_precision: u8,
184    #[default(Price::from("0.001"))] price_increment: Price,
185    #[default(Quantity::from("0.1"))] size_increment: Quantity,
186) -> CryptoOption {
187    let activation = UnixNanos::from(1_671_696_002_000_000_000);
188    let expiration = UnixNanos::from(1_673_596_800_000_000_000);
189    CryptoOption::new(
190        InstrumentId::from("BTC-13JAN23-16000-P.DERIBIT"),
191        Symbol::from("BTC-13JAN23-16000-P"),
192        Currency::from("BTC"),
193        Currency::from("USD"),
194        Currency::from("BTC"),
195        false,
196        OptionKind::Put,
197        Price::from("16000.000"),
198        activation,
199        expiration,
200        price_precision,
201        size_precision,
202        price_increment,
203        size_increment,
204        Some(Quantity::from(1)),
205        Some(Quantity::from("9000.0")),
206        Some(Quantity::from("0.1")),
207        None,
208        Some(Money::new(10.00, Currency::from("USD"))),
209        None,
210        None,
211        None,
212        None,
213        Some(dec!(0.0003)),
214        Some(dec!(0.0003)),
215        0.into(),
216        0.into(),
217    )
218}
219
220////////////////////////////////////////////////////////////////////////////////
221// CryptoPerpetual
222////////////////////////////////////////////////////////////////////////////////
223
224#[fixture]
225pub fn crypto_perpetual_ethusdt() -> CryptoPerpetual {
226    CryptoPerpetual::new(
227        InstrumentId::from("ETHUSDT-PERP.BINANCE"),
228        Symbol::from("ETHUSDT"),
229        Currency::from("ETH"),
230        Currency::from("USDT"),
231        Currency::from("USDT"),
232        false,
233        2,
234        3,
235        Price::from("0.01"),
236        Quantity::from("0.001"),
237        None,
238        None,
239        Some(Quantity::from("10000.0")),
240        Some(Quantity::from("0.001")),
241        None,
242        Some(Money::new(10.00, Currency::from("USDT"))),
243        Some(Price::from("15000.00")),
244        Some(Price::from("1.0")),
245        Some(dec!(1.0)),
246        Some(dec!(0.35)),
247        Some(dec!(0.0002)),
248        Some(dec!(0.0004)),
249        UnixNanos::default(),
250        UnixNanos::default(),
251    )
252}
253
254#[fixture]
255pub fn xbtusd_bitmex() -> CryptoPerpetual {
256    CryptoPerpetual::new(
257        InstrumentId::from("BTCUSDT.BITMEX"),
258        Symbol::from("XBTUSD"),
259        Currency::BTC(),
260        Currency::USD(),
261        Currency::BTC(),
262        true,
263        1,
264        0,
265        Price::from("0.5"),
266        Quantity::from("1"),
267        None,
268        None,
269        None,
270        None,
271        Some(Money::from("10000000 USD")),
272        Some(Money::from("1 USD")),
273        Some(Price::from("10000000")),
274        Some(Price::from("0.01")),
275        Some(dec!(0.01)),
276        Some(dec!(0.0035)),
277        Some(dec!(-0.00025)),
278        Some(dec!(0.00075)),
279        UnixNanos::default(),
280        UnixNanos::default(),
281    )
282}
283
284#[fixture]
285pub fn ethusdt_bitmex() -> CryptoPerpetual {
286    CryptoPerpetual::new(
287        InstrumentId::from("ETHUSD.BITMEX"),
288        Symbol::from("ETHUSD"),
289        Currency::ETH(),
290        Currency::USD(),
291        Currency::ETH(),
292        true,
293        2,
294        0,
295        Price::from("0.05"),
296        Quantity::from("1"),
297        None,
298        None,
299        None,
300        None,
301        None,
302        None,
303        Some(Price::from("10000000")),
304        Some(Price::from("0.01")),
305        Some(dec!(0.01)),
306        Some(dec!(0.0035)),
307        Some(dec!(-0.00025)),
308        Some(dec!(0.00075)),
309        UnixNanos::default(),
310        UnixNanos::default(),
311    )
312}
313
314////////////////////////////////////////////////////////////////////////////////
315// CurrencyPair
316////////////////////////////////////////////////////////////////////////////////
317
318#[fixture]
319pub fn currency_pair_btcusdt() -> CurrencyPair {
320    CurrencyPair::new(
321        InstrumentId::from("BTCUSDT.BINANCE"),
322        Symbol::from("BTCUSDT"),
323        Currency::from("BTC"),
324        Currency::from("USDT"),
325        2,
326        6,
327        Price::from("0.01"),
328        Quantity::from("0.000001"),
329        None,
330        None,
331        Some(Quantity::from("9000")),
332        Some(Quantity::from("0.000001")),
333        None,
334        None,
335        Some(Price::from("1000000")),
336        Some(Price::from("0.01")),
337        Some(dec!(0.001)),
338        Some(dec!(0.001)),
339        Some(dec!(0.001)),
340        Some(dec!(0.001)),
341        UnixNanos::default(),
342        UnixNanos::default(),
343    )
344}
345
346#[fixture]
347pub fn currency_pair_ethusdt() -> CurrencyPair {
348    CurrencyPair::new(
349        InstrumentId::from("ETHUSDT.BINANCE"),
350        Symbol::from("ETHUSDT"),
351        Currency::from("ETH"),
352        Currency::from("USDT"),
353        2,
354        5,
355        Price::from("0.01"),
356        Quantity::from("0.00001"),
357        None,
358        None,
359        Some(Quantity::from("9000")),
360        Some(Quantity::from("0.00001")),
361        None,
362        None,
363        Some(Price::from("1000000")),
364        Some(Price::from("0.01")),
365        Some(dec!(0.01)),
366        Some(dec!(0.0035)),
367        Some(dec!(0.0001)),
368        Some(dec!(0.0001)),
369        UnixNanos::default(),
370        UnixNanos::default(),
371    )
372}
373
374/// # Panics
375///
376/// Panics if `symbol` does not contain a '/' delimiter.
377#[must_use]
378pub fn default_fx_ccy(symbol: Symbol, venue: Option<Venue>) -> CurrencyPair {
379    let target_venue = venue.unwrap_or(Venue::from("SIM"));
380    let instrument_id = InstrumentId::new(symbol, target_venue);
381    let base_currency = symbol.as_str().split('/').next().unwrap();
382    let quote_currency = symbol.as_str().split('/').next_back().unwrap();
383    let price_precision = if quote_currency == "JPY" { 3 } else { 5 };
384    let price_increment = Price::new(1.0 / 10.0f64, price_precision);
385    CurrencyPair::new(
386        instrument_id,
387        symbol,
388        Currency::from(base_currency),
389        Currency::from(quote_currency),
390        price_precision,
391        0,
392        price_increment,
393        Quantity::from("1"),
394        None,
395        Some(Quantity::from("1000")),
396        Some(Quantity::from("1000000")),
397        Some(Quantity::from("100")),
398        None,
399        None,
400        None,
401        None,
402        Some(dec!(0.03)),
403        Some(dec!(0.03)),
404        Some(dec!(0.00002)),
405        Some(dec!(0.00002)),
406        UnixNanos::default(),
407        UnixNanos::default(),
408    )
409}
410
411#[fixture]
412pub fn audusd_sim() -> CurrencyPair {
413    default_fx_ccy(Symbol::from("AUD/USD"), Some(Venue::from("SIM")))
414}
415
416#[fixture]
417pub fn gbpusd_sim() -> CurrencyPair {
418    default_fx_ccy(Symbol::from("GBP/USD"), Some(Venue::from("SIM")))
419}
420
421#[fixture]
422pub fn usdjpy_idealpro() -> CurrencyPair {
423    default_fx_ccy(Symbol::from("USD/JPY"), Some(Venue::from("IDEALPRO")))
424}
425
426////////////////////////////////////////////////////////////////////////////////
427// Equity
428////////////////////////////////////////////////////////////////////////////////
429
430#[fixture]
431pub fn equity_aapl() -> Equity {
432    Equity::new(
433        InstrumentId::from("AAPL.XNAS"),
434        Symbol::from("AAPL"),
435        Some(Ustr::from("US0378331005")),
436        Currency::from("USD"),
437        2,
438        Price::from("0.01"),
439        None,
440        None,
441        None,
442        None,
443        None,
444        None,
445        None,
446        None,
447        None,
448        UnixNanos::default(),
449        UnixNanos::default(),
450    )
451}
452
453////////////////////////////////////////////////////////////////////////////////
454// FuturesContract
455////////////////////////////////////////////////////////////////////////////////
456
457/// # Panics
458///
459/// Panics if constructing the activation or expiration timestamp fails,
460/// e.g., if the provided dates are invalid or timestamp conversion returns `None`.
461pub fn futures_contract_es(
462    activation: Option<UnixNanos>,
463    expiration: Option<UnixNanos>,
464) -> FuturesContract {
465    let activation = activation.unwrap_or(UnixNanos::from(
466        Utc.with_ymd_and_hms(2021, 9, 10, 0, 0, 0)
467            .unwrap()
468            .timestamp_nanos_opt()
469            .unwrap() as u64,
470    ));
471    let expiration = expiration.unwrap_or(UnixNanos::from(
472        Utc.with_ymd_and_hms(2021, 12, 17, 0, 0, 0)
473            .unwrap()
474            .timestamp_nanos_opt()
475            .unwrap() as u64,
476    ));
477    FuturesContract::new(
478        InstrumentId::from("ESZ21.GLBX"),
479        Symbol::from("ESZ21"),
480        AssetClass::Index,
481        Some(Ustr::from("XCME")),
482        Ustr::from("ES"),
483        activation,
484        expiration,
485        Currency::USD(),
486        2,
487        Price::from("0.01"),
488        Quantity::from(1),
489        Quantity::from(1),
490        None,
491        None,
492        None,
493        None,
494        None,
495        None,
496        None,
497        None,
498        UnixNanos::default(),
499        UnixNanos::default(),
500    )
501}
502
503////////////////////////////////////////////////////////////////////////////////
504// FuturesSpread
505////////////////////////////////////////////////////////////////////////////////
506
507#[fixture]
508pub fn futures_spread_es() -> FuturesSpread {
509    let activation = Utc.with_ymd_and_hms(2022, 6, 21, 13, 30, 0).unwrap();
510    let expiration = Utc.with_ymd_and_hms(2024, 6, 21, 13, 30, 0).unwrap();
511    FuturesSpread::new(
512        InstrumentId::from("ESM4-ESU4.GLBX"),
513        Symbol::from("ESM4-ESU4"),
514        AssetClass::Index,
515        Some(Ustr::from("XCME")),
516        Ustr::from("ES"),
517        Ustr::from("EQ"),
518        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
519        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
520        Currency::USD(),
521        2,
522        Price::from("0.01"),
523        Quantity::from(1),
524        Quantity::from(1),
525        None,
526        None,
527        None,
528        None,
529        None,
530        None,
531        None,
532        None,
533        UnixNanos::default(),
534        UnixNanos::default(),
535    )
536}
537
538////////////////////////////////////////////////////////////////////////////////
539// OptionContract
540////////////////////////////////////////////////////////////////////////////////
541
542#[fixture]
543pub fn option_contract_appl() -> OptionContract {
544    let activation = Utc.with_ymd_and_hms(2021, 9, 17, 0, 0, 0).unwrap();
545    let expiration = Utc.with_ymd_and_hms(2021, 12, 17, 0, 0, 0).unwrap();
546    OptionContract::new(
547        InstrumentId::from("AAPL211217C00150000.OPRA"),
548        Symbol::from("AAPL211217C00150000"),
549        AssetClass::Equity,
550        Some(Ustr::from("GMNI")),
551        Ustr::from("AAPL"),
552        OptionKind::Call,
553        Price::from("149.0"),
554        Currency::USD(),
555        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
556        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
557        2,
558        Price::from("0.01"),
559        Quantity::from(1),
560        Quantity::from(1),
561        None,
562        None,
563        None,
564        None,
565        None,
566        None,
567        None,
568        None,
569        UnixNanos::default(),
570        UnixNanos::default(),
571    )
572}
573
574////////////////////////////////////////////////////////////////////////////////
575// OptionSpread
576////////////////////////////////////////////////////////////////////////////////
577
578#[fixture]
579pub fn option_spread() -> OptionSpread {
580    let activation = Utc.with_ymd_and_hms(2023, 11, 6, 20, 54, 7).unwrap();
581    let expiration = Utc.with_ymd_and_hms(2024, 2, 23, 22, 59, 0).unwrap();
582    OptionSpread::new(
583        InstrumentId::from("UD:U$: GN 2534559.GLBX"),
584        Symbol::from("UD:U$: GN 2534559"),
585        AssetClass::FX,
586        Some(Ustr::from("XCME")),
587        Ustr::from("SR3"),
588        Ustr::from("GN"),
589        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
590        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
591        Currency::USD(),
592        2,
593        Price::from("0.01"),
594        Quantity::from(1),
595        Quantity::from(1),
596        None,
597        None,
598        None,
599        None,
600        None,
601        None,
602        None,
603        None,
604        UnixNanos::default(),
605        UnixNanos::default(),
606    )
607}
608
609////////////////////////////////////////////////////////////////////////////////
610// BettingInstrument
611////////////////////////////////////////////////////////////////////////////////
612
613#[fixture]
614pub fn betting() -> BettingInstrument {
615    let raw_symbol = Symbol::new("1-123456789");
616    let id = InstrumentId::from(format!("{raw_symbol}.BETFAIR").as_str());
617    let event_type_id = 6423;
618    let event_type_name = Ustr::from("American Football");
619    let competition_id = 12282733;
620    let competition_name = Ustr::from("NFL");
621    let event_id = 29678534;
622    let event_name = Ustr::from("NFL");
623    let event_country_code = Ustr::from("GB");
624    let event_open_date = UnixNanos::from(
625        Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0)
626            .unwrap()
627            .timestamp_nanos_opt()
628            .unwrap() as u64,
629    );
630    let betting_type = Ustr::from("ODDS");
631    let market_id = Ustr::from("1-123456789");
632    let market_name = Ustr::from("AFC Conference Winner");
633    let market_type = Ustr::from("SPECIAL");
634    let market_start_time = UnixNanos::from(
635        Utc.with_ymd_and_hms(2022, 2, 7, 23, 30, 0)
636            .unwrap()
637            .timestamp_nanos_opt()
638            .unwrap() as u64,
639    );
640    let selection_id = 50214;
641    let selection_name = Ustr::from("Kansas City Chiefs");
642    let selection_handicap = 0.0;
643    let currency = Currency::GBP();
644    let price_increment = Price::from("0.01");
645    let size_increment = Quantity::from("0.01");
646    let max_quantity = Some(Quantity::from("1000"));
647    let min_quantity = Some(Quantity::from("1"));
648    let max_notional = Some(Money::from("10000 GBP"));
649    let min_notional = Some(Money::from("10 GBP"));
650    let max_price = Some(Price::from("100.00"));
651    let min_price = Some(Price::from("1.00"));
652    let margin_init = Some(Decimal::from(1));
653    let margin_maint = Some(Decimal::from(1));
654    let maker_fee = Some(Decimal::from(0));
655    let taker_fee = Some(Decimal::from(0));
656    let ts_event = UnixNanos::default();
657    let ts_init = UnixNanos::default();
658
659    BettingInstrument::new(
660        id,
661        raw_symbol,
662        event_type_id,
663        event_type_name,
664        competition_id,
665        competition_name,
666        event_id,
667        event_name,
668        event_country_code,
669        event_open_date,
670        betting_type,
671        market_id,
672        market_name,
673        market_type,
674        market_start_time,
675        selection_id,
676        selection_name,
677        selection_handicap,
678        currency,
679        price_increment.precision,
680        size_increment.precision,
681        price_increment,
682        size_increment,
683        max_quantity,
684        min_quantity,
685        max_notional,
686        min_notional,
687        max_price,
688        min_price,
689        margin_init,
690        margin_maint,
691        maker_fee,
692        taker_fee,
693        ts_event,
694        ts_init,
695    )
696}
697
698////////////////////////////////////////////////////////////////////////////////
699// BinaryOption
700////////////////////////////////////////////////////////////////////////////////
701
702#[fixture]
703pub fn binary_option() -> BinaryOption {
704    let raw_symbol = Symbol::new(
705        "0x12a0cb60174abc437bf1178367c72d11f069e1a3add20b148fb0ab4279b772b2-92544998123698303655208967887569360731013655782348975589292031774495159624905",
706    );
707    let activation = Utc.with_ymd_and_hms(2023, 11, 6, 20, 54, 7).unwrap();
708    let expiration = Utc.with_ymd_and_hms(2024, 2, 23, 22, 59, 0).unwrap();
709    let price_increment = Price::from("0.001");
710    let size_increment = Quantity::from("0.01");
711    BinaryOption::new(
712        InstrumentId::from("{raw_symbol}.POLYMARKET"),
713        raw_symbol,
714        AssetClass::Alternative,
715        Currency::USDC(),
716        UnixNanos::from(activation.timestamp_nanos_opt().unwrap() as u64),
717        UnixNanos::from(expiration.timestamp_nanos_opt().unwrap() as u64),
718        price_increment.precision,
719        size_increment.precision,
720        price_increment,
721        size_increment,
722        None,
723        None,
724        None,
725        None,
726        None,
727        None,
728        None,
729        None,
730        None,
731        None,
732        None,
733        None,
734        UnixNanos::default(),
735        UnixNanos::default(),
736    )
737}