Skip to main content

rust_okx/api/market/
responses.rs

1use serde::Deserialize;
2
3use crate::{NumberString, model::InstType};
4
5/// The latest ticker snapshot for an instrument.
6#[derive(Debug, Clone, Deserialize)]
7#[serde(rename_all = "camelCase")]
8#[non_exhaustive]
9pub struct Ticker {
10    /// Instrument type.
11    pub inst_type: InstType,
12    /// Instrument ID, e.g. `BTC-USDT`.
13    pub inst_id: String,
14    /// Last traded price.
15    pub last: NumberString,
16    /// Last traded size.
17    #[serde(default)]
18    pub last_sz: NumberString,
19    /// Best ask price.
20    #[serde(default)]
21    pub ask_px: NumberString,
22    /// Best ask size.
23    #[serde(default)]
24    pub ask_sz: NumberString,
25    /// Best bid price.
26    #[serde(default)]
27    pub bid_px: NumberString,
28    /// Best bid size.
29    #[serde(default)]
30    pub bid_sz: NumberString,
31    /// Open price over the last 24 hours.
32    #[serde(default)]
33    pub open24h: NumberString,
34    /// Highest price over the last 24 hours.
35    #[serde(default)]
36    pub high24h: NumberString,
37    /// Lowest price over the last 24 hours.
38    #[serde(default)]
39    pub low24h: NumberString,
40    /// Trading volume (base ccy) over the last 24 hours.
41    #[serde(default)]
42    pub vol24h: NumberString,
43    /// Trading volume (quote ccy) over the last 24 hours.
44    #[serde(default)]
45    pub vol_ccy24h: NumberString,
46    /// Ticker timestamp (Unix milliseconds).
47    pub ts: NumberString,
48}
49
50/// The latest index ticker snapshot.
51#[derive(Debug, Clone, Deserialize)]
52#[serde(rename_all = "camelCase")]
53#[non_exhaustive]
54pub struct IndexTicker {
55    /// Index instrument ID, e.g. `BTC-USD`.
56    pub inst_id: String,
57    /// Index price.
58    #[serde(default)]
59    pub idx_px: NumberString,
60    /// Open price over the last 24 hours.
61    #[serde(default)]
62    pub open24h: NumberString,
63    /// Highest price over the last 24 hours.
64    #[serde(default)]
65    pub high24h: NumberString,
66    /// Lowest price over the last 24 hours.
67    #[serde(default)]
68    pub low24h: NumberString,
69    /// Timestamp (Unix milliseconds).
70    #[serde(default)]
71    pub ts: NumberString,
72}
73
74/// An order book snapshot.
75#[derive(Debug, Clone, Deserialize)]
76#[non_exhaustive]
77pub struct OrderBook {
78    /// Ask levels, sorted from best (lowest) price.
79    pub asks: Vec<OrderBookLevel>,
80    /// Bid levels, sorted from best (highest) price.
81    pub bids: Vec<OrderBookLevel>,
82    /// Snapshot timestamp (Unix milliseconds).
83    pub ts: NumberString,
84}
85
86/// A single price level in an [`OrderBook`].
87///
88/// On the wire OKX encodes a level as the array
89/// `[price, size, deprecated, order_count]`.
90#[derive(Debug, Clone, Deserialize)]
91#[serde(from = "BookLevelRaw")]
92#[non_exhaustive]
93pub struct OrderBookLevel {
94    /// Price at this level.
95    pub price: NumberString,
96    /// Aggregated size available at this level.
97    pub size: NumberString,
98    /// Deprecated field (always `0`), retained for wire compatibility.
99    pub deprecated: NumberString,
100    /// Number of orders aggregated at this level.
101    pub order_count: NumberString,
102}
103
104type BookLevelRaw = (NumberString, NumberString, NumberString, NumberString);
105
106impl From<BookLevelRaw> for OrderBookLevel {
107    fn from(raw: BookLevelRaw) -> Self {
108        Self {
109            price: raw.0,
110            size: raw.1,
111            deprecated: raw.2,
112            order_count: raw.3,
113        }
114    }
115}
116
117/// A single candlestick (OHLCV) bar.
118///
119/// On the wire OKX encodes a bar as a 9-element string array.
120#[derive(Debug, Clone, Deserialize)]
121#[serde(from = "CandleRaw")]
122#[non_exhaustive]
123pub struct Candle {
124    /// Opening timestamp (Unix milliseconds).
125    pub ts: NumberString,
126    /// Open price.
127    pub open: NumberString,
128    /// Highest price.
129    pub high: NumberString,
130    /// Lowest price.
131    pub low: NumberString,
132    /// Close price.
133    pub close: NumberString,
134    /// Trading volume in contracts / base currency.
135    pub vol: NumberString,
136    /// Trading volume in quote currency.
137    pub vol_ccy: NumberString,
138    /// Trading volume in quote currency (alternate calculation).
139    pub vol_ccy_quote: NumberString,
140    /// `1` if the bar is closed/confirmed, `0` otherwise.
141    pub confirm: NumberString,
142}
143
144type CandleRaw = (
145    NumberString,
146    NumberString,
147    NumberString,
148    NumberString,
149    NumberString,
150    NumberString,
151    NumberString,
152    NumberString,
153    NumberString,
154);
155
156impl From<CandleRaw> for Candle {
157    fn from(raw: CandleRaw) -> Self {
158        Self {
159            ts: raw.0,
160            open: raw.1,
161            high: raw.2,
162            low: raw.3,
163            close: raw.4,
164            vol: raw.5,
165            vol_ccy: raw.6,
166            vol_ccy_quote: raw.7,
167            confirm: raw.8,
168        }
169    }
170}
171
172/// A public trade record.
173#[derive(Debug, Clone, Deserialize)]
174#[serde(rename_all = "camelCase")]
175#[non_exhaustive]
176pub struct MarketTrade {
177    /// Instrument ID.
178    pub inst_id: String,
179    /// Trade ID.
180    #[serde(default)]
181    pub trade_id: String,
182    /// Trade price.
183    #[serde(default)]
184    pub px: NumberString,
185    /// Trade size.
186    #[serde(default)]
187    pub sz: NumberString,
188    /// Trade side (`buy` or `sell`).
189    #[serde(default)]
190    pub side: String,
191    /// Trade timestamp (Unix milliseconds).
192    #[serde(default)]
193    pub ts: NumberString,
194}
195
196/// A block-trading ticker snapshot.
197///
198/// OKX block ticker rows are sparser than regular ticker rows, so fields that
199/// are required by [`Ticker`] are optional/defaulted here.
200#[derive(Debug, Clone, Deserialize)]
201#[serde(rename_all = "camelCase")]
202#[non_exhaustive]
203pub struct BlockTicker {
204    /// Instrument type, when present.
205    #[serde(default)]
206    pub inst_type: String,
207    /// Instrument ID, e.g. `BTC-USDT-SWAP`.
208    #[serde(default)]
209    pub inst_id: String,
210    /// Last traded price, when present.
211    #[serde(default)]
212    pub last: NumberString,
213    /// Last traded size, when present.
214    #[serde(default)]
215    pub last_sz: NumberString,
216    /// Best ask price, when present.
217    #[serde(default)]
218    pub ask_px: NumberString,
219    /// Best ask size, when present.
220    #[serde(default)]
221    pub ask_sz: NumberString,
222    /// Best bid price, when present.
223    #[serde(default)]
224    pub bid_px: NumberString,
225    /// Best bid size, when present.
226    #[serde(default)]
227    pub bid_sz: NumberString,
228    /// Open price over the last 24 hours, when present.
229    #[serde(default)]
230    pub open24h: NumberString,
231    /// Highest price over the last 24 hours, when present.
232    #[serde(default)]
233    pub high24h: NumberString,
234    /// Lowest price over the last 24 hours, when present.
235    #[serde(default)]
236    pub low24h: NumberString,
237    /// Trading volume over the last 24 hours, when present.
238    #[serde(default)]
239    pub vol24h: NumberString,
240    /// Trading volume in currency units over the last 24 hours, when present.
241    #[serde(default)]
242    pub vol_ccy24h: NumberString,
243    /// Ticker timestamp (Unix milliseconds), when present.
244    #[serde(default)]
245    pub ts: NumberString,
246}
247
248/// A public block-trade record.
249pub type BlockTrade = MarketTrade;
250
251/// A public option trade record grouped by instrument family.
252#[derive(Debug, Clone, Deserialize)]
253#[serde(rename_all = "camelCase")]
254#[non_exhaustive]
255pub struct OptionInstrumentFamilyTrade {
256    /// Instrument ID, when present.
257    #[serde(default)]
258    pub inst_id: String,
259    /// Instrument family, when present.
260    #[serde(default)]
261    pub inst_family: String,
262    /// Trade ID, when present.
263    #[serde(default)]
264    pub trade_id: String,
265    /// Trade price.
266    #[serde(default)]
267    pub px: NumberString,
268    /// Trade size.
269    #[serde(default)]
270    pub sz: NumberString,
271    /// Trade side (`buy` or `sell`), when present.
272    #[serde(default)]
273    pub side: String,
274    /// Trade timestamp (Unix milliseconds), when present.
275    #[serde(default)]
276    pub ts: NumberString,
277}
278
279/// OKX platform 24-hour trading volume.
280#[derive(Debug, Clone, Deserialize)]
281#[serde(rename_all = "camelCase")]
282#[non_exhaustive]
283pub struct PlatformVolume {
284    /// 24-hour volume in USD.
285    #[serde(default)]
286    pub vol_usd: NumberString,
287    /// 24-hour volume in CNY.
288    #[serde(default)]
289    pub vol_cny: NumberString,
290}
291
292/// The components that make up an OKX index.
293#[derive(Debug, Clone, Deserialize)]
294#[serde(rename_all = "camelCase")]
295#[non_exhaustive]
296pub struct IndexComponents {
297    /// Index name.
298    #[serde(default)]
299    pub index: String,
300    /// Component list.
301    #[serde(default)]
302    pub components: Vec<IndexComponent>,
303    /// Timestamp (Unix milliseconds).
304    #[serde(default)]
305    pub ts: NumberString,
306}
307
308/// A single index component.
309#[derive(Debug, Clone, Deserialize)]
310#[serde(rename_all = "camelCase")]
311#[non_exhaustive]
312pub struct IndexComponent {
313    /// Exchange name.
314    #[serde(default)]
315    pub exch: String,
316    /// Symbol used by the component exchange.
317    #[serde(default)]
318    pub symbol: String,
319    /// Component price.
320    #[serde(default)]
321    pub sym_px: NumberString,
322    /// Component weight.
323    #[serde(default)]
324    pub wgt: NumberString,
325    /// Conversion price.
326    #[serde(default)]
327    pub cnv_px: NumberString,
328}
329
330/// The USD/CNY exchange rate.
331#[derive(Debug, Clone, Deserialize)]
332#[serde(rename_all = "camelCase")]
333#[non_exhaustive]
334pub struct ExchangeRate {
335    /// USD/CNY rate.
336    #[serde(default)]
337    pub usd_cny: NumberString,
338}