Skip to main content

rust_okx/api/public_data/responses/
edge.rs

1use crate::model::{NumberString, deserialize_vec_or_empty_string};
2use serde::Deserialize;
3
4/// Option summary row.
5#[derive(Debug, Clone, Deserialize)]
6#[serde(rename_all = "camelCase")]
7#[non_exhaustive]
8pub struct OptionSummary {
9    /// Value returned by OKX in the `instType` field.
10    #[serde(default)]
11    pub inst_type: String,
12    /// Value returned by OKX in the `instId` field.
13    #[serde(default)]
14    pub inst_id: String,
15    /// Value returned by OKX in the `uly` field.
16    #[serde(default)]
17    pub uly: String,
18    /// Value returned by OKX in the `instFamily` field.
19    #[serde(default)]
20    pub inst_family: String,
21    /// Value returned by OKX in the `delta` field.
22    #[serde(default)]
23    pub delta: NumberString,
24    /// Value returned by OKX in the `gamma` field.
25    #[serde(default)]
26    pub gamma: NumberString,
27    /// Value returned by OKX in the `vega` field.
28    #[serde(default)]
29    pub vega: NumberString,
30    /// Value returned by OKX in the `theta` field.
31    #[serde(default)]
32    pub theta: NumberString,
33    /// Value returned by OKX in the `deltaBs` field.
34    #[serde(default)]
35    pub delta_bs: NumberString,
36    /// Value returned by OKX in the `gammaBs` field.
37    #[serde(default)]
38    pub gamma_bs: NumberString,
39    /// Value returned by OKX in the `vegaBs` field.
40    #[serde(default)]
41    pub vega_bs: NumberString,
42    /// Value returned by OKX in the `thetaBs` field.
43    #[serde(default)]
44    pub theta_bs: NumberString,
45    /// Value returned by OKX in the `lever` field.
46    #[serde(default)]
47    pub lever: NumberString,
48    /// Value returned by OKX in the `markVol` field.
49    #[serde(default)]
50    pub mark_vol: NumberString,
51    /// Value returned by OKX in the `realVol` field.
52    #[serde(default)]
53    pub real_vol: NumberString,
54    /// Value returned by OKX in the `volLv` field.
55    #[serde(default)]
56    pub vol_lv: NumberString,
57    /// Value returned by OKX in the `bidVol` field.
58    #[serde(default)]
59    pub bid_vol: NumberString,
60    /// Value returned by OKX in the `askVol` field.
61    #[serde(default)]
62    pub ask_vol: NumberString,
63    /// Value returned by OKX in the `fwdPx` field.
64    #[serde(default)]
65    pub fwd_px: NumberString,
66    /// Value returned by OKX in the `ts` field.
67    #[serde(default)]
68    pub ts: NumberString,
69}
70
71/// Estimated delivery or exercise price row.
72#[derive(Debug, Clone, Deserialize)]
73#[serde(rename_all = "camelCase")]
74#[non_exhaustive]
75pub struct EstimatedPrice {
76    /// Value returned by OKX in the `instType` field.
77    #[serde(default)]
78    pub inst_type: String,
79    /// Value returned by OKX in the `instId` field.
80    #[serde(default)]
81    pub inst_id: String,
82    /// Value returned by OKX in the `settlePx` field.
83    #[serde(default)]
84    pub settle_px: NumberString,
85    /// Value returned by OKX in the `ts` field.
86    #[serde(default)]
87    pub ts: NumberString,
88}
89
90/// Discount tier returned for interest-free quota calculations (legacy format).
91#[derive(Debug, Clone, Deserialize)]
92#[serde(rename_all = "camelCase")]
93#[non_exhaustive]
94pub struct DiscountLevel {
95    /// Value returned by OKX in the `discountRate` field.
96    #[serde(default)]
97    pub discount_rate: NumberString,
98    /// Value returned by OKX in the `minAmt` field.
99    #[serde(default)]
100    pub min_amt: NumberString,
101    /// Value returned by OKX in the `maxAmt` field.
102    #[serde(default)]
103    pub max_amt: NumberString,
104}
105
106/// Discount tier returned in the `details` array.
107#[derive(Debug, Clone, Deserialize)]
108#[serde(rename_all = "camelCase")]
109#[non_exhaustive]
110pub struct DiscountDetail {
111    /// Value returned by OKX in the `discountRate` field.
112    #[serde(default)]
113    pub discount_rate: NumberString,
114    /// Value returned by OKX in the `liqPenaltyRate` field.
115    #[serde(default)]
116    pub liq_penalty_rate: NumberString,
117    /// Value returned by OKX in the `minAmt` field.
118    #[serde(default)]
119    pub min_amt: NumberString,
120    /// Value returned by OKX in the `maxAmt` field.
121    #[serde(default)]
122    pub max_amt: NumberString,
123    /// Value returned by OKX in the `tier` field.
124    #[serde(default)]
125    pub tier: String,
126    /// Value returned by OKX in the `disCcyEq` field.
127    #[serde(default)]
128    pub dis_ccy_eq: NumberString,
129}
130
131/// Discount-rate and interest-free quota row.
132#[derive(Debug, Clone, Deserialize)]
133#[serde(rename_all = "camelCase")]
134#[non_exhaustive]
135pub struct DiscountRateInterestFreeQuota {
136    /// Value returned by OKX in the `ccy` field.
137    #[serde(default)]
138    pub ccy: String,
139    /// Value returned by OKX in the `amt` field.
140    #[serde(default)]
141    pub amt: NumberString,
142    /// Value returned by OKX in the `discountLv` field (discount level ID).
143    #[serde(default)]
144    pub discount_lv: String,
145    /// Value returned by OKX in the `details` field.
146    #[serde(default)]
147    pub details: Vec<DiscountDetail>,
148    /// Value returned by OKX in the `collateralRestrict` field.
149    #[serde(default)]
150    pub collateral_restrict: bool,
151    /// Value returned by OKX in the `minDiscountRate` field.
152    #[serde(default)]
153    pub min_discount_rate: NumberString,
154}
155
156/// Per-currency base rate and quota.
157#[derive(Debug, Clone, Deserialize)]
158#[serde(rename_all = "camelCase")]
159#[non_exhaustive]
160pub struct LoanQuotaBasic {
161    /// Value returned by OKX in the `ccy` field.
162    #[serde(default)]
163    pub ccy: String,
164    /// Value returned by OKX in the `rate` field.
165    #[serde(default)]
166    pub rate: NumberString,
167    /// Value returned by OKX in the `quota` field.
168    #[serde(default)]
169    pub quota: NumberString,
170}
171
172/// User-level quota coefficient.
173#[derive(Debug, Clone, Deserialize)]
174#[serde(rename_all = "camelCase")]
175#[non_exhaustive]
176pub struct LoanQuotaLevel {
177    /// Value returned by OKX in the `level` field.
178    #[serde(default)]
179    pub level: String,
180    /// Value returned by OKX in the `loanQuotaCoef` field.
181    #[serde(default)]
182    pub loan_quota_coef: NumberString,
183    /// Value returned by OKX in the `irDiscount` field.
184    #[serde(default)]
185    pub ir_discount: NumberString,
186}
187
188/// Currency with a customized interest rate.
189#[derive(Debug, Clone, Deserialize)]
190#[serde(rename_all = "camelCase")]
191#[non_exhaustive]
192pub struct LoanQuotaConfiguredCurrency {
193    /// Value returned by OKX in the `ccy` field.
194    #[serde(default)]
195    pub ccy: String,
196    /// Value returned by OKX in the `rate` field.
197    #[serde(default)]
198    pub rate: NumberString,
199}
200
201/// Customized absolute loan quota.
202#[derive(Debug, Clone, Deserialize)]
203#[serde(rename_all = "camelCase")]
204#[non_exhaustive]
205pub struct LoanQuotaConfig {
206    /// Value returned by OKX in the `ccy` field.
207    #[serde(default)]
208    pub ccy: String,
209    /// Value returned by OKX in the `stgyType` field.
210    #[serde(default)]
211    pub stgy_type: String,
212    /// Value returned by OKX in the `quota` field.
213    #[serde(default)]
214    pub quota: NumberString,
215    /// Value returned by OKX in the `level` field.
216    #[serde(default)]
217    pub level: String,
218}
219
220/// Interest-rate and loan-quota response row.
221#[derive(Debug, Clone, Deserialize)]
222#[serde(rename_all = "camelCase")]
223#[non_exhaustive]
224pub struct InterestRateLoanQuota {
225    /// Value returned by OKX in the `basic` field.
226    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
227    pub basic: Vec<LoanQuotaBasic>,
228    /// Value returned by OKX in the `vip` field.
229    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
230    pub vip: Vec<LoanQuotaLevel>,
231    /// Value returned by OKX in the `regular` field.
232    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
233    pub regular: Vec<LoanQuotaLevel>,
234    /// Value returned by OKX in the `configCcyList` field.
235    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
236    pub config_ccy_list: Vec<LoanQuotaConfiguredCurrency>,
237    /// Value returned by OKX in the `config` field.
238    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
239    pub config: Vec<LoanQuotaConfig>,
240}
241
242/// VIP interest-rate loan quota row.
243#[derive(Debug, Clone, Deserialize)]
244#[serde(rename_all = "camelCase")]
245#[non_exhaustive]
246pub struct VipInterestRateLoanQuota {
247    /// Value returned by OKX in the `ccy` field.
248    #[serde(default)]
249    pub ccy: String,
250    /// Value returned by OKX in the `level` field.
251    #[serde(default)]
252    pub level: String,
253    /// Value returned by OKX in the `rate` field.
254    #[serde(default)]
255    pub rate: NumberString,
256    /// Value returned by OKX in the `quota` field.
257    #[serde(default)]
258    pub quota: NumberString,
259}
260
261/// A single price range and tick-size definition.
262#[derive(Debug, Clone, Deserialize)]
263#[serde(rename_all = "camelCase")]
264#[non_exhaustive]
265pub struct TickBandDetail {
266    /// Value returned by OKX in the `minPx` field.
267    #[serde(default)]
268    pub min_px: NumberString,
269    /// Value returned by OKX in the `maxPx` field.
270    #[serde(default)]
271    pub max_px: NumberString,
272    /// Value returned by OKX in the `tickSz` field.
273    #[serde(default)]
274    pub tick_sz: NumberString,
275}
276
277/// Instrument tick-band row.
278#[derive(Debug, Clone, Deserialize)]
279#[serde(rename_all = "camelCase")]
280#[non_exhaustive]
281pub struct InstrumentTickBand {
282    /// Value returned by OKX in the `instType` field.
283    #[serde(default)]
284    pub inst_type: String,
285    /// Value returned by OKX in the `instFamily` field.
286    #[serde(default)]
287    pub inst_family: String,
288    /// Value returned by OKX in the `tickBand` field.
289    #[serde(default, deserialize_with = "deserialize_vec_or_empty_string")]
290    pub tick_band: Vec<TickBandDetail>,
291    /// Value returned by OKX in the `ts` field.
292    #[serde(default)]
293    pub ts: NumberString,
294}
295
296/// Public option-trade row.
297#[derive(Debug, Clone, Deserialize)]
298#[serde(rename_all = "camelCase")]
299#[non_exhaustive]
300pub struct PublicOptionTrade {
301    /// Value returned by OKX in the `instId` field.
302    #[serde(default)]
303    pub inst_id: String,
304    /// Value returned by OKX in the `tradeId` field.
305    #[serde(default)]
306    pub trade_id: String,
307    /// Value returned by OKX in the `px` field.
308    #[serde(default)]
309    pub px: NumberString,
310    /// Value returned by OKX in the `sz` field.
311    #[serde(default)]
312    pub sz: NumberString,
313    /// Value returned by OKX in the `side` field.
314    #[serde(default)]
315    pub side: String,
316    /// Value returned by OKX in the `fillVol` field.
317    #[serde(default)]
318    pub fill_vol: NumberString,
319    /// Value returned by OKX in the `fwdPx` field.
320    #[serde(default)]
321    pub fwd_px: NumberString,
322    /// Value returned by OKX in the `idxPx` field.
323    #[serde(default)]
324    pub idx_px: NumberString,
325    /// Value returned by OKX in the `markPx` field.
326    #[serde(default)]
327    pub mark_px: NumberString,
328    /// Value returned by OKX in the `ts` field.
329    #[serde(default)]
330    pub ts: NumberString,
331}
332
333/// Market-data history row.
334#[derive(Debug, Clone, Deserialize)]
335#[serde(rename_all = "camelCase")]
336#[non_exhaustive]
337pub struct MarketDataHistory {
338    /// Value returned by OKX in the `module` field.
339    #[serde(default)]
340    pub module: String,
341    /// Value returned by OKX in the `instType` field.
342    #[serde(default)]
343    pub inst_type: String,
344    /// Value returned by OKX in the `instId` field.
345    #[serde(default)]
346    pub inst_id: String,
347    /// Value returned by OKX in the `dateAggrType` field.
348    #[serde(default)]
349    pub date_aggr_type: String,
350    /// Value returned by OKX in the `value` field.
351    #[serde(default)]
352    pub value: NumberString,
353    /// Value returned by OKX in the `ts` field.
354    #[serde(default)]
355    pub ts: NumberString,
356}
357
358#[cfg(test)]
359mod tests {
360    use super::*;
361
362    #[test]
363    fn option_summary_ignores_future_fields() {
364        let row: OptionSummary = serde_json::from_str(
365            r#"{"instType":"OPTION","instId":"BTC-USD-1-C","delta":"0.5","futureField":"ok"}"#,
366        )
367        .unwrap();
368        assert_eq!(row.inst_type, "OPTION");
369        assert_eq!(row.inst_id, "BTC-USD-1-C");
370    }
371}