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}