Skip to main content

nautilus_okx/websocket/
enums.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2026 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16//! Enumerations representing OKX WebSocket message metadata and codes.
17
18use serde::{Deserialize, Serialize};
19use strum::{AsRefStr, Display, EnumIter, EnumString};
20
21/// Error types that can be returned by the WebSocket API.
22#[derive(
23    Clone,
24    Debug,
25    Display,
26    PartialEq,
27    Eq,
28    Hash,
29    AsRefStr,
30    EnumIter,
31    EnumString,
32    Serialize,
33    Deserialize,
34)]
35#[serde(rename_all = "camelCase")]
36pub enum OKXWsErrorType {
37    /// General error.
38    Error,
39    /// Error during subscription.
40    SubscriptionError,
41    /// Error during unsubscription.
42    UnsubscriptionError,
43    /// Authentication failure.
44    AuthenticationError,
45    /// Rate limit exceeded.
46    RateLimit,
47}
48
49/// Operation type for WebSocket commands.
50#[derive(
51    Clone,
52    Debug,
53    Display,
54    PartialEq,
55    Eq,
56    Hash,
57    AsRefStr,
58    EnumIter,
59    EnumString,
60    Serialize,
61    Deserialize,
62)]
63#[serde(rename_all = "kebab-case")]
64pub enum OKXWsOperation {
65    /// Subscribes to one or more topics.
66    Subscribe,
67    /// Unsubscribe from one or more topics.
68    Unsubscribe,
69    /// Place a new order.
70    Order,
71    /// Cancel an existing order.
72    CancelOrder,
73    /// Amend an existing order.
74    AmendOrder,
75    /// Place multiple orders.
76    BatchOrders,
77    /// Cancel multiple orders.
78    BatchCancelOrders,
79    /// Amend multiple orders.
80    BatchAmendOrders,
81    /// Mass cancel all orders for an instrument.
82    MassCancel,
83    /// Place a new algo order.
84    OrderAlgo,
85    /// Cancel algo orders.
86    CancelAlgos,
87}
88
89#[derive(
90    Clone,
91    Debug,
92    Display,
93    PartialEq,
94    Eq,
95    Hash,
96    AsRefStr,
97    EnumIter,
98    EnumString,
99    Serialize,
100    Deserialize,
101)]
102#[serde(rename_all = "camelCase")]
103pub enum OKXSubscriptionEvent {
104    Subscribe,
105    Unsubscribe,
106}
107
108#[derive(
109    Clone,
110    Debug,
111    Display,
112    PartialEq,
113    Eq,
114    Hash,
115    AsRefStr,
116    EnumIter,
117    EnumString,
118    Serialize,
119    Deserialize,
120)]
121pub enum OKXWsChannel {
122    // Public Channels
123    #[serde(rename = "instruments")]
124    Instruments,
125    #[serde(rename = "tickers")]
126    Tickers,
127    #[serde(rename = "open-interest")]
128    OpenInterest,
129    #[serde(rename = "trades")]
130    Trades,
131    #[serde(rename = "trades-all")]
132    TradesAll,
133    #[serde(rename = "estimated-price")]
134    EstimatedPrice,
135    #[serde(rename = "mark-price")]
136    MarkPrice,
137    #[serde(rename = "price-limit")]
138    PriceLimit,
139    #[serde(rename = "books")]
140    Books, // Default depth
141    #[serde(rename = "books5")]
142    Books5,
143    #[serde(rename = "books50-l2-tbt")]
144    Books50Tbt,
145    #[serde(rename = "books-l2-tbt")]
146    BooksTbt,
147    #[serde(rename = "bbo-tbt")]
148    BboTbt,
149    #[serde(rename = "opt-summary")]
150    OptionSummary,
151    #[serde(rename = "funding-rate")]
152    FundingRate,
153    #[serde(rename = "event-contract-markets")]
154    EventContractMarkets,
155    #[serde(rename = "index-tickers")]
156    IndexTickers,
157    #[serde(rename = "status")]
158    Status,
159    // Private Channels
160    #[serde(rename = "account")]
161    Account,
162    #[serde(rename = "positions")]
163    Positions,
164    // #[display(fmt = "balance_and_position")]
165    // BalanceAndPosition,
166    #[serde(rename = "orders")]
167    Orders,
168    #[serde(rename = "sprd-orders")]
169    SprdOrders,
170    #[serde(rename = "sprd-bbo-tbt")]
171    SprdBboTbt,
172    #[serde(rename = "sprd-books5")]
173    SprdBooks5,
174    #[serde(rename = "sprd-public-trades")]
175    SprdPublicTrades,
176    #[serde(rename = "fills")]
177    Fills,
178    #[serde(rename = "orders-algo")]
179    OrdersAlgo,
180    #[serde(rename = "algo-advance")]
181    AlgoAdvance,
182    // #[display(fmt = "liquidation-warning")]
183    // LiquidationWarning,
184    // #[display(fmt = "account-greeks")]
185    // AccountGreeks,
186    // #[display(fmt = "rfqs")]
187    // Rfqs,
188    // #[serde(rename = "quotes")]
189    // Quotes,
190    // #[display(fmt = "structure-block-trades")]
191    // StructuredBlock,
192    // #[display(fmt = "spreads")]
193    // Spreads,
194    //
195    // // Trading Channels
196    // #[display(fmt = "orders-spot-margin")]
197    // SpotMarginOrders,
198    // #[display(fmt = "orders-futures")]
199    // FuturesOrders,
200    // #[display(fmt = "orders-swap")]
201    // SwapOrders,
202    // #[display(fmt = "orders-option")]
203    // OptionOrders,
204    //
205    // // Business Channels
206    // #[display(fmt = "deposit-info")]
207    // DepositInfo,
208    // #[display(fmt = "withdrawal-info")]
209    // WithdrawalInfo,
210
211    // Candlesticks
212    #[serde(rename = "candle1s")]
213    Candle1Second,
214    #[serde(rename = "candle1m")]
215    Candle1Minute,
216    #[serde(rename = "candle3m")]
217    Candle3Minute,
218    #[serde(rename = "candle5m")]
219    Candle5Minute,
220    #[serde(rename = "candle15m")]
221    Candle15Minute,
222    #[serde(rename = "candle30m")]
223    Candle30Minute,
224    #[serde(rename = "candle1H")]
225    Candle1Hour,
226    #[serde(rename = "candle2H")]
227    Candle2Hour,
228    #[serde(rename = "candle4H")]
229    Candle4Hour,
230    #[serde(rename = "candle6H")]
231    Candle6Hour,
232    #[serde(rename = "candle12H")]
233    Candle12Hour,
234    #[serde(rename = "candle1D")]
235    Candle1Day,
236    #[serde(rename = "candle2D")]
237    Candle2Day,
238    #[serde(rename = "candle3D")]
239    Candle3Day,
240    #[serde(rename = "candle5D")]
241    Candle5Day,
242    #[serde(rename = "candle1W")]
243    Candle1Week,
244    #[serde(rename = "candle1M")]
245    Candle1Month,
246    #[serde(rename = "candle3M")]
247    Candle3Month,
248    #[serde(rename = "candle6M")]
249    Candle6Month,
250    #[serde(rename = "candle1Y")]
251    Candle1Year,
252
253    // Mark Price Candlesticks
254    #[serde(rename = "mark-price-candle1s")]
255    MarkPriceCandle1Second,
256    #[serde(rename = "mark-price-candle1m")]
257    MarkPriceCandle1Minute,
258    #[serde(rename = "mark-price-candle3m")]
259    MarkPriceCandle3Minute,
260    #[serde(rename = "mark-price-candle5m")]
261    MarkPriceCandle5Minute,
262    #[serde(rename = "mark-price-candle15m")]
263    MarkPriceCandle15Minute,
264    #[serde(rename = "mark-price-candle30m")]
265    MarkPriceCandle30Minute,
266    #[serde(rename = "mark-price-candle1H")]
267    MarkPriceCandle1Hour,
268    #[serde(rename = "mark-price-candle2H")]
269    MarkPriceCandle2Hour,
270    #[serde(rename = "mark-price-candle4H")]
271    MarkPriceCandle4Hour,
272    #[serde(rename = "mark-price-candle6H")]
273    MarkPriceCandle6Hour,
274    #[serde(rename = "mark-price-candle12H")]
275    MarkPriceCandle12Hour,
276    #[serde(rename = "mark-price-candle1D")]
277    MarkPriceCandle1Day,
278    #[serde(rename = "mark-price-candle2D")]
279    MarkPriceCandle2Day,
280    #[serde(rename = "mark-price-candle3D")]
281    MarkPriceCandle3Day,
282    #[serde(rename = "mark-price-candle5D")]
283    MarkPriceCandle5Day,
284    #[serde(rename = "mark-price-candle1W")]
285    MarkPriceCandle1Week,
286    #[serde(rename = "mark-price-candle1M")]
287    MarkPriceCandle1Month,
288    #[serde(rename = "mark-price-candle3M")]
289    MarkPriceCandle3Month,
290}
291
292impl OKXWsChannel {
293    /// Returns `true` for OKX Nitro spread channels, which key on `sprdId`
294    /// rather than `instId` and are served on the business WebSocket.
295    #[must_use]
296    pub const fn is_spread(&self) -> bool {
297        matches!(
298            self,
299            Self::SprdOrders | Self::SprdBboTbt | Self::SprdBooks5 | Self::SprdPublicTrades
300        )
301    }
302}