Skip to main content

xapi_okx/data/
instrument.rs

1use crate::data::{
2    contract_type::OkxContractType, instrument_state::OkxInstrumentState,
3    instrument_type::OkxInstrumentType, option_type::OkxOptionType,
4};
5use chrono::{DateTime, Utc};
6use rust_decimal::Decimal;
7use serde::{Deserialize, Serialize};
8use serde_with::{TimestampMilliSeconds, formats::Flexible};
9use typed_builder::TypedBuilder;
10use xapi_shared::{
11    data::{crypto_asset::CryptoAsset, crypto_symbol::CryptoSymbol},
12    repr::de_datetime::deserialize_empty_or_datetime,
13};
14
15#[derive(Debug, Serialize, TypedBuilder)]
16pub struct OkxInstrumentParams {
17    #[serde(rename = "instType")]
18    instrument_type: OkxInstrumentType,
19    /// Only applicable to FUTURES/SWAP/OPTION.If instType is OPTION, either uly or instFamily is required.
20    #[serde(rename = "uly", skip_serializing_if = "Option::is_none")]
21    #[builder(default, setter(strip_option, into))]
22    underlying: Option<CryptoSymbol>,
23    /// Only applicable to FUTURES/SWAP/OPTION. If instType is OPTION, either uly or instFamily is required.
24    #[serde(rename = "instFamily", skip_serializing_if = "Option::is_none")]
25    #[builder(default, setter(strip_option, into))]
26    instrument_family: Option<CryptoSymbol>,
27    #[serde(rename = "instId", skip_serializing_if = "Option::is_none")]
28    #[builder(default, setter(into))]
29    instrument_id: Option<CryptoSymbol>,
30}
31
32#[serde_with::serde_as]
33#[derive(Debug, Deserialize)]
34#[serde(rename_all = "camelCase")]
35pub struct OkxInstrument {
36    #[serde(rename = "instId")]
37    pub instrument_id: CryptoSymbol,
38    #[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
39    pub list_time: DateTime<Utc>,
40    #[serde(rename = "expTime", deserialize_with = "deserialize_empty_or_datetime")]
41    pub expiry_time: Option<DateTime<Utc>>,
42    #[serde(rename = "tickSz")]
43    pub tick_size: Decimal,
44    #[serde(rename = "lotSz")]
45    pub lot_size: Decimal,
46    #[serde(rename = "minSz")]
47    pub min_size: Decimal,
48    pub state: OkxInstrumentState,
49    #[serde(flatten)]
50    pub extra: OkxInstrumentExtra,
51}
52
53#[derive(Debug, Deserialize)]
54#[serde(tag = "instType", rename_all = "UPPERCASE")]
55pub enum OkxInstrumentExtra {
56    Spot {
57        #[serde(rename = "baseCcy")]
58        base_currency: CryptoAsset,
59        #[serde(rename = "quoteCcy")]
60        quote_currency: CryptoAsset,
61    },
62    Margin {
63        #[serde(rename = "uly")]
64        underlying: CryptoSymbol,
65        #[serde(rename = "instFamily")]
66        instrument_family: CryptoSymbol,
67        #[serde(rename = "baseCcy")]
68        base_currency: CryptoAsset,
69        #[serde(rename = "quoteCcy")]
70        quote_currency: CryptoAsset,
71        #[serde(rename = "lever")]
72        leverage: Decimal,
73    },
74    Futures {
75        #[serde(rename = "uly")]
76        underlying: CryptoSymbol,
77        #[serde(rename = "instFamily")]
78        instrument_family: CryptoSymbol,
79        #[serde(rename = "settleCcy")]
80        settlement_currency: CryptoAsset,
81        #[serde(rename = "ctVal")]
82        contract_value: Decimal,
83        #[serde(rename = "ctMult")]
84        contract_multiplier: Decimal,
85        #[serde(rename = "ctValCcy")]
86        contract_value_currency: CryptoAsset,
87        #[serde(rename = "lever")]
88        leverage: Decimal,
89        #[serde(rename = "ctType")]
90        contract_type: OkxContractType,
91    },
92    Swap {
93        #[serde(rename = "uly")]
94        underlying: CryptoSymbol,
95        #[serde(rename = "instFamily")]
96        instrument_family: CryptoSymbol,
97        #[serde(rename = "settleCcy")]
98        settlement_currency: CryptoAsset,
99        #[serde(rename = "ctVal")]
100        contract_value: Decimal,
101        #[serde(rename = "ctMult")]
102        contract_multiplier: Decimal,
103        #[serde(rename = "ctValCcy")]
104        contract_value_currency: CryptoAsset,
105        #[serde(rename = "lever")]
106        leverage: Decimal,
107        #[serde(rename = "ctType")]
108        contract_type: OkxContractType,
109    },
110    Option {
111        #[serde(rename = "uly")]
112        underlying: CryptoSymbol,
113        #[serde(rename = "instFamily")]
114        instrument_family: CryptoSymbol,
115        #[serde(rename = "settleCcy")]
116        settlement_currency: CryptoAsset,
117        #[serde(rename = "ctVal")]
118        contract_value: Decimal,
119        #[serde(rename = "ctMult")]
120        contract_multiplier: Decimal,
121        #[serde(rename = "ctValCcy")]
122        contract_value_currency: CryptoAsset,
123        #[serde(rename = "optType")]
124        option_type: OkxOptionType,
125        #[serde(rename = "stk")]
126        strike_price: Decimal,
127    },
128}