nautilus_tardis/
enums.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Posei Systems Pty Ltd. All rights reserved.
3//  https://poseitrader.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
16use nautilus_model::identifiers::Venue;
17use serde::{Deserialize, Serialize};
18use strum::{AsRefStr, Display, EnumIter, EnumString, FromRepr};
19use ustr::Ustr;
20
21#[derive(
22    Debug,
23    Clone,
24    PartialEq,
25    Eq,
26    Hash,
27    Serialize,
28    Deserialize,
29    Display,
30    AsRefStr,
31    EnumIter,
32    EnumString,
33    FromRepr,
34)]
35#[strum(ascii_case_insensitive)]
36#[strum(serialize_all = "lowercase")]
37#[serde(rename_all = "lowercase")]
38/// The instrument type for the symbol.
39pub enum InstrumentType {
40    Spot,
41    Perpetual,
42    Future,
43    Option,
44    Combo,
45}
46
47#[derive(
48    Debug,
49    Clone,
50    PartialEq,
51    Eq,
52    Hash,
53    Serialize,
54    Deserialize,
55    Display,
56    AsRefStr,
57    EnumIter,
58    EnumString,
59    FromRepr,
60)]
61#[serde(rename_all = "lowercase")]
62/// The type of option.
63pub enum OptionType {
64    Call,
65    Put,
66}
67
68/// The aggressor side of the trade.
69#[derive(
70    Debug,
71    Clone,
72    PartialEq,
73    Eq,
74    Hash,
75    Serialize,
76    Deserialize,
77    Display,
78    AsRefStr,
79    EnumIter,
80    EnumString,
81    FromRepr,
82)]
83#[serde(rename_all = "lowercase")]
84pub enum TradeSide {
85    Buy,
86    Sell,
87    Unknown,
88}
89
90/// The bar kind.
91#[allow(missing_docs)]
92#[derive(
93    Debug,
94    Clone,
95    PartialEq,
96    Eq,
97    Hash,
98    Serialize,
99    Deserialize,
100    Display,
101    AsRefStr,
102    EnumIter,
103    EnumString,
104    FromRepr,
105)]
106#[serde(rename_all = "lowercase")]
107pub enum BarKind {
108    Time,
109    Volume,
110    Tick,
111}
112
113#[derive(
114    Debug,
115    Clone,
116    PartialEq,
117    Eq,
118    Hash,
119    Serialize,
120    Deserialize,
121    Display,
122    AsRefStr,
123    EnumIter,
124    EnumString,
125    FromRepr,
126)]
127#[strum(ascii_case_insensitive)]
128#[strum(serialize_all = "kebab-case")]
129#[serde(rename_all = "kebab-case")]
130/// Represents a crypto exchange.
131/// See <https://api.tardis.dev/v1/exchanges> for all supported exchanges.
132pub enum Exchange {
133    Ascendex,
134    Binance,
135    BinanceDelivery,
136    BinanceDex,
137    BinanceFutures,
138    BinanceJersey,
139    BinanceOptions,
140    BinanceUs,
141    Bitfinex,
142    BitfinexDerivatives,
143    Bitflyer,
144    Bitmex,
145    Bitnomial,
146    Bitstamp,
147    BlockchainCom,
148    Bybit,
149    BybitOptions,
150    BybitSpot,
151    Coinbase,
152    Coinflex,
153    CryptoCom,
154    CryptoComDerivatives,
155    Cryptofacilities,
156    Delta,
157    Deribit,
158    Dydx,
159    Ftx,
160    FtxUs,
161    GateIo,
162    GateIoFutures,
163    Gemini,
164    Hitbtc,
165    Huobi,
166    HuobiDm,
167    HuobiDmLinearSwap,
168    HuobiDmOptions,
169    HuobiDmSwap,
170    Kraken,
171    Kucoin,
172    Mango,
173    Okcoin,
174    Okex,
175    OkexFutures,
176    OkexOptions,
177    OkexSwap,
178    Phemex,
179    Poloniex,
180    Serum,
181    StarAtlas,
182    Upbit,
183    WooX,
184}
185
186impl Exchange {
187    #[must_use]
188    pub fn from_venue_str(s: &str) -> Vec<Self> {
189        let s = s.to_ascii_uppercase();
190        match s.as_str() {
191            "ASCENDEX" => vec![Self::Ascendex],
192            "BINANCE" => vec![
193                Self::Binance,
194                Self::BinanceDex,
195                Self::BinanceFutures,
196                Self::BinanceJersey,
197                Self::BinanceOptions,
198            ],
199            "BINANCE_DELIVERY" => vec![Self::BinanceDelivery],
200            "BINANCE_US" => vec![Self::BinanceUs],
201            "BITFINEX" => vec![Self::Bitfinex, Self::BitfinexDerivatives],
202            "BITFLYER" => vec![Self::Bitflyer],
203            "BITMEX" => vec![Self::Bitmex],
204            "BITNOMIAL" => vec![Self::Bitnomial],
205            "BITSTAMP" => vec![Self::Bitstamp],
206            "BLOCKCHAIN_COM" => vec![Self::BlockchainCom],
207            "BYBIT" => vec![Self::Bybit, Self::BybitOptions, Self::BybitSpot],
208            "COINBASE" => vec![Self::Coinbase],
209            "COINFLEX" => vec![Self::Coinflex],
210            "CRYPTO_COM" => vec![Self::CryptoCom, Self::CryptoComDerivatives],
211            "CRYPTOFACILITIES" => vec![Self::Cryptofacilities],
212            "DELTA" => vec![Self::Delta],
213            "DERIBIT" => vec![Self::Deribit],
214            "DYDX" => vec![Self::Dydx],
215            "FTX" => vec![Self::Ftx, Self::FtxUs],
216            "GATE_IO" => vec![Self::GateIo, Self::GateIoFutures],
217            "GEMINI" => vec![Self::Gemini],
218            "HITBTC" => vec![Self::Hitbtc],
219            "HUOBI" => vec![
220                Self::Huobi,
221                Self::HuobiDm,
222                Self::HuobiDmLinearSwap,
223                Self::HuobiDmOptions,
224            ],
225            "HUOBI_DELIVERY" => vec![Self::HuobiDmSwap],
226            "KRAKEN" => vec![Self::Kraken],
227            "KUCOIN" => vec![Self::Kucoin],
228            "MANGO" => vec![Self::Mango],
229            "OKCOIN" => vec![Self::Okcoin],
230            "OKEX" => vec![
231                Self::Okex,
232                Self::OkexFutures,
233                Self::OkexOptions,
234                Self::OkexSwap,
235            ],
236            "PHEMEX" => vec![Self::Phemex],
237            "POLONIEX" => vec![Self::Poloniex],
238            "SERUM" => vec![Self::Serum],
239            "STARATLAS" => vec![Self::StarAtlas],
240            "UPBIT" => vec![Self::Upbit],
241            "WOO_X" => vec![Self::WooX],
242            _ => Vec::new(),
243        }
244    }
245
246    #[must_use]
247    pub const fn as_venue_str(&self) -> &str {
248        match self {
249            Self::Ascendex => "ASCENDEX",
250            Self::Binance => "BINANCE",
251            Self::BinanceDelivery => "BINANCE_DELIVERY",
252            Self::BinanceDex => "BINANCE",
253            Self::BinanceFutures => "BINANCE",
254            Self::BinanceJersey => "BINANCE",
255            Self::BinanceOptions => "BINANCE",
256            Self::BinanceUs => "BINANCE_US",
257            Self::Bitfinex => "BITFINEX",
258            Self::BitfinexDerivatives => "BITFINEX",
259            Self::Bitflyer => "BITFLYER",
260            Self::Bitmex => "BITMEX",
261            Self::Bitnomial => "BITNOMIAL",
262            Self::Bitstamp => "BITSTAMP",
263            Self::BlockchainCom => "BLOCKCHAIN_COM",
264            Self::Bybit => "BYBIT",
265            Self::BybitOptions => "BYBIT",
266            Self::BybitSpot => "BYBIT",
267            Self::Coinbase => "COINBASE",
268            Self::Coinflex => "COINFLEX",
269            Self::CryptoCom => "CRYPTO_COM",
270            Self::CryptoComDerivatives => "CRYPTO_COM",
271            Self::Cryptofacilities => "CRYPTOFACILITIES",
272            Self::Delta => "DELTA",
273            Self::Deribit => "DERIBIT",
274            Self::Dydx => "DYDX",
275            Self::Ftx => "FTX",
276            Self::FtxUs => "FTX",
277            Self::GateIo => "GATE_IO",
278            Self::GateIoFutures => "GATE_IO",
279            Self::Gemini => "GEMINI",
280            Self::Hitbtc => "HITBTC",
281            Self::Huobi => "HUOBI",
282            Self::HuobiDm => "HUOBI",
283            Self::HuobiDmLinearSwap => "HUOBI",
284            Self::HuobiDmOptions => "HUOBI",
285            Self::HuobiDmSwap => "HUOBI_DELIVERY",
286            Self::Kraken => "KRAKEN",
287            Self::Kucoin => "KUCOIN",
288            Self::Mango => "MANGO",
289            Self::Okcoin => "OKCOIN",
290            Self::Okex => "OKEX",
291            Self::OkexFutures => "OKEX",
292            Self::OkexOptions => "OKEX",
293            Self::OkexSwap => "OKEX",
294            Self::Phemex => "PHEMEX",
295            Self::Poloniex => "POLONIEX",
296            Self::Serum => "SERUM",
297            Self::StarAtlas => "STARATLAS",
298            Self::Upbit => "UPBIT",
299            Self::WooX => "WOO_X",
300        }
301    }
302
303    #[must_use]
304    pub fn as_venue(&self) -> Venue {
305        Venue::from_ustr_unchecked(Ustr::from(self.as_venue_str()))
306    }
307}