xapi_okx/data/
instrument.rs1use 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 #[serde(rename = "uly", skip_serializing_if = "Option::is_none")]
21 #[builder(default, setter(strip_option, into))]
22 underlying: Option<CryptoSymbol>,
23 #[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}