Skip to main content

rust_okx/api/market/
api.rs

1use crate::client::OkxClient;
2use crate::error::Error;
3use crate::model::EmptyRequest;
4use crate::transport::Transport;
5
6use super::endpoints::*;
7use super::requests::*;
8use super::responses::*;
9
10/// Accessor for the public market-data endpoints.
11///
12/// Obtain one via [`OkxClient::market`](crate::OkxClient::market).
13pub struct Market<'a, T> {
14    client: &'a OkxClient<T>,
15}
16
17impl<'a, T: Transport> Market<'a, T> {
18    pub(crate) fn new(client: &'a OkxClient<T>) -> Self {
19        Self { client }
20    }
21
22    /// Retrieve the latest ticker for a single instrument.
23    ///
24    /// `GET /api/v5/market/ticker`. Public (unauthenticated). The returned
25    /// vector contains exactly one [`Ticker`].
26    ///
27    /// # Errors
28    ///
29    /// Returns [`RestError::Okx`](crate::RestError::Okx) on a non-zero OKX code, or
30    /// [`RestError::Transport`](crate::RestError::Transport)/[`RestError::Decode`](crate::RestError::Decode) on transport/parsing failure.
31    pub async fn get_ticker(&self, request: &InstIdRequest<'_>) -> Result<Vec<Ticker>, Error> {
32        self.client.get(TICKER, request, false).await
33    }
34
35    /// Retrieve tickers for an instrument type.
36    ///
37    /// `GET /api/v5/market/tickers`. Public. `underlying` and `inst_family`
38    /// are useful for derivatives and omitted when `None`.
39    ///
40    /// # Errors
41    ///
42    /// See [`get_ticker`](Self::get_ticker).
43    pub async fn get_tickers(&self, request: &TickersRequest<'_>) -> Result<Vec<Ticker>, Error> {
44        self.client.get(TICKERS, request, false).await
45    }
46
47    /// Retrieve index tickers.
48    ///
49    /// `GET /api/v5/market/index-tickers`. Public. Filter by quote currency,
50    /// index instrument ID, or neither.
51    ///
52    /// # Errors
53    ///
54    /// See [`get_ticker`](Self::get_ticker).
55    pub async fn get_index_tickers(
56        &self,
57        request: &IndexTickersRequest<'_>,
58    ) -> Result<Vec<IndexTicker>, Error> {
59        self.client.get(INDEX_TICKERS, request, false).await
60    }
61
62    /// Retrieve the order book for an instrument.
63    ///
64    /// `GET /api/v5/market/books`. `depth` is the number of levels per side
65    /// (OKX default 1, max 400). Public.
66    ///
67    /// # Errors
68    ///
69    /// See [`get_ticker`](Self::get_ticker).
70    pub async fn get_orderbook(
71        &self,
72        request: &OrderBookRequest<'_>,
73    ) -> Result<Vec<OrderBook>, Error> {
74        self.client.get(BOOKS, request, false).await
75    }
76
77    /// Retrieve candlestick (OHLCV) data.
78    ///
79    /// `GET /api/v5/market/candles`. `bar` is the bar size, e.g. `1m`, `1H`,
80    /// `1D` (OKX default `1m`). `limit` caps the number of bars (max 300).
81    /// Public.
82    ///
83    /// # Errors
84    ///
85    /// See [`get_ticker`](Self::get_ticker).
86    pub async fn get_candlesticks(
87        &self,
88        request: &CandlesRequest<'_>,
89    ) -> Result<Vec<Candle>, Error> {
90        self.client.get(CANDLES, request, false).await
91    }
92
93    /// Retrieve historical candlestick data for top currencies.
94    ///
95    /// `GET /api/v5/market/history-candles`. Public.
96    ///
97    /// # Errors
98    ///
99    /// See [`get_ticker`](Self::get_ticker).
100    pub async fn get_history_candlesticks(
101        &self,
102        request: &CandlesticksRequest<'_>,
103    ) -> Result<Vec<Candle>, Error> {
104        self.client.get(HISTORY_CANDLES, request, false).await
105    }
106
107    /// Retrieve index candlestick data.
108    ///
109    /// `GET /api/v5/market/index-candles`. Public.
110    ///
111    /// # Errors
112    ///
113    /// See [`get_ticker`](Self::get_ticker).
114    pub async fn get_index_candlesticks(
115        &self,
116        request: &CandlesticksRequest<'_>,
117    ) -> Result<Vec<IndexCandle>, Error> {
118        self.client.get(INDEX_CANDLES, request, false).await
119    }
120
121    /// Retrieve mark-price candlestick data.
122    ///
123    /// `GET /api/v5/market/mark-price-candles`. Public.
124    ///
125    /// # Errors
126    ///
127    /// See [`get_ticker`](Self::get_ticker).
128    pub async fn get_mark_price_candlesticks(
129        &self,
130        request: &CandlesticksRequest<'_>,
131    ) -> Result<Vec<IndexCandle>, Error> {
132        self.client.get(MARK_PRICE_CANDLES, request, false).await
133    }
134
135    /// Retrieve recent trades for an instrument.
136    ///
137    /// `GET /api/v5/market/trades`. Public.
138    ///
139    /// # Errors
140    ///
141    /// See [`get_ticker`](Self::get_ticker).
142    pub async fn get_trades(&self, request: &TradesRequest<'_>) -> Result<Vec<MarketTrade>, Error> {
143        self.client.get(TRADES, request, false).await
144    }
145
146    /// Retrieve historical trades for an instrument.
147    ///
148    /// `GET /api/v5/market/history-trades`. Public.
149    ///
150    /// # Errors
151    ///
152    /// See [`get_ticker`](Self::get_ticker).
153    pub async fn get_history_trades(
154        &self,
155        request: &HistoryTradesRequest<'_>,
156    ) -> Result<Vec<MarketTrade>, Error> {
157        self.client.get(HISTORY_TRADES, request, false).await
158    }
159
160    /// Retrieve OKX platform 24-hour volume.
161    ///
162    /// `GET /api/v5/market/platform-24-volume`. Public.
163    ///
164    /// # Errors
165    ///
166    /// See [`get_ticker`](Self::get_ticker).
167    pub async fn get_platform_24_volume(&self) -> Result<Vec<PlatformVolume>, Error> {
168        self.client
169            .get(PLATFORM_24_VOLUME, &EmptyRequest {}, false)
170            .await
171    }
172
173    /// Retrieve index components.
174    ///
175    /// `GET /api/v5/market/index-components`. Public.
176    ///
177    /// # Errors
178    ///
179    /// See [`get_ticker`](Self::get_ticker).
180    pub async fn get_index_components(
181        &self,
182        request: &IndexRequest<'_>,
183    ) -> Result<Vec<IndexComponents>, Error> {
184        self.client.get(INDEX_COMPONENTS, request, false).await
185    }
186
187    /// Retrieve the USD/CNY exchange rate used by OKX.
188    ///
189    /// `GET /api/v5/market/exchange-rate`. Public.
190    ///
191    /// # Errors
192    ///
193    /// See [`get_ticker`](Self::get_ticker).
194    pub async fn get_exchange_rate(&self) -> Result<Vec<ExchangeRate>, Error> {
195        self.client
196            .get(EXCHANGE_RATE, &EmptyRequest {}, false)
197            .await
198    }
199
200    /// Retrieve a block-trading ticker for a single instrument.
201    ///
202    /// `GET /api/v5/market/block-ticker`. Public.
203    ///
204    /// # Errors
205    ///
206    /// See [`get_ticker`](Self::get_ticker).
207    pub async fn get_block_ticker(
208        &self,
209        request: &InstIdRequest<'_>,
210    ) -> Result<Vec<BlockTicker>, Error> {
211        self.client.get(BLOCK_TICKER, request, false).await
212    }
213
214    /// Retrieve block-trading tickers for an instrument type.
215    ///
216    /// `GET /api/v5/market/block-tickers`. Public.
217    ///
218    /// # Errors
219    ///
220    /// See [`get_ticker`](Self::get_ticker).
221    pub async fn get_block_tickers(
222        &self,
223        request: &TickersRequest<'_>,
224    ) -> Result<Vec<BlockTicker>, Error> {
225        self.client.get(BLOCK_TICKERS, request, false).await
226    }
227
228    /// Retrieve option trades aggregated by instrument family.
229    ///
230    /// `GET /api/v5/market/option/instrument-family-trades`. Public.
231    ///
232    /// # Errors
233    ///
234    /// See [`get_ticker`](Self::get_ticker).
235    pub async fn get_option_instrument_family_trades(
236        &self,
237        request: &InstFamilyRequest<'_>,
238    ) -> Result<Vec<OptionFamilyTradeGroup>, Error> {
239        self.client
240            .get(OPTION_INSTRUMENT_FAMILY_TRADES, request, false)
241            .await
242    }
243}